From 64de1c2c007ee1747d16ab66d6131444205f6ff0 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Wed, 13 Dec 2023 17:50:38 +1100 Subject: [PATCH 01/95] chore(sfp): move to sfp cli from flxbl-io --- packages/sfpowerscripts-cli/CHANGELOG.md | 4 +- packages/sfpowerscripts-cli/README.md | 48 +- .../sfpowerscripts-cli/coverage/clover.xml | 2694 +++++++++++ .../coverage/coverage-final.json | 72 + .../coverage/lcov-report/base.css | 224 + .../coverage/lcov-report/block-navigation.js | 87 + .../coverage/lcov-report/core/git/Git.ts.html | 823 ++++ .../lcov-report/core/git/GitIdentity.ts.html | 187 + .../coverage/lcov-report/core/git/index.html | 131 + .../coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes .../impl/changelog/OrgsUpdater.ts.html | 466 ++ .../impl/changelog/WorkItemUpdater.ts.html | 208 + .../lcov-report/impl/changelog/index.html | 131 + .../parallelBuilder/UndirectedGraph.ts.html | 232 + .../impl/parallelBuilder/index.html | 116 + .../impl/release/ReleaseDefinition.ts.html | 322 ++ .../lcov-report/impl/release/index.html | 116 + .../coverage/lcov-report/index.html | 581 +++ .../coverage/lcov-report/prettify.css | 1 + .../coverage/lcov-report/prettify.js | 2 + .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes .../coverage/lcov-report/sorter.js | 196 + .../lcov-report/src/ProjectValidation.ts.html | 346 ++ .../src/core/apex/ApexClassFetcher.ts.html | 166 + .../src/core/apex/ApexTriggerFetcher.ts.html | 169 + .../ApexCodeCoverageAggregateFetcher.ts.html | 211 + .../coverage/IndividualClassCoverage.ts.html | 313 ++ .../src/core/apex/coverage/index.html | 131 + .../lcov-report/src/core/apex/index.html | 131 + .../src/core/apextest/ApexTestSuite.ts.html | 175 + .../ImpactedApexTestClassFetcher.ts.html | 355 ++ .../lcov-report/src/core/apextest/index.html | 131 + .../core/artifacts/ArtifactFetcher.ts.html | 757 +++ .../lcov-report/src/core/artifacts/index.html | 116 + .../src/core/display/TableConstants.ts.html | 199 + .../lcov-report/src/core/display/index.html | 116 + .../lcov-report/src/core/git/Git.ts.html | 823 ++++ .../src/core/git/GitDiffUtil.ts.html | 610 +++ .../src/core/git/GitIdentity.ts.html | 187 + .../lcov-report/src/core/git/GitTags.ts.html | 538 +++ .../lcov-report/src/core/git/index.html | 161 + .../src/core/metadata/MetadataFiles.ts.html | 1114 +++++ .../src/core/metadata/MetadataInfo.ts.html | 727 +++ .../src/core/metadata/SettingsFetcher.ts.html | 151 + .../lcov-report/src/core/metadata/index.html | 146 + .../lcov-report/src/core/org/SFPOrg.ts.html | 898 ++++ .../lcov-report/src/core/org/index.html | 116 + .../InstalledPackagesQueryExecutor.ts.html | 127 + .../src/core/org/packageQuery/index.html | 116 + .../src/core/package/SfpPackage.ts.html | 514 ++ .../core/package/SfpPackageBuilder.ts.html | 919 ++++ .../package/analyser/AnalyzerRegistry.ts.html | 145 + .../core/package/analyser/FHTAnalyzer.ts.html | 313 ++ .../core/package/analyser/FTAnalyzer.ts.html | 307 ++ .../package/analyser/PicklistAnalyzer.ts.html | 241 + .../src/core/package/analyser/index.html | 161 + .../components/PackageManifest.ts.html | 898 ++++ .../components/PackageToComponent.ts.html | 169 + .../src/core/package/components/index.html | 131 + .../coverage/PackageTestCoverage.ts.html | 904 ++++ .../src/core/package/coverage/index.html | 116 + ...ExternalPackage2DependencyResolver.ts.html | 394 ++ .../PackageDependencyResolver.ts.html | 892 ++++ .../TransitiveDependencyResolver.ts.html | 412 ++ .../src/core/package/dependencies/index.html | 146 + .../EntitlementVersionFilter.ts.html | 415 ++ .../core/package/deploymentFilters/index.html | 116 + .../package/diff/PackageComponentDiff.ts.html | 1357 ++++++ .../core/package/diff/PackageDiffImpl.ts.html | 583 +++ .../src/core/package/diff/index.html | 131 + .../lcov-report/src/core/package/index.html | 131 + .../CreateDataPackageImpl.ts.html | 343 ++ .../CreateDiffPackageImpl.ts.html | 898 ++++ .../packageCreators/CreatePackage.ts.html | 523 ++ .../core/package/packageCreators/index.html | 146 + .../AssignPermissionSetFetcher.ts.html | 154 + .../DestructiveManifestPathFetcher.ts.html | 172 + .../ReconcileProfilePropertyFetcher.ts.html | 115 + .../core/package/propertyFetchers/index.html | 146 + .../validators/PackageEmptyChecker.ts.html | 340 ++ .../src/core/package/validators/index.html | 116 + .../version/Package2VersionFetcher.ts.html | 412 ++ .../version/PackageVersionUpdater.ts.html | 139 + .../src/core/package/version/index.html | 131 + .../permsets/AssignPermissionSetsImpl.ts.html | 364 ++ .../permsets/PermissionSetFetcher.ts.html | 130 + .../PermissionSetGroupUpdateAwaiter.ts.html | 223 + .../lcov-report/src/core/permsets/index.html | 146 + .../src/core/project/ProjectConfig.ts.html | 928 ++++ .../UserDefinedExternalDependency.ts.html | 268 ++ .../lcov-report/src/core/project/index.html | 131 + .../core/queryHelper/ChunkCollection.ts.html | 196 + .../src/core/queryHelper/QueryHelper.ts.html | 139 + .../src/core/queryHelper/index.html | 131 + .../src/core/stats/NativeMetricSender.ts.html | 151 + .../src/core/stats/SFPStatsSender.ts.html | 427 ++ .../lcov-report/src/core/stats/index.html | 131 + .../DataDogMetricSender.ts.html | 241 + .../NewRelicMetricSender.ts.html | 283 ++ .../SplunkMetricSender.ts.html | 232 + .../stats/nativeMetricSenderImpl/index.html | 146 + .../src/core/utils/AliasList.ts.html | 133 + .../src/core/utils/ChunkArray.ts.html | 118 + .../lcov-report/src/core/utils/Delay.ts.html | 94 + .../src/core/utils/FileSystem.ts.html | 241 + .../src/core/utils/Fileutils.ts.html | 697 +++ .../src/core/utils/ObjectCRUDHelper.ts.html | 199 + .../core/utils/VersionNumberConverter.ts.html | 184 + .../core/utils/extractDomainFromUrl.ts.html | 115 + .../lcov-report/src/core/utils/index.html | 236 + .../src/core/utils/xml2json.ts.html | 115 + .../src/impl/changelog/CommitUpdater.ts.html | 256 + .../src/impl/changelog/OrgsUpdater.ts.html | 466 ++ .../impl/changelog/WorkItemUpdater.ts.html | 208 + .../lcov-report/src/impl/changelog/index.html | 146 + .../src/impl/dependency/ShrinkImpl.ts.html | 328 ++ .../src/impl/dependency/index.html | 116 + .../parallelBuilder/BuildCollections.ts.html | 280 ++ .../parallelBuilder/UndirectedGraph.ts.html | 232 + .../src/impl/parallelBuilder/index.html | 131 + .../impl/release/ReleaseDefinition.ts.html | 322 ++ .../lcov-report/src/impl/release/index.html | 116 + .../coverage/lcov-report/src/index.html | 116 + .../src/utils/Get18DigitSalesforceId.ts.html | 142 + .../coverage/lcov-report/src/utils/index.html | 116 + .../utils/Get18DigitSalesforceId.ts.html | 142 + .../coverage/lcov-report/utils/index.html | 116 + .../sfpowerscripts-cli/coverage/lcov.info | 4285 +++++++++++++++++ .../messages/generate_changelog.json | 2 +- .../messages/install_package.json | 2 +- .../messages/install_source_package.json | 2 +- .../messages/install_unlocked_package.json | 2 +- .../messages/metrics_report.json | 2 +- .../messages/pool_delete.json | 2 +- packages/sfpowerscripts-cli/package.json | 52 +- .../resources/metadatainfo.json | 1075 +++++ .../schemas/pooldefinition.schema.json | 147 + .../schemas/releasedefinition.schema.json | 4 +- .../releasedefinitiongenerator.schema.json | 2 +- .../schemas/sfdx-project.schema.json | 20 +- packages/sfpowerscripts-cli/src/BuildBase.ts | 20 +- .../src/InstallPackageCommand.ts | 20 +- .../src/PackageCreateCommand.ts | 22 +- .../src/ProjectValidation.ts | 8 +- ...SfpowerscriptsCommand.ts => SfpCommand.ts} | 43 +- .../src/commands/apextests/trigger.ts | 20 +- .../src/commands/artifacts/fetch.ts | 12 +- .../src/commands/artifacts/query.ts | 14 +- .../src/commands/changelog/generate.ts | 8 +- .../src/commands/dependency/expand.ts | 14 +- .../src/commands/dependency/install.ts | 18 +- .../src/commands/dependency/shrink.ts | 10 +- .../src/commands/impact/package.ts | 8 +- .../src/commands/impact/releaseconfig.ts | 8 +- .../src/commands/metrics/report.ts | 18 +- .../src/commands/orchestrator/build.ts | 2 +- .../src/commands/orchestrator/deploy.ts | 16 +- .../src/commands/orchestrator/prepare.ts | 29 +- .../src/commands/orchestrator/promote.ts | 22 +- .../src/commands/orchestrator/publish.ts | 40 +- .../src/commands/orchestrator/quickbuild.ts | 2 +- .../src/commands/orchestrator/release.ts | 10 +- .../src/commands/orchestrator/validate.ts | 12 +- .../orchestrator/validateAgainstOrg.ts | 10 +- .../src/commands/package/data/create.ts | 10 +- .../src/commands/package/data/install.ts | 10 +- .../src/commands/package/install.ts | 12 +- .../src/commands/package/source/create.ts | 8 +- .../src/commands/package/source/install.ts | 22 +- .../src/commands/package/unlocked/create.ts | 8 +- .../src/commands/package/unlocked/install.ts | 10 +- .../src/commands/pool/delete.ts | 24 +- .../src/commands/pool/fetch.ts | 28 +- .../src/commands/pool/list.ts | 20 +- .../src/commands/pool/metrics/publish.ts | 38 +- .../src/commands/pool/org/delete.ts | 10 +- .../src/commands/profile/merge.ts | 14 +- .../src/commands/profile/reconcile.ts | 16 +- .../src/commands/profile/retrieve.ts | 12 +- .../commands/releasedefinition/generate.ts | 8 +- .../src/commands/repo/patch.ts | 26 +- .../src/core/apex/ApexClassFetcher.ts | 28 + .../src/core/apex/ApexTriggerFetcher.ts | 28 + .../ApexCodeCoverageAggregateFetcher.ts | 42 + .../apex/coverage/IndividualClassCoverage.ts | 76 + .../src/core/apex/parser/ApexTypeFetcher.ts | 134 + .../apex/parser/listeners/ApexTypeListener.ts | 38 + .../src/core/apextest/ApexTestSuite.ts | 30 + .../src/core/apextest/ClearCodeCoverage.ts | 53 + .../apextest/ImpactedApexTestClassFetcher.ts | 90 + .../src/core/apextest/JSONReporter.ts | 174 + .../src/core/apextest/TestOptions.ts | 73 + .../src/core/apextest/TestReportDisplayer.ts | 118 + .../src/core/apextest/TriggerApexTests.ts | 767 +++ .../src/core/artifacts/ArtifactFetcher.ts | 224 + .../artifacts/generators/ArtifactGenerator.ts | 105 + .../changelog/GeneratePackageChangelog.ts | 76 + .../interfaces/GenericChangelogInterfaces.ts | 30 + .../dependency/ChangedComponentsFetcher.ts | 93 + .../src/core/dependency/Component.ts | 16 + .../core/dependency/DependencyViolation.ts | 7 + .../src/core/dependency/Entrypoint.ts | 20 + .../core/deployers/DeploySourceToOrgImpl.ts | 230 + .../src/core/deployers/DeploymentExecutor.ts | 17 + .../deployers/DeploymentSettingsService.ts | 64 + .../display/DependencyViolationDisplayer.ts | 31 + .../src/core/display/DeployErrorDisplayer.ts | 103 + .../core/display/DeploymentOptionDisplayer.ts | 51 + .../display/ExternalDependencyDisplayer.ts | 30 + .../display/InstalledArtifactsDisplayer.ts | 22 + .../display/InstalledPackagesDisplayer.ts | 22 + .../core/display/PackageComponentPrinter.ts | 27 + .../display/PackageDependencyDisplayer.ts | 35 + .../core/display/PackageMetadataPrinter.ts | 38 + .../src/core/display/PushErrorDisplayer.ts | 75 + .../src/core/display/TableConstants.ts | 38 + .../sfpowerscripts-cli/src/core/git/Git.ts | 246 + .../src/core/git/GitDiffUtil.ts | 175 + .../src/core/git/GitIdentity.ts | 34 + .../src/core/git/GitTags.ts | 151 + .../src/core/ignore/IgnoreFiles.ts | 13 + .../src/core/limits/LimitsFetcher.ts | 30 + .../src/core/metadata/CustomFieldFetcher.ts | 45 + .../src/core/metadata/MetadataFetcher.ts | 71 + .../src/core/metadata/MetadataFiles.ts | 343 ++ .../src/core/metadata/MetadataInfo.ts | 214 + .../src/core/metadata/SettingsFetcher.ts | 22 + .../src/core/org/OrgDetailsFetcher.ts | 120 + .../src/core/org/OrganizationFetcher.ts | 12 + .../sfpowerscripts-cli/src/core/org/SFPOrg.ts | 271 ++ .../src/core/org/ScratchOrgInfoFetcher.ts | 30 + .../InstalledPackagesQueryExecutor.ts | 14 + .../src/core/package/Package2Detail.ts | 10 + .../src/core/package/SfpPackage.ts | 143 + .../src/core/package/SfpPackageBuilder.ts | 278 ++ .../src/core/package/SfpPackageInquirer.ts | 178 + .../src/core/package/SfpPackageInstaller.ts | 63 + .../core/package/analyser/AnalyzerRegistry.ts | 20 + .../src/core/package/analyser/FHTAnalyzer.ts | 76 + .../src/core/package/analyser/FTAnalyzer.ts | 74 + .../core/package/analyser/PackageAnalyzer.ts | 12 + .../core/package/analyser/PicklistAnalyzer.ts | 52 + .../DeployDestructiveManifestToOrgImpl.ts | 129 + .../core/package/components/MetadataCount.ts | 18 + .../package/components/PackageManifest.ts | 271 ++ .../package/components/PackageToComponent.ts | 28 + .../ReconcileProfileAgainstOrgImpl.ts | 53 + .../package/coverage/PackageTestCoverage.ts | 273 ++ .../coverage/PackageVersionCoverage.ts | 39 + .../ExternalPackage2DependencyResolver.ts | 103 + .../dependencies/PackageDependencyResolver.ts | 269 ++ .../TransitiveDependencyResolver.ts | 109 + .../DeploymentCustomizer.ts | 27 + .../deploymentCustomizers/FHTEnabler.ts | 121 + .../deploymentCustomizers/FTEnabler.ts | 107 + .../MetadataDeploymentCustomizer.ts | 83 + .../deploymentCustomizers/PicklistEnabler.ts | 218 + .../PostDeployersRegistry.ts | 18 + .../PreDeployersRegistry.ts | 14 + .../deploymentFilters/DeploymentFilter.ts | 13 + .../DeploymentFilterRegistry.ts | 18 + .../EntitlementVersionFilter.ts | 110 + .../core/package/diff/PackageComponentDiff.ts | 424 ++ .../src/core/package/diff/PackageDiffImpl.ts | 166 + .../generators/SfpPackageContentGenerator.ts | 301 ++ .../packageCreators/CreateDataPackageImpl.ts | 86 + .../packageCreators/CreateDiffPackageImpl.ts | 271 ++ .../package/packageCreators/CreatePackage.ts | 146 + .../CreateSourcePackageImpl.ts | 117 + .../CreateUnlockedPackageImpl.ts | 262 + .../SourceToMDAPIConvertor.ts | 52 + .../InstallDataPackageImpl.ts | 104 + .../packageInstallers/InstallPackage.ts | 497 ++ .../InstallSourcePackageImpl.ts | 397 ++ .../InstallUnlockedPackage.ts | 91 + .../InstallUnlockedPackageCollection.ts | 134 + .../InstallUnlockedPackageImpl.ts | 96 + .../PackageInstallationResult.ts | 15 + .../packageMerger/PackageMergeManager.ts | 160 + .../promote/PromoteUnlockedPackageImpl.ts | 34 + .../AssignPermissionSetFetcher.ts | 23 + .../DestructiveManifestPathFetcher.ts | 29 + .../propertyFetchers/PropertyFetcher.ts | 11 + .../ReconcileProfilePropertyFetcher.ts | 10 + .../package/validators/PackageEmptyChecker.ts | 85 + .../package/version/Package2VersionFetcher.ts | 109 + .../version/Package2VersionInstaller.ts | 26 + .../package/version/PackageVersionLister.ts | 62 + .../package/version/PackageVersionUpdater.ts | 18 + .../src/core/permsets/AssignPermissionSets.ts | 17 + .../core/permsets/AssignPermissionSetsImpl.ts | 93 + .../src/core/permsets/PermissionSetFetcher.ts | 15 + .../PermissionSetGroupUpdateAwaiter.ts | 46 + .../src/core/project/ProjectConfig.ts | 281 ++ .../project/UserDefinedExternalDependency.ts | 61 + .../src/core/queryHelper/ChunkCollection.ts | 38 + .../src/core/queryHelper/QueryHelper.ts | 18 + .../src/core/scratchorg/PasswordGenerator.ts | 41 + .../src/core/scratchorg/ScratchOrg.ts | 18 + .../src/core/scratchorg/ScratchOrgOperator.ts | 149 + .../scratchorg/pool/ClientSourceTracking.ts | 205 + .../scratchorg/pool/OrphanedOrgsDeleteImpl.ts | 47 + .../src/core/scratchorg/pool/PoolBaseImpl.ts | 22 + .../src/core/scratchorg/pool/PoolConfig.ts | 40 + .../core/scratchorg/pool/PoolCreateImpl.ts | 432 ++ .../core/scratchorg/pool/PoolDeleteImpl.ts | 65 + .../src/core/scratchorg/pool/PoolError.ts | 13 + .../src/core/scratchorg/pool/PoolFetchImpl.ts | 244 + .../core/scratchorg/pool/PoolJobExecutor.ts | 41 + .../src/core/scratchorg/pool/PoolListImpl.ts | 48 + .../core/scratchorg/pool/PoolOrgDeleteImpl.ts | 26 + .../prequisitecheck/IsValidSfdxAuthUrl.ts | 19 + .../pool/prequisitecheck/PreRequisiteCheck.ts | 63 + .../pool/services/fetchers/GetUserEmail.ts | 28 + .../fetchers/ScratchOrgInfoFetcher.ts | 187 + .../fetchers/ScratchOrgLimitsFetcher.ts | 13 + .../updaters/ScratchOrgInfoAssigner.ts | 24 + .../scriptExecutor/ScriptExecutorHelpers.ts | 19 + .../src/core/sfdmuwrapper/SFDMURunImpl.ts | 28 + .../src/core/stats/NativeMetricSender.ts | 22 + .../src/core/stats/SFPStatsSender.ts | 114 + .../DataDogMetricSender.ts | 52 + .../NewRelicMetricSender.ts | 66 + .../SplunkMetricSender.ts | 49 + .../src/core/utils/AliasList.ts | 16 + .../src/core/utils/ChunkArray.ts | 11 + .../src/core/utils/DefaultShell.ts | 7 + .../src/core/utils/Delay.ts | 3 + .../src/core/utils/FileSystem.ts | 52 + .../src/core/utils/Fileutils.ts | 204 + .../src/core/utils/GetFormattedTime.ts | 6 + .../src/core/utils/ObjectCRUDHelper.ts | 38 + .../src/core/utils/OnExit.ts | 17 + .../src/core/utils/RandomId.ts | 9 + .../src/core/utils/VersionNumberConverter.ts | 33 + .../src/core/utils/extractDomainFromUrl.ts | 10 + .../src/core/utils/xml2json.ts | 10 + .../vlocitywrapper/VlocityInitialInstall.ts | 21 + .../vlocitywrapper/VlocityPackDeployImpl.ts | 31 + .../VlocityPackUpdateSettings.ts | 21 + .../core/vlocitywrapper/VlocityRefreshBase.ts | 31 + .../src/errors/ReleaseError.ts | 4 +- .../{SfpowerscriptsError.ts => SfpError.ts} | 2 +- .../src/errors/ValidateError.ts | 4 +- .../sfpowerscripts-cli/src/flags/duration.ts | 2 +- .../src/flags/orgApiVersion.ts | 4 +- .../sfpowerscripts-cli/src/flags/sfdxflags.ts | 6 +- .../impl/artifacts/FetchAnArtifactFromNPM.ts | 6 +- .../artifacts/FetchAnArtifactUsingScript.ts | 4 +- .../src/impl/artifacts/FetchArtifactsError.ts | 4 +- .../src/impl/artifacts/FetchImpl.ts | 8 +- .../src/impl/changelog/ChangelogImpl.ts | 12 +- .../src/impl/changelog/CommitUpdater.ts | 2 +- .../impl/changelog/ReadPackageChangelog.ts | 2 +- .../src/impl/changelog/ReleaseChangelog.ts | 2 +- .../impl/changelog/ReleaseChangelogUpdater.ts | 2 +- .../src/impl/changelog/WorkItemUpdater.ts | 2 +- .../src/impl/demoreelplayer/DemoReelPlayer.ts | 2 +- .../src/impl/dependency/ShrinkImpl.ts | 8 +- .../src/impl/deploy/DeployImpl.ts | 28 +- .../src/impl/deploy/PostDeployHook.ts | 6 +- .../src/impl/deploy/PreDeployHook.ts | 4 +- .../impl/impact/ImpactedPackagesResolver.ts | 10 +- .../impl/parallelBuilder/BuildCollections.ts | 2 +- .../src/impl/parallelBuilder/BuildImpl.ts | 50 +- .../impl/parallelBuilder/DependencyHelper.ts | 2 +- .../src/impl/prepare/PrepareImpl.ts | 30 +- .../src/impl/prepare/PrepareOrgJob.ts | 56 +- .../src/impl/release/ReleaseConfig.ts | 4 +- .../src/impl/release/ReleaseDefinition.ts | 4 +- .../release/ReleaseDefinitionGenerator.ts | 10 +- .../src/impl/release/ReleaseImpl.ts | 10 +- .../src/impl/repo/AlignImpl.ts | 2 +- .../src/impl/validate/Analyzer.ts | 4 +- .../src/impl/validate/ApexTestValidator.ts | 10 +- .../src/impl/validate/ValidateImpl.ts | 54 +- .../src/impl/validate/ValidateResult.ts | 2 +- .../src/outputs/FileOutputHandler.ts | 2 +- .../src/ui/GroupConsoleLogs.ts | 4 +- .../src/ui/OrgInfoDisplayer.ts | 6 +- .../tests/ProjectValidation.test.ts | 8 +- .../tests/core/apextest/ApexTestSuite.test.ts | 77 + .../artifacts/ArtifactsFromFileSystem.test.ts | 52 + .../coverage/IndividualClassCoverage.test.ts | 167 + .../tests/core/git/GitTags.test.ts | 83 + .../tests/core/org/ArtifactsToOrg.test.ts | 214 + .../tests/core/org/ListAllPackages.test.ts | 59 + .../package/Package2VersionFetcher.test.ts | 79 + .../core/package/PackageDiffImpl.test.ts | 295 ++ .../core/package/PackageManifest.test.ts | 300 ++ .../core/package/SFPackageBuilder.test.ts | 374 ++ .../package/analysers/FHTAnalyzer.test.ts | 360 ++ .../core/package/analysers/FTAnalyzer.test.ts | 363 ++ .../coverage/PackageTestCoverage.test.ts | 330 ++ .../PackageDependencyResolver.test.ts | 346 ++ .../TransitiveDependencyResolver.test.ts | 235 + .../EntitlementVersionFilter.test.ts | 500 ++ .../packageMerger/PackageMergeManager.test.ts | 39 + .../core2_sfpowerscripts_artifact_1.0.4-1.zip | Bin 0 -> 8405 bytes ...-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip | Bin 0 -> 35211 bytes .../AssignPermissionSetFetcher.test.ts | 55 + .../DestructiveManifestPathFetcher.test.ts | 85 + .../ReconcileProfilePropertyFetcher.test.ts | 48 + .../permsets/AssignPermissionSets.test.ts | 198 + .../permsets/PermissionSetFetcher.test.ts | 115 + .../PermissionSetGroupUpdateAwaiter.test.ts | 35 + .../tests/core/project/ProjectConfig.test.ts | 278 ++ .../core/queryHelper/ChunkCollection.test.ts | 30 + .../tests/core/utils/ChunkArray.test.ts | 24 + .../tests/core/utils/FileSystem.test.ts | 35 + .../core/utils/extractDomainFromUrl.test.ts | 34 + .../tests/core/utils/resources/a/b/b1.file | 0 .../tests/core/utils/resources/a/b/c/c1.file | 0 .../tests/core/utils/resources/a/b/c/c2.file | 0 .../tests/core/utils/resources/a/b/d/d1.file | 0 .../core/utils/resources/a/b/d/x/x1.file | 0 .../tests/core/utils/resources/a/b/e/e1.file | 0 .../impl/changelog/CommitUpdater.test.ts | 2 +- .../tests/impl/changelog/OrgUpdater.test.ts | 2 +- .../impl/changelog/WorkItemUpdater.test.ts | 2 +- .../resources/ESBaseCodeLWCChangelog.json | 2 +- ...update_latestRelease_with_all_commits.json | 2 +- ..._latestRelease_with_subset_of_commits.json | 2 +- ..._update_latestRelease_with_work_items.json | 2 +- .../tests/impl/dependency/ShrinkImpl.test.ts | 6 +- .../parallelBuilder/BuildCollections.test.ts | 2 +- 426 files changed, 63824 insertions(+), 597 deletions(-) create mode 100644 packages/sfpowerscripts-cli/coverage/clover.xml create mode 100644 packages/sfpowerscripts-cli/coverage/coverage-final.json create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/base.css create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/OrgsUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html create mode 100644 packages/sfpowerscripts-cli/coverage/lcov.info create mode 100644 packages/sfpowerscripts-cli/resources/metadatainfo.json create mode 100644 packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json rename packages/sfpowerscripts-cli/src/{SfpowerscriptsCommand.ts => SfpCommand.ts} (78%) create mode 100644 packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts create mode 100644 packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts create mode 100644 packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts create mode 100644 packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts create mode 100644 packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/dependency/Component.ts create mode 100644 packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts create mode 100644 packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts create mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts create mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/display/TableConstants.ts create mode 100644 packages/sfpowerscripts-cli/src/core/git/Git.ts create mode 100644 packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts create mode 100644 packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts create mode 100644 packages/sfpowerscripts-cli/src/core/git/GitTags.ts create mode 100644 packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts create mode 100644 packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts create mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts create mode 100644 packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts create mode 100644 packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts create mode 100644 packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts create mode 100644 packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts create mode 100644 packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts create mode 100644 packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts create mode 100644 packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts create mode 100644 packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts create mode 100644 packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts create mode 100644 packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts create mode 100644 packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts create mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts create mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts create mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/AliasList.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/Delay.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/OnExit.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/RandomId.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/utils/xml2json.ts create mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts create mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts create mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts create mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts rename packages/sfpowerscripts-cli/src/errors/{SfpowerscriptsError.ts => SfpError.ts} (86%) create mode 100644 packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip create mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip create mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file create mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file diff --git a/packages/sfpowerscripts-cli/CHANGELOG.md b/packages/sfpowerscripts-cli/CHANGELOG.md index 375e5c6f2..6c0a4531b 100644 --- a/packages/sfpowerscripts-cli/CHANGELOG.md +++ b/packages/sfpowerscripts-cli/CHANGELOG.md @@ -3,9 +3,9 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -# [20.30.0](https://github.com/dxatscale/sfpowerscripts/compare/@dxatscale/sfpowerscripts@20.29.0...@dxatscale/sfpowerscripts@20.30.0) (2023-03-22) +# [20.30.0](https://github.com/flxblio/sfp/compare/@flxblio/sfp@20.29.0...@flxblio/sfp@20.30.0) (2023-03-22) ### Features -* **publish:** Add new flag to delete Git tags by age and limit ([#1275](https://github.com/dxatscale/sfpowerscripts/issues/1275)) ([aae62d6](https://github.com/dxatscale/sfpowerscripts/commit/aae62d6d3e7eb390dddcf2ca46b99b44ca4cc933)) +* **publish:** Add new flag to delete Git tags by age and limit ([#1275](https://github.com/flxblio/sfp/issues/1275)) ([aae62d6](https://github.com/flxblio/sfp/commit/aae62d6d3e7eb390dddcf2ca46b99b44ca4cc933)) diff --git a/packages/sfpowerscripts-cli/README.md b/packages/sfpowerscripts-cli/README.md index fabe4ea56..0abca1322 100644 --- a/packages/sfpowerscripts-cli/README.md +++ b/packages/sfpowerscripts-cli/README.md @@ -1,19 +1,19 @@

- sfpowerscripts + sfp

-![Version](https://img.shields.io/npm/v/@dxatscale/sfpowerscripts.svg) -[![GitHub stars](https://img.shields.io/github/stars/dxatscale/sfpowerscripts)](https://gitHub.com/dxatscale/sfpowerscripts/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/dxatscale/sfpowerscripts.svg)](https://github.com/forcedotcom/dxatscale/sfpowerscripts/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/dxatscale/sfpowerscripts/blob/master/LICENSE) +![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) +[![GitHub stars](https://img.shields.io/github/stars/flxblio/sfp)](https://github.com/flxblio/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxblio/sfp.svg)](https://github.com/flxblio/sfp/graphs/contributors/) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxblio/sfp/blob/master/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) -[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/dxatscale) +[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxblio) -A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.dxatscale.io +A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxblio.io #### Features @@ -26,10 +26,10 @@ A build system for package based development in Salesforce, delivered as a node - Integrate with any CI/CD system of choice - All commands are enabled with statsD, for collecting metrics about your pipeline. -There are lot more features to explore. Read more at https://docs.dxatscale.io +There are lot more features to explore. Read more at https://docs.flxblio.io -The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@dxatscale/sfpowerscripts) or can be -used by using the [docker image](https://github.com/dxatscale/sfpowerscripts/pkgs/container/sfpowerscripts) +The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxblio/sfp) or can be +used by using the [docker image](https://github.com/flxblio/sfp/pkgs/container/sfp) @@ -45,29 +45,29 @@ used by using the [docker image](https://github.com/dxatscale/sfpowerscripts/pkg #### CI/CD Reference Implementation -Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.dxatscale.io/reference-implementation/github) +Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxblio.io/implementing-your-ci-cd/github) -#### Installing sfpowerscripts locally +#### Installing sfp locally -sfpowerscripts can be installed on your local device using npm +sfp can be installed on your local device using npm ``` -npm i -g @dxatscale/sfpowerscripts +npm i -g @flxblio/sfp ``` #### Docker -Docker images for sfpowerscripts are available at [GitHub Container Registry](https://github.com/dxatscale/sfpowerscripts/pkgs/container/sfpowerscripts). +Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxblio/sfp/pkgs/container/sfp). -We recommend using the sfpowerscripts docker image to avoid breakages in your CI/CD pipelines due to updates in sfpowerscripts or any of its dependencies such as the SFDX CLI. +We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. #### Build Instructions -To build sfpowerscripts execute the following on the terminal: +To build sfp execute the following on the terminal: ``` npm i -g lerna #Install Lerna Globally -cd # Navigate to the checked out directory -npm i +cd # Navigate to the checked out directory +pnpm i lerna run build ``` @@ -80,19 +80,19 @@ lerna run test To debug and test plugin ``` - cd packages/sfpowerscripts-cli + cd packages/sfp-cli npm link ``` #### Maintainers -List of Maintainers are available in the [link](https://docs.dxatscale.io/about-us) +List of Maintainers are available in the [link](https://docs.flxblio.io/about-us) #### Where do I reach for queries? -Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/dxatscale) as well. +Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxblio) as well. ## License -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts?ref=badge_large) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_large) diff --git a/packages/sfpowerscripts-cli/coverage/clover.xml b/packages/sfpowerscripts-cli/coverage/clover.xml new file mode 100644 index 000000000..2f2b77c16 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/clover.xml @@ -0,0 +1,2694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/sfpowerscripts-cli/coverage/coverage-final.json b/packages/sfpowerscripts-cli/coverage/coverage-final.json new file mode 100644 index 000000000..8fff365e9 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/coverage-final.json @@ -0,0 +1,72 @@ +{"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/ProjectValidation.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/ProjectValidation.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"7":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"8":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"9":{"start":{"line":20,"column":21},"end":{"line":20,"column":117}},"10":{"start":{"line":21,"column":24},"end":{"line":21,"column":48}},"11":{"start":{"line":22,"column":28},"end":{"line":22,"column":57}},"12":{"start":{"line":24,"column":35},"end":{"line":24,"column":104}},"13":{"start":{"line":26,"column":12},"end":{"line":32,"column":null}},"14":{"start":{"line":27,"column":16},"end":{"line":31,"column":null}},"15":{"start":{"line":35,"column":10},"end":{"line":35,"column":null}},"16":{"start":{"line":36,"column":10},"end":{"line":36,"column":null}},"17":{"start":{"line":41,"column":8},"end":{"line":58,"column":null}},"18":{"start":{"line":42,"column":23},"end":{"line":42,"column":34}},"19":{"start":{"line":44,"column":16},"end":{"line":49,"column":null}},"20":{"start":{"line":51,"column":16},"end":{"line":56,"column":null}},"21":{"start":{"line":63,"column":8},"end":{"line":85,"column":null}},"22":{"start":{"line":64,"column":30},"end":{"line":64,"column":91}},"23":{"start":{"line":66,"column":34},"end":{"line":66,"column":50}},"24":{"start":{"line":71,"column":16},"end":{"line":83,"column":null}},"25":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"loc":{"start":{"line":13,"column":4},"end":{"line":17,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":19,"column":11},"end":{"line":19,"column":34}},"loc":{"start":{"line":19,"column":34},"end":{"line":38,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":26,"column":37},"end":{"line":26,"column":38}},"loc":{"start":{"line":26,"column":57},"end":{"line":32,"column":13}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":40,"column":11},"end":{"line":40,"column":31}},"loc":{"start":{"line":40,"column":31},"end":{"line":59,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":41,"column":86},"end":{"line":41,"column":89}},"loc":{"start":{"line":41,"column":93},"end":{"line":58,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":62,"column":11},"end":{"line":62,"column":38}},"loc":{"start":{"line":62,"column":38},"end":{"line":86,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":63,"column":86},"end":{"line":63,"column":89}},"loc":{"start":{"line":63,"column":93},"end":{"line":85,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":16},"end":{"line":69,"column":88}},"type":"binary-expr","locations":[{"start":{"line":68,"column":16},"end":{"line":68,"column":48}},{"start":{"line":69,"column":17},"end":{"line":69,"column":51}},{"start":{"line":69,"column":55},"end":{"line":69,"column":87}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":8,"7":8,"8":8,"9":4,"10":4,"11":4,"12":1,"13":1,"14":7,"15":1,"16":1,"17":2,"18":4,"19":1,"20":1,"21":2,"22":4,"23":4,"24":1,"25":1},"f":{"0":8,"1":4,"2":7,"3":2,"4":4,"5":2,"6":4},"b":{"0":[4,2,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":15,"column":51},"end":{"line":15,"column":53}},"4":{"start":{"line":17,"column":23},"end":{"line":17,"column":50}},"5":{"start":{"line":19,"column":35},"end":{"line":19,"column":76}},"6":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}},"7":{"start":{"line":20,"column":26},"end":{"line":20,"column":92}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":106}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":58},"end":{"line":27,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":45},"end":{"line":19,"column":49}},"loc":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":15,"column":51},"end":{"line":15,"column":53}},"4":{"start":{"line":17,"column":23},"end":{"line":17,"column":52}},"5":{"start":{"line":19,"column":35},"end":{"line":19,"column":76}},"6":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}},"7":{"start":{"line":20,"column":26},"end":{"line":20,"column":94}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":106}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":62},"end":{"line":27,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":45},"end":{"line":19,"column":49}},"loc":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":24,"column":14},"end":{"line":24,"column":16}},"4":{"start":{"line":26,"column":23},"end":{"line":26,"column":66}},"5":{"start":{"line":28,"column":35},"end":{"line":28,"column":76}},"6":{"start":{"line":28,"column":53},"end":{"line":28,"column":64}},"7":{"start":{"line":29,"column":24},"end":{"line":29,"column":180}},"8":{"start":{"line":31,"column":28},"end":{"line":36,"column":38}},"9":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"10":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":11},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":67},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":45},"end":{"line":28,"column":49}},"loc":{"start":{"line":28,"column":53},"end":{"line":28,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":31},"end":{"line":4,"column":48}},"2":{"start":{"line":4,"column":58},"end":{"line":4,"column":72}},"3":{"start":{"line":10,"column":14},"end":{"line":10,"column":16}},"4":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"5":{"start":{"line":14,"column":12},"end":{"line":14,"column":null}},"6":{"start":{"line":18,"column":8},"end":{"line":21,"column":null}},"7":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"8":{"start":{"line":20,"column":13},"end":{"line":20,"column":null}},"9":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"10":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"11":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"12":{"start":{"line":41,"column":8},"end":{"line":45,"column":null}},"13":{"start":{"line":46,"column":41},"end":{"line":48,"column":10}},"14":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"15":{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},"16":{"start":{"line":51,"column":12},"end":{"line":56,"column":null}},"17":{"start":{"line":58,"column":12},"end":{"line":62,"column":null}},"18":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":31}},"loc":{"start":{"line":4,"column":72},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":37}},"loc":{"start":{"line":6,"column":68},"end":{"line":25,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":13,"column":57},"end":{"line":13,"column":60}},"loc":{"start":{"line":13,"column":64},"end":{"line":15,"column":9}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":19,"column":66},"end":{"line":19,"column":69}},"loc":{"start":{"line":19,"column":73},"end":{"line":21,"column":9}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":27,"column":11},"end":{"line":27,"column":42}},"loc":{"start":{"line":29,"column":34},"end":{"line":63,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":46,"column":73},"end":{"line":46,"column":76}},"loc":{"start":{"line":46,"column":80},"end":{"line":48,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":21,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":11},"end":{"line":18,"column":66}},"type":"binary-expr","locations":[{"start":{"line":18,"column":11},"end":{"line":18,"column":31}},{"start":{"line":18,"column":35},"end":{"line":18,"column":66}}]},"2":{"loc":{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},{"start":{"line":58,"column":12},"end":{"line":62,"column":null}}]}},"s":{"0":2,"1":9,"2":9,"3":2,"4":2,"5":8,"6":2,"7":0,"8":0,"9":2,"10":0,"11":0,"12":4,"13":4,"14":13,"15":4,"16":2,"17":2,"18":2},"f":{"0":9,"1":2,"2":8,"3":0,"4":4,"5":13},"b":{"0":[0],"1":[2,0],"2":[2,2]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts","statementMap":{"0":{"start":{"line":2,"column":11},"end":{"line":2,"column":30}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":8,"column":31},"end":{"line":8,"column":48}},"5":{"start":{"line":8,"column":58},"end":{"line":8,"column":75}},"6":{"start":{"line":11,"column":39},"end":{"line":14,"column":10}},"7":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"8":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"9":{"start":{"line":18,"column":32},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":35},"end":{"line":20,"column":99}},"11":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"12":{"start":{"line":25,"column":31},"end":{"line":25,"column":50}},"13":{"start":{"line":26,"column":12},"end":{"line":26,"column":null}},"14":{"start":{"line":27,"column":12},"end":{"line":27,"column":null}},"15":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":31}},"loc":{"start":{"line":8,"column":75},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":11},"end":{"line":10,"column":17}},"loc":{"start":{"line":10,"column":38},"end":{"line":29,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":3,"5":3,"6":3,"7":3,"8":3,"9":1,"10":2,"11":1,"12":1,"13":1,"14":1,"15":1},"f":{"0":3,"1":3},"b":{"0":[1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":10,"column":16},"end":{"line":10,"column":38}},"6":{"start":{"line":11,"column":16},"end":{"line":11,"column":46}},"7":{"start":{"line":12,"column":16},"end":{"line":12,"column":30}},"8":{"start":{"line":13,"column":16},"end":{"line":13,"column":38}},"9":{"start":{"line":18,"column":33},"end":{"line":18,"column":35}},"10":{"start":{"line":19,"column":37},"end":{"line":19,"column":39}},"11":{"start":{"line":23,"column":41},"end":{"line":24,"column":null}},"12":{"start":{"line":24,"column":27},"end":{"line":24,"column":75}},"13":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"14":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"15":{"start":{"line":32,"column":27},"end":{"line":32,"column":144}},"16":{"start":{"line":33,"column":27},"end":{"line":33,"column":70}},"17":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"18":{"start":{"line":39,"column":12},"end":{"line":39,"column":null}},"19":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"20":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"21":{"start":{"line":51,"column":16},"end":{"line":55,"column":null}},"22":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"23":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"24":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"25":{"start":{"line":62,"column":65},"end":{"line":62,"column":null}},"26":{"start":{"line":66,"column":20},"end":{"line":66,"column":null}},"27":{"start":{"line":66,"column":64},"end":{"line":66,"column":null}},"28":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"29":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"30":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"31":{"start":{"line":81,"column":12},"end":{"line":85,"column":null}},"32":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"33":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"34":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":13,"column":38},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":39},"end":{"line":89,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":24,"column":13},"end":{"line":24,"column":22}},"loc":{"start":{"line":24,"column":27},"end":{"line":24,"column":75}}}},"branchMap":{"0":{"loc":{"start":{"line":50,"column":16},"end":{"line":50,"column":146}},"type":"binary-expr","locations":[{"start":{"line":50,"column":16},"end":{"line":50,"column":63}},{"start":{"line":50,"column":67},"end":{"line":50,"column":146}}]},"1":{"loc":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":16},"end":{"line":62,"column":null}}]},"2":{"loc":{"start":{"line":66,"column":20},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":20},"end":{"line":66,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0],"2":[0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":17,"column":33},"end":{"line":17,"column":35}},"8":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"9":{"start":{"line":23,"column":34},"end":{"line":23,"column":85}},"10":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"11":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"12":{"start":{"line":32,"column":16},"end":{"line":32,"column":null}},"13":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"14":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"15":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"16":{"start":{"line":47,"column":30},"end":{"line":47,"column":88}},"17":{"start":{"line":49,"column":32},"end":{"line":49,"column":98}},"18":{"start":{"line":51,"column":42},"end":{"line":55,"column":null}},"19":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"20":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"21":{"start":{"line":67,"column":49},"end":{"line":67,"column":97}},"22":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"23":{"start":{"line":70,"column":18},"end":{"line":70,"column":38}},"24":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"25":{"start":{"line":75,"column":35},"end":{"line":75,"column":87}},"26":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"27":{"start":{"line":80,"column":38},"end":{"line":80,"column":115}},"28":{"start":{"line":82,"column":30},"end":{"line":82,"column":91}},"29":{"start":{"line":84,"column":32},"end":{"line":84,"column":101}},"30":{"start":{"line":86,"column":42},"end":{"line":90,"column":null}},"31":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"32":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"33":{"start":{"line":102,"column":49},"end":{"line":102,"column":97}},"34":{"start":{"line":103,"column":8},"end":{"line":103,"column":null}},"35":{"start":{"line":105,"column":8},"end":{"line":109,"column":null}},"36":{"start":{"line":111,"column":38},"end":{"line":111,"column":112}},"37":{"start":{"line":113,"column":30},"end":{"line":113,"column":88}},"38":{"start":{"line":115,"column":32},"end":{"line":115,"column":98}},"39":{"start":{"line":117,"column":42},"end":{"line":121,"column":null}},"40":{"start":{"line":123,"column":8},"end":{"line":123,"column":null}},"41":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"42":{"start":{"line":138,"column":12},"end":{"line":138,"column":null}},"43":{"start":{"line":140,"column":12},"end":{"line":140,"column":null}},"44":{"start":{"line":143,"column":34},"end":{"line":146,"column":10}},"45":{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},"46":{"start":{"line":149,"column":12},"end":{"line":149,"column":null}},"47":{"start":{"line":150,"column":41},"end":{"line":150,"column":85}},"48":{"start":{"line":151,"column":12},"end":{"line":151,"column":null}},"49":{"start":{"line":152,"column":12},"end":{"line":152,"column":null}},"50":{"start":{"line":153,"column":15},"end":{"line":153,"column":null}},"51":{"start":{"line":162,"column":8},"end":{"line":165,"column":null}},"52":{"start":{"line":163,"column":30},"end":{"line":163,"column":52}},"53":{"start":{"line":164,"column":12},"end":{"line":164,"column":null}},"54":{"start":{"line":167,"column":22},"end":{"line":167,"column":96}},"55":{"start":{"line":168,"column":33},"end":{"line":174,"column":10}},"56":{"start":{"line":169,"column":42},"end":{"line":169,"column":80}},"57":{"start":{"line":170,"column":26},"end":{"line":170,"column":47}},"58":{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},"59":{"start":{"line":172,"column":25},"end":{"line":172,"column":40}},"60":{"start":{"line":173,"column":17},"end":{"line":173,"column":null}},"61":{"start":{"line":177,"column":39},"end":{"line":177,"column":60}},"62":{"start":{"line":178,"column":36},"end":{"line":178,"column":56}},"63":{"start":{"line":180,"column":8},"end":{"line":180,"column":null}},"64":{"start":{"line":180,"column":44},"end":{"line":180,"column":76}},"65":{"start":{"line":188,"column":8},"end":{"line":190,"column":null}},"66":{"start":{"line":189,"column":12},"end":{"line":189,"column":null}},"67":{"start":{"line":189,"column":42},"end":{"line":189,"column":null}},"68":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"69":{"start":{"line":202,"column":12},"end":{"line":204,"column":null}},"70":{"start":{"line":205,"column":12},"end":{"line":205,"column":null}},"71":{"start":{"line":210,"column":21},"end":{"line":210,"column":23}},"72":{"start":{"line":211,"column":25},"end":{"line":211,"column":89}},"73":{"start":{"line":212,"column":31},"end":{"line":212,"column":48}},"74":{"start":{"line":213,"column":21},"end":{"line":213,"column":22}},"75":{"start":{"line":214,"column":12},"end":{"line":214,"column":null}},"76":{"start":{"line":216,"column":8},"end":{"line":216,"column":null}},"77":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":98},"end":{"line":40,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":46,"column":12},"end":{"line":46,"column":19}},"loc":{"start":{"line":46,"column":83},"end":{"line":60,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":19}},"loc":{"start":{"line":66,"column":69},"end":{"line":95,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":101,"column":12},"end":{"line":101,"column":19}},"loc":{"start":{"line":101,"column":69},"end":{"line":126,"column":null}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":135,"column":11},"end":{"line":135,"column":18}},"loc":{"start":{"line":135,"column":80},"end":{"line":154,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":160,"column":12},"end":{"line":160,"column":19}},"loc":{"start":{"line":160,"column":56},"end":{"line":181,"column":null}}},"6":{"name":"(anonymous_12)","decl":{"start":{"line":162,"column":38},"end":{"line":162,"column":46}},"loc":{"start":{"line":162,"column":50},"end":{"line":165,"column":9}}},"7":{"name":"(anonymous_13)","decl":{"start":{"line":168,"column":48},"end":{"line":168,"column":56}},"loc":{"start":{"line":168,"column":60},"end":{"line":174,"column":9}}},"8":{"name":"(anonymous_14)","decl":{"start":{"line":180,"column":31},"end":{"line":180,"column":39}},"loc":{"start":{"line":180,"column":44},"end":{"line":180,"column":76}}},"9":{"name":"(anonymous_15)","decl":{"start":{"line":187,"column":12},"end":{"line":187,"column":19}},"loc":{"start":{"line":187,"column":70},"end":{"line":191,"column":null}}},"10":{"name":"(anonymous_16)","decl":{"start":{"line":188,"column":50},"end":{"line":188,"column":58}},"loc":{"start":{"line":188,"column":62},"end":{"line":190,"column":9}}},"11":{"name":"(anonymous_17)","decl":{"start":{"line":198,"column":11},"end":{"line":198,"column":18}},"loc":{"start":{"line":198,"column":98},"end":{"line":207,"column":null}}},"12":{"name":"(anonymous_18)","decl":{"start":{"line":209,"column":12},"end":{"line":209,"column":19}},"loc":{"start":{"line":209,"column":38},"end":{"line":217,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},{"start":{"line":153,"column":15},"end":{"line":153,"column":null}}]},"1":{"loc":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"type":"binary-expr","locations":[{"start":{"line":148,"column":12},"end":{"line":148,"column":24}},{"start":{"line":148,"column":28},"end":{"line":148,"column":48}}]},"2":{"loc":{"start":{"line":164,"column":19},"end":{"line":164,"column":51}},"type":"binary-expr","locations":[{"start":{"line":164,"column":19},"end":{"line":164,"column":33}},{"start":{"line":164,"column":37},"end":{"line":164,"column":51}}]},"3":{"loc":{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},{"start":{"line":173,"column":17},"end":{"line":173,"column":null}}]},"4":{"loc":{"start":{"line":189,"column":12},"end":{"line":189,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":12},"end":{"line":189,"column":null}}]},"5":{"loc":{"start":{"line":199,"column":12},"end":{"line":199,"column":64}},"type":"binary-expr","locations":[{"start":{"line":199,"column":12},"end":{"line":199,"column":34}},{"start":{"line":199,"column":38},"end":{"line":199,"column":64}}]},"6":{"loc":{"start":{"line":201,"column":19},"end":{"line":201,"column":70}},"type":"binary-expr","locations":[{"start":{"line":201,"column":19},"end":{"line":201,"column":41}},{"start":{"line":201,"column":45},"end":{"line":201,"column":70}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":3,"46":1,"47":1,"48":1,"49":1,"50":2,"51":1,"52":4,"53":4,"54":1,"55":1,"56":4,"57":4,"58":4,"59":4,"60":0,"61":1,"62":1,"63":1,"64":4,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":3,"5":1,"6":4,"7":4,"8":4,"9":0,"10":0,"11":0,"12":0},"b":{"0":[1,2],"1":[3,2],"2":[4,1],"3":[4,0],"4":[0],"5":[0,0],"6":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts","statementMap":{"0":{"start":{"line":2,"column":13},"end":{"line":18,"column":null}},"1":{"start":{"line":22,"column":13},"end":{"line":38,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/Git.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/Git.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":12},"end":{"line":5,"column":26}},"5":{"start":{"line":14,"column":32},"end":{"line":14,"column":51}},"6":{"start":{"line":14,"column":61},"end":{"line":14,"column":76}},"7":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"8":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"9":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"10":{"start":{"line":19,"column":12},"end":{"line":19,"column":null}},"11":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"12":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"14":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":24},"end":{"line":37,"column":52}},"16":{"start":{"line":39,"column":29},"end":{"line":39,"column":50}},"17":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"18":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"19":{"start":{"line":46,"column":25},"end":{"line":46,"column":54}},"20":{"start":{"line":48,"column":29},"end":{"line":48,"column":51}},"21":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"22":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"23":{"start":{"line":55,"column":27},"end":{"line":55,"column":55}},"24":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"25":{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},"26":{"start":{"line":63,"column":12},"end":{"line":63,"column":null}},"27":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"28":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"29":{"start":{"line":68,"column":15},"end":{"line":68,"column":null}},"30":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"31":{"start":{"line":70,"column":30},"end":{"line":70,"column":null}},"32":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"33":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"34":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"35":{"start":{"line":79,"column":12},"end":{"line":79,"column":null}},"36":{"start":{"line":80,"column":12},"end":{"line":80,"column":null}},"37":{"start":{"line":82,"column":12},"end":{"line":85,"column":null}},"38":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"39":{"start":{"line":91,"column":19},"end":{"line":91,"column":46}},"40":{"start":{"line":94,"column":16},"end":{"line":94,"column":null}},"41":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"42":{"start":{"line":100,"column":18},"end":{"line":100,"column":null}},"43":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"44":{"start":{"line":107,"column":16},"end":{"line":107,"column":null}},"45":{"start":{"line":109,"column":33},"end":{"line":109,"column":77}},"46":{"start":{"line":110,"column":16},"end":{"line":110,"column":null}},"47":{"start":{"line":113,"column":12},"end":{"line":116,"column":null}},"48":{"start":{"line":117,"column":12},"end":{"line":117,"column":null}},"49":{"start":{"line":122,"column":31},"end":{"line":122,"column":62}},"50":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}},"51":{"start":{"line":124,"column":49},"end":{"line":124,"column":70}},"52":{"start":{"line":128,"column":40},"end":{"line":128,"column":76}},"53":{"start":{"line":130,"column":8},"end":{"line":130,"column":null}},"54":{"start":{"line":131,"column":22},"end":{"line":131,"column":52}},"55":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"56":{"start":{"line":137,"column":18},"end":{"line":137,"column":42}},"57":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"58":{"start":{"line":139,"column":8},"end":{"line":139,"column":null}},"59":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"60":{"start":{"line":142,"column":8},"end":{"line":142,"column":null}},"61":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"62":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"63":{"start":{"line":148,"column":12},"end":{"line":148,"column":null}},"64":{"start":{"line":151,"column":8},"end":{"line":155,"column":null}},"65":{"start":{"line":156,"column":8},"end":{"line":156,"column":null}},"66":{"start":{"line":160,"column":18},"end":{"line":160,"column":45}},"67":{"start":{"line":161,"column":24},"end":{"line":161,"column":60}},"68":{"start":{"line":163,"column":12},"end":{"line":163,"column":null}},"69":{"start":{"line":165,"column":8},"end":{"line":165,"column":null}},"70":{"start":{"line":166,"column":8},"end":{"line":166,"column":null}},"71":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"72":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"73":{"start":{"line":174,"column":35},"end":{"line":174,"column":null}},"74":{"start":{"line":181,"column":8},"end":{"line":181,"column":null}},"75":{"start":{"line":185,"column":12},"end":{"line":185,"column":null}},"76":{"start":{"line":190,"column":8},"end":{"line":190,"column":null}},"77":{"start":{"line":190,"column":21},"end":{"line":190,"column":null}},"78":{"start":{"line":191,"column":8},"end":{"line":191,"column":null}},"79":{"start":{"line":193,"column":12},"end":{"line":193,"column":null}},"80":{"start":{"line":194,"column":12},"end":{"line":194,"column":null}},"81":{"start":{"line":198,"column":12},"end":{"line":198,"column":null}},"82":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"83":{"start":{"line":205,"column":8},"end":{"line":205,"column":null}},"84":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"85":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"86":{"start":{"line":214,"column":12},"end":{"line":214,"column":null}},"87":{"start":{"line":215,"column":15},"end":{"line":215,"column":null}},"88":{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},"89":{"start":{"line":220,"column":12},"end":{"line":220,"column":null}},"90":{"start":{"line":221,"column":15},"end":{"line":221,"column":null}},"91":{"start":{"line":226,"column":12},"end":{"line":226,"column":null}},"92":{"start":{"line":227,"column":12},"end":{"line":227,"column":null}},"93":{"start":{"line":229,"column":12},"end":{"line":229,"column":null}},"94":{"start":{"line":230,"column":12},"end":{"line":230,"column":null}},"95":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"96":{"start":{"line":238,"column":16},"end":{"line":238,"column":null}},"97":{"start":{"line":240,"column":16},"end":{"line":240,"column":null}},"98":{"start":{"line":243,"column":12},"end":{"line":243,"column":null}},"99":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":32}},"loc":{"start":{"line":14,"column":76},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":10}},"loc":{"start":{"line":24,"column":15},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":4},"end":{"line":28,"column":10}},"loc":{"start":{"line":28,"column":23},"end":{"line":30,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":10}},"loc":{"start":{"line":32,"column":32},"end":{"line":34,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":10}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":10}},"loc":{"start":{"line":45,"column":32},"end":{"line":52,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":54,"column":4},"end":{"line":54,"column":10}},"loc":{"start":{"line":54,"column":31},"end":{"line":58,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":60,"column":11},"end":{"line":60,"column":17}},"loc":{"start":{"line":60,"column":62},"end":{"line":73,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":75,"column":11},"end":{"line":75,"column":17}},"loc":{"start":{"line":75,"column":100},"end":{"line":88,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":90,"column":4},"end":{"line":90,"column":10}},"loc":{"start":{"line":90,"column":34},"end":{"line":97,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":99,"column":4},"end":{"line":99,"column":10}},"loc":{"start":{"line":99,"column":36},"end":{"line":101,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":103,"column":4},"end":{"line":103,"column":10}},"loc":{"start":{"line":103,"column":80},"end":{"line":119,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":121,"column":11},"end":{"line":121,"column":17}},"loc":{"start":{"line":121,"column":46},"end":{"line":125,"column":null}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":124,"column":40},"end":{"line":124,"column":44}},"loc":{"start":{"line":124,"column":49},"end":{"line":124,"column":70}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":127,"column":4},"end":{"line":127,"column":17}},"loc":{"start":{"line":127,"column":95},"end":{"line":157,"column":null}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":159,"column":4},"end":{"line":159,"column":17}},"loc":{"start":{"line":159,"column":66},"end":{"line":167,"column":null}}},"16":{"name":"(anonymous_23)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":28}},"loc":{"start":{"line":169,"column":28},"end":{"line":171,"column":null}}},"17":{"name":"(anonymous_24)","decl":{"start":{"line":173,"column":4},"end":{"line":173,"column":10}},"loc":{"start":{"line":173,"column":30},"end":{"line":175,"column":null}}},"18":{"name":"(anonymous_25)","decl":{"start":{"line":177,"column":4},"end":{"line":177,"column":10}},"loc":{"start":{"line":177,"column":39},"end":{"line":187,"column":null}}},"19":{"name":"(anonymous_26)","decl":{"start":{"line":189,"column":4},"end":{"line":189,"column":10}},"loc":{"start":{"line":189,"column":55},"end":{"line":202,"column":null}}},"20":{"name":"(anonymous_27)","decl":{"start":{"line":204,"column":4},"end":{"line":204,"column":20}},"loc":{"start":{"line":204,"column":20},"end":{"line":206,"column":null}}},"21":{"name":"(anonymous_28)","decl":{"start":{"line":208,"column":4},"end":{"line":208,"column":10}},"loc":{"start":{"line":208,"column":28},"end":{"line":210,"column":null}}},"22":{"name":"(anonymous_29)","decl":{"start":{"line":212,"column":4},"end":{"line":212,"column":10}},"loc":{"start":{"line":212,"column":55},"end":{"line":216,"column":null}}},"23":{"name":"(anonymous_30)","decl":{"start":{"line":218,"column":4},"end":{"line":218,"column":10}},"loc":{"start":{"line":218,"column":73},"end":{"line":222,"column":null}}},"24":{"name":"(anonymous_31)","decl":{"start":{"line":224,"column":4},"end":{"line":224,"column":10}},"loc":{"start":{"line":224,"column":40},"end":{"line":232,"column":null}}},"25":{"name":"(anonymous_32)","decl":{"start":{"line":233,"column":4},"end":{"line":233,"column":10}},"loc":{"start":{"line":233,"column":37},"end":{"line":245,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},{"start":{"line":68,"column":15},"end":{"line":68,"column":null}}]},"1":{"loc":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":8},"end":{"line":70,"column":null}}]},"2":{"loc":{"start":{"line":75,"column":51},"end":{"line":75,"column":100}},"type":"default-arg","locations":[{"start":{"line":75,"column":61},"end":{"line":75,"column":100}}]},"3":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":null}}]},"4":{"loc":{"start":{"line":124,"column":15},"end":{"line":124,"column":86}},"type":"cond-expr","locations":[{"start":{"line":124,"column":74},"end":{"line":124,"column":78}},{"start":{"line":124,"column":81},"end":{"line":124,"column":86}}]},"5":{"loc":{"start":{"line":152,"column":83},"end":{"line":152,"column":113}},"type":"cond-expr","locations":[{"start":{"line":152,"column":95},"end":{"line":152,"column":104}},{"start":{"line":152,"column":107},"end":{"line":152,"column":113}}]},"6":{"loc":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":8},"end":{"line":174,"column":null}}]},"7":{"loc":{"start":{"line":190,"column":8},"end":{"line":190,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":8},"end":{"line":190,"column":null}}]},"8":{"loc":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"type":"if","locations":[{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},{"start":{"line":215,"column":15},"end":{"line":215,"column":null}}]},"9":{"loc":{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},"type":"if","locations":[{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},{"start":{"line":221,"column":15},"end":{"line":221,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0],"7":[0],"8":[0,0],"9":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":12},"end":{"line":8,"column":19}},"7":{"start":{"line":22,"column":23},"end":{"line":22,"column":34}},"8":{"start":{"line":31,"column":27},"end":{"line":31,"column":75}},"9":{"start":{"line":32,"column":21},"end":{"line":32,"column":51}},"10":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"11":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"12":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":27},"end":{"line":39,"column":71}},"14":{"start":{"line":40,"column":25},"end":{"line":40,"column":32}},"15":{"start":{"line":41,"column":20},"end":{"line":41,"column":48}},"16":{"start":{"line":42,"column":21},"end":{"line":42,"column":22}},"17":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"18":{"start":{"line":43,"column":33},"end":{"line":43,"column":null}},"19":{"start":{"line":44,"column":25},"end":{"line":44,"column":45}},"20":{"start":{"line":45,"column":26},"end":{"line":45,"column":35}},"21":{"start":{"line":46,"column":30},"end":{"line":46,"column":54}},"22":{"start":{"line":47,"column":31},"end":{"line":50,"column":null}},"23":{"start":{"line":51,"column":12},"end":{"line":51,"column":null}},"24":{"start":{"line":53,"column":8},"end":{"line":53,"column":null}},"25":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"26":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"27":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"28":{"start":{"line":66,"column":14},"end":{"line":66,"column":16}},"29":{"start":{"line":67,"column":8},"end":{"line":71,"column":null}},"30":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"31":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"32":{"start":{"line":74,"column":10},"end":{"line":74,"column":null}},"33":{"start":{"line":76,"column":31},"end":{"line":76,"column":43}},"34":{"start":{"line":77,"column":21},"end":{"line":77,"column":22}},"35":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"36":{"start":{"line":79,"column":26},"end":{"line":79,"column":37}},"37":{"start":{"line":81,"column":12},"end":{"line":85,"column":null}},"38":{"start":{"line":87,"column":29},"end":{"line":87,"column":66}},"39":{"start":{"line":89,"column":32},"end":{"line":89,"column":55}},"40":{"start":{"line":92,"column":16},"end":{"line":92,"column":null}},"41":{"start":{"line":95,"column":25},"end":{"line":95,"column":26}},"42":{"start":{"line":96,"column":29},"end":{"line":96,"column":62}},"43":{"start":{"line":97,"column":16},"end":{"line":97,"column":null}},"44":{"start":{"line":99,"column":20},"end":{"line":99,"column":null}},"45":{"start":{"line":102,"column":30},"end":{"line":102,"column":79}},"46":{"start":{"line":103,"column":12},"end":{"line":103,"column":null}},"47":{"start":{"line":108,"column":8},"end":{"line":108,"column":null}},"48":{"start":{"line":110,"column":12},"end":{"line":110,"column":null}},"49":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"50":{"start":{"line":114,"column":8},"end":{"line":119,"column":null}},"51":{"start":{"line":115,"column":32},"end":{"line":115,"column":41}},"52":{"start":{"line":117,"column":16},"end":{"line":117,"column":null}},"53":{"start":{"line":123,"column":26},"end":{"line":126,"column":null}},"54":{"start":{"line":130,"column":12},"end":{"line":130,"column":null}},"55":{"start":{"line":133,"column":12},"end":{"line":133,"column":null}},"56":{"start":{"line":137,"column":12},"end":{"line":137,"column":null}},"57":{"start":{"line":141,"column":12},"end":{"line":141,"column":null}},"58":{"start":{"line":145,"column":12},"end":{"line":161,"column":null}},"59":{"start":{"line":146,"column":28},"end":{"line":146,"column":33}},"60":{"start":{"line":147,"column":29},"end":{"line":147,"column":30}},"61":{"start":{"line":148,"column":32},"end":{"line":148,"column":40}},"62":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"63":{"start":{"line":154,"column":24},"end":{"line":154,"column":null}},"64":{"start":{"line":155,"column":24},"end":{"line":155,"column":null}},"65":{"start":{"line":159,"column":20},"end":{"line":159,"column":null}},"66":{"start":{"line":165,"column":31},"end":{"line":167,"column":14}},"67":{"start":{"line":166,"column":16},"end":{"line":166,"column":null}},"68":{"start":{"line":170,"column":16},"end":{"line":170,"column":null}},"69":{"start":{"line":173,"column":8},"end":{"line":173,"column":null}},"70":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":11},"end":{"line":30,"column":17}},"loc":{"start":{"line":30,"column":80},"end":{"line":34,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":36,"column":11},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":75},"end":{"line":54,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":56,"column":11},"end":{"line":56,"column":17}},"loc":{"start":{"line":56,"column":80},"end":{"line":105,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":67,"column":40},"end":{"line":67,"column":44}},"loc":{"start":{"line":67,"column":48},"end":{"line":71,"column":9}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":107,"column":11},"end":{"line":107,"column":17}},"loc":{"start":{"line":107,"column":84},"end":{"line":120,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":114,"column":40},"end":{"line":114,"column":44}},"loc":{"start":{"line":114,"column":48},"end":{"line":119,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":122,"column":11},"end":{"line":122,"column":28}},"loc":{"start":{"line":122,"column":68},"end":{"line":174,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":145,"column":27},"end":{"line":145,"column":32}},"loc":{"start":{"line":145,"column":36},"end":{"line":161,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":165,"column":62},"end":{"line":165,"column":72}},"loc":{"start":{"line":165,"column":100},"end":{"line":167,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":null}}]},"1":{"loc":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":74,"column":null}}]},"2":{"loc":{"start":{"line":129,"column":12},"end":{"line":129,"column":52}},"type":"binary-expr","locations":[{"start":{"line":129,"column":12},"end":{"line":129,"column":27}},{"start":{"line":129,"column":31},"end":{"line":129,"column":52}}]},"3":{"loc":{"start":{"line":132,"column":12},"end":{"line":132,"column":52}},"type":"binary-expr","locations":[{"start":{"line":132,"column":12},"end":{"line":132,"column":27}},{"start":{"line":132,"column":31},"end":{"line":132,"column":52}}]},"4":{"loc":{"start":{"line":136,"column":12},"end":{"line":136,"column":65}},"type":"binary-expr","locations":[{"start":{"line":136,"column":12},"end":{"line":136,"column":26}},{"start":{"line":136,"column":30},"end":{"line":136,"column":45}},{"start":{"line":136,"column":49},"end":{"line":136,"column":65}}]},"5":{"loc":{"start":{"line":140,"column":12},"end":{"line":140,"column":65}},"type":"binary-expr","locations":[{"start":{"line":140,"column":12},"end":{"line":140,"column":26}},{"start":{"line":140,"column":30},"end":{"line":140,"column":45}},{"start":{"line":140,"column":49},"end":{"line":140,"column":65}}]},"6":{"loc":{"start":{"line":144,"column":12},"end":{"line":144,"column":46}},"type":"binary-expr","locations":[{"start":{"line":144,"column":12},"end":{"line":144,"column":27}},{"start":{"line":144,"column":31},"end":{"line":144,"column":46}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0,0],"4":[0,0,0],"5":[0,0,0],"6":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts","statementMap":{"0":{"start":{"line":4,"column":24},"end":{"line":4,"column":38}},"1":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":8},"end":{"line":8,"column":null}},"3":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"4":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"6":{"start":{"line":27,"column":12},"end":{"line":27,"column":null}},"7":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"8":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"9":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"loc":{"start":{"line":4,"column":38},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":10}},"loc":{"start":{"line":6,"column":29},"end":{"line":9,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":12},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":29},"end":{"line":21,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":18}},"loc":{"start":{"line":23,"column":26},"end":{"line":33,"column":null}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitTags.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitTags.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":5,"column":24},"end":{"line":5,"column":32}},"2":{"start":{"line":5,"column":42},"end":{"line":5,"column":62}},"3":{"start":{"line":14,"column":29},"end":{"line":19,"column":10}},"4":{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},"5":{"start":{"line":21,"column":29},"end":{"line":21,"column":71}},"6":{"start":{"line":22,"column":13},"end":{"line":22,"column":null}},"7":{"start":{"line":27,"column":32},"end":{"line":27,"column":92}},"8":{"start":{"line":32,"column":35},"end":{"line":36,"column":10}},"9":{"start":{"line":38,"column":29},"end":{"line":38,"column":60}},"10":{"start":{"line":40,"column":32},"end":{"line":40,"column":58}},"11":{"start":{"line":41,"column":8},"end":{"line":41,"column":22}},"12":{"start":{"line":45,"column":48},"end":{"line":45,"column":117}},"13":{"start":{"line":45,"column":75},"end":{"line":45,"column":116}},"14":{"start":{"line":48,"column":8},"end":{"line":50,"column":null}},"15":{"start":{"line":49,"column":40},"end":{"line":49,"column":116}},"16":{"start":{"line":53,"column":45},"end":{"line":53,"column":104}},"17":{"start":{"line":53,"column":66},"end":{"line":53,"column":103}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"19":{"start":{"line":61,"column":19},"end":{"line":61,"column":48}},"20":{"start":{"line":62,"column":24},"end":{"line":62,"column":34}},"21":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"22":{"start":{"line":64,"column":42},"end":{"line":65,"column":null}},"23":{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},"24":{"start":{"line":67,"column":23},"end":{"line":67,"column":96}},"25":{"start":{"line":68,"column":17},"end":{"line":68,"column":null}},"26":{"start":{"line":69,"column":15},"end":{"line":69,"column":null}},"27":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"28":{"start":{"line":75,"column":23},"end":{"line":75,"column":54}},"29":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"30":{"start":{"line":82,"column":12},"end":{"line":85,"column":null}},"31":{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},"32":{"start":{"line":83,"column":39},"end":{"line":83,"column":70}},"33":{"start":{"line":84,"column":21},"end":{"line":84,"column":null}},"34":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"35":{"start":{"line":93,"column":22},"end":{"line":93,"column":51}},"36":{"start":{"line":96,"column":12},"end":{"line":96,"column":null}},"37":{"start":{"line":99,"column":31},"end":{"line":99,"column":69}},"38":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"39":{"start":{"line":105,"column":33},"end":{"line":105,"column":62}},"40":{"start":{"line":109,"column":12},"end":{"line":109,"column":null}},"41":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"42":{"start":{"line":115,"column":12},"end":{"line":115,"column":null}},"43":{"start":{"line":118,"column":29},"end":{"line":118,"column":70}},"44":{"start":{"line":120,"column":29},"end":{"line":129,"column":12}},"45":{"start":{"line":122,"column":41},"end":{"line":122,"column":58}},"46":{"start":{"line":123,"column":30},"end":{"line":123,"column":56}},"47":{"start":{"line":124,"column":12},"end":{"line":124,"column":null}},"48":{"start":{"line":127,"column":33},"end":{"line":127,"column":75}},"49":{"start":{"line":128,"column":12},"end":{"line":128,"column":null}},"50":{"start":{"line":131,"column":8},"end":{"line":131,"column":null}},"51":{"start":{"line":131,"column":39},"end":{"line":131,"column":47}},"52":{"start":{"line":135,"column":53},"end":{"line":135,"column":55}},"53":{"start":{"line":138,"column":8},"end":{"line":143,"column":null}},"54":{"start":{"line":139,"column":8},"end":{"line":142,"column":null}},"55":{"start":{"line":141,"column":40},"end":{"line":141,"column":70}},"56":{"start":{"line":146,"column":37},"end":{"line":146,"column":73}},"57":{"start":{"line":147,"column":34},"end":{"line":147,"column":105}},"58":{"start":{"line":147,"column":75},"end":{"line":147,"column":104}},"59":{"start":{"line":148,"column":8},"end":{"line":148,"column":null}},"60":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":24}},"loc":{"start":{"line":5,"column":62},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":10}},"loc":{"start":{"line":13,"column":26},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"loc":{"start":{"line":25,"column":56},"end":{"line":56,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":64},"end":{"line":45,"column":70}},"loc":{"start":{"line":45,"column":75},"end":{"line":45,"column":116}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":13},"end":{"line":49,"column":35}},"loc":{"start":{"line":49,"column":40},"end":{"line":49,"column":116}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":53,"column":58},"end":{"line":53,"column":61}},"loc":{"start":{"line":53,"column":66},"end":{"line":53,"column":103}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":11},"end":{"line":58,"column":17}},"loc":{"start":{"line":58,"column":40},"end":{"line":72,"column":null}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":74,"column":12},"end":{"line":74,"column":47}},"loc":{"start":{"line":74,"column":76},"end":{"line":89,"column":null}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":51},"end":{"line":82,"column":52}},"loc":{"start":{"line":82,"column":85},"end":{"line":85,"column":13}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":92,"column":11},"end":{"line":92,"column":17}},"loc":{"start":{"line":92,"column":40},"end":{"line":101,"column":null}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":104,"column":11},"end":{"line":104,"column":17}},"loc":{"start":{"line":104,"column":67},"end":{"line":132,"column":null}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":121,"column":15},"end":{"line":121,"column":21}},"loc":{"start":{"line":121,"column":24},"end":{"line":125,"column":11}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":126,"column":18},"end":{"line":126,"column":21}},"loc":{"start":{"line":126,"column":24},"end":{"line":129,"column":11}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":131,"column":32},"end":{"line":131,"column":35}},"loc":{"start":{"line":131,"column":39},"end":{"line":131,"column":47}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":134,"column":12},"end":{"line":134,"column":18}},"loc":{"start":{"line":134,"column":54},"end":{"line":149,"column":null}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":138,"column":22},"end":{"line":138,"column":33}},"loc":{"start":{"line":138,"column":37},"end":{"line":143,"column":9}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":141,"column":19},"end":{"line":141,"column":35}},"loc":{"start":{"line":141,"column":40},"end":{"line":141,"column":70}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":147,"column":43},"end":{"line":147,"column":44}},"loc":{"start":{"line":147,"column":75},"end":{"line":147,"column":104}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},{"start":{"line":22,"column":13},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},{"start":{"line":69,"column":15},"end":{"line":69,"column":null}}]},"2":{"loc":{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},{"start":{"line":68,"column":17},"end":{"line":68,"column":null}}]},"3":{"loc":{"start":{"line":77,"column":12},"end":{"line":77,"column":65}},"type":"binary-expr","locations":[{"start":{"line":77,"column":12},"end":{"line":77,"column":32}},{"start":{"line":77,"column":36},"end":{"line":77,"column":65}}]},"4":{"loc":{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},{"start":{"line":84,"column":21},"end":{"line":84,"column":null}}]},"5":{"loc":{"start":{"line":128,"column":19},"end":{"line":128,"column":56}},"type":"binary-expr","locations":[{"start":{"line":128,"column":19},"end":{"line":128,"column":27}},{"start":{"line":128,"column":31},"end":{"line":128,"column":56}}]}},"s":{"0":1,"1":3,"2":3,"3":3,"4":3,"5":2,"6":1,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":24,"14":2,"15":8,"16":2,"17":8,"18":2,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1},"f":{"0":3,"1":3,"2":2,"3":24,"4":8,"5":8,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"b":{"0":[2,1],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"8":{"start":{"line":11,"column":12},"end":{"line":11,"column":19}},"9":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":24,"column":23},"end":{"line":24,"column":25}},"12":{"start":{"line":25,"column":27},"end":{"line":25,"column":65}},"13":{"start":{"line":26,"column":28},"end":{"line":26,"column":47}},"14":{"start":{"line":27,"column":28},"end":{"line":27,"column":91}},"15":{"start":{"line":29,"column":29},"end":{"line":29,"column":68}},"16":{"start":{"line":30,"column":28},"end":{"line":30,"column":81}},"17":{"start":{"line":31,"column":12},"end":{"line":31,"column":null}},"18":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"19":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"20":{"start":{"line":38,"column":23},"end":{"line":38,"column":25}},"21":{"start":{"line":39,"column":27},"end":{"line":39,"column":65}},"22":{"start":{"line":40,"column":28},"end":{"line":40,"column":47}},"23":{"start":{"line":41,"column":28},"end":{"line":41,"column":91}},"24":{"start":{"line":43,"column":29},"end":{"line":43,"column":68}},"25":{"start":{"line":44,"column":28},"end":{"line":44,"column":67}},"26":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"27":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"28":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"29":{"start":{"line":53,"column":21},"end":{"line":53,"column":25}},"30":{"start":{"line":54,"column":28},"end":{"line":54,"column":47}},"31":{"start":{"line":55,"column":28},"end":{"line":55,"column":67}},"32":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"33":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"34":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"35":{"start":{"line":65,"column":28},"end":{"line":65,"column":47}},"36":{"start":{"line":66,"column":24},"end":{"line":66,"column":48}},"37":{"start":{"line":67,"column":28},"end":{"line":67,"column":83}},"38":{"start":{"line":68,"column":49},"end":{"line":68,"column":68}},"39":{"start":{"line":70,"column":29},"end":{"line":70,"column":57}},"40":{"start":{"line":71,"column":28},"end":{"line":71,"column":66}},"41":{"start":{"line":72,"column":12},"end":{"line":72,"column":null}},"42":{"start":{"line":74,"column":27},"end":{"line":74,"column":57}},"43":{"start":{"line":75,"column":28},"end":{"line":75,"column":72}},"44":{"start":{"line":76,"column":26},"end":{"line":76,"column":59}},"45":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"46":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"47":{"start":{"line":81,"column":16},"end":{"line":81,"column":null}},"48":{"start":{"line":83,"column":35},"end":{"line":83,"column":53}},"49":{"start":{"line":84,"column":34},"end":{"line":84,"column":51}},"50":{"start":{"line":85,"column":45},"end":{"line":85,"column":74}},"51":{"start":{"line":86,"column":47},"end":{"line":86,"column":72}},"52":{"start":{"line":88,"column":20},"end":{"line":88,"column":null}},"53":{"start":{"line":91,"column":35},"end":{"line":91,"column":52}},"54":{"start":{"line":92,"column":36},"end":{"line":92,"column":80}},"55":{"start":{"line":93,"column":34},"end":{"line":93,"column":67}},"56":{"start":{"line":94,"column":20},"end":{"line":94,"column":null}},"57":{"start":{"line":95,"column":36},"end":{"line":95,"column":58}},"58":{"start":{"line":97,"column":20},"end":{"line":97,"column":null}},"59":{"start":{"line":100,"column":35},"end":{"line":100,"column":48}},"60":{"start":{"line":101,"column":36},"end":{"line":101,"column":80}},"61":{"start":{"line":102,"column":34},"end":{"line":102,"column":67}},"62":{"start":{"line":103,"column":20},"end":{"line":103,"column":null}},"63":{"start":{"line":104,"column":36},"end":{"line":104,"column":58}},"64":{"start":{"line":106,"column":20},"end":{"line":106,"column":null}},"65":{"start":{"line":108,"column":36},"end":{"line":108,"column":76}},"66":{"start":{"line":109,"column":20},"end":{"line":109,"column":null}},"67":{"start":{"line":113,"column":8},"end":{"line":113,"column":null}},"68":{"start":{"line":117,"column":38},"end":{"line":117,"column":74}},"69":{"start":{"line":118,"column":19},"end":{"line":118,"column":45}},"70":{"start":{"line":120,"column":12},"end":{"line":174,"column":null}},"71":{"start":{"line":121,"column":28},"end":{"line":121,"column":33}},"72":{"start":{"line":123,"column":29},"end":{"line":123,"column":30}},"73":{"start":{"line":124,"column":32},"end":{"line":124,"column":37}},"74":{"start":{"line":126,"column":24},"end":{"line":126,"column":null}},"75":{"start":{"line":131,"column":24},"end":{"line":131,"column":null}},"76":{"start":{"line":135,"column":28},"end":{"line":135,"column":null}},"77":{"start":{"line":136,"column":28},"end":{"line":136,"column":null}},"78":{"start":{"line":139,"column":28},"end":{"line":139,"column":null}},"79":{"start":{"line":141,"column":39},"end":{"line":143,"column":null}},"80":{"start":{"line":147,"column":48},"end":{"line":147,"column":71}},"81":{"start":{"line":148,"column":49},"end":{"line":148,"column":80}},"82":{"start":{"line":149,"column":32},"end":{"line":149,"column":null}},"83":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"84":{"start":{"line":154,"column":24},"end":{"line":154,"column":null}},"85":{"start":{"line":155,"column":24},"end":{"line":155,"column":null}},"86":{"start":{"line":160,"column":39},"end":{"line":160,"column":57}},"87":{"start":{"line":163,"column":28},"end":{"line":163,"column":null}},"88":{"start":{"line":164,"column":28},"end":{"line":164,"column":null}},"89":{"start":{"line":167,"column":28},"end":{"line":167,"column":null}},"90":{"start":{"line":169,"column":39},"end":{"line":169,"column":90}},"91":{"start":{"line":170,"column":28},"end":{"line":170,"column":null}},"92":{"start":{"line":176,"column":12},"end":{"line":181,"column":null}},"93":{"start":{"line":178,"column":20},"end":{"line":178,"column":null}},"94":{"start":{"line":179,"column":20},"end":{"line":179,"column":null}},"95":{"start":{"line":186,"column":8},"end":{"line":186,"column":null}},"96":{"start":{"line":190,"column":35},"end":{"line":190,"column":119}},"97":{"start":{"line":190,"column":109},"end":{"line":190,"column":118}},"98":{"start":{"line":192,"column":12},"end":{"line":192,"column":null}},"99":{"start":{"line":194,"column":29},"end":{"line":197,"column":10}},"100":{"start":{"line":195,"column":42},"end":{"line":195,"column":74}},"101":{"start":{"line":196,"column":12},"end":{"line":196,"column":null}},"102":{"start":{"line":198,"column":8},"end":{"line":198,"column":null}},"103":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"104":{"start":{"line":210,"column":33},"end":{"line":210,"column":68}},"105":{"start":{"line":211,"column":34},"end":{"line":211,"column":76}},"106":{"start":{"line":212,"column":40},"end":{"line":212,"column":69}},"107":{"start":{"line":213,"column":32},"end":{"line":213,"column":92}},"108":{"start":{"line":215,"column":31},"end":{"line":215,"column":43}},"109":{"start":{"line":218,"column":12},"end":{"line":218,"column":null}},"110":{"start":{"line":221,"column":21},"end":{"line":221,"column":69}},"111":{"start":{"line":223,"column":12},"end":{"line":223,"column":null}},"112":{"start":{"line":227,"column":24},"end":{"line":227,"column":44}},"113":{"start":{"line":229,"column":16},"end":{"line":229,"column":null}},"114":{"start":{"line":230,"column":16},"end":{"line":230,"column":null}},"115":{"start":{"line":234,"column":23},"end":{"line":234,"column":48}},"116":{"start":{"line":237,"column":12},"end":{"line":237,"column":null}},"117":{"start":{"line":240,"column":28},"end":{"line":240,"column":47}},"118":{"start":{"line":243,"column":12},"end":{"line":243,"column":null}},"119":{"start":{"line":246,"column":21},"end":{"line":246,"column":22}},"120":{"start":{"line":247,"column":25},"end":{"line":247,"column":58}},"121":{"start":{"line":248,"column":12},"end":{"line":248,"column":null}},"122":{"start":{"line":250,"column":16},"end":{"line":250,"column":null}},"123":{"start":{"line":255,"column":36},"end":{"line":255,"column":38}},"124":{"start":{"line":257,"column":12},"end":{"line":257,"column":null}},"125":{"start":{"line":259,"column":28},"end":{"line":259,"column":52}},"126":{"start":{"line":260,"column":12},"end":{"line":260,"column":null}},"127":{"start":{"line":262,"column":20},"end":{"line":262,"column":51}},"128":{"start":{"line":263,"column":21},"end":{"line":263,"column":22}},"129":{"start":{"line":265,"column":34},"end":{"line":265,"column":58}},"130":{"start":{"line":266,"column":39},"end":{"line":266,"column":61}},"131":{"start":{"line":267,"column":16},"end":{"line":267,"column":null}},"132":{"start":{"line":268,"column":33},"end":{"line":268,"column":66}},"133":{"start":{"line":269,"column":16},"end":{"line":269,"column":null}},"134":{"start":{"line":276,"column":31},"end":{"line":276,"column":70}},"135":{"start":{"line":277,"column":36},"end":{"line":277,"column":104}},"136":{"start":{"line":278,"column":29},"end":{"line":278,"column":71}},"137":{"start":{"line":279,"column":29},"end":{"line":279,"column":74}},"138":{"start":{"line":281,"column":16},"end":{"line":281,"column":null}},"139":{"start":{"line":287,"column":12},"end":{"line":287,"column":null}},"140":{"start":{"line":288,"column":28},"end":{"line":288,"column":31}},"141":{"start":{"line":289,"column":37},"end":{"line":289,"column":39}},"142":{"start":{"line":290,"column":31},"end":{"line":290,"column":33}},"143":{"start":{"line":291,"column":25},"end":{"line":291,"column":26}},"144":{"start":{"line":292,"column":16},"end":{"line":292,"column":null}},"145":{"start":{"line":293,"column":16},"end":{"line":293,"column":null}},"146":{"start":{"line":295,"column":40},"end":{"line":295,"column":60}},"147":{"start":{"line":296,"column":45},"end":{"line":296,"column":69}},"148":{"start":{"line":297,"column":20},"end":{"line":297,"column":null}},"149":{"start":{"line":298,"column":20},"end":{"line":298,"column":null}},"150":{"start":{"line":299,"column":20},"end":{"line":299,"column":null}},"151":{"start":{"line":300,"column":20},"end":{"line":300,"column":null}},"152":{"start":{"line":301,"column":20},"end":{"line":301,"column":null}},"153":{"start":{"line":304,"column":28},"end":{"line":304,"column":null}},"154":{"start":{"line":307,"column":20},"end":{"line":307,"column":null}},"155":{"start":{"line":311,"column":16},"end":{"line":311,"column":null}},"156":{"start":{"line":314,"column":16},"end":{"line":314,"column":null}},"157":{"start":{"line":319,"column":12},"end":{"line":319,"column":null}},"158":{"start":{"line":320,"column":28},"end":{"line":320,"column":31}},"159":{"start":{"line":321,"column":25},"end":{"line":321,"column":26}},"160":{"start":{"line":322,"column":16},"end":{"line":322,"column":null}},"161":{"start":{"line":323,"column":16},"end":{"line":323,"column":null}},"162":{"start":{"line":325,"column":40},"end":{"line":325,"column":60}},"163":{"start":{"line":326,"column":45},"end":{"line":326,"column":69}},"164":{"start":{"line":327,"column":20},"end":{"line":327,"column":null}},"165":{"start":{"line":328,"column":20},"end":{"line":328,"column":null}},"166":{"start":{"line":332,"column":28},"end":{"line":332,"column":null}},"167":{"start":{"line":335,"column":20},"end":{"line":335,"column":null}},"168":{"start":{"line":339,"column":16},"end":{"line":339,"column":null}},"169":{"start":{"line":14,"column":18},"end":{"line":14,"column":null}},"170":{"start":{"line":13,"column":21},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"loc":{"start":{"line":16,"column":4},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":11}},"loc":{"start":{"line":23,"column":42},"end":{"line":36,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":11}},"loc":{"start":{"line":37,"column":55},"end":{"line":50,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":52,"column":11},"end":{"line":52,"column":18}},"loc":{"start":{"line":52,"column":65},"end":{"line":62,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":18}},"loc":{"start":{"line":63,"column":74},"end":{"line":114,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":116,"column":11},"end":{"line":116,"column":25}},"loc":{"start":{"line":116,"column":63},"end":{"line":183,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":120,"column":35},"end":{"line":120,"column":47}},"loc":{"start":{"line":120,"column":51},"end":{"line":174,"column":13}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":176,"column":26},"end":{"line":176,"column":29}},"loc":{"start":{"line":176,"column":33},"end":{"line":181,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":185,"column":11},"end":{"line":185,"column":18}},"loc":{"start":{"line":185,"column":35},"end":{"line":187,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":189,"column":11},"end":{"line":189,"column":17}},"loc":{"start":{"line":189,"column":50},"end":{"line":199,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":190,"column":100},"end":{"line":190,"column":104}},"loc":{"start":{"line":190,"column":109},"end":{"line":190,"column":118}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":194,"column":54},"end":{"line":194,"column":67}},"loc":{"start":{"line":194,"column":71},"end":{"line":197,"column":9}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":208,"column":11},"end":{"line":208,"column":18}},"loc":{"start":{"line":208,"column":65},"end":{"line":342,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":101}},"type":"binary-expr","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":54}},{"start":{"line":57,"column":58},"end":{"line":57,"column":101}}]},"1":{"loc":{"start":{"line":59,"column":21},"end":{"line":59,"column":85}},"type":"binary-expr","locations":[{"start":{"line":59,"column":21},"end":{"line":59,"column":50}},{"start":{"line":59,"column":54},"end":{"line":59,"column":85}}]},"2":{"loc":{"start":{"line":87,"column":20},"end":{"line":87,"column":73}},"type":"binary-expr","locations":[{"start":{"line":87,"column":20},"end":{"line":87,"column":45}},{"start":{"line":87,"column":49},"end":{"line":87,"column":73}}]},"3":{"loc":{"start":{"line":116,"column":45},"end":{"line":116,"column":63}},"type":"default-arg","locations":[{"start":{"line":116,"column":59},"end":{"line":116,"column":63}}]},"4":{"loc":{"start":{"line":119,"column":12},"end":{"line":119,"column":68}},"type":"binary-expr","locations":[{"start":{"line":119,"column":12},"end":{"line":119,"column":40}},{"start":{"line":119,"column":44},"end":{"line":119,"column":68}}]},"5":{"loc":{"start":{"line":128,"column":24},"end":{"line":129,"column":85}},"type":"binary-expr","locations":[{"start":{"line":128,"column":24},"end":{"line":128,"column":55}},{"start":{"line":129,"column":24},"end":{"line":129,"column":85}}]},"6":{"loc":{"start":{"line":138,"column":28},"end":{"line":138,"column":87}},"type":"binary-expr","locations":[{"start":{"line":138,"column":28},"end":{"line":138,"column":40}},{"start":{"line":138,"column":45},"end":{"line":138,"column":56}},{"start":{"line":138,"column":60},"end":{"line":138,"column":87}}]},"7":{"loc":{"start":{"line":161,"column":24},"end":{"line":161,"column":98}},"type":"binary-expr","locations":[{"start":{"line":161,"column":24},"end":{"line":161,"column":53}},{"start":{"line":161,"column":57},"end":{"line":161,"column":98}}]},"8":{"loc":{"start":{"line":166,"column":28},"end":{"line":166,"column":87}},"type":"binary-expr","locations":[{"start":{"line":166,"column":28},"end":{"line":166,"column":40}},{"start":{"line":166,"column":45},"end":{"line":166,"column":56}},{"start":{"line":166,"column":60},"end":{"line":166,"column":87}}]},"9":{"loc":{"start":{"line":191,"column":12},"end":{"line":191,"column":65}},"type":"binary-expr","locations":[{"start":{"line":191,"column":12},"end":{"line":191,"column":31}},{"start":{"line":191,"column":35},"end":{"line":191,"column":65}}]},"10":{"loc":{"start":{"line":275,"column":12},"end":{"line":275,"column":95}},"type":"binary-expr","locations":[{"start":{"line":275,"column":12},"end":{"line":275,"column":53}},{"start":{"line":275,"column":57},"end":{"line":275,"column":95}}]},"11":{"loc":{"start":{"line":324,"column":20},"end":{"line":324,"column":77}},"type":"binary-expr","locations":[{"start":{"line":324,"column":20},"end":{"line":324,"column":47}},{"start":{"line":324,"column":51},"end":{"line":324,"column":77}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":1,"170":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0,0],"7":[0,0],"8":[0,0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":13},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":44,"column":null}},"5":{"start":{"line":103,"column":41},"end":{"line":103,"column":43}},"6":{"start":{"line":104,"column":27},"end":{"line":104,"column":99}},"7":{"start":{"line":105,"column":25},"end":{"line":105,"column":62}},"8":{"start":{"line":106,"column":31},"end":{"line":106,"column":51}},"9":{"start":{"line":107,"column":8},"end":{"line":145,"column":null}},"10":{"start":{"line":108,"column":35},"end":{"line":108,"column":63}},"11":{"start":{"line":111,"column":20},"end":{"line":111,"column":null}},"12":{"start":{"line":112,"column":20},"end":{"line":112,"column":null}},"13":{"start":{"line":114,"column":20},"end":{"line":114,"column":null}},"14":{"start":{"line":115,"column":20},"end":{"line":115,"column":null}},"15":{"start":{"line":118,"column":12},"end":{"line":118,"column":null}},"16":{"start":{"line":120,"column":44},"end":{"line":120,"column":59}},"17":{"start":{"line":122,"column":20},"end":{"line":122,"column":null}},"18":{"start":{"line":124,"column":16},"end":{"line":124,"column":null}},"19":{"start":{"line":129,"column":16},"end":{"line":142,"column":null}},"20":{"start":{"line":130,"column":41},"end":{"line":130,"column":63}},"21":{"start":{"line":132,"column":62},"end":{"line":132,"column":64}},"22":{"start":{"line":133,"column":24},"end":{"line":133,"column":null}},"23":{"start":{"line":134,"column":24},"end":{"line":134,"column":null}},"24":{"start":{"line":135,"column":24},"end":{"line":135,"column":null}},"25":{"start":{"line":136,"column":24},"end":{"line":136,"column":null}},"26":{"start":{"line":137,"column":24},"end":{"line":137,"column":null}},"27":{"start":{"line":138,"column":24},"end":{"line":138,"column":null}},"28":{"start":{"line":139,"column":24},"end":{"line":139,"column":null}},"29":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"30":{"start":{"line":144,"column":12},"end":{"line":144,"column":null}},"31":{"start":{"line":146,"column":8},"end":{"line":146,"column":null}},"32":{"start":{"line":150,"column":22},"end":{"line":150,"column":64}},"33":{"start":{"line":151,"column":24},"end":{"line":151,"column":26}},"34":{"start":{"line":153,"column":12},"end":{"line":153,"column":null}},"35":{"start":{"line":155,"column":12},"end":{"line":155,"column":null}},"36":{"start":{"line":158,"column":27},"end":{"line":158,"column":29}},"37":{"start":{"line":160,"column":27},"end":{"line":160,"column":45}},"38":{"start":{"line":161,"column":26},"end":{"line":161,"column":43}},"39":{"start":{"line":162,"column":37},"end":{"line":162,"column":66}},"40":{"start":{"line":163,"column":39},"end":{"line":163,"column":64}},"41":{"start":{"line":164,"column":31},"end":{"line":164,"column":54}},"42":{"start":{"line":166,"column":12},"end":{"line":166,"column":null}},"43":{"start":{"line":171,"column":12},"end":{"line":171,"column":null}},"44":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"45":{"start":{"line":181,"column":12},"end":{"line":181,"column":null}},"46":{"start":{"line":186,"column":12},"end":{"line":186,"column":null}},"47":{"start":{"line":188,"column":23},"end":{"line":188,"column":49}},"48":{"start":{"line":189,"column":25},"end":{"line":189,"column":26}},"49":{"start":{"line":190,"column":35},"end":{"line":190,"column":57}},"50":{"start":{"line":196,"column":20},"end":{"line":196,"column":null}},"51":{"start":{"line":197,"column":20},"end":{"line":197,"column":null}},"52":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"53":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"54":{"start":{"line":205,"column":13},"end":{"line":205,"column":null}},"55":{"start":{"line":206,"column":13},"end":{"line":212,"column":null}},"56":{"start":{"line":214,"column":13},"end":{"line":214,"column":null}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":102,"column":4},"end":{"line":102,"column":11}},"loc":{"start":{"line":102,"column":27},"end":{"line":147,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":107,"column":50},"end":{"line":107,"column":58}},"loc":{"start":{"line":107,"column":62},"end":{"line":145,"column":9}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":129,"column":48},"end":{"line":129,"column":55}},"loc":{"start":{"line":129,"column":59},"end":{"line":142,"column":17}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":149,"column":4},"end":{"line":149,"column":11}},"loc":{"start":{"line":149,"column":79},"end":{"line":202,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":149,"column":49},"end":{"line":149,"column":79}},"type":"default-arg","locations":[{"start":{"line":149,"column":75},"end":{"line":149,"column":79}}]},"1":{"loc":{"start":{"line":165,"column":12},"end":{"line":165,"column":116}},"type":"binary-expr","locations":[{"start":{"line":165,"column":12},"end":{"line":165,"column":41}},{"start":{"line":165,"column":46},"end":{"line":165,"column":87}},{"start":{"line":165,"column":91},"end":{"line":165,"column":115}}]},"2":{"loc":{"start":{"line":168,"column":12},"end":{"line":169,"column":83}},"type":"binary-expr","locations":[{"start":{"line":168,"column":12},"end":{"line":168,"column":40}},{"start":{"line":169,"column":13},"end":{"line":169,"column":54}},{"start":{"line":169,"column":58},"end":{"line":169,"column":82}}]},"3":{"loc":{"start":{"line":173,"column":12},"end":{"line":174,"column":83}},"type":"binary-expr","locations":[{"start":{"line":173,"column":12},"end":{"line":173,"column":51}},{"start":{"line":174,"column":13},"end":{"line":174,"column":54}},{"start":{"line":174,"column":58},"end":{"line":174,"column":82}}]},"4":{"loc":{"start":{"line":178,"column":12},"end":{"line":179,"column":83}},"type":"binary-expr","locations":[{"start":{"line":178,"column":12},"end":{"line":178,"column":53}},{"start":{"line":179,"column":13},"end":{"line":179,"column":54}},{"start":{"line":179,"column":58},"end":{"line":179,"column":82}}]},"5":{"loc":{"start":{"line":183,"column":12},"end":{"line":184,"column":83}},"type":"binary-expr","locations":[{"start":{"line":183,"column":12},"end":{"line":183,"column":45}},{"start":{"line":184,"column":13},"end":{"line":184,"column":54}},{"start":{"line":184,"column":58},"end":{"line":184,"column":82}}]},"6":{"loc":{"start":{"line":192,"column":20},"end":{"line":194,"column":62}},"type":"binary-expr","locations":[{"start":{"line":192,"column":20},"end":{"line":192,"column":62}},{"start":{"line":193,"column":21},"end":{"line":193,"column":60}},{"start":{"line":193,"column":64},"end":{"line":193,"column":89}},{"start":{"line":194,"column":20},"end":{"line":194,"column":62}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":149,"11":1,"12":1,"13":1,"14":1,"15":149,"16":4,"17":0,"18":4,"19":9,"20":25,"21":9,"22":9,"23":9,"24":9,"25":9,"26":9,"27":9,"28":9,"29":9,"30":149,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":1,"54":1,"55":1,"56":1},"f":{"0":1,"1":149,"2":25,"3":0},"b":{"0":[0],"1":[0,0,0],"2":[0,0,0],"3":[0,0,0],"4":[0,0,0],"5":[0,0,0],"6":[0,0,0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":11},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"5":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":30},"end":{"line":16,"column":28}},"7":{"start":{"line":17,"column":25},"end":{"line":17,"column":74}},"8":{"start":{"line":18,"column":23},"end":{"line":18,"column":38}},"9":{"start":{"line":19,"column":29},"end":{"line":19,"column":103}},"10":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"11":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":16}},"loc":{"start":{"line":8,"column":30},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":17}},"loc":{"start":{"line":12,"column":65},"end":{"line":21,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":5,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":5,"1":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":22}},"7":{"start":{"line":17,"column":13},"end":{"line":21,"column":null}},"8":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"9":{"start":{"line":24,"column":12},"end":{"line":30,"column":null}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"11":{"start":{"line":43,"column":71},"end":{"line":45,"column":null}},"12":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"13":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"14":{"start":{"line":49,"column":37},"end":{"line":49,"column":71}},"15":{"start":{"line":50,"column":30},"end":{"line":50,"column":52}},"16":{"start":{"line":53,"column":20},"end":{"line":53,"column":null}},"17":{"start":{"line":55,"column":24},"end":{"line":55,"column":null}},"18":{"start":{"line":56,"column":24},"end":{"line":56,"column":null}},"19":{"start":{"line":61,"column":12},"end":{"line":67,"column":null}},"20":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"21":{"start":{"line":77,"column":25},"end":{"line":77,"column":67}},"22":{"start":{"line":79,"column":8},"end":{"line":87,"column":null}},"23":{"start":{"line":89,"column":26},"end":{"line":89,"column":49}},"24":{"start":{"line":92,"column":12},"end":{"line":101,"column":null}},"25":{"start":{"line":103,"column":12},"end":{"line":113,"column":null}},"26":{"start":{"line":116,"column":8},"end":{"line":124,"column":null}},"27":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"28":{"start":{"line":129,"column":33},"end":{"line":129,"column":67}},"29":{"start":{"line":131,"column":26},"end":{"line":131,"column":48}},"30":{"start":{"line":134,"column":16},"end":{"line":134,"column":null}},"31":{"start":{"line":137,"column":8},"end":{"line":137,"column":null}},"32":{"start":{"line":143,"column":52},"end":{"line":143,"column":54}},"33":{"start":{"line":145,"column":22},"end":{"line":145,"column":85}},"34":{"start":{"line":147,"column":8},"end":{"line":161,"column":null}},"35":{"start":{"line":148,"column":39},"end":{"line":148,"column":231}},"36":{"start":{"line":150,"column":49},"end":{"line":158,"column":null}},"37":{"start":{"line":160,"column":12},"end":{"line":160,"column":null}},"38":{"start":{"line":163,"column":8},"end":{"line":163,"column":null}},"39":{"start":{"line":170,"column":34},"end":{"line":170,"column":73}},"40":{"start":{"line":171,"column":8},"end":{"line":171,"column":null}},"41":{"start":{"line":171,"column":62},"end":{"line":171,"column":97}},"42":{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},"43":{"start":{"line":178,"column":26},"end":{"line":178,"column":108}},"44":{"start":{"line":179,"column":12},"end":{"line":182,"column":null}},"45":{"start":{"line":180,"column":16},"end":{"line":181,"column":null}},"46":{"start":{"line":184,"column":12},"end":{"line":184,"column":null}},"47":{"start":{"line":185,"column":15},"end":{"line":185,"column":null}},"48":{"start":{"line":189,"column":8},"end":{"line":189,"column":null}},"49":{"start":{"line":196,"column":24},"end":{"line":196,"column":64}},"50":{"start":{"line":197,"column":52},"end":{"line":197,"column":54}},"51":{"start":{"line":198,"column":35},"end":{"line":198,"column":74}},"52":{"start":{"line":200,"column":8},"end":{"line":217,"column":null}},"53":{"start":{"line":201,"column":55},"end":{"line":206,"column":null}},"54":{"start":{"line":207,"column":31},"end":{"line":207,"column":94}},"55":{"start":{"line":207,"column":67},"end":{"line":207,"column":93}},"56":{"start":{"line":209,"column":16},"end":{"line":209,"column":null}},"57":{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},"58":{"start":{"line":210,"column":49},"end":{"line":210,"column":92}},"59":{"start":{"line":211,"column":21},"end":{"line":211,"column":null}},"60":{"start":{"line":213,"column":16},"end":{"line":213,"column":null}},"61":{"start":{"line":214,"column":16},"end":{"line":214,"column":null}},"62":{"start":{"line":216,"column":12},"end":{"line":216,"column":null}},"63":{"start":{"line":219,"column":8},"end":{"line":235,"column":null}},"64":{"start":{"line":220,"column":31},"end":{"line":220,"column":103}},"65":{"start":{"line":220,"column":65},"end":{"line":220,"column":102}},"66":{"start":{"line":222,"column":59},"end":{"line":226,"column":null}},"67":{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},"68":{"start":{"line":227,"column":56},"end":{"line":227,"column":99}},"69":{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},"70":{"start":{"line":228,"column":64},"end":{"line":228,"column":99}},"71":{"start":{"line":229,"column":21},"end":{"line":229,"column":null}},"72":{"start":{"line":231,"column":16},"end":{"line":231,"column":null}},"73":{"start":{"line":232,"column":16},"end":{"line":232,"column":null}},"74":{"start":{"line":233,"column":16},"end":{"line":233,"column":null}},"75":{"start":{"line":236,"column":8},"end":{"line":236,"column":null}},"76":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"77":{"start":{"line":241,"column":4},"end":{"line":244,"column":36}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":85},"end":{"line":33,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":39,"column":11},"end":{"line":39,"column":17}},"loc":{"start":{"line":41,"column":30},"end":{"line":70,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":76,"column":11},"end":{"line":76,"column":17}},"loc":{"start":{"line":76,"column":75},"end":{"line":126,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":128,"column":12},"end":{"line":128,"column":18}},"loc":{"start":{"line":128,"column":60},"end":{"line":138,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":11},"end":{"line":142,"column":17}},"loc":{"start":{"line":142,"column":43},"end":{"line":164,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":147,"column":25},"end":{"line":147,"column":31}},"loc":{"start":{"line":147,"column":35},"end":{"line":161,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":17}},"loc":{"start":{"line":169,"column":47},"end":{"line":172,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":171,"column":41},"end":{"line":171,"column":57}},"loc":{"start":{"line":171,"column":62},"end":{"line":171,"column":97}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":176,"column":11},"end":{"line":176,"column":17}},"loc":{"start":{"line":176,"column":32},"end":{"line":186,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":179,"column":29},"end":{"line":179,"column":35}},"loc":{"start":{"line":179,"column":39},"end":{"line":182,"column":13}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":188,"column":11},"end":{"line":188,"column":17}},"loc":{"start":{"line":188,"column":25},"end":{"line":190,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":195,"column":11},"end":{"line":195,"column":17}},"loc":{"start":{"line":195,"column":41},"end":{"line":237,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":200,"column":27},"end":{"line":200,"column":35}},"loc":{"start":{"line":200,"column":39},"end":{"line":217,"column":9}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":207,"column":58},"end":{"line":207,"column":62}},"loc":{"start":{"line":207,"column":67},"end":{"line":207,"column":93}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":219,"column":38},"end":{"line":219,"column":57}},"loc":{"start":{"line":219,"column":61},"end":{"line":235,"column":9}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":220,"column":56},"end":{"line":220,"column":60}},"loc":{"start":{"line":220,"column":65},"end":{"line":220,"column":102}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":39},"end":{"line":14,"column":70}},"type":"default-arg","locations":[{"start":{"line":14,"column":57},"end":{"line":14,"column":70}}]},"1":{"loc":{"start":{"line":83,"column":21},"end":{"line":83,"column":52}},"type":"cond-expr","locations":[{"start":{"line":83,"column":34},"end":{"line":83,"column":44}},{"start":{"line":83,"column":47},"end":{"line":83,"column":52}}]},"2":{"loc":{"start":{"line":119,"column":20},"end":{"line":119,"column":null}},"type":"cond-expr","locations":[{"start":{"line":119,"column":33},"end":{"line":119,"column":43}},{"start":{"line":119,"column":46},"end":{"line":119,"column":null}}]},"3":{"loc":{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},"type":"if","locations":[{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},{"start":{"line":185,"column":15},"end":{"line":185,"column":null}}]},"4":{"loc":{"start":{"line":181,"column":20},"end":{"line":181,"column":113}},"type":"cond-expr","locations":[{"start":{"line":181,"column":60},"end":{"line":181,"column":65}},{"start":{"line":181,"column":68},"end":{"line":181,"column":113}}]},"5":{"loc":{"start":{"line":181,"column":68},"end":{"line":181,"column":113}},"type":"cond-expr","locations":[{"start":{"line":181,"column":101},"end":{"line":181,"column":106}},{"start":{"line":181,"column":109},"end":{"line":181,"column":113}}]},"6":{"loc":{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},"type":"if","locations":[{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},{"start":{"line":211,"column":21},"end":{"line":211,"column":null}}]},"7":{"loc":{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},"type":"if","locations":[{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},{"start":{"line":228,"column":21},"end":{"line":229,"column":null}}]},"8":{"loc":{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},"type":"if","locations":[{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},{"start":{"line":229,"column":21},"end":{"line":229,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":6,"7":6,"8":5,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":3,"22":3,"23":3,"24":3,"25":0,"26":2,"27":2,"28":3,"29":3,"30":0,"31":3,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":1,"43":1,"44":1,"45":2,"46":1,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":4,"77":4},"f":{"0":6,"1":0,"2":3,"3":3,"4":0,"5":0,"6":0,"7":0,"8":1,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"b":{"0":[6],"1":[0,3],"2":[2,0],"3":[1,0],"4":[0,2],"5":[1,1],"6":[0,0],"7":[0,0],"8":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":7,"column":12},"end":{"line":10,"column":42}},"2":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":38},"end":{"line":13,"column":null}}}},"branchMap":{},"s":{"0":4,"1":0,"2":0,"3":4},"f":{"0":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"2":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"3":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"4":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":null}},"7":{"start":{"line":61,"column":11},"end":{"line":61,"column":null}},"8":{"start":{"line":94,"column":36},"end":{"line":94,"column":53}},"9":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"10":{"start":{"line":96,"column":8},"end":{"line":96,"column":null}},"11":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"12":{"start":{"line":98,"column":8},"end":{"line":98,"column":null}},"13":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"14":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"15":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"16":{"start":{"line":102,"column":8},"end":{"line":102,"column":null}},"17":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"18":{"start":{"line":107,"column":0},"end":{"line":107,"column":null}},"19":{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},"20":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"21":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"22":{"start":{"line":111,"column":4},"end":{"line":111,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"loc":{"start":{"line":64,"column":26},"end":{"line":66,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":68,"column":4},"end":{"line":68,"column":15}},"loc":{"start":{"line":68,"column":28},"end":{"line":70,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":4},"end":{"line":72,"column":15}},"loc":{"start":{"line":72,"column":49},"end":{"line":75,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":77,"column":4},"end":{"line":77,"column":15}},"loc":{"start":{"line":77,"column":26},"end":{"line":79,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":81,"column":4},"end":{"line":81,"column":15}},"loc":{"start":{"line":81,"column":46},"end":{"line":83,"column":null}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":4},"end":{"line":89,"column":null}},"loc":{"start":{"line":89,"column":4},"end":{"line":91,"column":null}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"loc":{"start":{"line":93,"column":10},"end":{"line":103,"column":null}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":107,"column":0},"end":{"line":107,"column":12}},"loc":{"start":{"line":107,"column":23},"end":{"line":112,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":107,"column":12},"end":{"line":107,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":12},"end":{"line":107,"column":23}},{"start":{"line":107,"column":12},"end":{"line":107,"column":null}}]}},"s":{"0":13,"1":0,"2":0,"3":0,"4":8,"5":7,"6":12,"7":12,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":13,"18":13,"19":13,"20":13,"21":13,"22":13},"f":{"0":0,"1":0,"2":0,"3":8,"4":7,"5":12,"6":0,"7":13},"b":{"0":[13,13]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"14":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}},"15":{"start":{"line":18,"column":0},"end":{"line":18,"column":null}},"16":{"start":{"line":19,"column":0},"end":{"line":19,"column":null}},"17":{"start":{"line":21,"column":0},"end":{"line":21,"column":null}},"18":{"start":{"line":22,"column":0},"end":{"line":22,"column":null}},"19":{"start":{"line":23,"column":0},"end":{"line":23,"column":null}},"20":{"start":{"line":24,"column":0},"end":{"line":24,"column":null}},"21":{"start":{"line":25,"column":0},"end":{"line":25,"column":null}},"22":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"23":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"24":{"start":{"line":43,"column":50},"end":{"line":46,"column":null}},"25":{"start":{"line":49,"column":24},"end":{"line":49,"column":32}},"26":{"start":{"line":50,"column":37},"end":{"line":50,"column":53}},"27":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"28":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"29":{"start":{"line":53,"column":8},"end":{"line":53,"column":null}},"30":{"start":{"line":54,"column":8},"end":{"line":57,"column":null}},"31":{"start":{"line":58,"column":8},"end":{"line":58,"column":null}},"32":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"33":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"34":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"35":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"36":{"start":{"line":66,"column":8},"end":{"line":66,"column":null}},"37":{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},"38":{"start":{"line":67,"column":44},"end":{"line":67,"column":106}},"39":{"start":{"line":68,"column":13},"end":{"line":68,"column":null}},"40":{"start":{"line":71,"column":12},"end":{"line":71,"column":null}},"41":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"42":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"43":{"start":{"line":80,"column":8},"end":{"line":90,"column":null}},"44":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"45":{"start":{"line":96,"column":41},"end":{"line":100,"column":null}},"46":{"start":{"line":102,"column":12},"end":{"line":102,"column":null}},"47":{"start":{"line":103,"column":53},"end":{"line":103,"column":102}},"48":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"49":{"start":{"line":106,"column":12},"end":{"line":106,"column":null}},"50":{"start":{"line":107,"column":12},"end":{"line":107,"column":null}},"51":{"start":{"line":108,"column":12},"end":{"line":108,"column":null}},"52":{"start":{"line":109,"column":12},"end":{"line":109,"column":null}},"53":{"start":{"line":110,"column":12},"end":{"line":110,"column":null}},"54":{"start":{"line":112,"column":47},"end":{"line":112,"column":87}},"55":{"start":{"line":113,"column":12},"end":{"line":113,"column":null}},"56":{"start":{"line":114,"column":12},"end":{"line":114,"column":null}},"57":{"start":{"line":115,"column":12},"end":{"line":118,"column":null}},"58":{"start":{"line":119,"column":12},"end":{"line":119,"column":null}},"59":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"60":{"start":{"line":124,"column":31},"end":{"line":125,"column":null}},"61":{"start":{"line":129,"column":28},"end":{"line":129,"column":59}},"62":{"start":{"line":131,"column":16},"end":{"line":131,"column":null}},"63":{"start":{"line":131,"column":60},"end":{"line":131,"column":null}},"64":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"65":{"start":{"line":138,"column":36},"end":{"line":138,"column":null}},"66":{"start":{"line":140,"column":26},"end":{"line":140,"column":49}},"67":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"68":{"start":{"line":141,"column":45},"end":{"line":141,"column":null}},"69":{"start":{"line":146,"column":16},"end":{"line":152,"column":null}},"70":{"start":{"line":153,"column":16},"end":{"line":153,"column":null}},"71":{"start":{"line":155,"column":16},"end":{"line":161,"column":null}},"72":{"start":{"line":162,"column":16},"end":{"line":162,"column":null}},"73":{"start":{"line":164,"column":16},"end":{"line":170,"column":null}},"74":{"start":{"line":171,"column":16},"end":{"line":171,"column":null}},"75":{"start":{"line":173,"column":16},"end":{"line":173,"column":null}},"76":{"start":{"line":174,"column":16},"end":{"line":174,"column":null}},"77":{"start":{"line":175,"column":16},"end":{"line":181,"column":null}},"78":{"start":{"line":182,"column":16},"end":{"line":182,"column":null}},"79":{"start":{"line":185,"column":8},"end":{"line":185,"column":null}},"80":{"start":{"line":199,"column":12},"end":{"line":199,"column":null}},"81":{"start":{"line":202,"column":60},"end":{"line":202,"column":87}},"82":{"start":{"line":203,"column":16},"end":{"line":206,"column":null}},"83":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"84":{"start":{"line":211,"column":8},"end":{"line":211,"column":null}},"85":{"start":{"line":216,"column":25},"end":{"line":216,"column":41}},"86":{"start":{"line":217,"column":8},"end":{"line":217,"column":null}},"87":{"start":{"line":218,"column":8},"end":{"line":218,"column":null}},"88":{"start":{"line":219,"column":8},"end":{"line":219,"column":null}},"89":{"start":{"line":221,"column":8},"end":{"line":221,"column":null}},"90":{"start":{"line":222,"column":8},"end":{"line":225,"column":null}},"91":{"start":{"line":226,"column":8},"end":{"line":226,"column":null}},"92":{"start":{"line":227,"column":8},"end":{"line":227,"column":null}},"93":{"start":{"line":228,"column":8},"end":{"line":228,"column":null}},"94":{"start":{"line":230,"column":8},"end":{"line":230,"column":null}},"95":{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},"96":{"start":{"line":242,"column":12},"end":{"line":242,"column":null}},"97":{"start":{"line":243,"column":12},"end":{"line":250,"column":null}},"98":{"start":{"line":251,"column":12},"end":{"line":251,"column":null}},"99":{"start":{"line":252,"column":12},"end":{"line":252,"column":null}},"100":{"start":{"line":253,"column":15},"end":{"line":253,"column":null}},"101":{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},"102":{"start":{"line":258,"column":60},"end":{"line":258,"column":72}},"103":{"start":{"line":259,"column":13},"end":{"line":259,"column":null}},"104":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"105":{"start":{"line":265,"column":4},"end":{"line":265,"column":null}},"106":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":24}},"loc":{"start":{"line":34,"column":27},"end":{"line":186,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":193,"column":12},"end":{"line":193,"column":19}},"loc":{"start":{"line":196,"column":52},"end":{"line":212,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":214,"column":11},"end":{"line":214,"column":24}},"loc":{"start":{"line":214,"column":83},"end":{"line":231,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":235,"column":12},"end":{"line":235,"column":19}},"loc":{"start":{"line":235,"column":81},"end":{"line":254,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":257,"column":12},"end":{"line":257,"column":19}},"loc":{"start":{"line":257,"column":75},"end":{"line":260,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"loc":{"start":{"line":264,"column":0},"end":{"line":278,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":58,"column":38},"end":{"line":58,"column":74}},"type":"cond-expr","locations":[{"start":{"line":58,"column":55},"end":{"line":58,"column":71}},{"start":{"line":58,"column":72},"end":{"line":58,"column":74}}]},"1":{"loc":{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},{"start":{"line":68,"column":13},"end":{"line":68,"column":null}}]},"2":{"loc":{"start":{"line":131,"column":16},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":16},"end":{"line":131,"column":null}}]},"3":{"loc":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":null}}]},"4":{"loc":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":141,"column":null}}]},"5":{"loc":{"start":{"line":145,"column":12},"end":{"line":153,"column":null}},"type":"switch","locations":[{"start":{"line":145,"column":12},"end":{"line":153,"column":null}},{"start":{"line":154,"column":12},"end":{"line":162,"column":null}},{"start":{"line":163,"column":12},"end":{"line":171,"column":null}},{"start":{"line":172,"column":12},"end":{"line":182,"column":null}}]},"6":{"loc":{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},"type":"if","locations":[{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},{"start":{"line":253,"column":15},"end":{"line":253,"column":null}}]},"7":{"loc":{"start":{"line":237,"column":12},"end":{"line":240,"column":52}},"type":"binary-expr","locations":[{"start":{"line":237,"column":12},"end":{"line":237,"column":75}},{"start":{"line":238,"column":13},"end":{"line":238,"column":57}},{"start":{"line":239,"column":16},"end":{"line":239,"column":46}},{"start":{"line":240,"column":16},"end":{"line":240,"column":52}}]},"8":{"loc":{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},"type":"if","locations":[{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},{"start":{"line":259,"column":13},"end":{"line":259,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":1,"105":0,"106":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0],"3":[0],"4":[0],"5":[0,0,0,0],"6":[0,0],"7":[0,0,0,0],"8":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":8,"column":50},"end":{"line":8,"column":52}},"4":{"start":{"line":11,"column":26},"end":{"line":11,"column":43}},"5":{"start":{"line":12,"column":25},"end":{"line":12,"column":41}},"6":{"start":{"line":13,"column":31},"end":{"line":13,"column":53}},"7":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"8":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"9":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"10":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"11":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":11}},"loc":{"start":{"line":7,"column":23},"end":{"line":19,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":12,"column":7},"end":{"line":12,"column":null}},"7":{"start":{"line":20,"column":62},"end":{"line":20,"column":64}},"8":{"start":{"line":23,"column":30},"end":{"line":27,"column":null}},"9":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"10":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"11":{"start":{"line":41,"column":16},"end":{"line":41,"column":null}},"12":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"13":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"14":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"15":{"start":{"line":55,"column":31},"end":{"line":55,"column":75}},"16":{"start":{"line":59,"column":16},"end":{"line":59,"column":null}},"17":{"start":{"line":62,"column":30},"end":{"line":62,"column":72}},"18":{"start":{"line":64,"column":30},"end":{"line":64,"column":61}},"19":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"20":{"start":{"line":65,"column":41},"end":{"line":65,"column":null}},"21":{"start":{"line":66,"column":16},"end":{"line":66,"column":null}},"22":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"23":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"24":{"start":{"line":73,"column":56},"end":{"line":73,"column":68}},"25":{"start":{"line":74,"column":13},"end":{"line":74,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":10},"end":{"line":11,"column":17}},"loc":{"start":{"line":11,"column":17},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":17,"column":11},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":89},"end":{"line":49,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":51,"column":12},"end":{"line":51,"column":18}},"loc":{"start":{"line":53,"column":34},"end":{"line":70,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":72,"column":11},"end":{"line":72,"column":17}},"loc":{"start":{"line":72,"column":63},"end":{"line":75,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":16},"end":{"line":65,"column":null}}]},"1":{"loc":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},{"start":{"line":74,"column":13},"end":{"line":74,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":4,"8":4,"9":3,"10":4,"11":4,"12":4,"13":0,"14":4,"15":4,"16":0,"17":3,"18":2,"19":2,"20":2,"21":2,"22":4,"23":3,"24":2,"25":1,"26":2},"f":{"0":0,"1":4,"2":4,"3":3},"b":{"0":[2],"1":[2,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"7":{"start":{"line":18,"column":61},"end":{"line":18,"column":63}},"8":{"start":{"line":21,"column":29},"end":{"line":25,"column":null}},"9":{"start":{"line":31,"column":16},"end":{"line":31,"column":null}},"10":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"11":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"12":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"13":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"14":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"15":{"start":{"line":53,"column":31},"end":{"line":53,"column":75}},"16":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"17":{"start":{"line":60,"column":30},"end":{"line":60,"column":72}},"18":{"start":{"line":62,"column":30},"end":{"line":62,"column":61}},"19":{"start":{"line":63,"column":16},"end":{"line":63,"column":null}},"20":{"start":{"line":63,"column":40},"end":{"line":63,"column":null}},"21":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"22":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"23":{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},"24":{"start":{"line":71,"column":56},"end":{"line":71,"column":68}},"25":{"start":{"line":72,"column":13},"end":{"line":72,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":11},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":18},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":17}},"loc":{"start":{"line":15,"column":89},"end":{"line":47,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":18}},"loc":{"start":{"line":51,"column":34},"end":{"line":68,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":70,"column":11},"end":{"line":70,"column":17}},"loc":{"start":{"line":70,"column":63},"end":{"line":73,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":63,"column":16},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":16},"end":{"line":63,"column":null}}]},"1":{"loc":{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},{"start":{"line":72,"column":13},"end":{"line":72,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":4,"8":4,"9":3,"10":4,"11":4,"12":4,"13":0,"14":4,"15":4,"16":0,"17":3,"18":2,"19":2,"20":2,"21":2,"22":4,"23":3,"24":2,"25":1,"26":2},"f":{"0":0,"1":4,"2":4,"3":3},"b":{"0":[2],"1":[2,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"4":{"start":{"line":16,"column":35},"end":{"line":16,"column":79}},"5":{"start":{"line":17,"column":29},"end":{"line":17,"column":31}},"6":{"start":{"line":23,"column":20},"end":{"line":23,"column":null}},"7":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}},"8":{"start":{"line":33,"column":38},"end":{"line":33,"column":79}},"9":{"start":{"line":37,"column":24},"end":{"line":37,"column":null}},"10":{"start":{"line":38,"column":24},"end":{"line":38,"column":null}},"11":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"12":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"13":{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},"14":{"start":{"line":49,"column":56},"end":{"line":49,"column":68}},"15":{"start":{"line":50,"column":13},"end":{"line":50,"column":null}},"16":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":18},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":89},"end":{"line":46,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":48,"column":11},"end":{"line":48,"column":17}},"loc":{"start":{"line":48,"column":63},"end":{"line":51,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":24},"end":{"line":36,"column":72}},"type":"binary-expr","locations":[{"start":{"line":36,"column":24},"end":{"line":36,"column":35}},{"start":{"line":36,"column":39},"end":{"line":36,"column":72}}]},"1":{"loc":{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},{"start":{"line":50,"column":13},"end":{"line":50,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":15},"end":{"line":5,"column":32}},"4":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"5":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"6":{"start":{"line":33,"column":32},"end":{"line":33,"column":53}},"7":{"start":{"line":35,"column":35},"end":{"line":35,"column":94}},"8":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"9":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"10":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"11":{"start":{"line":50,"column":32},"end":{"line":50,"column":53}},"12":{"start":{"line":52,"column":28},"end":{"line":56,"column":null}},"13":{"start":{"line":58,"column":8},"end":{"line":71,"column":null}},"14":{"start":{"line":59,"column":25},"end":{"line":59,"column":87}},"15":{"start":{"line":59,"column":58},"end":{"line":59,"column":86}},"16":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"17":{"start":{"line":65,"column":32},"end":{"line":68,"column":null}},"18":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"19":{"start":{"line":73,"column":24},"end":{"line":75,"column":10}},"20":{"start":{"line":77,"column":25},"end":{"line":79,"column":null}},"21":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"22":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"23":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"24":{"start":{"line":93,"column":32},"end":{"line":93,"column":53}},"25":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"26":{"start":{"line":96,"column":24},"end":{"line":98,"column":10}},"27":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"28":{"start":{"line":102,"column":8},"end":{"line":102,"column":null}},"29":{"start":{"line":110,"column":30},"end":{"line":110,"column":35}},"30":{"start":{"line":116,"column":24},"end":{"line":116,"column":null}},"31":{"start":{"line":117,"column":24},"end":{"line":117,"column":null}},"32":{"start":{"line":121,"column":16},"end":{"line":121,"column":null}},"33":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"34":{"start":{"line":133,"column":35},"end":{"line":133,"column":40}},"35":{"start":{"line":139,"column":24},"end":{"line":139,"column":null}},"36":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"37":{"start":{"line":144,"column":16},"end":{"line":144,"column":null}},"38":{"start":{"line":148,"column":8},"end":{"line":148,"column":null}},"39":{"start":{"line":152,"column":40},"end":{"line":152,"column":45}},"40":{"start":{"line":156,"column":20},"end":{"line":156,"column":null}},"41":{"start":{"line":157,"column":20},"end":{"line":157,"column":null}},"42":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"43":{"start":{"line":163,"column":8},"end":{"line":163,"column":null}},"44":{"start":{"line":171,"column":26},"end":{"line":171,"column":31}},"45":{"start":{"line":177,"column":24},"end":{"line":177,"column":null}},"46":{"start":{"line":178,"column":24},"end":{"line":178,"column":null}},"47":{"start":{"line":185,"column":16},"end":{"line":185,"column":null}},"48":{"start":{"line":189,"column":8},"end":{"line":189,"column":null}},"49":{"start":{"line":202,"column":16},"end":{"line":202,"column":null}},"50":{"start":{"line":205,"column":16},"end":{"line":205,"column":null}},"51":{"start":{"line":213,"column":24},"end":{"line":213,"column":null}},"52":{"start":{"line":216,"column":24},"end":{"line":216,"column":null}},"53":{"start":{"line":218,"column":20},"end":{"line":218,"column":null}},"54":{"start":{"line":223,"column":8},"end":{"line":223,"column":null}},"55":{"start":{"line":227,"column":27},"end":{"line":227,"column":32}},"56":{"start":{"line":232,"column":24},"end":{"line":232,"column":null}},"57":{"start":{"line":233,"column":24},"end":{"line":233,"column":null}},"58":{"start":{"line":237,"column":16},"end":{"line":237,"column":null}},"59":{"start":{"line":240,"column":8},"end":{"line":240,"column":null}},"60":{"start":{"line":244,"column":46},"end":{"line":253,"column":null}},"61":{"start":{"line":256,"column":43},"end":{"line":256,"column":48}},"62":{"start":{"line":261,"column":24},"end":{"line":261,"column":null}},"63":{"start":{"line":262,"column":24},"end":{"line":262,"column":null}},"64":{"start":{"line":266,"column":16},"end":{"line":266,"column":null}},"65":{"start":{"line":269,"column":8},"end":{"line":269,"column":null}},"66":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":8}},"loc":{"start":{"line":14,"column":20},"end":{"line":16,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":8}},"loc":{"start":{"line":21,"column":19},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":25,"column":4},"end":{"line":25,"column":27}},"loc":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":17}},"loc":{"start":{"line":32,"column":40},"end":{"line":41,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":11}},"loc":{"start":{"line":49,"column":97},"end":{"line":85,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":58,"column":28},"end":{"line":58,"column":37}},"loc":{"start":{"line":58,"column":41},"end":{"line":71,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":59,"column":49},"end":{"line":59,"column":53}},"loc":{"start":{"line":59,"column":58},"end":{"line":59,"column":86}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":92,"column":4},"end":{"line":92,"column":17}},"loc":{"start":{"line":92,"column":53},"end":{"line":103,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":109,"column":11},"end":{"line":109,"column":30}},"loc":{"start":{"line":109,"column":30},"end":{"line":126,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":132,"column":12},"end":{"line":132,"column":37}},"loc":{"start":{"line":132,"column":37},"end":{"line":149,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":151,"column":11},"end":{"line":151,"column":46}},"loc":{"start":{"line":151,"column":46},"end":{"line":164,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":170,"column":11},"end":{"line":170,"column":26}},"loc":{"start":{"line":170,"column":26},"end":{"line":190,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":196,"column":11},"end":{"line":196,"column":24}},"loc":{"start":{"line":196,"column":24},"end":{"line":224,"column":null}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":226,"column":11},"end":{"line":226,"column":41}},"loc":{"start":{"line":226,"column":62},"end":{"line":241,"column":null}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":243,"column":11},"end":{"line":243,"column":51}},"loc":{"start":{"line":243,"column":51},"end":{"line":270,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":80}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":49}},{"start":{"line":176,"column":53},"end":{"line":176,"column":80}}]},"1":{"loc":{"start":{"line":182,"column":16},"end":{"line":183,"column":71}},"type":"binary-expr","locations":[{"start":{"line":182,"column":16},"end":{"line":182,"column":69}},{"start":{"line":183,"column":16},"end":{"line":183,"column":71}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":3,"5":3,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":48,"15":150,"16":6,"17":42,"18":42,"19":6,"20":6,"21":6,"22":6,"23":6,"24":1,"25":1,"26":1,"27":1,"28":1,"29":2,"30":1,"31":1,"32":0,"33":2,"34":0,"35":0,"36":0,"37":0,"38":0,"39":2,"40":1,"41":1,"42":0,"43":2,"44":1,"45":1,"46":1,"47":0,"48":1,"49":2,"50":0,"51":1,"52":0,"53":1,"54":2,"55":1,"56":1,"57":1,"58":0,"59":1,"60":1,"61":1,"62":1,"63":1,"64":0,"65":1,"66":2},"f":{"0":3,"1":3,"2":13,"3":6,"4":6,"5":48,"6":150,"7":1,"8":2,"9":0,"10":2,"11":1,"12":2,"13":1,"14":1},"b":{"0":[2,1],"1":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":31},"end":{"line":6,"column":49}},"2":{"start":{"line":6,"column":58},"end":{"line":6,"column":81}},"3":{"start":{"line":9,"column":40},"end":{"line":9,"column":42}},"4":{"start":{"line":11,"column":27},"end":{"line":11,"column":73}},"5":{"start":{"line":13,"column":32},"end":{"line":13,"column":76}},"6":{"start":{"line":16,"column":41},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"8":{"start":{"line":26,"column":7},"end":{"line":26,"column":null}},"9":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":31}},"loc":{"start":{"line":6,"column":81},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":29}},"loc":{"start":{"line":8,"column":29},"end":{"line":27,"column":null}}}},"branchMap":{},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1},"f":{"0":0,"1":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":14,"column":16},"end":{"line":14,"column":31}},"7":{"start":{"line":15,"column":16},"end":{"line":15,"column":33}},"8":{"start":{"line":16,"column":16},"end":{"line":16,"column":30}},"9":{"start":{"line":17,"column":25},"end":{"line":17,"column":41}},"10":{"start":{"line":11,"column":12},"end":{"line":11,"column":45}},"11":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"12":{"start":{"line":23,"column":39},"end":{"line":23,"column":75}},"13":{"start":{"line":24,"column":33},"end":{"line":24,"column":50}},"14":{"start":{"line":26,"column":35},"end":{"line":29,"column":null}},"15":{"start":{"line":32,"column":33},"end":{"line":32,"column":34}},"16":{"start":{"line":33,"column":35},"end":{"line":33,"column":36}},"17":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"18":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"19":{"start":{"line":41,"column":51},"end":{"line":41,"column":53}},"20":{"start":{"line":43,"column":43},"end":{"line":43,"column":114}},"21":{"start":{"line":45,"column":31},"end":{"line":47,"column":46}},"22":{"start":{"line":47,"column":33},"end":{"line":47,"column":45}},"23":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"24":{"start":{"line":51,"column":44},"end":{"line":51,"column":110}},"25":{"start":{"line":53,"column":29},"end":{"line":55,"column":42}},"26":{"start":{"line":55,"column":31},"end":{"line":55,"column":41}},"27":{"start":{"line":56,"column":12},"end":{"line":56,"column":null}},"28":{"start":{"line":60,"column":53},"end":{"line":62,"column":55}},"29":{"start":{"line":65,"column":48},"end":{"line":65,"column":49}},"30":{"start":{"line":66,"column":16},"end":{"line":68,"column":null}},"31":{"start":{"line":67,"column":20},"end":{"line":67,"column":null}},"32":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"33":{"start":{"line":73,"column":27},"end":{"line":73,"column":72}},"34":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"35":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"36":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"37":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"38":{"start":{"line":91,"column":29},"end":{"line":91,"column":88}},"39":{"start":{"line":94,"column":12},"end":{"line":94,"column":null}},"40":{"start":{"line":95,"column":12},"end":{"line":95,"column":null}},"41":{"start":{"line":103,"column":16},"end":{"line":110,"column":null}},"42":{"start":{"line":112,"column":16},"end":{"line":117,"column":null}},"43":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"44":{"start":{"line":122,"column":51},"end":{"line":124,"column":null}},"45":{"start":{"line":128,"column":16},"end":{"line":134,"column":null}},"46":{"start":{"line":136,"column":16},"end":{"line":142,"column":null}},"47":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"48":{"start":{"line":153,"column":14},"end":{"line":153,"column":16}},"49":{"start":{"line":155,"column":39},"end":{"line":155,"column":75}},"50":{"start":{"line":156,"column":33},"end":{"line":156,"column":50}},"51":{"start":{"line":158,"column":8},"end":{"line":162,"column":null}},"52":{"start":{"line":166,"column":16},"end":{"line":169,"column":null}},"53":{"start":{"line":173,"column":50},"end":{"line":175,"column":null}},"54":{"start":{"line":182,"column":18},"end":{"line":184,"column":14}},"55":{"start":{"line":183,"column":16},"end":{"line":183,"column":null}},"56":{"start":{"line":185,"column":12},"end":{"line":185,"column":null}},"57":{"start":{"line":189,"column":51},"end":{"line":189,"column":118}},"58":{"start":{"line":195,"column":18},"end":{"line":197,"column":14}},"59":{"start":{"line":196,"column":16},"end":{"line":196,"column":null}},"60":{"start":{"line":198,"column":12},"end":{"line":198,"column":null}},"61":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"62":{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},"63":{"start":{"line":213,"column":12},"end":{"line":221,"column":null}},"64":{"start":{"line":217,"column":24},"end":{"line":217,"column":null}},"65":{"start":{"line":220,"column":16},"end":{"line":220,"column":null}},"66":{"start":{"line":222,"column":15},"end":{"line":222,"column":null}},"67":{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},"68":{"start":{"line":234,"column":12},"end":{"line":242,"column":null}},"69":{"start":{"line":238,"column":24},"end":{"line":238,"column":null}},"70":{"start":{"line":241,"column":16},"end":{"line":241,"column":null}},"71":{"start":{"line":243,"column":15},"end":{"line":243,"column":null}},"72":{"start":{"line":253,"column":35},"end":{"line":269,"column":10}},"73":{"start":{"line":256,"column":20},"end":{"line":256,"column":null}},"74":{"start":{"line":256,"column":64},"end":{"line":256,"column":null}},"75":{"start":{"line":263,"column":24},"end":{"line":263,"column":null}},"76":{"start":{"line":268,"column":12},"end":{"line":268,"column":null}},"77":{"start":{"line":271,"column":8},"end":{"line":271,"column":null}},"78":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"loc":{"start":{"line":17,"column":41},"end":{"line":20,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":22,"column":11},"end":{"line":22,"column":17}},"loc":{"start":{"line":22,"column":46},"end":{"line":76,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":47,"column":19},"end":{"line":47,"column":28}},"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":45}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":55,"column":19},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":31},"end":{"line":55,"column":41}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":66,"column":60},"end":{"line":66,"column":66}},"loc":{"start":{"line":66,"column":70},"end":{"line":68,"column":17}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":78,"column":11},"end":{"line":78,"column":17}},"loc":{"start":{"line":79,"column":34},"end":{"line":147,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":149,"column":12},"end":{"line":149,"column":47}},"loc":{"start":{"line":149,"column":71},"end":{"line":202,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":182,"column":49},"end":{"line":182,"column":58}},"loc":{"start":{"line":182,"column":62},"end":{"line":184,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":195,"column":50},"end":{"line":195,"column":61}},"loc":{"start":{"line":195,"column":65},"end":{"line":197,"column":13}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":211,"column":12},"end":{"line":211,"column":44}},"loc":{"start":{"line":211,"column":88},"end":{"line":223,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":213,"column":36},"end":{"line":213,"column":43}},"loc":{"start":{"line":213,"column":47},"end":{"line":221,"column":13}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":232,"column":12},"end":{"line":232,"column":43}},"loc":{"start":{"line":232,"column":93},"end":{"line":244,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":234,"column":42},"end":{"line":234,"column":54}},"loc":{"start":{"line":234,"column":58},"end":{"line":242,"column":13}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":252,"column":12},"end":{"line":252,"column":57}},"loc":{"start":{"line":252,"column":116},"end":{"line":272,"column":null}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":253,"column":56},"end":{"line":253,"column":69}},"loc":{"start":{"line":253,"column":73},"end":{"line":269,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":8},"end":{"line":89,"column":null}}]},"1":{"loc":{"start":{"line":93,"column":12},"end":{"line":93,"column":68}},"type":"binary-expr","locations":[{"start":{"line":93,"column":12},"end":{"line":93,"column":42}},{"start":{"line":93,"column":46},"end":{"line":93,"column":68}}]},"2":{"loc":{"start":{"line":119,"column":19},"end":{"line":119,"column":107}},"type":"binary-expr","locations":[{"start":{"line":119,"column":19},"end":{"line":119,"column":62}},{"start":{"line":119,"column":66},"end":{"line":119,"column":107}}]},"3":{"loc":{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},"type":"if","locations":[{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},{"start":{"line":222,"column":15},"end":{"line":222,"column":null}}]},"4":{"loc":{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},"type":"if","locations":[{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},{"start":{"line":243,"column":15},"end":{"line":243,"column":null}}]},"5":{"loc":{"start":{"line":256,"column":20},"end":{"line":256,"column":null}},"type":"if","locations":[{"start":{"line":256,"column":20},"end":{"line":256,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":7,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":19,"18":19,"19":7,"20":7,"21":1,"22":1,"23":1,"24":7,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":2,"32":1,"33":7,"34":7,"35":7,"36":5,"37":5,"38":5,"39":3,"40":3,"41":0,"42":2,"43":3,"44":3,"45":2,"46":1,"47":0,"48":8,"49":8,"50":8,"51":8,"52":20,"53":8,"54":2,"55":2,"56":2,"57":8,"58":2,"59":2,"60":2,"61":8,"62":15,"63":15,"64":12,"65":3,"66":0,"67":15,"68":15,"69":27,"70":3,"71":0,"72":15,"73":63,"74":27,"75":12,"76":0,"77":15,"78":1},"f":{"0":7,"1":7,"2":1,"3":1,"4":2,"5":5,"6":8,"7":2,"8":2,"9":15,"10":15,"11":15,"12":30,"13":15,"14":39},"b":{"0":[5],"1":[5,2],"2":[3,0],"3":[15,0],"4":[15,0],"5":[27]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"2":{"start":{"line":12,"column":24},"end":{"line":12,"column":40}},"3":{"start":{"line":12,"column":50},"end":{"line":12,"column":73}},"4":{"start":{"line":12,"column":73},"end":{"line":12,"column":80}},"5":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"6":{"start":{"line":19,"column":48},"end":{"line":19,"column":null}},"7":{"start":{"line":22,"column":35},"end":{"line":28,"column":44}},"8":{"start":{"line":30,"column":48},"end":{"line":30,"column":50}},"9":{"start":{"line":31,"column":36},"end":{"line":31,"column":73}},"10":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"11":{"start":{"line":41,"column":12},"end":{"line":42,"column":null}},"12":{"start":{"line":42,"column":14},"end":{"line":42,"column":null}},"13":{"start":{"line":45,"column":29},"end":{"line":45,"column":30}},"14":{"start":{"line":46,"column":37},"end":{"line":46,"column":64}},"15":{"start":{"line":50,"column":66},"end":{"line":50,"column":94}},"16":{"start":{"line":51,"column":24},"end":{"line":51,"column":null}},"17":{"start":{"line":52,"column":24},"end":{"line":52,"column":null}},"18":{"start":{"line":55,"column":56},"end":{"line":55,"column":87}},"19":{"start":{"line":56,"column":66},"end":{"line":56,"column":94}},"20":{"start":{"line":58,"column":28},"end":{"line":58,"column":null}},"21":{"start":{"line":59,"column":49},"end":{"line":62,"column":null}},"22":{"start":{"line":64,"column":28},"end":{"line":65,"column":null}},"23":{"start":{"line":67,"column":28},"end":{"line":68,"column":null}},"24":{"start":{"line":71,"column":28},"end":{"line":71,"column":null}},"25":{"start":{"line":73,"column":24},"end":{"line":73,"column":null}},"26":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"27":{"start":{"line":87,"column":46},"end":{"line":87,"column":48}},"28":{"start":{"line":89,"column":8},"end":{"line":89,"column":null}},"29":{"start":{"line":90,"column":25},"end":{"line":90,"column":40}},"30":{"start":{"line":93,"column":33},"end":{"line":93,"column":47}},"31":{"start":{"line":95,"column":16},"end":{"line":95,"column":null}},"32":{"start":{"line":98,"column":16},"end":{"line":98,"column":null}},"33":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"34":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":24}},"loc":{"start":{"line":12,"column":77},"end":{"line":12,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":17,"column":39},"end":{"line":79,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":55,"column":47},"end":{"line":55,"column":51}},"loc":{"start":{"line":55,"column":56},"end":{"line":55,"column":87}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":12},"end":{"line":86,"column":21}},"loc":{"start":{"line":86,"column":34},"end":{"line":102,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":null}}]},"1":{"loc":{"start":{"line":41,"column":12},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":12},"end":{"line":42,"column":null}}]},"2":{"loc":{"start":{"line":41,"column":15},"end":{"line":41,"column":90}},"type":"binary-expr","locations":[{"start":{"line":41,"column":15},"end":{"line":41,"column":35}},{"start":{"line":41,"column":39},"end":{"line":41,"column":90}}]},"3":{"loc":{"start":{"line":44,"column":16},"end":{"line":44,"column":83}},"type":"binary-expr","locations":[{"start":{"line":44,"column":16},"end":{"line":44,"column":40}},{"start":{"line":44,"column":44},"end":{"line":44,"column":83}}]},"4":{"loc":{"start":{"line":48,"column":24},"end":{"line":48,"column":95}},"type":"binary-expr","locations":[{"start":{"line":48,"column":24},"end":{"line":48,"column":43}},{"start":{"line":48,"column":47},"end":{"line":48,"column":95}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":0,"11":12,"12":0,"13":10,"14":4,"15":0,"16":0,"17":0,"18":2,"19":2,"20":0,"21":0,"22":0,"23":2,"24":0,"25":2,"26":2,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":2},"f":{"0":2,"1":2,"2":2,"3":0},"b":{"0":[2],"1":[0],"2":[12,0],"3":[12,10],"4":[4,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":16,"column":16},"end":{"line":16,"column":32}},"6":{"start":{"line":17,"column":16},"end":{"line":17,"column":null}},"7":{"start":{"line":18,"column":16},"end":{"line":18,"column":46}},"8":{"start":{"line":19,"column":16},"end":{"line":19,"column":47}},"9":{"start":{"line":20,"column":16},"end":{"line":20,"column":54}},"10":{"start":{"line":13,"column":12},"end":{"line":13,"column":null}},"11":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"13":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"14":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"15":{"start":{"line":45,"column":29},"end":{"line":45,"column":30}},"16":{"start":{"line":46,"column":37},"end":{"line":46,"column":69}},"17":{"start":{"line":49,"column":24},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":43},"end":{"line":52,"column":169}},"19":{"start":{"line":56,"column":24},"end":{"line":56,"column":null}},"20":{"start":{"line":61,"column":24},"end":{"line":61,"column":null}},"21":{"start":{"line":63,"column":60},"end":{"line":63,"column":62}},"22":{"start":{"line":65,"column":24},"end":{"line":65,"column":null}},"23":{"start":{"line":66,"column":24},"end":{"line":71,"column":null}},"24":{"start":{"line":72,"column":24},"end":{"line":76,"column":null}},"25":{"start":{"line":78,"column":51},"end":{"line":83,"column":75}},"26":{"start":{"line":84,"column":24},"end":{"line":84,"column":null}},"27":{"start":{"line":85,"column":24},"end":{"line":85,"column":null}},"28":{"start":{"line":86,"column":24},"end":{"line":86,"column":null}},"29":{"start":{"line":87,"column":24},"end":{"line":87,"column":null}},"30":{"start":{"line":88,"column":24},"end":{"line":88,"column":null}},"31":{"start":{"line":91,"column":24},"end":{"line":95,"column":null}},"32":{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},"33":{"start":{"line":100,"column":24},"end":{"line":100,"column":null}},"34":{"start":{"line":101,"column":24},"end":{"line":101,"column":null}},"35":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"36":{"start":{"line":107,"column":8},"end":{"line":107,"column":null}},"37":{"start":{"line":124,"column":64},"end":{"line":124,"column":98}},"38":{"start":{"line":125,"column":12},"end":{"line":125,"column":null}},"39":{"start":{"line":125,"column":51},"end":{"line":125,"column":null}},"40":{"start":{"line":130,"column":36},"end":{"line":130,"column":60}},"41":{"start":{"line":131,"column":29},"end":{"line":131,"column":53}},"42":{"start":{"line":133,"column":12},"end":{"line":133,"column":null}},"43":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"44":{"start":{"line":143,"column":43},"end":{"line":143,"column":75}},"45":{"start":{"line":146,"column":16},"end":{"line":150,"column":null}},"46":{"start":{"line":152,"column":16},"end":{"line":156,"column":null}},"47":{"start":{"line":159,"column":12},"end":{"line":163,"column":null}},"48":{"start":{"line":164,"column":12},"end":{"line":167,"column":null}},"49":{"start":{"line":171,"column":12},"end":{"line":173,"column":null}},"50":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}},"51":{"start":{"line":177,"column":12},"end":{"line":177,"column":null}},"52":{"start":{"line":180,"column":12},"end":{"line":180,"column":null}},"53":{"start":{"line":182,"column":8},"end":{"line":182,"column":null}},"54":{"start":{"line":197,"column":20},"end":{"line":197,"column":44}},"55":{"start":{"line":198,"column":24},"end":{"line":198,"column":60}},"56":{"start":{"line":199,"column":21},"end":{"line":199,"column":53}},"57":{"start":{"line":202,"column":28},"end":{"line":202,"column":156}},"58":{"start":{"line":205,"column":20},"end":{"line":205,"column":null}},"59":{"start":{"line":206,"column":20},"end":{"line":206,"column":null}},"60":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"61":{"start":{"line":209,"column":48},"end":{"line":209,"column":null}},"62":{"start":{"line":213,"column":12},"end":{"line":215,"column":null}},"63":{"start":{"line":218,"column":8},"end":{"line":218,"column":null}},"64":{"start":{"line":222,"column":49},"end":{"line":222,"column":54}},"65":{"start":{"line":223,"column":8},"end":{"line":223,"column":null}},"66":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"67":{"start":{"line":228,"column":12},"end":{"line":228,"column":null}},"68":{"start":{"line":237,"column":20},"end":{"line":237,"column":51}},"69":{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},"70":{"start":{"line":238,"column":29},"end":{"line":238,"column":41}},"71":{"start":{"line":239,"column":13},"end":{"line":239,"column":null}},"72":{"start":{"line":254,"column":20},"end":{"line":254,"column":51}},"73":{"start":{"line":255,"column":8},"end":{"line":255,"column":null}},"74":{"start":{"line":256,"column":8},"end":{"line":256,"column":null}},"75":{"start":{"line":266,"column":20},"end":{"line":266,"column":51}},"76":{"start":{"line":267,"column":8},"end":{"line":267,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"loc":{"start":{"line":20,"column":54},"end":{"line":24,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":31,"column":11},"end":{"line":31,"column":17}},"loc":{"start":{"line":31,"column":49},"end":{"line":108,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":116,"column":12},"end":{"line":116,"column":18}},"loc":{"start":{"line":120,"column":23},"end":{"line":183,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":124,"column":56},"end":{"line":124,"column":59}},"loc":{"start":{"line":124,"column":64},"end":{"line":124,"column":98}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":176,"column":56},"end":{"line":176,"column":59}},"loc":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":191,"column":12},"end":{"line":191,"column":18}},"loc":{"start":{"line":193,"column":62},"end":{"line":219,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":221,"column":12},"end":{"line":221,"column":40}},"loc":{"start":{"line":221,"column":61},"end":{"line":224,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"loc":{"start":{"line":227,"column":0},"end":{"line":269,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":236,"column":4},"end":{"line":236,"column":7}},"loc":{"start":{"line":236,"column":48},"end":{"line":240,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":249,"column":4},"end":{"line":249,"column":7}},"loc":{"start":{"line":252,"column":43},"end":{"line":257,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":265,"column":4},"end":{"line":265,"column":7}},"loc":{"start":{"line":265,"column":48},"end":{"line":268,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":16},"end":{"line":33,"column":93}},"type":"binary-expr","locations":[{"start":{"line":33,"column":16},"end":{"line":33,"column":53}},{"start":{"line":33,"column":57},"end":{"line":33,"column":93}}]},"1":{"loc":{"start":{"line":37,"column":16},"end":{"line":37,"column":104}},"type":"binary-expr","locations":[{"start":{"line":37,"column":16},"end":{"line":37,"column":40}},{"start":{"line":37,"column":44},"end":{"line":37,"column":104}}]},"2":{"loc":{"start":{"line":41,"column":16},"end":{"line":41,"column":106}},"type":"binary-expr","locations":[{"start":{"line":41,"column":16},"end":{"line":41,"column":41}},{"start":{"line":41,"column":45},"end":{"line":41,"column":106}}]},"3":{"loc":{"start":{"line":44,"column":16},"end":{"line":44,"column":93}},"type":"binary-expr","locations":[{"start":{"line":44,"column":16},"end":{"line":44,"column":45}},{"start":{"line":44,"column":49},"end":{"line":44,"column":93}}]},"4":{"loc":{"start":{"line":47,"column":24},"end":{"line":47,"column":149}},"type":"binary-expr","locations":[{"start":{"line":47,"column":24},"end":{"line":47,"column":91}},{"start":{"line":47,"column":95},"end":{"line":47,"column":149}}]},"5":{"loc":{"start":{"line":52,"column":43},"end":{"line":52,"column":169}},"type":"cond-expr","locations":[{"start":{"line":52,"column":97},"end":{"line":52,"column":115}},{"start":{"line":52,"column":116},"end":{"line":52,"column":169}}]},"6":{"loc":{"start":{"line":59,"column":24},"end":{"line":59,"column":127}},"type":"binary-expr","locations":[{"start":{"line":59,"column":24},"end":{"line":59,"column":48}},{"start":{"line":59,"column":52},"end":{"line":59,"column":105}},{"start":{"line":59,"column":109},"end":{"line":59,"column":127}}]},"7":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":70}},"type":"binary-expr","locations":[{"start":{"line":64,"column":25},"end":{"line":64,"column":42}},{"start":{"line":64,"column":46},"end":{"line":64,"column":70}}]},"8":{"loc":{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},{"start":{"line":103,"column":24},"end":{"line":103,"column":null}}]},"9":{"loc":{"start":{"line":125,"column":12},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":12},"end":{"line":125,"column":null}}]},"10":{"loc":{"start":{"line":132,"column":12},"end":{"line":132,"column":53}},"type":"binary-expr","locations":[{"start":{"line":132,"column":12},"end":{"line":132,"column":29}},{"start":{"line":132,"column":33},"end":{"line":132,"column":53}}]},"11":{"loc":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}},"type":"binary-expr","locations":[{"start":{"line":176,"column":64},"end":{"line":176,"column":98}},{"start":{"line":176,"column":102},"end":{"line":176,"column":109}}]},"12":{"loc":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":12},"end":{"line":209,"column":null}}]},"13":{"loc":{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},"type":"if","locations":[{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},{"start":{"line":239,"column":13},"end":{"line":239,"column":null}}]}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":10,"6":10,"7":10,"8":10,"9":10,"10":10,"11":10,"12":0,"13":24,"14":0,"15":19,"16":28,"17":1,"18":27,"19":9,"20":2,"21":16,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":15,"32":13,"33":10,"34":10,"35":3,"36":7,"37":38,"38":16,"39":10,"40":6,"41":6,"42":6,"43":1,"44":5,"45":1,"46":4,"47":5,"48":5,"49":1,"50":13,"51":4,"52":1,"53":4,"54":4,"55":4,"56":4,"57":9,"58":3,"59":3,"60":9,"61":3,"62":1,"63":3,"64":55,"65":55,"66":3,"67":10,"68":6,"69":6,"70":1,"71":5,"72":5,"73":5,"74":5,"75":6,"76":6},"f":{"0":10,"1":10,"2":16,"3":38,"4":13,"5":4,"6":55,"7":10,"8":6,"9":5,"10":6},"b":{"0":[47,0],"1":[47,35],"2":[23,0],"3":[23,19],"4":[28,1],"5":[0,27],"6":[18,8,2],"7":[16,1],"8":[10,3],"9":[10],"10":[6,6],"11":[13,5],"12":[3],"13":[1,5]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":11,"column":24},"end":{"line":11,"column":46}},"8":{"start":{"line":11,"column":56},"end":{"line":11,"column":71}},"9":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"10":{"start":{"line":16,"column":34},"end":{"line":16,"column":75}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"12":{"start":{"line":18,"column":34},"end":{"line":18,"column":101}},"13":{"start":{"line":19,"column":8},"end":{"line":22,"column":null}},"14":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"15":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"16":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"17":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"18":{"start":{"line":43,"column":19},"end":{"line":43,"column":51}},"19":{"start":{"line":45,"column":12},"end":{"line":49,"column":null}},"20":{"start":{"line":50,"column":80},"end":{"line":50,"column":82}},"21":{"start":{"line":54,"column":20},"end":{"line":54,"column":null}},"22":{"start":{"line":55,"column":20},"end":{"line":61,"column":null}},"23":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"24":{"start":{"line":67,"column":37},"end":{"line":69,"column":55}},"25":{"start":{"line":68,"column":59},"end":{"line":68,"column":82}},"26":{"start":{"line":69,"column":33},"end":{"line":69,"column":54}},"27":{"start":{"line":70,"column":25},"end":{"line":70,"column":26}},"28":{"start":{"line":72,"column":34},"end":{"line":72,"column":102}},"29":{"start":{"line":74,"column":33},"end":{"line":74,"column":38}},"30":{"start":{"line":76,"column":51},"end":{"line":76,"column":119}},"31":{"start":{"line":79,"column":31},"end":{"line":79,"column":null}},"32":{"start":{"line":82,"column":32},"end":{"line":82,"column":null}},"33":{"start":{"line":83,"column":32},"end":{"line":83,"column":null}},"34":{"start":{"line":89,"column":16},"end":{"line":91,"column":null}},"35":{"start":{"line":90,"column":67},"end":{"line":90,"column":90}},"36":{"start":{"line":91,"column":37},"end":{"line":91,"column":58}},"37":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"38":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"39":{"start":{"line":100,"column":10},"end":{"line":100,"column":null}},"40":{"start":{"line":103,"column":21},"end":{"line":103,"column":29}},"41":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"42":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"43":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":24}},"loc":{"start":{"line":11,"column":71},"end":{"line":11,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":13,"column":11},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":46},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":12},"end":{"line":28,"column":56}},"loc":{"start":{"line":30,"column":34},"end":{"line":38,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":32}},"loc":{"start":{"line":41,"column":81},"end":{"line":96,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":68,"column":47},"end":{"line":68,"column":54}},"loc":{"start":{"line":68,"column":59},"end":{"line":68,"column":82}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":69,"column":19},"end":{"line":69,"column":28}},"loc":{"start":{"line":69,"column":33},"end":{"line":69,"column":54}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":90,"column":55},"end":{"line":90,"column":62}},"loc":{"start":{"line":90,"column":67},"end":{"line":90,"column":90}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":91,"column":23},"end":{"line":91,"column":32}},"loc":{"start":{"line":91,"column":37},"end":{"line":91,"column":58}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":98,"column":12},"end":{"line":98,"column":35}},"loc":{"start":{"line":98,"column":69},"end":{"line":106,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":64}},"type":"binary-expr","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":17}},{"start":{"line":99,"column":21},"end":{"line":99,"column":36}},{"start":{"line":99,"column":40},"end":{"line":99,"column":45}},{"start":{"line":99,"column":49},"end":{"line":99,"column":64}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":42,"20":42,"21":65,"22":65,"23":87,"24":42,"25":221,"26":152,"27":42,"28":96,"29":96,"30":7,"31":0,"32":7,"33":7,"34":145,"35":727,"36":727,"37":42,"38":7,"39":0,"40":0,"41":0,"42":0,"43":2},"f":{"0":7,"1":7,"2":7,"3":7,"4":221,"5":152,"6":727,"7":727,"8":0},"b":{"0":[0,0,0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":23},"end":{"line":9,"column":49}},"7":{"start":{"line":11,"column":35},"end":{"line":11,"column":131}},"8":{"start":{"line":12,"column":49},"end":{"line":12,"column":88}},"9":{"start":{"line":18,"column":31},"end":{"line":18,"column":75}},"10":{"start":{"line":19,"column":42},"end":{"line":19,"column":47}},"11":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"12":{"start":{"line":23,"column":16},"end":{"line":23,"column":null}},"13":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"14":{"start":{"line":26,"column":33},"end":{"line":26,"column":null}},"15":{"start":{"line":29,"column":38},"end":{"line":29,"column":111}},"16":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"17":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"18":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"19":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"20":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"21":{"start":{"line":42,"column":36},"end":{"line":42,"column":106}},"22":{"start":{"line":43,"column":39},"end":{"line":43,"column":57}},"23":{"start":{"line":48,"column":42},"end":{"line":48,"column":72}},"24":{"start":{"line":50,"column":62},"end":{"line":51,"column":null}},"25":{"start":{"line":51,"column":49},"end":{"line":51,"column":110}},"26":{"start":{"line":61,"column":24},"end":{"line":61,"column":null}},"27":{"start":{"line":62,"column":38},"end":{"line":66,"column":26}},"28":{"start":{"line":67,"column":41},"end":{"line":67,"column":71}},"29":{"start":{"line":68,"column":24},"end":{"line":68,"column":null}},"30":{"start":{"line":69,"column":24},"end":{"line":69,"column":null}},"31":{"start":{"line":71,"column":24},"end":{"line":75,"column":null}},"32":{"start":{"line":78,"column":24},"end":{"line":78,"column":null}},"33":{"start":{"line":81,"column":20},"end":{"line":81,"column":null}},"34":{"start":{"line":85,"column":12},"end":{"line":85,"column":null}},"35":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"36":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"37":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"38":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"39":{"start":{"line":94,"column":47},"end":{"line":94,"column":null}},"40":{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},"41":{"start":{"line":96,"column":67},"end":{"line":96,"column":80}},"42":{"start":{"line":97,"column":13},"end":{"line":97,"column":null}},"43":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":78},"end":{"line":91,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":51,"column":25},"end":{"line":51,"column":44}},"loc":{"start":{"line":51,"column":49},"end":{"line":51,"column":110}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":93,"column":11},"end":{"line":93,"column":20}},"loc":{"start":{"line":93,"column":60},"end":{"line":98,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":null}}]},"1":{"loc":{"start":{"line":55,"column":24},"end":{"line":57,"column":118}},"type":"binary-expr","locations":[{"start":{"line":55,"column":24},"end":{"line":55,"column":47}},{"start":{"line":56,"column":24},"end":{"line":56,"column":71}},{"start":{"line":57,"column":24},"end":{"line":57,"column":118}}]},"2":{"loc":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":94,"column":8},"end":{"line":94,"column":null}}]},"3":{"loc":{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},{"start":{"line":97,"column":13},"end":{"line":97,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":5,"10":5,"11":5,"12":5,"13":5,"14":0,"15":5,"16":3,"17":3,"18":1,"19":1,"20":4,"21":4,"22":4,"23":8,"24":8,"25":7,"26":1,"27":1,"28":1,"29":1,"30":1,"31":3,"32":4,"33":0,"34":4,"35":4,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":1},"f":{"0":5,"1":7,"2":0},"b":{"0":[0],"1":[8,4,4],"2":[0],"3":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"12":{"start":{"line":14,"column":27},"end":{"line":14,"column":41}},"13":{"start":{"line":15,"column":12},"end":{"line":15,"column":23}},"14":{"start":{"line":31,"column":16},"end":{"line":31,"column":30}},"15":{"start":{"line":32,"column":16},"end":{"line":32,"column":35}},"16":{"start":{"line":33,"column":16},"end":{"line":33,"column":37}},"17":{"start":{"line":34,"column":16},"end":{"line":34,"column":35}},"18":{"start":{"line":35,"column":16},"end":{"line":35,"column":39}},"19":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"20":{"start":{"line":41,"column":12},"end":{"line":41,"column":null}},"21":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"22":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"23":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"24":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"25":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"26":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"27":{"start":{"line":54,"column":25},"end":{"line":54,"column":32}},"28":{"start":{"line":55,"column":19},"end":{"line":55,"column":21}},"29":{"start":{"line":58,"column":27},"end":{"line":58,"column":84}},"30":{"start":{"line":59,"column":25},"end":{"line":59,"column":80}},"31":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"32":{"start":{"line":64,"column":8},"end":{"line":70,"column":null}},"33":{"start":{"line":72,"column":22},"end":{"line":72,"column":42}},"34":{"start":{"line":73,"column":33},"end":{"line":73,"column":65}},"35":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"36":{"start":{"line":76,"column":26},"end":{"line":76,"column":46}},"37":{"start":{"line":77,"column":27},"end":{"line":77,"column":43}},"38":{"start":{"line":79,"column":8},"end":{"line":90,"column":null}},"39":{"start":{"line":80,"column":24},"end":{"line":80,"column":29}},"40":{"start":{"line":81,"column":34},"end":{"line":81,"column":89}},"41":{"start":{"line":82,"column":25},"end":{"line":82,"column":26}},"42":{"start":{"line":83,"column":36},"end":{"line":83,"column":98}},"43":{"start":{"line":85,"column":20},"end":{"line":85,"column":null}},"44":{"start":{"line":86,"column":20},"end":{"line":86,"column":null}},"45":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"46":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"47":{"start":{"line":96,"column":25},"end":{"line":96,"column":47}},"48":{"start":{"line":99,"column":25},"end":{"line":99,"column":26}},"49":{"start":{"line":102,"column":35},"end":{"line":102,"column":54}},"50":{"start":{"line":104,"column":43},"end":{"line":104,"column":83}},"51":{"start":{"line":107,"column":28},"end":{"line":107,"column":null}},"52":{"start":{"line":108,"column":28},"end":{"line":108,"column":null}},"53":{"start":{"line":110,"column":28},"end":{"line":110,"column":null}},"54":{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},"55":{"start":{"line":112,"column":30},"end":{"line":112,"column":115}},"56":{"start":{"line":114,"column":30},"end":{"line":114,"column":null}},"57":{"start":{"line":116,"column":28},"end":{"line":116,"column":null}},"58":{"start":{"line":118,"column":28},"end":{"line":118,"column":null}},"59":{"start":{"line":120,"column":28},"end":{"line":120,"column":null}},"60":{"start":{"line":125,"column":19},"end":{"line":126,"column":null}},"61":{"start":{"line":126,"column":20},"end":{"line":126,"column":null}},"62":{"start":{"line":130,"column":20},"end":{"line":134,"column":null}},"63":{"start":{"line":140,"column":12},"end":{"line":140,"column":null}},"64":{"start":{"line":141,"column":12},"end":{"line":141,"column":null}},"65":{"start":{"line":146,"column":12},"end":{"line":146,"column":null}},"66":{"start":{"line":147,"column":12},"end":{"line":147,"column":null}},"67":{"start":{"line":150,"column":8},"end":{"line":150,"column":null}},"68":{"start":{"line":152,"column":8},"end":{"line":152,"column":null}},"69":{"start":{"line":157,"column":8},"end":{"line":157,"column":null}},"70":{"start":{"line":159,"column":12},"end":{"line":159,"column":null}},"71":{"start":{"line":162,"column":24},"end":{"line":162,"column":28}},"72":{"start":{"line":163,"column":8},"end":{"line":170,"column":null}},"73":{"start":{"line":168,"column":16},"end":{"line":168,"column":null}},"74":{"start":{"line":171,"column":8},"end":{"line":171,"column":null}},"75":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"76":{"start":{"line":178,"column":12},"end":{"line":180,"column":null}},"77":{"start":{"line":179,"column":16},"end":{"line":179,"column":null}},"78":{"start":{"line":182,"column":8},"end":{"line":182,"column":null}},"79":{"start":{"line":184,"column":21},"end":{"line":184,"column":22}},"80":{"start":{"line":185,"column":27},"end":{"line":185,"column":44}},"81":{"start":{"line":187,"column":30},"end":{"line":187,"column":68}},"82":{"start":{"line":188,"column":32},"end":{"line":188,"column":34}},"83":{"start":{"line":190,"column":20},"end":{"line":190,"column":null}},"84":{"start":{"line":192,"column":20},"end":{"line":192,"column":null}},"85":{"start":{"line":195,"column":27},"end":{"line":195,"column":65}},"86":{"start":{"line":202,"column":24},"end":{"line":208,"column":null}},"87":{"start":{"line":210,"column":24},"end":{"line":210,"column":null}},"88":{"start":{"line":212,"column":33},"end":{"line":212,"column":88}},"89":{"start":{"line":214,"column":41},"end":{"line":214,"column":113}},"90":{"start":{"line":216,"column":28},"end":{"line":220,"column":null}},"91":{"start":{"line":222,"column":28},"end":{"line":226,"column":null}},"92":{"start":{"line":228,"column":28},"end":{"line":234,"column":null}},"93":{"start":{"line":236,"column":28},"end":{"line":240,"column":null}},"94":{"start":{"line":242,"column":24},"end":{"line":246,"column":null}},"95":{"start":{"line":248,"column":24},"end":{"line":254,"column":null}},"96":{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},"97":{"start":{"line":257,"column":28},"end":{"line":261,"column":null}},"98":{"start":{"line":262,"column":28},"end":{"line":268,"column":null}},"99":{"start":{"line":276,"column":16},"end":{"line":282,"column":null}},"100":{"start":{"line":286,"column":8},"end":{"line":286,"column":null}},"101":{"start":{"line":291,"column":21},"end":{"line":291,"column":22}},"102":{"start":{"line":292,"column":12},"end":{"line":292,"column":null}},"103":{"start":{"line":294,"column":8},"end":{"line":296,"column":null}},"104":{"start":{"line":295,"column":12},"end":{"line":295,"column":null}},"105":{"start":{"line":299,"column":23},"end":{"line":306,"column":null}},"106":{"start":{"line":308,"column":41},"end":{"line":308,"column":49}},"107":{"start":{"line":309,"column":27},"end":{"line":309,"column":74}},"108":{"start":{"line":310,"column":26},"end":{"line":310,"column":46}},"109":{"start":{"line":311,"column":22},"end":{"line":311,"column":47}},"110":{"start":{"line":312,"column":12},"end":{"line":312,"column":null}},"111":{"start":{"line":317,"column":28},"end":{"line":317,"column":33}},"112":{"start":{"line":318,"column":21},"end":{"line":318,"column":22}},"113":{"start":{"line":320,"column":16},"end":{"line":320,"column":null}},"114":{"start":{"line":321,"column":16},"end":{"line":321,"column":null}},"115":{"start":{"line":322,"column":16},"end":{"line":322,"column":null}},"116":{"start":{"line":327,"column":12},"end":{"line":330,"column":null}},"117":{"start":{"line":331,"column":12},"end":{"line":331,"column":null}},"118":{"start":{"line":333,"column":8},"end":{"line":333,"column":null}},"119":{"start":{"line":337,"column":28},"end":{"line":337,"column":47}},"120":{"start":{"line":338,"column":29},"end":{"line":338,"column":58}},"121":{"start":{"line":339,"column":25},"end":{"line":339,"column":29}},"122":{"start":{"line":340,"column":33},"end":{"line":340,"column":52}},"123":{"start":{"line":341,"column":31},"end":{"line":341,"column":46}},"124":{"start":{"line":343,"column":28},"end":{"line":343,"column":47}},"125":{"start":{"line":345,"column":33},"end":{"line":348,"column":null}},"126":{"start":{"line":350,"column":21},"end":{"line":350,"column":22}},"127":{"start":{"line":352,"column":32},"end":{"line":352,"column":66}},"128":{"start":{"line":354,"column":32},"end":{"line":354,"column":88}},"129":{"start":{"line":355,"column":16},"end":{"line":355,"column":null}},"130":{"start":{"line":356,"column":16},"end":{"line":356,"column":null}},"131":{"start":{"line":359,"column":20},"end":{"line":359,"column":null}},"132":{"start":{"line":363,"column":20},"end":{"line":363,"column":null}},"133":{"start":{"line":366,"column":35},"end":{"line":366,"column":62}},"134":{"start":{"line":370,"column":20},"end":{"line":374,"column":null}},"135":{"start":{"line":377,"column":20},"end":{"line":381,"column":null}},"136":{"start":{"line":384,"column":32},"end":{"line":384,"column":67}},"137":{"start":{"line":386,"column":28},"end":{"line":386,"column":63}},"138":{"start":{"line":388,"column":32},"end":{"line":388,"column":63}},"139":{"start":{"line":389,"column":16},"end":{"line":389,"column":null}},"140":{"start":{"line":390,"column":35},"end":{"line":390,"column":62}},"141":{"start":{"line":393,"column":20},"end":{"line":393,"column":null}},"142":{"start":{"line":397,"column":20},"end":{"line":397,"column":null}},"143":{"start":{"line":400,"column":16},"end":{"line":405,"column":null}},"144":{"start":{"line":408,"column":16},"end":{"line":412,"column":null}},"145":{"start":{"line":415,"column":8},"end":{"line":415,"column":null}},"146":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"147":{"start":{"line":418,"column":0},"end":{"line":418,"column":null}},"148":{"start":{"line":419,"column":4},"end":{"line":419,"column":null}},"149":{"start":{"line":420,"column":4},"end":{"line":420,"column":null}},"150":{"start":{"line":421,"column":4},"end":{"line":421,"column":null}},"151":{"start":{"line":422,"column":4},"end":{"line":422,"column":null}},"152":{"start":{"line":423,"column":4},"end":{"line":423,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"loc":{"start":{"line":35,"column":39},"end":{"line":49,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":51,"column":11},"end":{"line":51,"column":17}},"loc":{"start":{"line":51,"column":43},"end":{"line":153,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":79,"column":44},"end":{"line":79,"column":51}},"loc":{"start":{"line":79,"column":55},"end":{"line":90,"column":9}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":156,"column":12},"end":{"line":156,"column":26}},"loc":{"start":{"line":156,"column":64},"end":{"line":172,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":163,"column":30},"end":{"line":163,"column":36}},"loc":{"start":{"line":163,"column":40},"end":{"line":170,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":174,"column":12},"end":{"line":174,"column":18}},"loc":{"start":{"line":174,"column":92},"end":{"line":287,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":178,"column":84},"end":{"line":178,"column":92}},"loc":{"start":{"line":178,"column":96},"end":{"line":180,"column":13}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":289,"column":12},"end":{"line":289,"column":35}},"loc":{"start":{"line":289,"column":98},"end":{"line":314,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":294,"column":40},"end":{"line":294,"column":48}},"loc":{"start":{"line":294,"column":52},"end":{"line":296,"column":9}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":316,"column":12},"end":{"line":316,"column":35}},"loc":{"start":{"line":316,"column":64},"end":{"line":334,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":336,"column":12},"end":{"line":336,"column":18}},"loc":{"start":{"line":336,"column":43},"end":{"line":416,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":418,"column":0},"end":{"line":418,"column":5}},"loc":{"start":{"line":418,"column":14},"end":{"line":424,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":68}},"type":"binary-expr","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":35}},{"start":{"line":37,"column":39},"end":{"line":37,"column":68}}]},"1":{"loc":{"start":{"line":98,"column":12},"end":{"line":98,"column":49}},"type":"binary-expr","locations":[{"start":{"line":98,"column":12},"end":{"line":98,"column":23}},{"start":{"line":98,"column":27},"end":{"line":98,"column":49}}]},"2":{"loc":{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},{"start":{"line":114,"column":30},"end":{"line":114,"column":null}}]},"3":{"loc":{"start":{"line":125,"column":19},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":19},"end":{"line":126,"column":null}}]},"4":{"loc":{"start":{"line":157,"column":23},"end":{"line":157,"column":41}},"type":"binary-expr","locations":[{"start":{"line":157,"column":23},"end":{"line":157,"column":35}},{"start":{"line":157,"column":39},"end":{"line":157,"column":41}}]},"5":{"loc":{"start":{"line":165,"column":16},"end":{"line":166,"column":69}},"type":"binary-expr","locations":[{"start":{"line":165,"column":16},"end":{"line":165,"column":63}},{"start":{"line":166,"column":16},"end":{"line":166,"column":69}}]},"6":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":80}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":49}},{"start":{"line":179,"column":53},"end":{"line":179,"column":80}}]},"7":{"loc":{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},"type":"if","locations":[{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},{"start":{"line":269,"column":31},"end":{"line":271,"column":null}}]},"8":{"loc":{"start":{"line":295,"column":19},"end":{"line":295,"column":66}},"type":"binary-expr","locations":[{"start":{"line":295,"column":19},"end":{"line":295,"column":35}},{"start":{"line":295,"column":39},"end":{"line":295,"column":66}}]},"9":{"loc":{"start":{"line":418,"column":5},"end":{"line":418,"column":null}},"type":"binary-expr","locations":[{"start":{"line":418,"column":5},"end":{"line":418,"column":14}},{"start":{"line":418,"column":5},"end":{"line":418,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[1,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"10":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"11":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"12":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"13":{"start":{"line":22,"column":16},"end":{"line":22,"column":30}},"14":{"start":{"line":23,"column":16},"end":{"line":23,"column":36}},"15":{"start":{"line":24,"column":16},"end":{"line":24,"column":46}},"16":{"start":{"line":25,"column":16},"end":{"line":25,"column":48}},"17":{"start":{"line":29,"column":23},"end":{"line":29,"column":81}},"18":{"start":{"line":31,"column":28},"end":{"line":31,"column":86}},"19":{"start":{"line":32,"column":28},"end":{"line":32,"column":106}},"20":{"start":{"line":34,"column":8},"end":{"line":40,"column":null}},"21":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"22":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"23":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"24":{"start":{"line":55,"column":16},"end":{"line":55,"column":null}},"25":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"26":{"start":{"line":58,"column":16},"end":{"line":58,"column":null}},"27":{"start":{"line":59,"column":16},"end":{"line":59,"column":null}},"28":{"start":{"line":60,"column":16},"end":{"line":60,"column":null}},"29":{"start":{"line":61,"column":16},"end":{"line":61,"column":null}},"30":{"start":{"line":64,"column":38},"end":{"line":64,"column":100}},"31":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"32":{"start":{"line":66,"column":50},"end":{"line":66,"column":null}},"33":{"start":{"line":68,"column":12},"end":{"line":72,"column":null}},"34":{"start":{"line":77,"column":40},"end":{"line":77,"column":74}},"35":{"start":{"line":78,"column":41},"end":{"line":78,"column":65}},"36":{"start":{"line":80,"column":35},"end":{"line":80,"column":87}},"37":{"start":{"line":83,"column":20},"end":{"line":83,"column":null}},"38":{"start":{"line":84,"column":20},"end":{"line":84,"column":null}},"39":{"start":{"line":88,"column":12},"end":{"line":92,"column":null}},"40":{"start":{"line":93,"column":45},"end":{"line":93,"column":107}},"41":{"start":{"line":95,"column":16},"end":{"line":95,"column":null}},"42":{"start":{"line":98,"column":12},"end":{"line":98,"column":null}},"43":{"start":{"line":100,"column":12},"end":{"line":104,"column":null}},"44":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"45":{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},"46":{"start":{"line":111,"column":60},"end":{"line":111,"column":125}},"47":{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},"48":{"start":{"line":112,"column":49},"end":{"line":112,"column":117}},"49":{"start":{"line":113,"column":13},"end":{"line":113,"column":null}},"50":{"start":{"line":115,"column":39},"end":{"line":115,"column":99}},"51":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"52":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"53":{"start":{"line":124,"column":33},"end":{"line":124,"column":63}},"54":{"start":{"line":125,"column":29},"end":{"line":125,"column":61}},"55":{"start":{"line":127,"column":8},"end":{"line":127,"column":null}},"56":{"start":{"line":129,"column":12},"end":{"line":129,"column":null}},"57":{"start":{"line":131,"column":12},"end":{"line":131,"column":null}},"58":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"59":{"start":{"line":138,"column":40},"end":{"line":138,"column":90}},"60":{"start":{"line":139,"column":28},"end":{"line":139,"column":57}},"61":{"start":{"line":144,"column":16},"end":{"line":144,"column":null}},"62":{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},"63":{"start":{"line":149,"column":12},"end":{"line":149,"column":null}},"64":{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},"65":{"start":{"line":153,"column":16},"end":{"line":153,"column":null}},"66":{"start":{"line":154,"column":16},"end":{"line":154,"column":null}},"67":{"start":{"line":155,"column":19},"end":{"line":155,"column":null}},"68":{"start":{"line":156,"column":15},"end":{"line":156,"column":null}},"69":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"70":{"start":{"line":163,"column":12},"end":{"line":163,"column":null}},"71":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"loc":{"start":{"line":12,"column":0},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"loc":{"start":{"line":25,"column":48},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":21},"end":{"line":107,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":109,"column":12},"end":{"line":109,"column":43}},"loc":{"start":{"line":109,"column":68},"end":{"line":121,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":123,"column":12},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":68},"end":{"line":135,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":137,"column":12},"end":{"line":137,"column":18}},"loc":{"start":{"line":137,"column":96},"end":{"line":157,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":159,"column":12},"end":{"line":159,"column":34}},"loc":{"start":{"line":159,"column":99},"end":{"line":165,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":110}},"type":"binary-expr","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":47}},{"start":{"line":43,"column":51},"end":{"line":43,"column":110}}]},"1":{"loc":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":12},"end":{"line":66,"column":null}}]},"2":{"loc":{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},{"start":{"line":112,"column":13},"end":{"line":113,"column":null}}]},"3":{"loc":{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},{"start":{"line":113,"column":13},"end":{"line":113,"column":null}}]},"4":{"loc":{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},{"start":{"line":156,"column":15},"end":{"line":156,"column":null}}]},"5":{"loc":{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},{"start":{"line":155,"column":19},"end":{"line":155,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":9,"14":9,"15":9,"16":9,"17":9,"18":9,"19":9,"20":8,"21":0,"22":8,"23":6,"24":6,"25":0,"26":0,"27":0,"28":0,"29":0,"30":6,"31":6,"32":6,"33":6,"34":7,"35":7,"36":7,"37":1,"38":1,"39":5,"40":5,"41":1,"42":4,"43":2,"44":2,"45":6,"46":0,"47":6,"48":0,"49":6,"50":6,"51":6,"52":6,"53":8,"54":8,"55":8,"56":0,"57":8,"58":8,"59":5,"60":5,"61":5,"62":5,"63":2,"64":2,"65":1,"66":1,"67":1,"68":3,"69":0,"70":0,"71":1},"f":{"0":1,"1":9,"2":9,"3":6,"4":8,"5":5,"6":0},"b":{"0":[8,7],"1":[6],"2":[0,6],"3":[0,6],"4":[2,3],"5":[1,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":8,"column":34}},"6":{"start":{"line":9,"column":23},"end":{"line":9,"column":47}},"7":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"8":{"start":{"line":13,"column":18},"end":{"line":13,"column":42}},"9":{"start":{"line":14,"column":18},"end":{"line":14,"column":40}},"10":{"start":{"line":15,"column":18},"end":{"line":15,"column":62}},"11":{"start":{"line":16,"column":18},"end":{"line":16,"column":33}},"12":{"start":{"line":17,"column":18},"end":{"line":17,"column":43}},"13":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"14":{"start":{"line":27,"column":30},"end":{"line":27,"column":104}},"15":{"start":{"line":29,"column":28},"end":{"line":29,"column":87}},"16":{"start":{"line":29,"column":49},"end":{"line":29,"column":86}},"17":{"start":{"line":31,"column":25},"end":{"line":31,"column":76}},"18":{"start":{"line":31,"column":46},"end":{"line":31,"column":75}},"19":{"start":{"line":33,"column":26},"end":{"line":33,"column":78}},"20":{"start":{"line":33,"column":47},"end":{"line":33,"column":77}},"21":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"22":{"start":{"line":35,"column":24},"end":{"line":35,"column":null}},"23":{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},"24":{"start":{"line":37,"column":43},"end":{"line":37,"column":55}},"25":{"start":{"line":38,"column":13},"end":{"line":38,"column":null}},"26":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"27":{"start":{"line":55,"column":22},"end":{"line":55,"column":67}},"28":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"29":{"start":{"line":60,"column":54},"end":{"line":60,"column":null}},"30":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"31":{"start":{"line":61,"column":56},"end":{"line":61,"column":null}},"32":{"start":{"line":65,"column":12},"end":{"line":67,"column":null}},"33":{"start":{"line":69,"column":12},"end":{"line":73,"column":null}},"34":{"start":{"line":75,"column":12},"end":{"line":79,"column":null}},"35":{"start":{"line":81,"column":12},"end":{"line":83,"column":null}},"36":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"loc":{"start":{"line":17,"column":43},"end":{"line":20,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":20}},"loc":{"start":{"line":22,"column":20},"end":{"line":24,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":18}},"loc":{"start":{"line":26,"column":69},"end":{"line":39,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":29,"column":40},"end":{"line":29,"column":44}},"loc":{"start":{"line":29,"column":49},"end":{"line":29,"column":86}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":31,"column":37},"end":{"line":31,"column":41}},"loc":{"start":{"line":31,"column":46},"end":{"line":31,"column":75}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":33,"column":38},"end":{"line":33,"column":42}},"loc":{"start":{"line":33,"column":47},"end":{"line":33,"column":77}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":20}},"loc":{"start":{"line":41,"column":31},"end":{"line":43,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":17}},"loc":{"start":{"line":45,"column":40},"end":{"line":46,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":21}},"loc":{"start":{"line":49,"column":44},"end":{"line":49,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":41}},"loc":{"start":{"line":51,"column":41},"end":{"line":51,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":31}},"loc":{"start":{"line":54,"column":56},"end":{"line":85,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":8},"end":{"line":35,"column":null}}]},"1":{"loc":{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},{"start":{"line":38,"column":13},"end":{"line":38,"column":null}}]},"2":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":41}},"type":"binary-expr","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":26}},{"start":{"line":37,"column":30},"end":{"line":37,"column":41}}]},"3":{"loc":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":60,"column":null}}]},"4":{"loc":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":12},"end":{"line":61,"column":null}}]},"5":{"loc":{"start":{"line":64,"column":12},"end":{"line":64,"column":32}},"type":"binary-expr","locations":[{"start":{"line":64,"column":12},"end":{"line":64,"column":19}},{"start":{"line":64,"column":23},"end":{"line":64,"column":32}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"14":{"start":{"line":18,"column":0},"end":{"line":18,"column":null}},"15":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"16":{"start":{"line":22,"column":18},"end":{"line":22,"column":42}},"17":{"start":{"line":23,"column":18},"end":{"line":23,"column":40}},"18":{"start":{"line":24,"column":18},"end":{"line":24,"column":62}},"19":{"start":{"line":25,"column":18},"end":{"line":25,"column":33}},"20":{"start":{"line":26,"column":18},"end":{"line":26,"column":43}},"21":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"22":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"23":{"start":{"line":42,"column":26},"end":{"line":42,"column":101}},"24":{"start":{"line":45,"column":49},"end":{"line":45,"column":108}},"25":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"26":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"27":{"start":{"line":52,"column":12},"end":{"line":52,"column":null}},"28":{"start":{"line":56,"column":12},"end":{"line":56,"column":null}},"29":{"start":{"line":58,"column":12},"end":{"line":58,"column":null}},"30":{"start":{"line":63,"column":33},"end":{"line":63,"column":79}},"31":{"start":{"line":64,"column":52},"end":{"line":64,"column":119}},"32":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"33":{"start":{"line":72,"column":67},"end":{"line":77,"column":null}},"34":{"start":{"line":79,"column":16},"end":{"line":79,"column":null}},"35":{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},"36":{"start":{"line":83,"column":20},"end":{"line":87,"column":null}},"37":{"start":{"line":89,"column":39},"end":{"line":89,"column":116}},"38":{"start":{"line":90,"column":20},"end":{"line":90,"column":null}},"39":{"start":{"line":91,"column":23},"end":{"line":91,"column":null}},"40":{"start":{"line":94,"column":12},"end":{"line":94,"column":null}},"41":{"start":{"line":96,"column":12},"end":{"line":100,"column":null}},"42":{"start":{"line":102,"column":12},"end":{"line":105,"column":null}},"43":{"start":{"line":116,"column":23},"end":{"line":116,"column":68}},"44":{"start":{"line":117,"column":27},"end":{"line":117,"column":76}},"45":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"46":{"start":{"line":120,"column":39},"end":{"line":120,"column":null}},"47":{"start":{"line":123,"column":43},"end":{"line":123,"column":77}},"48":{"start":{"line":126,"column":12},"end":{"line":126,"column":null}},"49":{"start":{"line":127,"column":12},"end":{"line":127,"column":null}},"50":{"start":{"line":131,"column":39},"end":{"line":131,"column":100}},"51":{"start":{"line":134,"column":12},"end":{"line":134,"column":null}},"52":{"start":{"line":137,"column":8},"end":{"line":138,"column":null}},"53":{"start":{"line":138,"column":12},"end":{"line":138,"column":null}},"54":{"start":{"line":142,"column":73},"end":{"line":142,"column":75}},"55":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"56":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"57":{"start":{"line":148,"column":63},"end":{"line":148,"column":65}},"58":{"start":{"line":149,"column":32},"end":{"line":149,"column":34}},"59":{"start":{"line":154,"column":33},"end":{"line":154,"column":87}},"60":{"start":{"line":155,"column":16},"end":{"line":155,"column":null}},"61":{"start":{"line":157,"column":16},"end":{"line":157,"column":null}},"62":{"start":{"line":162,"column":16},"end":{"line":164,"column":null}},"63":{"start":{"line":163,"column":20},"end":{"line":163,"column":null}},"64":{"start":{"line":168,"column":12},"end":{"line":172,"column":null}},"65":{"start":{"line":170,"column":20},"end":{"line":170,"column":null}},"66":{"start":{"line":174,"column":12},"end":{"line":174,"column":null}},"67":{"start":{"line":174,"column":49},"end":{"line":174,"column":null}},"68":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"69":{"start":{"line":185,"column":31},"end":{"line":185,"column":77}},"70":{"start":{"line":187,"column":36},"end":{"line":190,"column":34}},"71":{"start":{"line":192,"column":77},"end":{"line":195,"column":null}},"72":{"start":{"line":197,"column":38},"end":{"line":197,"column":97}},"73":{"start":{"line":200,"column":41},"end":{"line":204,"column":null}},"74":{"start":{"line":207,"column":31},"end":{"line":207,"column":83}},"75":{"start":{"line":209,"column":53},"end":{"line":209,"column":95}},"76":{"start":{"line":211,"column":12},"end":{"line":211,"column":null}},"77":{"start":{"line":212,"column":12},"end":{"line":212,"column":null}},"78":{"start":{"line":213,"column":12},"end":{"line":216,"column":null}},"79":{"start":{"line":217,"column":12},"end":{"line":217,"column":null}},"80":{"start":{"line":218,"column":12},"end":{"line":218,"column":null}},"81":{"start":{"line":219,"column":12},"end":{"line":219,"column":null}},"82":{"start":{"line":220,"column":12},"end":{"line":220,"column":null}},"83":{"start":{"line":222,"column":12},"end":{"line":225,"column":null}},"84":{"start":{"line":226,"column":12},"end":{"line":226,"column":null}},"85":{"start":{"line":229,"column":12},"end":{"line":229,"column":null}},"86":{"start":{"line":230,"column":12},"end":{"line":230,"column":null}},"87":{"start":{"line":231,"column":12},"end":{"line":231,"column":null}},"88":{"start":{"line":232,"column":12},"end":{"line":232,"column":null}},"89":{"start":{"line":233,"column":12},"end":{"line":233,"column":null}},"90":{"start":{"line":234,"column":12},"end":{"line":234,"column":null}},"91":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"92":{"start":{"line":236,"column":12},"end":{"line":236,"column":null}},"93":{"start":{"line":245,"column":16},"end":{"line":245,"column":null}},"94":{"start":{"line":250,"column":16},"end":{"line":250,"column":null}},"95":{"start":{"line":254,"column":33},"end":{"line":254,"column":86}},"96":{"start":{"line":254,"column":77},"end":{"line":254,"column":85}},"97":{"start":{"line":255,"column":29},"end":{"line":255,"column":86}},"98":{"start":{"line":255,"column":77},"end":{"line":255,"column":85}},"99":{"start":{"line":256,"column":39},"end":{"line":256,"column":96}},"100":{"start":{"line":256,"column":87},"end":{"line":256,"column":95}},"101":{"start":{"line":257,"column":12},"end":{"line":257,"column":null}},"102":{"start":{"line":257,"column":61},"end":{"line":257,"column":95}},"103":{"start":{"line":258,"column":12},"end":{"line":258,"column":null}},"104":{"start":{"line":258,"column":61},"end":{"line":258,"column":87}},"105":{"start":{"line":261,"column":39},"end":{"line":262,"column":null}},"106":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}},"107":{"start":{"line":266,"column":43},"end":{"line":266,"column":100}},"108":{"start":{"line":266,"column":81},"end":{"line":266,"column":99}},"109":{"start":{"line":268,"column":12},"end":{"line":268,"column":null}},"110":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"loc":{"start":{"line":26,"column":43},"end":{"line":29,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":20}},"loc":{"start":{"line":31,"column":20},"end":{"line":33,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":41}},"loc":{"start":{"line":35,"column":41},"end":{"line":35,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"loc":{"start":{"line":37,"column":69},"end":{"line":39,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":10}},"loc":{"start":{"line":41,"column":49},"end":{"line":60,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":62,"column":12},"end":{"line":62,"column":18}},"loc":{"start":{"line":62,"column":80},"end":{"line":66,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":68,"column":11},"end":{"line":68,"column":17}},"loc":{"start":{"line":68,"column":53},"end":{"line":107,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":109,"column":4},"end":{"line":109,"column":21}},"loc":{"start":{"line":109,"column":32},"end":{"line":109,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":111,"column":12},"end":{"line":111,"column":18}},"loc":{"start":{"line":114,"column":36},"end":{"line":139,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":141,"column":4},"end":{"line":141,"column":10}},"loc":{"start":{"line":141,"column":70},"end":{"line":178,"column":null}}},"10":{"name":"getPackagesToCommits","decl":{"start":{"line":147,"column":23},"end":{"line":147,"column":43}},"loc":{"start":{"line":147,"column":67},"end":{"line":177,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":162,"column":44},"end":{"line":162,"column":52}},"loc":{"start":{"line":162,"column":56},"end":{"line":164,"column":17}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":168,"column":48},"end":{"line":168,"column":55}},"loc":{"start":{"line":168,"column":59},"end":{"line":172,"column":13}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":180,"column":12},"end":{"line":180,"column":18}},"loc":{"start":{"line":183,"column":22},"end":{"line":270,"column":null}}},"14":{"name":"getOnlyChangedClassesFromPackage","decl":{"start":{"line":239,"column":17},"end":{"line":239,"column":49}},"loc":{"start":{"line":241,"column":54},"end":{"line":269,"column":null}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":254,"column":69},"end":{"line":254,"column":72}},"loc":{"start":{"line":254,"column":77},"end":{"line":254,"column":85}}},"16":{"name":"(anonymous_23)","decl":{"start":{"line":255,"column":69},"end":{"line":255,"column":72}},"loc":{"start":{"line":255,"column":77},"end":{"line":255,"column":85}}},"17":{"name":"(anonymous_24)","decl":{"start":{"line":256,"column":79},"end":{"line":256,"column":82}},"loc":{"start":{"line":256,"column":87},"end":{"line":256,"column":95}}},"18":{"name":"(anonymous_25)","decl":{"start":{"line":257,"column":52},"end":{"line":257,"column":56}},"loc":{"start":{"line":257,"column":61},"end":{"line":257,"column":95}}},"19":{"name":"(anonymous_26)","decl":{"start":{"line":258,"column":52},"end":{"line":258,"column":56}},"loc":{"start":{"line":258,"column":61},"end":{"line":258,"column":87}}},"20":{"name":"(anonymous_27)","decl":{"start":{"line":262,"column":17},"end":{"line":262,"column":26}},"loc":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}}},"21":{"name":"(anonymous_28)","decl":{"start":{"line":266,"column":67},"end":{"line":266,"column":76}},"loc":{"start":{"line":266,"column":81},"end":{"line":266,"column":99}}}},"branchMap":{"0":{"loc":{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},{"start":{"line":91,"column":23},"end":{"line":91,"column":null}}]},"1":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":null}}]},"2":{"loc":{"start":{"line":137,"column":8},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":138,"column":null}}]},"3":{"loc":{"start":{"line":174,"column":12},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":12},"end":{"line":174,"column":null}}]},"4":{"loc":{"start":{"line":244,"column":16},"end":{"line":244,"column":63}},"type":"binary-expr","locations":[{"start":{"line":244,"column":16},"end":{"line":244,"column":34}},{"start":{"line":244,"column":38},"end":{"line":244,"column":63}}]},"5":{"loc":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}},"type":"binary-expr","locations":[{"start":{"line":262,"column":31},"end":{"line":262,"column":74}},{"start":{"line":262,"column":78},"end":{"line":262,"column":108}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":42}},"4":{"start":{"line":11,"column":18},"end":{"line":11,"column":40}},"5":{"start":{"line":12,"column":18},"end":{"line":12,"column":63}},"6":{"start":{"line":13,"column":18},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"8":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"9":{"start":{"line":17,"column":33},"end":{"line":17,"column":null}},"10":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"11":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"12":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"13":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"14":{"start":{"line":31,"column":8},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"16":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"17":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"18":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"19":{"start":{"line":50,"column":26},"end":{"line":50,"column":53}},"20":{"start":{"line":52,"column":8},"end":{"line":55,"column":null}},"21":{"start":{"line":57,"column":8},"end":{"line":61,"column":null}},"22":{"start":{"line":58,"column":12},"end":{"line":61,"column":null}},"23":{"start":{"line":63,"column":8},"end":{"line":67,"column":null}},"24":{"start":{"line":69,"column":8},"end":{"line":73,"column":null}},"25":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"26":{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},"27":{"start":{"line":84,"column":16},"end":{"line":84,"column":108}},"28":{"start":{"line":85,"column":17},"end":{"line":85,"column":null}},"29":{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},"30":{"start":{"line":90,"column":16},"end":{"line":90,"column":110}},"31":{"start":{"line":91,"column":17},"end":{"line":91,"column":null}},"32":{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},"33":{"start":{"line":98,"column":16},"end":{"line":98,"column":82}},"34":{"start":{"line":99,"column":17},"end":{"line":99,"column":null}},"35":{"start":{"line":106,"column":8},"end":{"line":111,"column":null}},"36":{"start":{"line":112,"column":8},"end":{"line":116,"column":null}},"37":{"start":{"line":117,"column":8},"end":{"line":117,"column":null}},"38":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"39":{"start":{"line":122,"column":8},"end":{"line":122,"column":null}},"40":{"start":{"line":123,"column":8},"end":{"line":127,"column":null}},"41":{"start":{"line":128,"column":8},"end":{"line":132,"column":null}},"42":{"start":{"line":134,"column":8},"end":{"line":138,"column":null}},"43":{"start":{"line":140,"column":8},"end":{"line":140,"column":null}},"44":{"start":{"line":142,"column":8},"end":{"line":142,"column":null}},"45":{"start":{"line":6,"column":0},"end":{"line":6,"column":22}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":14,"column":43},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":20,"column":11},"end":{"line":20,"column":17}},"loc":{"start":{"line":20,"column":21},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":46}},"loc":{"start":{"line":49,"column":46},"end":{"line":79,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":12},"end":{"line":81,"column":42}},"loc":{"start":{"line":81,"column":65},"end":{"line":93,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":95,"column":12},"end":{"line":95,"column":18}},"loc":{"start":{"line":95,"column":77},"end":{"line":101,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":105,"column":14},"end":{"line":105,"column":39}},"loc":{"start":{"line":105,"column":39},"end":{"line":119,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":121,"column":12},"end":{"line":121,"column":23}},"loc":{"start":{"line":121,"column":23},"end":{"line":143,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":null}}]},"1":{"loc":{"start":{"line":57,"column":8},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":61,"column":null}}]},"2":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":110}},"type":"binary-expr","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":58}},{"start":{"line":57,"column":62},"end":{"line":57,"column":110}}]},"3":{"loc":{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},{"start":{"line":85,"column":17},"end":{"line":85,"column":null}}]},"4":{"loc":{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},{"start":{"line":91,"column":17},"end":{"line":91,"column":null}}]},"5":{"loc":{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},{"start":{"line":99,"column":17},"end":{"line":99,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts","statementMap":{"0":{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},"1":{"start":{"line":9,"column":16},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"3":{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},"4":{"start":{"line":16,"column":16},"end":{"line":17,"column":null}},"5":{"start":{"line":18,"column":19},"end":{"line":18,"column":null}},"6":{"start":{"line":21,"column":8},"end":{"line":21,"column":null}},"7":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":27}},"loc":{"start":{"line":6,"column":79},"end":{"line":22,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},{"start":{"line":11,"column":19},"end":{"line":11,"column":null}}]},"1":{"loc":{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},{"start":{"line":18,"column":19},"end":{"line":18,"column":null}}]}},"s":{"0":4,"1":4,"2":0,"3":4,"4":4,"5":0,"6":4,"7":2},"f":{"0":4},"b":{"0":[4,0],"1":[4,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"2":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"3":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"4":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"5":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"6":{"start":{"line":25,"column":12},"end":{"line":25,"column":null}},"7":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"8":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":85},"end":{"line":28,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":12},"end":{"line":11,"column":105}},"type":"binary-expr","locations":[{"start":{"line":11,"column":12},"end":{"line":11,"column":54}},{"start":{"line":11,"column":58},"end":{"line":11,"column":105}}]}},"s":{"0":2,"1":2,"2":0,"3":4,"4":4,"5":4,"6":0,"7":4,"8":2},"f":{"0":4},"b":{"0":[4,4]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts","statementMap":{"0":{"start":{"line":7,"column":12},"end":{"line":7,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":20}},"loc":{"start":{"line":5,"column":69},"end":{"line":9,"column":null}}}},"branchMap":{},"s":{"0":2,"1":2},"f":{"0":2},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":16,"column":58},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"6":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":15},"end":{"line":23,"column":null}},"8":{"start":{"line":29,"column":20},"end":{"line":29,"column":null}},"9":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"10":{"start":{"line":32,"column":20},"end":{"line":32,"column":null}},"11":{"start":{"line":33,"column":20},"end":{"line":33,"column":null}},"12":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"13":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"14":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"15":{"start":{"line":41,"column":20},"end":{"line":41,"column":null}},"16":{"start":{"line":42,"column":20},"end":{"line":42,"column":null}},"17":{"start":{"line":44,"column":16},"end":{"line":44,"column":null}},"18":{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},"19":{"start":{"line":47,"column":16},"end":{"line":47,"column":null}},"20":{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},"21":{"start":{"line":51,"column":16},"end":{"line":51,"column":73}},"22":{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},"23":{"start":{"line":53,"column":16},"end":{"line":53,"column":null}},"24":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"25":{"start":{"line":55,"column":16},"end":{"line":55,"column":null}},"26":{"start":{"line":56,"column":19},"end":{"line":56,"column":null}},"27":{"start":{"line":64,"column":12},"end":{"line":64,"column":null}},"28":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"29":{"start":{"line":69,"column":30},"end":{"line":69,"column":83}},"30":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"31":{"start":{"line":71,"column":36},"end":{"line":71,"column":68}},"32":{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},"33":{"start":{"line":74,"column":38},"end":{"line":74,"column":100}},"34":{"start":{"line":75,"column":13},"end":{"line":75,"column":null}},"35":{"start":{"line":78,"column":8},"end":{"line":80,"column":null}},"36":{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},"37":{"start":{"line":82,"column":49},"end":{"line":82,"column":61}},"38":{"start":{"line":83,"column":13},"end":{"line":83,"column":null}},"39":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":11},"end":{"line":7,"column":18}},"loc":{"start":{"line":10,"column":38},"end":{"line":58,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":11},"end":{"line":60,"column":18}},"loc":{"start":{"line":60,"column":81},"end":{"line":84,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":71,"column":27},"end":{"line":71,"column":31}},"loc":{"start":{"line":71,"column":36},"end":{"line":71,"column":68}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},{"start":{"line":23,"column":15},"end":{"line":23,"column":null}}]},"1":{"loc":{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},{"start":{"line":52,"column":19},"end":{"line":56,"column":null}}]},"2":{"loc":{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},{"start":{"line":56,"column":19},"end":{"line":56,"column":null}}]},"3":{"loc":{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},{"start":{"line":75,"column":13},"end":{"line":75,"column":null}}]},"4":{"loc":{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},{"start":{"line":83,"column":13},"end":{"line":83,"column":null}}]},"5":{"loc":{"start":{"line":82,"column":12},"end":{"line":82,"column":47}},"type":"binary-expr","locations":[{"start":{"line":82,"column":12},"end":{"line":82,"column":25}},{"start":{"line":82,"column":29},"end":{"line":82,"column":47}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":12,"column":24},"end":{"line":12,"column":40}},"3":{"start":{"line":9,"column":21},"end":{"line":10,"column":null}},"4":{"start":{"line":27,"column":20},"end":{"line":27,"column":30}},"5":{"start":{"line":29,"column":34},"end":{"line":29,"column":70}},"6":{"start":{"line":33,"column":29},"end":{"line":33,"column":53}},"7":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"8":{"start":{"line":35,"column":29},"end":{"line":35,"column":null}},"9":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"10":{"start":{"line":36,"column":29},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"12":{"start":{"line":37,"column":29},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"14":{"start":{"line":38,"column":29},"end":{"line":38,"column":null}},"15":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"16":{"start":{"line":41,"column":33},"end":{"line":41,"column":null}},"17":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"18":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"19":{"start":{"line":47,"column":24},"end":{"line":47,"column":88}},"20":{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},"21":{"start":{"line":51,"column":12},"end":{"line":55,"column":null}},"22":{"start":{"line":52,"column":27},"end":{"line":52,"column":99}},"23":{"start":{"line":53,"column":27},"end":{"line":53,"column":99}},"24":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"25":{"start":{"line":56,"column":15},"end":{"line":56,"column":null}},"26":{"start":{"line":60,"column":20},"end":{"line":60,"column":30}},"27":{"start":{"line":62,"column":34},"end":{"line":62,"column":100}},"28":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"29":{"start":{"line":65,"column":24},"end":{"line":65,"column":88}},"30":{"start":{"line":66,"column":8},"end":{"line":66,"column":null}},"31":{"start":{"line":75,"column":20},"end":{"line":75,"column":30}},"32":{"start":{"line":77,"column":34},"end":{"line":77,"column":104}},"33":{"start":{"line":80,"column":29},"end":{"line":80,"column":53}},"34":{"start":{"line":81,"column":12},"end":{"line":81,"column":null}},"35":{"start":{"line":81,"column":29},"end":{"line":81,"column":null}},"36":{"start":{"line":82,"column":12},"end":{"line":82,"column":null}},"37":{"start":{"line":82,"column":29},"end":{"line":82,"column":null}},"38":{"start":{"line":83,"column":12},"end":{"line":83,"column":null}},"39":{"start":{"line":83,"column":29},"end":{"line":83,"column":null}},"40":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"41":{"start":{"line":87,"column":36},"end":{"line":87,"column":63}},"42":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"43":{"start":{"line":90,"column":24},"end":{"line":90,"column":88}},"44":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"45":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":24}},"loc":{"start":{"line":12,"column":40},"end":{"line":12,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":10}},"loc":{"start":{"line":25,"column":37},"end":{"line":57,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":32},"end":{"line":51,"column":33}},"loc":{"start":{"line":51,"column":41},"end":{"line":55,"column":13}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":59,"column":4},"end":{"line":59,"column":10}},"loc":{"start":{"line":59,"column":78},"end":{"line":67,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":69,"column":4},"end":{"line":69,"column":10}},"loc":{"start":{"line":72,"column":30},"end":{"line":93,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":12},"end":{"line":35,"column":null}}]},"1":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":null}}]},"2":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":null}}]},"3":{"loc":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":12},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":41,"column":null}}]},"5":{"loc":{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},{"start":{"line":56,"column":15},"end":{"line":56,"column":null}}]},"6":{"loc":{"start":{"line":81,"column":12},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":12},"end":{"line":81,"column":null}}]},"7":{"loc":{"start":{"line":82,"column":12},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":12},"end":{"line":82,"column":null}}]},"8":{"loc":{"start":{"line":83,"column":12},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":12},"end":{"line":83,"column":null}}]}},"s":{"0":4,"1":4,"2":8,"3":8,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":0,"15":4,"16":4,"17":4,"18":4,"19":4,"20":4,"21":3,"22":6,"23":6,"24":6,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":2,"32":2,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":2,"43":2,"44":2,"45":4},"f":{"0":8,"1":4,"2":6,"3":0,"4":2},"b":{"0":[4],"1":[4],"2":[4],"3":[0],"4":[4],"5":[3,1],"6":[1],"7":[1],"8":[1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts","statementMap":{"0":{"start":{"line":8,"column":12},"end":{"line":8,"column":null}},"1":{"start":{"line":10,"column":27},"end":{"line":10,"column":62}},"2":{"start":{"line":11,"column":37},"end":{"line":11,"column":58}},"3":{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},"4":{"start":{"line":13,"column":43},"end":{"line":13,"column":93}},"5":{"start":{"line":14,"column":17},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"7":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":26}},"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":32}},"loc":{"start":{"line":6,"column":76},"end":{"line":17,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},{"start":{"line":14,"column":17},"end":{"line":14,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":1},"f":{"0":0,"1":0},"b":{"0":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":14},"end":{"line":6,"column":34}},"5":{"start":{"line":10,"column":16},"end":{"line":10,"column":32}},"6":{"start":{"line":11,"column":16},"end":{"line":11,"column":34}},"7":{"start":{"line":12,"column":16},"end":{"line":12,"column":41}},"8":{"start":{"line":13,"column":16},"end":{"line":13,"column":37}},"9":{"start":{"line":26,"column":52},"end":{"line":26,"column":112}},"10":{"start":{"line":27,"column":31},"end":{"line":27,"column":80}},"11":{"start":{"line":32,"column":14},"end":{"line":32,"column":16}},"12":{"start":{"line":36,"column":14},"end":{"line":36,"column":16}},"13":{"start":{"line":39,"column":41},"end":{"line":41,"column":14}},"14":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"15":{"start":{"line":45,"column":16},"end":{"line":45,"column":null}},"16":{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},"17":{"start":{"line":50,"column":52},"end":{"line":56,"column":null}},"18":{"start":{"line":59,"column":40},"end":{"line":59,"column":73}},"19":{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},"20":{"start":{"line":61,"column":20},"end":{"line":61,"column":105}},"21":{"start":{"line":62,"column":21},"end":{"line":62,"column":null}},"22":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"23":{"start":{"line":69,"column":12},"end":{"line":69,"column":null}},"24":{"start":{"line":70,"column":12},"end":{"line":70,"column":null}},"25":{"start":{"line":74,"column":12},"end":{"line":74,"column":null}},"26":{"start":{"line":75,"column":12},"end":{"line":75,"column":null}},"27":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"28":{"start":{"line":82,"column":20},"end":{"line":85,"column":10}},"29":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"30":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"31":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"32":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":13,"column":37},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":21},"end":{"line":79,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":39,"column":64},"end":{"line":39,"column":70}},"loc":{"start":{"line":39,"column":74},"end":{"line":41,"column":13}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":12},"end":{"line":81,"column":35}},"loc":{"start":{"line":81,"column":88},"end":{"line":92,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":87,"column":29},"end":{"line":87,"column":39}},"loc":{"start":{"line":87,"column":43},"end":{"line":89,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},{"start":{"line":62,"column":21},"end":{"line":62,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3,"13":6,"14":12,"15":0,"16":0,"17":6,"18":6,"19":6,"20":3,"21":3,"22":0,"23":2,"24":2,"25":2,"26":2,"27":3,"28":4,"29":4,"30":6,"31":4,"32":1},"f":{"0":3,"1":3,"2":12,"3":4,"4":6},"b":{"0":[3,3]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":8,"column":24},"end":{"line":8,"column":40}},"2":{"start":{"line":8,"column":50},"end":{"line":8,"column":66}},"3":{"start":{"line":11,"column":22},"end":{"line":11,"column":146}},"4":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":24}},"loc":{"start":{"line":8,"column":66},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":11},"end":{"line":10,"column":17}},"loc":{"start":{"line":10,"column":42},"end":{"line":14,"column":null}}}},"branchMap":{},"s":{"0":1,"1":3,"2":3,"3":3,"4":3,"5":1},"f":{"0":3,"1":3},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":21},"end":{"line":6,"column":101}},"4":{"start":{"line":9,"column":24},"end":{"line":9,"column":46}},"5":{"start":{"line":9,"column":56},"end":{"line":9,"column":70}},"6":{"start":{"line":9,"column":80},"end":{"line":9,"column":105}},"7":{"start":{"line":12,"column":8},"end":{"line":16,"column":null}},"8":{"start":{"line":19,"column":30},"end":{"line":19,"column":91}},"9":{"start":{"line":21,"column":20},"end":{"line":25,"column":null}},"10":{"start":{"line":26,"column":20},"end":{"line":30,"column":null}},"11":{"start":{"line":31,"column":20},"end":{"line":31,"column":null}},"12":{"start":{"line":33,"column":20},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"14":{"start":{"line":41,"column":16},"end":{"line":41,"column":null}},"15":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"16":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":24}},"loc":{"start":{"line":9,"column":110},"end":{"line":9,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":10}},"loc":{"start":{"line":11,"column":48},"end":{"line":45,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":80},"end":{"line":9,"column":110}},"type":"default-arg","locations":[{"start":{"line":9,"column":105},"end":{"line":9,"column":110}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":1,"13":1,"14":0,"15":0,"16":1},"f":{"0":1,"1":1},"b":{"0":[1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":30}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":11},"end":{"line":5,"column":26}},"4":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"6":{"start":{"line":29,"column":28},"end":{"line":29,"column":80}},"7":{"start":{"line":30,"column":27},"end":{"line":30,"column":29}},"8":{"start":{"line":31,"column":8},"end":{"line":34,"column":null}},"9":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"10":{"start":{"line":33,"column":50},"end":{"line":33,"column":null}},"11":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"12":{"start":{"line":41,"column":100},"end":{"line":41,"column":102}},"13":{"start":{"line":42,"column":41},"end":{"line":42,"column":104}},"14":{"start":{"line":43,"column":31},"end":{"line":43,"column":65}},"15":{"start":{"line":44,"column":8},"end":{"line":55,"column":null}},"16":{"start":{"line":45,"column":12},"end":{"line":54,"column":null}},"17":{"start":{"line":49,"column":24},"end":{"line":49,"column":null}},"18":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"19":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"20":{"start":{"line":64,"column":27},"end":{"line":64,"column":29}},"21":{"start":{"line":65,"column":8},"end":{"line":68,"column":null}},"22":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"23":{"start":{"line":67,"column":50},"end":{"line":67,"column":null}},"24":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"25":{"start":{"line":75,"column":34},"end":{"line":75,"column":98}},"26":{"start":{"line":76,"column":23},"end":{"line":76,"column":86}},"27":{"start":{"line":79,"column":16},"end":{"line":79,"column":null}},"28":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"29":{"start":{"line":86,"column":28},"end":{"line":86,"column":80}},"30":{"start":{"line":87,"column":27},"end":{"line":87,"column":29}},"31":{"start":{"line":88,"column":8},"end":{"line":91,"column":null}},"32":{"start":{"line":90,"column":12},"end":{"line":90,"column":null}},"33":{"start":{"line":90,"column":50},"end":{"line":90,"column":null}},"34":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"35":{"start":{"line":96,"column":27},"end":{"line":96,"column":29}},"36":{"start":{"line":97,"column":8},"end":{"line":100,"column":null}},"37":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"38":{"start":{"line":99,"column":50},"end":{"line":99,"column":null}},"39":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"40":{"start":{"line":112,"column":12},"end":{"line":112,"column":null}},"41":{"start":{"line":114,"column":12},"end":{"line":114,"column":null}},"42":{"start":{"line":118,"column":12},"end":{"line":118,"column":null}},"43":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"44":{"start":{"line":133,"column":32},"end":{"line":133,"column":104}},"45":{"start":{"line":136,"column":12},"end":{"line":136,"column":null}},"46":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"47":{"start":{"line":138,"column":76},"end":{"line":138,"column":100}},"48":{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},"49":{"start":{"line":139,"column":80},"end":{"line":139,"column":null}},"50":{"start":{"line":141,"column":13},"end":{"line":141,"column":null}},"51":{"start":{"line":151,"column":28},"end":{"line":151,"column":80}},"52":{"start":{"line":153,"column":36},"end":{"line":153,"column":108}},"53":{"start":{"line":155,"column":8},"end":{"line":155,"column":null}},"54":{"start":{"line":167,"column":12},"end":{"line":171,"column":null}},"55":{"start":{"line":169,"column":20},"end":{"line":169,"column":null}},"56":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"57":{"start":{"line":174,"column":43},"end":{"line":174,"column":null}},"58":{"start":{"line":176,"column":8},"end":{"line":176,"column":null}},"59":{"start":{"line":187,"column":28},"end":{"line":187,"column":71}},"60":{"start":{"line":190,"column":8},"end":{"line":195,"column":null}},"61":{"start":{"line":192,"column":16},"end":{"line":192,"column":null}},"62":{"start":{"line":193,"column":16},"end":{"line":193,"column":null}},"63":{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},"64":{"start":{"line":197,"column":38},"end":{"line":197,"column":96}},"65":{"start":{"line":198,"column":13},"end":{"line":198,"column":null}},"66":{"start":{"line":207,"column":30},"end":{"line":207,"column":73}},"67":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"68":{"start":{"line":219,"column":20},"end":{"line":219,"column":62}},"69":{"start":{"line":222,"column":20},"end":{"line":222,"column":null}},"70":{"start":{"line":226,"column":20},"end":{"line":226,"column":62}},"71":{"start":{"line":229,"column":20},"end":{"line":229,"column":null}},"72":{"start":{"line":233,"column":8},"end":{"line":233,"column":65}},"73":{"start":{"line":234,"column":8},"end":{"line":234,"column":null}},"74":{"start":{"line":243,"column":38},"end":{"line":243,"column":40}},"75":{"start":{"line":244,"column":39},"end":{"line":244,"column":74}},"76":{"start":{"line":248,"column":20},"end":{"line":248,"column":null}},"77":{"start":{"line":249,"column":20},"end":{"line":249,"column":null}},"78":{"start":{"line":253,"column":8},"end":{"line":253,"column":65}},"79":{"start":{"line":254,"column":8},"end":{"line":254,"column":null}},"80":{"start":{"line":255,"column":8},"end":{"line":255,"column":null}},"81":{"start":{"line":264,"column":30},"end":{"line":264,"column":73}},"82":{"start":{"line":265,"column":8},"end":{"line":265,"column":null}},"83":{"start":{"line":274,"column":35},"end":{"line":274,"column":67}},"84":{"start":{"line":275,"column":8},"end":{"line":277,"column":null}},"85":{"start":{"line":276,"column":12},"end":{"line":276,"column":null}},"86":{"start":{"line":279,"column":8},"end":{"line":279,"column":null}},"87":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":70},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":18}},"loc":{"start":{"line":28,"column":57},"end":{"line":36,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":53},"end":{"line":31,"column":56}},"loc":{"start":{"line":31,"column":60},"end":{"line":34,"column":9}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":38,"column":11},"end":{"line":38,"column":18}},"loc":{"start":{"line":39,"column":26},"end":{"line":57,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":44,"column":47},"end":{"line":44,"column":48}},"loc":{"start":{"line":44,"column":64},"end":{"line":55,"column":9}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":48,"column":21},"end":{"line":48,"column":25}},"loc":{"start":{"line":48,"column":29},"end":{"line":50,"column":21}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":18}},"loc":{"start":{"line":63,"column":68},"end":{"line":70,"column":null}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":65,"column":50},"end":{"line":65,"column":53}},"loc":{"start":{"line":65,"column":57},"end":{"line":68,"column":9}}},"8":{"name":"(anonymous_9)","decl":{"start":{"line":72,"column":11},"end":{"line":72,"column":18}},"loc":{"start":{"line":73,"column":26},"end":{"line":83,"column":null}}},"9":{"name":"(anonymous_10)","decl":{"start":{"line":85,"column":11},"end":{"line":85,"column":18}},"loc":{"start":{"line":85,"column":81},"end":{"line":93,"column":null}}},"10":{"name":"(anonymous_11)","decl":{"start":{"line":88,"column":51},"end":{"line":88,"column":54}},"loc":{"start":{"line":88,"column":58},"end":{"line":91,"column":9}}},"11":{"name":"(anonymous_12)","decl":{"start":{"line":95,"column":11},"end":{"line":95,"column":18}},"loc":{"start":{"line":95,"column":71},"end":{"line":102,"column":null}}},"12":{"name":"(anonymous_13)","decl":{"start":{"line":97,"column":51},"end":{"line":97,"column":54}},"loc":{"start":{"line":97,"column":58},"end":{"line":100,"column":9}}},"13":{"name":"(anonymous_14)","decl":{"start":{"line":108,"column":11},"end":{"line":108,"column":18}},"loc":{"start":{"line":108,"column":63},"end":{"line":122,"column":null}}},"14":{"name":"(anonymous_15)","decl":{"start":{"line":129,"column":11},"end":{"line":129,"column":18}},"loc":{"start":{"line":131,"column":27},"end":{"line":143,"column":null}}},"15":{"name":"(anonymous_16)","decl":{"start":{"line":150,"column":11},"end":{"line":150,"column":18}},"loc":{"start":{"line":150,"column":88},"end":{"line":156,"column":null}}},"16":{"name":"(anonymous_17)","decl":{"start":{"line":163,"column":11},"end":{"line":163,"column":18}},"loc":{"start":{"line":163,"column":88},"end":{"line":177,"column":null}}},"17":{"name":"(anonymous_18)","decl":{"start":{"line":167,"column":57},"end":{"line":167,"column":60}},"loc":{"start":{"line":167,"column":64},"end":{"line":171,"column":13}}},"18":{"name":"(anonymous_19)","decl":{"start":{"line":183,"column":11},"end":{"line":183,"column":18}},"loc":{"start":{"line":183,"column":74},"end":{"line":199,"column":null}}},"19":{"name":"(anonymous_20)","decl":{"start":{"line":190,"column":53},"end":{"line":190,"column":56}},"loc":{"start":{"line":190,"column":60},"end":{"line":195,"column":9}}},"20":{"name":"(anonymous_21)","decl":{"start":{"line":206,"column":11},"end":{"line":206,"column":18}},"loc":{"start":{"line":206,"column":94},"end":{"line":210,"column":null}}},"21":{"name":"(anonymous_22)","decl":{"start":{"line":217,"column":11},"end":{"line":217,"column":18}},"loc":{"start":{"line":217,"column":85},"end":{"line":235,"column":null}}},"22":{"name":"(anonymous_23)","decl":{"start":{"line":242,"column":11},"end":{"line":242,"column":18}},"loc":{"start":{"line":242,"column":93},"end":{"line":256,"column":null}}},"23":{"name":"(anonymous_24)","decl":{"start":{"line":263,"column":11},"end":{"line":263,"column":18}},"loc":{"start":{"line":263,"column":102},"end":{"line":266,"column":null}}},"24":{"name":"(anonymous_25)","decl":{"start":{"line":270,"column":11},"end":{"line":270,"column":24}},"loc":{"start":{"line":272,"column":81},"end":{"line":280,"column":null}}},"25":{"name":"(anonymous_26)","decl":{"start":{"line":275,"column":53},"end":{"line":275,"column":56}},"loc":{"start":{"line":275,"column":60},"end":{"line":277,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":12},"end":{"line":33,"column":null}}]},"1":{"loc":{"start":{"line":33,"column":16},"end":{"line":33,"column":48}},"type":"binary-expr","locations":[{"start":{"line":33,"column":16},"end":{"line":33,"column":27}},{"start":{"line":33,"column":31},"end":{"line":33,"column":48}}]},"2":{"loc":{"start":{"line":43,"column":31},"end":{"line":43,"column":65}},"type":"binary-expr","locations":[{"start":{"line":43,"column":31},"end":{"line":43,"column":59}},{"start":{"line":43,"column":63},"end":{"line":43,"column":65}}]},"3":{"loc":{"start":{"line":45,"column":12},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":12},"end":{"line":54,"column":null}}]},"4":{"loc":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":67,"column":null}}]},"5":{"loc":{"start":{"line":67,"column":16},"end":{"line":67,"column":48}},"type":"binary-expr","locations":[{"start":{"line":67,"column":16},"end":{"line":67,"column":27}},{"start":{"line":67,"column":31},"end":{"line":67,"column":48}}]},"6":{"loc":{"start":{"line":90,"column":12},"end":{"line":90,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":12},"end":{"line":90,"column":null}}]},"7":{"loc":{"start":{"line":90,"column":16},"end":{"line":90,"column":48}},"type":"binary-expr","locations":[{"start":{"line":90,"column":16},"end":{"line":90,"column":27}},{"start":{"line":90,"column":31},"end":{"line":90,"column":48}}]},"8":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":null}}]},"9":{"loc":{"start":{"line":99,"column":16},"end":{"line":99,"column":48}},"type":"binary-expr","locations":[{"start":{"line":99,"column":16},"end":{"line":99,"column":27}},{"start":{"line":99,"column":31},"end":{"line":99,"column":48}}]},"10":{"loc":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},{"start":{"line":139,"column":17},"end":{"line":141,"column":null}}]},"11":{"loc":{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},{"start":{"line":141,"column":13},"end":{"line":141,"column":null}}]},"12":{"loc":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":8},"end":{"line":174,"column":null}}]},"13":{"loc":{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},"type":"if","locations":[{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},{"start":{"line":198,"column":13},"end":{"line":198,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":1,"5":1,"6":1,"7":1,"8":1,"9":5,"10":5,"11":1,"12":2,"13":2,"14":2,"15":2,"16":3,"17":15,"18":1,"19":2,"20":1,"21":1,"22":5,"23":5,"24":1,"25":7,"26":7,"27":35,"28":7,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":13,"36":13,"37":60,"38":60,"39":13,"40":0,"41":4,"42":4,"43":0,"44":13,"45":7,"46":6,"47":1,"48":5,"49":0,"50":5,"51":1,"52":1,"53":1,"54":24,"55":23,"56":24,"57":1,"58":23,"59":1,"60":1,"61":1,"62":1,"63":1,"64":0,"65":1,"66":1,"67":1,"68":1,"69":4,"70":0,"71":0,"72":1,"73":1,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":5},"f":{"0":2,"1":1,"2":5,"3":2,"4":3,"5":15,"6":1,"7":5,"8":7,"9":0,"10":0,"11":13,"12":60,"13":4,"14":13,"15":1,"16":24,"17":123,"18":1,"19":5,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0},"b":{"0":[5],"1":[5,5],"2":[2,0],"3":[1],"4":[5],"5":[5,5],"6":[0],"7":[0,0],"8":[60],"9":[60,60],"10":[1,5],"11":[0,5],"12":[1],"13":[0,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},"5":{"start":{"line":15,"column":40},"end":{"line":15,"column":87}},"6":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"8":{"start":{"line":20,"column":9},"end":{"line":20,"column":null}},"9":{"start":{"line":24,"column":35},"end":{"line":24,"column":37}},"10":{"start":{"line":25,"column":35},"end":{"line":25,"column":67}},"11":{"start":{"line":26,"column":38},"end":{"line":26,"column":111}},"12":{"start":{"line":28,"column":36},"end":{"line":28,"column":78}},"13":{"start":{"line":30,"column":32},"end":{"line":30,"column":109}},"14":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"16":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"17":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"18":{"start":{"line":45,"column":35},"end":{"line":45,"column":67}},"19":{"start":{"line":47,"column":42},"end":{"line":47,"column":96}},"20":{"start":{"line":50,"column":20},"end":{"line":50,"column":null}},"21":{"start":{"line":55,"column":20},"end":{"line":55,"column":null}},"22":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"23":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":12},"end":{"line":13,"column":34}},"loc":{"start":{"line":13,"column":53},"end":{"line":21,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":11},"end":{"line":23,"column":17}},"loc":{"start":{"line":23,"column":82},"end":{"line":42,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":11},"end":{"line":44,"column":17}},"loc":{"start":{"line":44,"column":50},"end":{"line":60,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},{"start":{"line":20,"column":9},"end":{"line":20,"column":null}}]},"1":{"loc":{"start":{"line":52,"column":20},"end":{"line":53,"column":81}},"type":"binary-expr","locations":[{"start":{"line":52,"column":20},"end":{"line":52,"column":75}},{"start":{"line":53,"column":20},"end":{"line":53,"column":81}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":9,"5":9,"6":9,"7":9,"8":0,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":0,"16":2,"17":2,"18":7,"19":7,"20":0,"21":0,"22":7,"23":2},"f":{"0":9,"1":2,"2":7},"b":{"0":[9,0],"1":[7,7]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts","statementMap":{"0":{"start":{"line":10,"column":29},"end":{"line":10,"column":31}},"1":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"2":{"start":{"line":13,"column":24},"end":{"line":13,"column":26}},"3":{"start":{"line":14,"column":37},"end":{"line":14,"column":38}},"4":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"5":{"start":{"line":20,"column":28},"end":{"line":20,"column":61}},"6":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"8":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"9":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"10":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"11":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"12":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"13":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"14":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"15":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}}},"fnMap":{"0":{"name":"chunkCollection","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":39}},"loc":{"start":{"line":9,"column":109},"end":{"line":38,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":62},"end":{"line":9,"column":86}},"type":"default-arg","locations":[{"start":{"line":9,"column":82},"end":{"line":9,"column":86}}]},"1":{"loc":{"start":{"line":9,"column":88},"end":{"line":9,"column":109}},"type":"default-arg","locations":[{"start":{"line":9,"column":105},"end":{"line":9,"column":109}}]}},"s":{"0":3,"1":3,"2":3,"3":3,"4":1,"5":7,"6":6,"7":6,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2},"f":{"0":3},"b":{"0":[1],"1":[1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts","statementMap":{"0":{"start":{"line":3,"column":14},"end":{"line":3,"column":36}},"1":{"start":{"line":7,"column":8},"end":{"line":16,"column":null}},"2":{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},"3":{"start":{"line":10,"column":31},"end":{"line":10,"column":83}},"4":{"start":{"line":11,"column":21},"end":{"line":11,"column":null}},"5":{"start":{"line":13,"column":16},"end":{"line":13,"column":null}},"6":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":17}},"loc":{"start":{"line":6,"column":77},"end":{"line":17,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":12},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":27},"end":{"line":14,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},{"start":{"line":11,"column":21},"end":{"line":11,"column":null}}]}},"s":{"0":11,"1":21,"2":27,"3":7,"4":20,"5":19,"6":11},"f":{"0":21,"1":27},"b":{"0":[7,20]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts","statementMap":{"0":{"start":{"line":4,"column":26},"end":{"line":4,"column":40}},"1":{"start":{"line":14,"column":48},"end":{"line":14,"column":50}},"2":{"start":{"line":16,"column":16},"end":{"line":16,"column":null}},"3":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"4":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"5":{"start":{"line":3,"column":0},"end":{"line":3,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":26}},"loc":{"start":{"line":4,"column":40},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":14},"end":{"line":12,"column":40}},"loc":{"start":{"line":12,"column":83},"end":{"line":21,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":48}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":24}},{"start":{"line":13,"column":28},"end":{"line":13,"column":48}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":1},"f":{"0":0,"1":0},"b":{"0":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":16,"column":37},"end":{"line":21,"column":null}},"7":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"8":{"start":{"line":28,"column":16},"end":{"line":28,"column":null}},"9":{"start":{"line":29,"column":16},"end":{"line":29,"column":null}},"10":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"11":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"13":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"14":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"15":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"16":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"17":{"start":{"line":43,"column":16},"end":{"line":43,"column":null}},"18":{"start":{"line":49,"column":12},"end":{"line":49,"column":null}},"19":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"20":{"start":{"line":52,"column":12},"end":{"line":52,"column":null}},"21":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"22":{"start":{"line":57,"column":43},"end":{"line":57,"column":null}},"23":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"24":{"start":{"line":64,"column":22},"end":{"line":70,"column":null}},"25":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"26":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"27":{"start":{"line":75,"column":43},"end":{"line":75,"column":null}},"28":{"start":{"line":79,"column":12},"end":{"line":79,"column":null}},"29":{"start":{"line":82,"column":22},"end":{"line":88,"column":null}},"30":{"start":{"line":89,"column":8},"end":{"line":89,"column":null}},"31":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"32":{"start":{"line":93,"column":43},"end":{"line":93,"column":null}},"33":{"start":{"line":97,"column":12},"end":{"line":97,"column":null}},"34":{"start":{"line":100,"column":22},"end":{"line":105,"column":null}},"35":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"36":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"37":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":11}},"loc":{"start":{"line":15,"column":66},"end":{"line":23,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":25,"column":4},"end":{"line":25,"column":11}},"loc":{"start":{"line":25,"column":97},"end":{"line":45,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":47,"column":4},"end":{"line":47,"column":11}},"loc":{"start":{"line":47,"column":36},"end":{"line":54,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":56,"column":4},"end":{"line":56,"column":11}},"loc":{"start":{"line":56,"column":114},"end":{"line":72,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":74,"column":4},"end":{"line":74,"column":11}},"loc":{"start":{"line":74,"column":94},"end":{"line":90,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":92,"column":4},"end":{"line":92,"column":11}},"loc":{"start":{"line":92,"column":79},"end":{"line":107,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":109,"column":4},"end":{"line":109,"column":11}},"loc":{"start":{"line":109,"column":44},"end":{"line":113,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":18},"end":{"line":18,"column":52}},"type":"cond-expr","locations":[{"start":{"line":18,"column":33},"end":{"line":18,"column":37}},{"start":{"line":18,"column":40},"end":{"line":18,"column":52}}]},"1":{"loc":{"start":{"line":19,"column":22},"end":{"line":19,"column":55}},"type":"cond-expr","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":47}},{"start":{"line":19,"column":50},"end":{"line":19,"column":55}}]},"2":{"loc":{"start":{"line":27,"column":12},"end":{"line":30,"column":null}},"type":"switch","locations":[{"start":{"line":27,"column":12},"end":{"line":30,"column":null}},{"start":{"line":32,"column":12},"end":{"line":35,"column":null}},{"start":{"line":37,"column":12},"end":{"line":40,"column":null}},{"start":{"line":42,"column":12},"end":{"line":43,"column":null}}]},"3":{"loc":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":57,"column":null}}]},"4":{"loc":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":8},"end":{"line":75,"column":null}}]},"5":{"loc":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":93,"column":8},"end":{"line":93,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0,0,0],"3":[0],"4":[0],"5":[0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"4":{"start":{"line":14,"column":12},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"6":{"start":{"line":27,"column":34},"end":{"line":27,"column":71}},"7":{"start":{"line":28,"column":12},"end":{"line":28,"column":null}},"8":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"9":{"start":{"line":31,"column":12},"end":{"line":35,"column":null}},"10":{"start":{"line":41,"column":34},"end":{"line":41,"column":71}},"11":{"start":{"line":42,"column":12},"end":{"line":42,"column":null}},"12":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"13":{"start":{"line":45,"column":12},"end":{"line":49,"column":null}},"14":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":16}},"loc":{"start":{"line":6,"column":30},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":21}},"loc":{"start":{"line":12,"column":53},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":25,"column":11},"end":{"line":25,"column":26}},"loc":{"start":{"line":25,"column":100},"end":{"line":37,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":39,"column":11},"end":{"line":39,"column":26}},"loc":{"start":{"line":39,"column":85},"end":{"line":51,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"3":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"4":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"5":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"6":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"7":{"start":{"line":29,"column":28},"end":{"line":29,"column":58}},"8":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"9":{"start":{"line":31,"column":22},"end":{"line":31,"column":56}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"11":{"start":{"line":33,"column":8},"end":{"line":43,"column":null}},"12":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"13":{"start":{"line":37,"column":12},"end":{"line":42,"column":null}},"14":{"start":{"line":38,"column":16},"end":{"line":42,"column":null}},"15":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"16":{"start":{"line":48,"column":28},"end":{"line":48,"column":51}},"17":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"18":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"19":{"start":{"line":51,"column":22},"end":{"line":51,"column":56}},"20":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"21":{"start":{"line":54,"column":8},"end":{"line":64,"column":null}},"22":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"23":{"start":{"line":58,"column":12},"end":{"line":63,"column":null}},"24":{"start":{"line":59,"column":16},"end":{"line":63,"column":null}},"25":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":16}},"loc":{"start":{"line":12,"column":30},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":19,"column":11},"end":{"line":19,"column":21}},"loc":{"start":{"line":19,"column":53},"end":{"line":25,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":27,"column":11},"end":{"line":27,"column":26}},"loc":{"start":{"line":27,"column":100},"end":{"line":44,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":33,"column":40},"end":{"line":33,"column":41}},"loc":{"start":{"line":33,"column":66},"end":{"line":43,"column":9}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":46,"column":11},"end":{"line":46,"column":26}},"loc":{"start":{"line":46,"column":85},"end":{"line":65,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":54,"column":40},"end":{"line":54,"column":41}},"loc":{"start":{"line":54,"column":66},"end":{"line":64,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":12},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":42,"column":null}}]},"1":{"loc":{"start":{"line":58,"column":12},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":12},"end":{"line":63,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0],"1":[0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"4":{"start":{"line":15,"column":10},"end":{"line":18,"column":null}},"5":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":24},"end":{"line":23,"column":176}},"7":{"start":{"line":24,"column":8},"end":{"line":32,"column":null}},"8":{"start":{"line":25,"column":29},"end":{"line":25,"column":126}},"9":{"start":{"line":27,"column":12},"end":{"line":31,"column":null}},"10":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":24},"end":{"line":37,"column":163}},"12":{"start":{"line":38,"column":8},"end":{"line":46,"column":null}},"13":{"start":{"line":39,"column":29},"end":{"line":39,"column":126}},"14":{"start":{"line":41,"column":12},"end":{"line":45,"column":null}},"15":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":16}},"loc":{"start":{"line":8,"column":30},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":21}},"loc":{"start":{"line":14,"column":53},"end":{"line":19,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":21,"column":11},"end":{"line":21,"column":26}},"loc":{"start":{"line":21,"column":100},"end":{"line":33,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":25,"column":15},"end":{"line":25,"column":23}},"loc":{"start":{"line":25,"column":27},"end":{"line":25,"column":126}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":26,"column":16},"end":{"line":26,"column":21}},"loc":{"start":{"line":26,"column":25},"end":{"line":32,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":35,"column":11},"end":{"line":35,"column":26}},"loc":{"start":{"line":35,"column":85},"end":{"line":47,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":23}},"loc":{"start":{"line":39,"column":27},"end":{"line":39,"column":126}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":40,"column":16},"end":{"line":40,"column":21}},"loc":{"start":{"line":40,"column":25},"end":{"line":46,"column":9}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":5,"column":28},"end":{"line":5,"column":63}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"4":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"5":{"start":{"line":12,"column":28},"end":{"line":12,"column":63}},"6":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}}},"fnMap":{"0":{"name":"convertAliasToUsername","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":44}},"loc":{"start":{"line":4,"column":58},"end":{"line":8,"column":null}}},"1":{"name":"convertUsernameToAlias","decl":{"start":{"line":10,"column":22},"end":{"line":10,"column":44}},"loc":{"start":{"line":10,"column":61},"end":{"line":16,"column":null}}}},"branchMap":{},"s":{"0":4,"1":0,"2":0,"3":0,"4":4,"5":0,"6":0,"7":0,"8":4},"f":{"0":0,"1":0},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":19}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":13}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":29}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"5":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}},"fnMap":{"0":{"name":"chunkArray","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":62},"end":{"line":11,"column":null}}}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":9,"4":2,"5":1},"f":{"0":2},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Delay.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Delay.ts","statementMap":{"0":{"start":{"line":2,"column":4},"end":{"line":2,"column":null}},"1":{"start":{"line":2,"column":36},"end":{"line":2,"column":59}},"2":{"start":{"line":1,"column":0},"end":{"line":1,"column":7}}},"fnMap":{"0":{"name":"delay","decl":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}},"loc":{"start":{"line":1,"column":42},"end":{"line":3,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":2,"column":24},"end":{"line":2,"column":31}},"loc":{"start":{"line":2,"column":36},"end":{"line":2,"column":59}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":42}},"type":"default-arg","locations":[{"start":{"line":1,"column":41},"end":{"line":1,"column":42}}]}},"s":{"0":0,"1":0,"2":1},"f":{"0":0,"1":0},"b":{"0":[0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":16,"column":33},"end":{"line":16,"column":35}},"3":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"4":{"start":{"line":18,"column":58},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":48,"column":null}},"6":{"start":{"line":21,"column":36},"end":{"line":21,"column":61}},"7":{"start":{"line":23,"column":12},"end":{"line":47,"column":null}},"8":{"start":{"line":26,"column":20},"end":{"line":26,"column":null}},"9":{"start":{"line":28,"column":20},"end":{"line":28,"column":null}},"10":{"start":{"line":34,"column":28},"end":{"line":34,"column":null}},"11":{"start":{"line":36,"column":28},"end":{"line":36,"column":null}},"12":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"13":{"start":{"line":42,"column":24},"end":{"line":42,"column":null}},"14":{"start":{"line":44,"column":24},"end":{"line":44,"column":null}},"15":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"16":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":11}},"loc":{"start":{"line":14,"column":35},"end":{"line":51,"column":null}}},"1":{"name":"readdirRecursiveHandler","decl":{"start":{"line":20,"column":18},"end":{"line":20,"column":41}},"loc":{"start":{"line":20,"column":59},"end":{"line":48,"column":9}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":27},"end":{"line":23,"column":31}},"loc":{"start":{"line":23,"column":35},"end":{"line":47,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":43}},"type":"default-arg","locations":[{"start":{"line":13,"column":38},"end":{"line":13,"column":43}}]},"1":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":35}},"type":"default-arg","locations":[{"start":{"line":14,"column":30},"end":{"line":14,"column":35}}]},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]}},"s":{"0":2,"1":2,"2":4,"3":4,"4":0,"5":4,"6":24,"7":24,"8":22,"9":22,"10":5,"11":5,"12":20,"13":12,"14":12,"15":4,"16":2},"f":{"0":4,"1":24,"2":44},"b":{"0":[0],"1":[0],"2":[0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":10},"end":{"line":3,"column":27}},"3":{"start":{"line":4,"column":11},"end":{"line":4,"column":24}},"4":{"start":{"line":6,"column":12},"end":{"line":6,"column":19}},"5":{"start":{"line":8,"column":13},"end":{"line":8,"column":null}},"6":{"start":{"line":16,"column":8},"end":{"line":24,"column":null}},"7":{"start":{"line":19,"column":20},"end":{"line":19,"column":null}},"8":{"start":{"line":21,"column":20},"end":{"line":21,"column":null}},"9":{"start":{"line":32,"column":31},"end":{"line":32,"column":33}},"10":{"start":{"line":33,"column":25},"end":{"line":33,"column":46}},"11":{"start":{"line":34,"column":25},"end":{"line":34,"column":46}},"12":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"13":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"14":{"start":{"line":39,"column":32},"end":{"line":39,"column":54}},"15":{"start":{"line":40,"column":8},"end":{"line":51,"column":null}},"16":{"start":{"line":41,"column":26},"end":{"line":41,"column":49}},"17":{"start":{"line":42,"column":24},"end":{"line":42,"column":44}},"18":{"start":{"line":45,"column":20},"end":{"line":45,"column":null}},"19":{"start":{"line":48,"column":38},"end":{"line":48,"column":78}},"20":{"start":{"line":49,"column":16},"end":{"line":49,"column":null}},"21":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"22":{"start":{"line":56,"column":22},"end":{"line":56,"column":34}},"23":{"start":{"line":57,"column":24},"end":{"line":57,"column":64}},"24":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"25":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"26":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"27":{"start":{"line":71,"column":22},"end":{"line":71,"column":34}},"28":{"start":{"line":72,"column":24},"end":{"line":72,"column":64}},"29":{"start":{"line":74,"column":12},"end":{"line":74,"column":null}},"30":{"start":{"line":75,"column":12},"end":{"line":75,"column":null}},"31":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"32":{"start":{"line":86,"column":20},"end":{"line":86,"column":28}},"33":{"start":{"line":87,"column":24},"end":{"line":87,"column":61}},"34":{"start":{"line":88,"column":24},"end":{"line":88,"column":60}},"35":{"start":{"line":90,"column":8},"end":{"line":100,"column":null}},"36":{"start":{"line":91,"column":27},"end":{"line":91,"column":69}},"37":{"start":{"line":93,"column":16},"end":{"line":93,"column":null}},"38":{"start":{"line":96,"column":20},"end":{"line":96,"column":null}},"39":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"40":{"start":{"line":108,"column":24},"end":{"line":108,"column":43}},"41":{"start":{"line":109,"column":23},"end":{"line":109,"column":54}},"42":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"43":{"start":{"line":113,"column":12},"end":{"line":113,"column":null}},"44":{"start":{"line":115,"column":8},"end":{"line":115,"column":null}},"45":{"start":{"line":124,"column":21},"end":{"line":124,"column":39}},"46":{"start":{"line":126,"column":24},"end":{"line":126,"column":40}},"47":{"start":{"line":127,"column":30},"end":{"line":127,"column":49}},"48":{"start":{"line":129,"column":16},"end":{"line":129,"column":null}},"49":{"start":{"line":131,"column":20},"end":{"line":131,"column":null}},"50":{"start":{"line":133,"column":16},"end":{"line":135,"column":null}},"51":{"start":{"line":134,"column":20},"end":{"line":134,"column":null}},"52":{"start":{"line":137,"column":16},"end":{"line":137,"column":null}},"53":{"start":{"line":147,"column":21},"end":{"line":147,"column":39}},"54":{"start":{"line":148,"column":23},"end":{"line":148,"column":25}},"55":{"start":{"line":150,"column":24},"end":{"line":150,"column":40}},"56":{"start":{"line":151,"column":30},"end":{"line":151,"column":49}},"57":{"start":{"line":153,"column":29},"end":{"line":153,"column":48}},"58":{"start":{"line":154,"column":29},"end":{"line":154,"column":30}},"59":{"start":{"line":155,"column":40},"end":{"line":155,"column":49}},"60":{"start":{"line":157,"column":24},"end":{"line":157,"column":null}},"61":{"start":{"line":159,"column":40},"end":{"line":159,"column":82}},"62":{"start":{"line":161,"column":28},"end":{"line":161,"column":null}},"63":{"start":{"line":165,"column":24},"end":{"line":165,"column":null}},"64":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"65":{"start":{"line":179,"column":12},"end":{"line":190,"column":null}},"66":{"start":{"line":180,"column":30},"end":{"line":180,"column":53}},"67":{"start":{"line":184,"column":20},"end":{"line":184,"column":null}},"68":{"start":{"line":188,"column":20},"end":{"line":188,"column":null}},"69":{"start":{"line":192,"column":12},"end":{"line":192,"column":null}},"70":{"start":{"line":196,"column":21},"end":{"line":196,"column":23}},"71":{"start":{"line":197,"column":25},"end":{"line":197,"column":89}},"72":{"start":{"line":198,"column":31},"end":{"line":198,"column":48}},"73":{"start":{"line":199,"column":21},"end":{"line":199,"column":22}},"74":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"75":{"start":{"line":202,"column":8},"end":{"line":202,"column":null}},"76":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":62},"end":{"line":25,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":35},"end":{"line":16,"column":44}},"loc":{"start":{"line":16,"column":48},"end":{"line":24,"column":9}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":11},"end":{"line":31,"column":18}},"loc":{"start":{"line":31,"column":76},"end":{"line":53,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":40,"column":25},"end":{"line":40,"column":29}},"loc":{"start":{"line":40,"column":33},"end":{"line":51,"column":9}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":11},"end":{"line":55,"column":18}},"loc":{"start":{"line":55,"column":35},"end":{"line":64,"column":null}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":70,"column":11},"end":{"line":70,"column":18}},"loc":{"start":{"line":70,"column":53},"end":{"line":78,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":85,"column":11},"end":{"line":85,"column":18}},"loc":{"start":{"line":85,"column":88},"end":{"line":101,"column":null}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":90,"column":36},"end":{"line":90,"column":37}},"loc":{"start":{"line":90,"column":60},"end":{"line":100,"column":9}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":107,"column":11},"end":{"line":107,"column":18}},"loc":{"start":{"line":107,"column":82},"end":{"line":116,"column":null}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":123,"column":11},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":45},"end":{"line":140,"column":null}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":133,"column":44},"end":{"line":133,"column":54}},"loc":{"start":{"line":133,"column":67},"end":{"line":135,"column":17}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":146,"column":11},"end":{"line":146,"column":18}},"loc":{"start":{"line":146,"column":47},"end":{"line":171,"column":null}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":177,"column":11},"end":{"line":177,"column":18}},"loc":{"start":{"line":177,"column":46},"end":{"line":194,"column":null}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":179,"column":43},"end":{"line":179,"column":53}},"loc":{"start":{"line":179,"column":64},"end":{"line":190,"column":13}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":195,"column":11},"end":{"line":195,"column":18}},"loc":{"start":{"line":195,"column":37},"end":{"line":203,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":50},"end":{"line":31,"column":76}},"type":"default-arg","locations":[{"start":{"line":31,"column":70},"end":{"line":31,"column":76}}]},"1":{"loc":{"start":{"line":44,"column":20},"end":{"line":44,"column":86}},"type":"binary-expr","locations":[{"start":{"line":44,"column":20},"end":{"line":44,"column":66}},{"start":{"line":44,"column":70},"end":{"line":44,"column":86}}]},"2":{"loc":{"start":{"line":85,"column":53},"end":{"line":85,"column":88}},"type":"default-arg","locations":[{"start":{"line":85,"column":86},"end":{"line":85,"column":88}}]},"3":{"loc":{"start":{"line":85,"column":55},"end":{"line":85,"column":81}},"type":"default-arg","locations":[{"start":{"line":85,"column":76},"end":{"line":85,"column":81}}]},"4":{"loc":{"start":{"line":87,"column":24},"end":{"line":87,"column":61}},"type":"cond-expr","locations":[{"start":{"line":87,"column":53},"end":{"line":87,"column":56}},{"start":{"line":87,"column":59},"end":{"line":87,"column":61}}]},"5":{"loc":{"start":{"line":88,"column":24},"end":{"line":88,"column":60}},"type":"cond-expr","locations":[{"start":{"line":88,"column":45},"end":{"line":88,"column":54}},{"start":{"line":88,"column":57},"end":{"line":88,"column":60}}]},"6":{"loc":{"start":{"line":95,"column":20},"end":{"line":95,"column":90}},"type":"binary-expr","locations":[{"start":{"line":95,"column":20},"end":{"line":95,"column":41}},{"start":{"line":95,"column":45},"end":{"line":95,"column":65}},{"start":{"line":95,"column":69},"end":{"line":95,"column":90}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0],"1":[0,0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"1":{"start":{"line":5,"column":14},"end":{"line":5,"column":36}},"2":{"start":{"line":9,"column":8},"end":{"line":25,"column":null}},"3":{"start":{"line":11,"column":29},"end":{"line":11,"column":63}},"4":{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},"5":{"start":{"line":13,"column":48},"end":{"line":13,"column":52}},"6":{"start":{"line":16,"column":28},"end":{"line":16,"column":null}},"7":{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},"8":{"start":{"line":19,"column":47},"end":{"line":19,"column":76}},"9":{"start":{"line":20,"column":25},"end":{"line":20,"column":null}},"10":{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},"11":{"start":{"line":21,"column":59},"end":{"line":21,"column":92}},"12":{"start":{"line":22,"column":21},"end":{"line":22,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":36,"column":null}},"14":{"start":{"line":31,"column":29},"end":{"line":31,"column":63}},"15":{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},"16":{"start":{"line":32,"column":36},"end":{"line":32,"column":53}},"17":{"start":{"line":33,"column":21},"end":{"line":33,"column":null}},"18":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":79},"end":{"line":26,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":12},"end":{"line":10,"column":19}},"loc":{"start":{"line":10,"column":27},"end":{"line":23,"column":13}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":4},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":79},"end":{"line":37,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":12},"end":{"line":30,"column":19}},"loc":{"start":{"line":30,"column":27},"end":{"line":34,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},{"start":{"line":21,"column":23},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},{"start":{"line":20,"column":25},"end":{"line":20,"column":null}}]},"2":{"loc":{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},{"start":{"line":22,"column":21},"end":{"line":22,"column":null}}]},"3":{"loc":{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},{"start":{"line":33,"column":21},"end":{"line":33,"column":null}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":3,"14":3,"15":3,"16":2,"17":1,"18":4},"f":{"0":0,"1":0,"2":3,"3":3},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[2,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts","statementMap":{"0":{"start":{"line":7,"column":27},"end":{"line":7,"column":34}},"1":{"start":{"line":9,"column":35},"end":{"line":9,"column":71}},"2":{"start":{"line":11,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"5":{"start":{"line":23,"column":43},"end":{"line":23,"column":44}},"6":{"start":{"line":24,"column":17},"end":{"line":24,"column":18}},"7":{"start":{"line":26,"column":12},"end":{"line":26,"column":null}},"8":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"9":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"convertBuildNumDotDelimToHyphen","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":55}},"loc":{"start":{"line":6,"column":71},"end":{"line":15,"column":null}}},"1":{"name":"getIndexOfBuildNumDelimeter","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":36}},"loc":{"start":{"line":22,"column":52},"end":{"line":33,"column":null}}}},"branchMap":{},"s":{"0":103,"1":103,"2":103,"3":103,"4":2,"5":103,"6":103,"7":309,"8":103,"9":0},"f":{"0":103,"1":103},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts","statementMap":{"0":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"1":{"start":{"line":7,"column":14},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":20},"end":{"line":8,"column":69}},"3":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}}},"fnMap":{"0":{"name":"extractDomainFromUrl","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":44}},"loc":{"start":{"line":6,"column":56},"end":{"line":10,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":4},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":11},"end":{"line":9,"column":32}},"type":"binary-expr","locations":[{"start":{"line":9,"column":11},"end":{"line":9,"column":18}},{"start":{"line":9,"column":22},"end":{"line":9,"column":32}}]}},"s":{"0":7,"1":3,"2":4,"3":4,"4":1},"f":{"0":7},"b":{"0":[3],"1":[4,3]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":68}},"1":{"start":{"line":4,"column":4},"end":{"line":9,"column":null}},"2":{"start":{"line":5,"column":8},"end":{"line":8,"column":null}},"3":{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},"4":{"start":{"line":6,"column":21},"end":{"line":6,"column":33}},"5":{"start":{"line":7,"column":17},"end":{"line":7,"column":null}},"6":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}}},"fnMap":{"0":{"name":"xml2json","decl":{"start":{"line":3,"column":24},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":36},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":29}},"loc":{"start":{"line":4,"column":48},"end":{"line":9,"column":5}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":35},"end":{"line":5,"column":45}},"loc":{"start":{"line":5,"column":54},"end":{"line":8,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},{"start":{"line":7,"column":17},"end":{"line":7,"column":null}}]}},"s":{"0":4,"1":12,"2":12,"3":12,"4":0,"5":12,"6":4},"f":{"0":12,"1":12,"2":12},"b":{"0":[0,12]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts","statementMap":{"0":{"start":{"line":7,"column":16},"end":{"line":7,"column":38}},"1":{"start":{"line":8,"column":16},"end":{"line":8,"column":66}},"2":{"start":{"line":9,"column":16},"end":{"line":9,"column":69}},"3":{"start":{"line":10,"column":16},"end":{"line":10,"column":58}},"4":{"start":{"line":20,"column":53},"end":{"line":21,"column":null}},"5":{"start":{"line":25,"column":12},"end":{"line":25,"column":null}},"6":{"start":{"line":29,"column":16},"end":{"line":31,"column":null}},"7":{"start":{"line":30,"column":32},"end":{"line":30,"column":100}},"8":{"start":{"line":33,"column":20},"end":{"line":37,"column":null}},"9":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"10":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"11":{"start":{"line":40,"column":20},"end":{"line":40,"column":null}},"12":{"start":{"line":45,"column":16},"end":{"line":45,"column":null}},"13":{"start":{"line":48,"column":16},"end":{"line":48,"column":null}},"14":{"start":{"line":50,"column":16},"end":{"line":50,"column":null}},"15":{"start":{"line":53,"column":16},"end":{"line":53,"column":null}},"16":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"loc":{"start":{"line":10,"column":58},"end":{"line":11,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":4},"end":{"line":18,"column":10}},"loc":{"start":{"line":18,"column":10},"end":{"line":56,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":21},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":32},"end":{"line":30,"column":100}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":10,"5":10,"6":6,"7":76,"8":2,"9":2,"10":2,"11":2,"12":4,"13":0,"14":0,"15":4,"16":1},"f":{"0":4,"1":4,"2":76},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":50}},"2":{"start":{"line":10,"column":16},"end":{"line":10,"column":38}},"3":{"start":{"line":11,"column":16},"end":{"line":11,"column":27}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":50}},"5":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"6":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"7":{"start":{"line":24,"column":26},"end":{"line":24,"column":89}},"8":{"start":{"line":24,"column":67},"end":{"line":24,"column":88}},"9":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}},"10":{"start":{"line":28,"column":20},"end":{"line":28,"column":null}},"11":{"start":{"line":29,"column":20},"end":{"line":29,"column":null}},"12":{"start":{"line":31,"column":20},"end":{"line":36,"column":null}},"13":{"start":{"line":40,"column":16},"end":{"line":47,"column":null}},"14":{"start":{"line":49,"column":12},"end":{"line":55,"column":null}},"15":{"start":{"line":58,"column":22},"end":{"line":58,"column":85}},"16":{"start":{"line":58,"column":63},"end":{"line":58,"column":84}},"17":{"start":{"line":61,"column":42},"end":{"line":62,"column":null}},"18":{"start":{"line":62,"column":36},"end":{"line":62,"column":99}},"19":{"start":{"line":67,"column":24},"end":{"line":67,"column":null}},"20":{"start":{"line":68,"column":24},"end":{"line":68,"column":null}},"21":{"start":{"line":71,"column":24},"end":{"line":71,"column":null}},"22":{"start":{"line":75,"column":20},"end":{"line":75,"column":null}},"23":{"start":{"line":76,"column":20},"end":{"line":76,"column":null}},"24":{"start":{"line":79,"column":24},"end":{"line":79,"column":null}},"25":{"start":{"line":81,"column":24},"end":{"line":81,"column":null}},"26":{"start":{"line":85,"column":20},"end":{"line":85,"column":null}},"27":{"start":{"line":86,"column":20},"end":{"line":86,"column":null}},"28":{"start":{"line":89,"column":16},"end":{"line":95,"column":null}},"29":{"start":{"line":98,"column":16},"end":{"line":103,"column":null}},"30":{"start":{"line":104,"column":16},"end":{"line":109,"column":null}},"31":{"start":{"line":120,"column":27},"end":{"line":120,"column":45}},"32":{"start":{"line":121,"column":8},"end":{"line":125,"column":null}},"33":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"loc":{"start":{"line":12,"column":50},"end":{"line":19,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":10}},"loc":{"start":{"line":21,"column":10},"end":{"line":112,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":59},"end":{"line":24,"column":62}},"loc":{"start":{"line":24,"column":67},"end":{"line":24,"column":88}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":55},"end":{"line":58,"column":58}},"loc":{"start":{"line":58,"column":63},"end":{"line":58,"column":84}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":21},"end":{"line":62,"column":31}},"loc":{"start":{"line":62,"column":36},"end":{"line":62,"column":99}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":119,"column":12},"end":{"line":119,"column":30}},"loc":{"start":{"line":119,"column":47},"end":{"line":126,"column":null}}}},"branchMap":{},"s":{"0":1,"1":4,"2":4,"3":4,"4":4,"5":4,"6":2,"7":2,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":2,"15":2,"16":3,"17":2,"18":2,"19":0,"20":0,"21":1,"22":1,"23":1,"24":1,"25":0,"26":1,"27":1,"28":2,"29":0,"30":0,"31":6,"32":6,"33":1},"f":{"0":4,"1":4,"2":1,"3":3,"4":2,"5":6},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":24},"end":{"line":6,"column":46}},"2":{"start":{"line":6,"column":56},"end":{"line":6,"column":81}},"3":{"start":{"line":6,"column":90},"end":{"line":6,"column":104}},"4":{"start":{"line":14,"column":42},"end":{"line":14,"column":70}},"5":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"6":{"start":{"line":19,"column":44},"end":{"line":19,"column":85}},"7":{"start":{"line":20,"column":50},"end":{"line":20,"column":90}},"8":{"start":{"line":24,"column":28},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":28},"end":{"line":25,"column":null}},"10":{"start":{"line":27,"column":28},"end":{"line":27,"column":null}},"11":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"12":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":104},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":10}},"loc":{"start":{"line":11,"column":10},"end":{"line":40,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":2,"5":2,"6":24,"7":24,"8":3,"9":3,"10":1,"11":3,"12":1},"f":{"0":1,"1":1},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":14},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":14,"column":24},"end":{"line":14,"column":47}},"7":{"start":{"line":14,"column":57},"end":{"line":14,"column":72}},"8":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"9":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":45},"end":{"line":21,"column":null}},"11":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"12":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"13":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"14":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"15":{"start":{"line":33,"column":19},"end":{"line":33,"column":44}},"16":{"start":{"line":36,"column":12},"end":{"line":40,"column":null}},"17":{"start":{"line":41,"column":33},"end":{"line":41,"column":55}},"18":{"start":{"line":42,"column":38},"end":{"line":42,"column":65}},"19":{"start":{"line":45,"column":20},"end":{"line":51,"column":null}},"20":{"start":{"line":53,"column":37},"end":{"line":53,"column":38}},"21":{"start":{"line":55,"column":32},"end":{"line":55,"column":null}},"22":{"start":{"line":60,"column":20},"end":{"line":64,"column":null}},"23":{"start":{"line":68,"column":12},"end":{"line":68,"column":null}},"24":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"25":{"start":{"line":76,"column":16},"end":{"line":76,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":24}},"loc":{"start":{"line":14,"column":72},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":17}},"loc":{"start":{"line":15,"column":58},"end":{"line":30,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":32,"column":12},"end":{"line":32,"column":18}},"loc":{"start":{"line":32,"column":65},"end":{"line":71,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":73,"column":12},"end":{"line":73,"column":18}},"loc":{"start":{"line":73,"column":81},"end":{"line":79,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":74,"column":58},"end":{"line":74,"column":61}},"loc":{"start":{"line":74,"column":65},"end":{"line":78,"column":9}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":12,"17":12,"18":12,"19":22,"20":36,"21":24,"22":18,"23":12,"24":12,"25":10,"26":1},"f":{"0":2,"1":2,"2":2,"3":12,"4":72},"b":{}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"4":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"5":{"start":{"line":26,"column":28},"end":{"line":26,"column":80}},"6":{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},"7":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"8":{"start":{"line":30,"column":65},"end":{"line":30,"column":null}},"9":{"start":{"line":32,"column":20},"end":{"line":45,"column":null}},"10":{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},"11":{"start":{"line":36,"column":80},"end":{"line":36,"column":116}},"12":{"start":{"line":37,"column":32},"end":{"line":37,"column":null}},"13":{"start":{"line":39,"column":32},"end":{"line":41,"column":null}},"14":{"start":{"line":44,"column":24},"end":{"line":44,"column":null}},"15":{"start":{"line":47,"column":20},"end":{"line":49,"column":null}},"16":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"17":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"18":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":40},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":8}},"loc":{"start":{"line":15,"column":13},"end":{"line":17,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":41}},"loc":{"start":{"line":23,"column":66},"end":{"line":52,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":49},"end":{"line":32,"column":68}},"loc":{"start":{"line":32,"column":72},"end":{"line":45,"column":21}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":36,"column":71},"end":{"line":36,"column":75}},"loc":{"start":{"line":36,"column":80},"end":{"line":36,"column":116}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":28}},"loc":{"start":{"line":58,"column":40},"end":{"line":60,"column":null}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":4},"end":{"line":62,"column":26}},"loc":{"start":{"line":62,"column":38},"end":{"line":64,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},{"start":{"line":47,"column":20},"end":{"line":49,"column":null}}]},"1":{"loc":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":20},"end":{"line":30,"column":null}}]},"2":{"loc":{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},{"start":{"line":39,"column":32},"end":{"line":41,"column":null}}]},"3":{"loc":{"start":{"line":63,"column":15},"end":{"line":63,"column":60}},"type":"cond-expr","locations":[{"start":{"line":63,"column":48},"end":{"line":63,"column":52}},{"start":{"line":63,"column":55},"end":{"line":63,"column":60}}]}},"s":{"0":1,"1":1,"2":4,"3":2,"4":4,"5":4,"6":7,"7":6,"8":6,"9":6,"10":3,"11":9,"12":2,"13":1,"14":5,"15":1,"16":0,"17":0,"18":1},"f":{"0":4,"1":2,"2":4,"3":6,"4":9,"5":0,"6":0},"b":{"0":[6,1],"1":[6],"2":[2,1],"3":[0,0]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts","statementMap":{"0":{"start":{"line":5,"column":8},"end":{"line":5,"column":null}},"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"2":{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},"3":{"start":{"line":13,"column":40},"end":{"line":13,"column":71}},"4":{"start":{"line":14,"column":13},"end":{"line":14,"column":null}},"5":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"6":{"start":{"line":18,"column":33},"end":{"line":18,"column":null}},"7":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"8":{"start":{"line":19,"column":43},"end":{"line":19,"column":null}},"9":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"10":{"start":{"line":20,"column":43},"end":{"line":20,"column":null}},"11":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"12":{"start":{"line":22,"column":61},"end":{"line":22,"column":null}},"13":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"14":{"start":{"line":23,"column":61},"end":{"line":23,"column":null}},"15":{"start":{"line":31,"column":35},"end":{"line":31,"column":37}},"16":{"start":{"line":32,"column":50},"end":{"line":32,"column":52}},"17":{"start":{"line":33,"column":30},"end":{"line":33,"column":49}},"18":{"start":{"line":35,"column":8},"end":{"line":45,"column":null}},"19":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"20":{"start":{"line":36,"column":25},"end":{"line":36,"column":null}},"21":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"22":{"start":{"line":37,"column":40},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"24":{"start":{"line":39,"column":12},"end":{"line":39,"column":null}},"25":{"start":{"line":40,"column":12},"end":{"line":44,"column":null}},"26":{"start":{"line":42,"column":20},"end":{"line":42,"column":null}},"27":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"28":{"start":{"line":1,"column":0},"end":{"line":1,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":4},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":8}},"loc":{"start":{"line":8,"column":21},"end":{"line":10,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":13}},"loc":{"start":{"line":12,"column":26},"end":{"line":15,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":11}},"loc":{"start":{"line":17,"column":44},"end":{"line":24,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":7}},"loc":{"start":{"line":30,"column":21},"end":{"line":48,"column":null}}},"5":{"name":"dfsHandler","decl":{"start":{"line":35,"column":18},"end":{"line":35,"column":28}},"loc":{"start":{"line":35,"column":35},"end":{"line":45,"column":9}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":40,"column":43},"end":{"line":40,"column":51}},"loc":{"start":{"line":40,"column":55},"end":{"line":44,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},{"start":{"line":14,"column":13},"end":{"line":14,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":null}}]},"3":{"loc":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":20,"column":null}}]},"4":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":null}}]},"5":{"loc":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":8},"end":{"line":23,"column":null}}]},"6":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":null}}]},"7":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":null}}]}},"s":{"0":12,"1":17,"2":22,"3":21,"4":1,"5":17,"6":1,"7":16,"8":2,"9":14,"10":1,"11":13,"12":13,"13":13,"14":13,"15":4,"16":4,"17":4,"18":4,"19":19,"20":0,"21":19,"22":1,"23":18,"24":18,"25":18,"26":15,"27":3,"28":2},"f":{"0":12,"1":17,"2":22,"3":17,"4":4,"5":19,"6":42},"b":{"0":[21,1],"1":[1],"2":[2],"3":[1],"4":[13],"5":[13],"6":[0],"7":[1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":13},"end":{"line":3,"column":31}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":11},"end":{"line":8,"column":30}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}},"7":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"8":{"start":{"line":16,"column":32},"end":{"line":16,"column":81}},"9":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"10":{"start":{"line":20,"column":8},"end":{"line":21,"column":null}},"11":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"12":{"start":{"line":24,"column":12},"end":{"line":24,"column":null}},"13":{"start":{"line":33,"column":26},"end":{"line":33,"column":50}},"14":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"15":{"start":{"line":35,"column":34},"end":{"line":35,"column":75}},"16":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"17":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"18":{"start":{"line":41,"column":12},"end":{"line":41,"column":null}},"19":{"start":{"line":44,"column":32},"end":{"line":44,"column":78}},"20":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"21":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"22":{"start":{"line":55,"column":21},"end":{"line":57,"column":null}},"23":{"start":{"line":60,"column":24},"end":{"line":60,"column":68}},"24":{"start":{"line":61,"column":31},"end":{"line":61,"column":59}},"25":{"start":{"line":65,"column":16},"end":{"line":66,"column":71}},"26":{"start":{"line":68,"column":12},"end":{"line":74,"column":null}},"27":{"start":{"line":69,"column":16},"end":{"line":73,"column":null}},"28":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"29":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":8}},"loc":{"start":{"line":12,"column":25},"end":{"line":15,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":32}},"loc":{"start":{"line":16,"column":81},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":24}},"loc":{"start":{"line":28,"column":77},"end":{"line":46,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":12},"end":{"line":48,"column":50}},"loc":{"start":{"line":48,"column":95},"end":{"line":52,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":37}},"loc":{"start":{"line":54,"column":80},"end":{"line":78,"column":null}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":68,"column":37},"end":{"line":68,"column":38}},"loc":{"start":{"line":68,"column":57},"end":{"line":74,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":21,"column":null}}]},"1":{"loc":{"start":{"line":20,"column":12},"end":{"line":20,"column":110}},"type":"binary-expr","locations":[{"start":{"line":20,"column":12},"end":{"line":20,"column":53}},{"start":{"line":20,"column":57},"end":{"line":20,"column":110}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":5,"9":5,"10":1,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":5,"18":0,"19":5,"20":0,"21":0,"22":5,"23":5,"24":5,"25":4,"26":4,"27":6,"28":4,"29":1},"f":{"0":0,"1":5,"2":5,"3":0,"4":5,"5":6},"b":{"0":[1],"1":[1,1]}} +,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts","statementMap":{"0":{"start":{"line":3,"column":8},"end":{"line":3,"column":null}},"1":{"start":{"line":5,"column":20},"end":{"line":5,"column":22}},"2":{"start":{"line":6,"column":25},"end":{"line":6,"column":26}},"3":{"start":{"line":7,"column":23},"end":{"line":7,"column":24}},"4":{"start":{"line":8,"column":32},"end":{"line":8,"column":33}},"5":{"start":{"line":9,"column":30},"end":{"line":9,"column":67}},"6":{"start":{"line":10,"column":16},"end":{"line":10,"column":null}},"7":{"start":{"line":10,"column":54},"end":{"line":10,"column":null}},"8":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"9":{"start":{"line":14,"column":26},"end":{"line":14,"column":42}},"10":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"12":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}},"fnMap":{"0":{"name":"get18DigitSalesforceId","decl":{"start":{"line":1,"column":24},"end":{"line":1,"column":46}},"loc":{"start":{"line":1,"column":63},"end":{"line":19,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":42}},"type":"binary-expr","locations":[{"start":{"line":2,"column":8},"end":{"line":2,"column":16}},{"start":{"line":2,"column":20},"end":{"line":2,"column":42}}]},"1":{"loc":{"start":{"line":4,"column":15},"end":{"line":4,"column":49}},"type":"binary-expr","locations":[{"start":{"line":4,"column":15},"end":{"line":4,"column":23}},{"start":{"line":4,"column":27},"end":{"line":4,"column":49}}]},"2":{"loc":{"start":{"line":10,"column":16},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":16},"end":{"line":10,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":20},"end":{"line":10,"column":52}},"type":"binary-expr","locations":[{"start":{"line":10,"column":20},"end":{"line":10,"column":34}},{"start":{"line":10,"column":38},"end":{"line":10,"column":52}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":1},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0],"3":[0,0]}} +} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/base.css b/packages/sfpowerscripts-cli/coverage/lcov-report/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js b/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js new file mode 100644 index 000000000..cc1213023 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html new file mode 100644 index 000000000..64189ce82 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html @@ -0,0 +1,823 @@ + + + + + + Code coverage report for core/git/Git.ts + + + + + + + + + +
+
+

All files / core/git Git.ts

+
+ +
+ 6% + Statements + 6/100 +
+ + +
+ 0% + Branches + 0/15 +
+ + +
+ 0% + Functions + 0/26 +
+ + +
+ 6.38% + Lines + 6/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +2471x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import simplegit, { SimpleGit } from 'simple-git';
+import fs = require('fs-extra');
+import GitIdentity from './GitIdentity';
+const tmp = require('tmp');
+ 
+//Git Abstraction
+export default class Git {
+    private _git: SimpleGit;
+    private repositoryLocation: string;
+    private tempRepoLocation: any;
+    private _isATemporaryRepo: boolean = false;
+ 
+    private constructor(private projectDir?: string, private logger?: Logger) {
+        if (this.projectDir) {
+            this._git = simplegit(this.projectDir);
+            this.repositoryLocation = this.projectDir;
+        } else {
+            this._git = simplegit();
+            this.repositoryLocation = process.cwd();
+        }
+    }
+ 
+    async fetch() {
+        return this._git.fetch('origin');
+    }
+ 
+    async getHeadCommit(): Promise<string> {
+        return this._git.revparse(['HEAD']);
+    }
+ 
+    async show(options: string[]): Promise<string> {
+        return this._git.show(options);
+    }
+ 
+    async tag(options: string[]): Promise<string[]> {
+        let tagResult = await this._git.tag(options);
+ 
+        let temp: string[] = tagResult.split('\n');
+        temp.pop();
+ 
+        return temp;
+    }
+ 
+    async diff(options: string[]): Promise<string[]> {
+        let diffResult = await this._git.diff(options);
+ 
+        let temp: string[] = diffResult.split('\n');
+        temp.pop();
+ 
+        return temp;
+    }
+ 
+    async log(options: string[]): Promise<string[]> {
+        let gitLogResult = await this._git.log(options);
+ 
+        return gitLogResult['all'][0]['hash'].split('\n');
+    }
+ 
+    public async getRemoteOriginUrl(overrideOriginURL?: string): Promise<string> {
+        let remoteOriginURL;
+        if (!overrideOriginURL) {
+            remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
+            if (!remoteOriginURL) {
+                remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
+            }
+            SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG);
+        } else remoteOriginURL = overrideOriginURL;
+ 
+        Iif (!remoteOriginURL) throw new Error('Remote origin must be set in repository');
+ 
+        return remoteOriginURL;
+    }
+ 
+    public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) {
+        try {
+            await new GitIdentity(this._git).setUsernameAndEmail();
+            await this._git.add(pathToFiles);
+            await this._git.commit(message);
+            SFPLogger.log(`Committed File ${pathToFiles}`);
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to commit file, probably due to no change or something else,Please try manually`,
+                LoggerLevel.ERROR
+            );
+            throw error;
+        }
+    }
+ 
+    async pushTags(tags?: string[]) {
+        if (!tags) await this._git.pushTags();
+        else {
+            for (let tag of tags) {
+                await this._git.push('origin', tag);
+            }
+        }
+    }
+ 
+    async deleteTags(tags?: string[]) {
+        Iif (tags) await this._git.push('origin', '--delete', tags);
+    }
+ 
+    async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) {
+        try {
+            await new GitIdentity(this._git).setUsernameAndEmail();
+            if (!commitId) {
+                await this._git.addAnnotatedTag(tagName, annotation);
+            } else {
+                const commands = ['tag', tagName, commitId, '-m', annotation];
+                await this._git.raw(commands);
+            }
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to commit file, probably due to no change or something else,Please try manually`,
+                LoggerLevel.ERROR
+            );
+            throw error;
+        }
+    }
+ 
+    public async isBranchExists(branch: string): Promise<boolean> {
+        const listOfBranches = await this._git.branch(['-la']);
+ 
+        return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false;
+    }
+ 
+    static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise<Git> {
+        let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true });
+ 
+        SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger);
+        let repoDir = locationOfCopiedDirectory.name;
+ 
+        // Copy source directory to temp dir
+        fs.copySync(process.cwd(), repoDir);
+ 
+        //Initiate git on new repo on using the abstracted object
+        let git = new Git(repoDir, logger);
+        git._isATemporaryRepo = true;
+        git.tempRepoLocation = locationOfCopiedDirectory;
+ 
+        await git.addSafeConfig(repoDir);
+        await git.getRemoteOriginUrl();
+        await git.fetch();
+        if (branch) {
+            await git.createBranch(branch);
+        }
+        if (commitRef) {
+            await git.checkout(commitRef, true);
+        }
+ 
+        SFPLogger.log(
+            `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`,
+            LoggerLevel.INFO,
+            logger
+        );
+        return git;
+    }
+ 
+    static async initiateRepo(logger?: Logger, projectDir?: string) {
+        let git = new Git(projectDir, logger);
+        if (projectDir) await git.addSafeConfig(projectDir);
+        else {
+            await git.addSafeConfig(process.cwd());
+        }
+        await git.getRemoteOriginUrl();
+        return git;
+    }
+ 
+    public getRepositoryPath() {
+        return this.repositoryLocation;
+    }
+ 
+    async deleteTempoRepoIfAny() {
+        Iif (this.tempRepoLocation) this.tempRepoLocation.removeCallback();
+    }
+ 
+    async addSafeConfig(repoDir: string) {
+        try
+        {
+        //add workaround for safe directory (https://github.com/actions/runner/issues/2033)
+        await this._git.addConfig('safe.directory', repoDir, false, 'global');
+        }catch(error)
+        {
+            //ignore error
+            SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE)
+        }
+    }
+ 
+    async pushToRemote(branch: string, isForce: boolean) {
+        Iif (!branch) branch = (await this._git.branch()).current;
+        SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger);
+        if (process.env.sfp_OVERRIDE_ORIGIN_URL) {
+            await this._git.removeRemote('origin');
+            await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL);
+        }
+ 
+        if (isForce) {
+            await this._git.push('origin', branch, [`--force`]);
+        } else {
+            await this._git.push('origin', branch);
+        }
+    }
+ 
+    isATemporaryRepo(): boolean {
+        return this._isATemporaryRepo;
+    }
+ 
+    async getCurrentCommitId() {
+        return this._git.revparse(['HEAD']);
+    }
+ 
+    async checkout(commitRef: string, isForce?: boolean) {
+        if (isForce) {
+            return this._git.checkout(commitRef, [`--force`]);
+        } else return this._git.checkout(commitRef, {});
+    }
+ 
+    async checkoutPath(commitRef: string, path: string, isForce?: boolean) {
+        if (isForce) {
+            return this._git.checkout(commitRef, [path, `--force`]);
+        } else return this._git.checkout(commitRef, [path]);
+    }
+ 
+    async stageChangedFiles(path: string): Promise<boolean> {
+        try {
+            await this._git.add(path);
+            return true;
+        } catch (error) {
+            SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger);
+            return false;
+        }
+    }
+    async createBranch(branch: string) {
+        if (await this.isBranchExists(branch)) {
+            await this._git.checkout(branch, ['-f']);
+            try {
+                // For ease-of-use when running locally and local branch exists
+                await this._git.merge([`refs/remotes/origin/${branch}`]);
+            } catch (error) {
+                SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger);
+            }
+        } else {
+            await this._git.checkout(['-b', branch]);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html new file mode 100644 index 000000000..bf6949b0f --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for core/git/GitIdentity.ts + + + + + + + + + +
+
+

All files / core/git GitIdentity.ts

+
+ +
+ 10% + Statements + 1/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 10% + Lines + 1/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { SimpleGit } from 'simple-git/promise';
+ 
+export default class GitIdentity {
+    constructor(private git: SimpleGit) {}
+ 
+    async setUsernameAndEmail(): Promise<void> {
+        await this.setUsername();
+        await this.setEmail();
+    }
+ 
+    private async setUsername(): Promise<void> {
+        let username: string;
+ 
+        if (process.env.sfp_GIT_USERNAME) {
+            username = process.env.sfp_GIT_USERNAME;
+        } else {
+            username = 'sfp';
+        }
+ 
+        await this.git.addConfig('user.name', username);
+    }
+ 
+    private async setEmail(): Promise<void> {
+        let email: string;
+ 
+        if (process.env.sfp_GIT_EMAIL) {
+            email = process.env.sfp_GIT_EMAIL;
+        } else {
+            email = 'sfp@flxblio.io';
+        }
+ 
+        await this.git.addConfig('user.email', email);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html new file mode 100644 index 000000000..c63f4d34a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for core/git + + + + + + + + + +
+
+

All files core/git

+
+ +
+ 6.36% + Statements + 7/110 +
+ + +
+ 0% + Branches + 0/15 +
+ + +
+ 0% + Functions + 0/30 +
+ + +
+ 6.73% + Lines + 7/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Git.ts +
+
6%6/1000%0/150%0/266.38%6/94
GitIdentity.ts +
+
10%1/10100%0/00%0/410%1/10
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png b/packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for impl/changelog/OrgsUpdater.ts + + + + + + + + + +
+
+

All files / impl/changelog OrgsUpdater.ts

+
+ +
+ 82.35% + Statements + 28/34 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 81.25% + Lines + 26/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128  +1x +  +1x +  +  +  +  +4x +4x +4x +4x +  +4x +  +  +2x +  +  +  +  +  +  +2x +  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +3x +  +  +2x +2x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +1x +1x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  + 
import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog';
+import lodash = require('lodash');
+ 
+export default class OrgsUpdater {
+    private latestReleaseId: ReleaseId;
+    private idOfReleaseWithMatchingHashId: ReleaseId;
+ 
+    constructor(
+        private releaseChangelog: ReleaseChangelog,
+        private latestRelease: Release,
+        private org: string,
+        private releaseWithMatchingHashId: Release
+    ) {
+        this.latestReleaseId = this.convertReleaseToId(this.latestRelease);
+ 
+        if (this.releaseWithMatchingHashId) {
+            this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId);
+        }
+    }
+ 
+    update(): void {
+        if (!this.idOfReleaseWithMatchingHashId) {
+            if (this.releaseChangelog.orgs) {
+                let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
+ 
+                if (org) {
+                    org.releases.push(this.latestReleaseId);
+                    org.latestRelease = org.releases[org.releases.length - 1];
+                    org.retryCount = 0;
+                } else {
+                    this.releaseChangelog.orgs.push({
+                        name: this.org,
+                        releases: [this.latestReleaseId],
+                        latestRelease: this.latestReleaseId,
+                        retryCount: 0,
+                    });
+                }
+            } else {
+                // for backwards-compatibility with pre-existing changelogs
+                this.releaseChangelog.orgs = [
+                    {
+                        name: this.org,
+                        releases: [this.latestReleaseId],
+                        latestRelease: this.latestReleaseId,
+                        retryCount: 0,
+                    },
+                ];
+            }
+            console.log(
+                `Updating ${this.org} org with`,
+                this.latestRelease.names[this.latestRelease.names.length - 1] +
+                    '-' +
+                    this.latestRelease.buildNumber +
+                    `(0)`
+            );
+        } else {
+            // Update orgs
+            let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
+ 
+            if (org) {
+                let indexOfReleaseToOrg = org.releases.findIndex(
+                    (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId
+                );
+                if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) {
+                    if (indexOfReleaseToOrg >= 0) {
+                        // Update release names in releases to org
+                        org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
+                        org.releases[indexOfReleaseToOrg].date = new Date().toUTCString();
+                    } else {
+                        // Add releaseId in releases to org
+                        org.releases.push(this.idOfReleaseWithMatchingHashId);
+                    }
+ 
+                    // Update latest release
+                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
+                    org.retryCount = 0;
+                } else {
+                    if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) {
+                        org.retryCount++;
+                    } else {
+                        org.retryCount = 0;
+                    }
+ 
+                    // Update releases names in releases to org & latestRelease
+                    org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
+                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
+                }
+ 
+                console.log(
+                    `Updating ${this.org} org with`,
+                    org.latestRelease.names[org.latestRelease.names.length - 1] +
+                        '-' +
+                        org.latestRelease.buildNumber +
+                        `(${org.retryCount})`
+                );
+            } else {
+                // new org
+                this.releaseChangelog.orgs.push({
+                    name: this.org,
+                    releases: [this.idOfReleaseWithMatchingHashId],
+                    latestRelease: this.idOfReleaseWithMatchingHashId,
+                    retryCount: 0,
+                });
+                console.log(
+                    `Updating ${this.org} org with`,
+                    `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${
+                        this.idOfReleaseWithMatchingHashId.buildNumber
+                    }(0)`
+                );
+            }
+        }
+    }
+ 
+    /**
+     * Convert Release to Release Id
+     * @param release
+     * @returns
+     */
+    private convertReleaseToId(release: Release): ReleaseId {
+        let releaseNames = [...release.names]; // Shallow copy
+        return {
+            names: releaseNames,
+            buildNumber: release.buildNumber,
+            hashId: release.hashId,
+        };
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html new file mode 100644 index 000000000..e1462a0d6 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html @@ -0,0 +1,208 @@ + + + + + + Code coverage report for impl/changelog/WorkItemUpdater.ts + + + + + + + + + +
+
+

All files / impl/changelog WorkItemUpdater.ts

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +421x +  +  +  +1x +1x +  +  +  +  +  +  +  +2x +2x +  +  +  +24x +24x +  +  +  +3x +3x +  +1x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { Release } from './ReleaseChangelog';
+ 
+ 
+export default class WorkItemUpdater {
+    constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {}
+ 
+    /**
+     * Generate work items in latest release
+     */
+    update(): void {
+        for (const workItemFilter of this.workItemFilters) {
+     
+        let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi');
+        SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger);
+ 
+        for (let artifact of this.latestRelease['artifacts']) {
+            for (let commit of artifact['commits']) {
+                let commitMessage: String = commit['message'] + '\n' + commit['body'];
+                let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex);
+                if (workItems) {
+                    for (let item of workItems) {
+                        if (this.latestRelease['workItems'][item] == null) {
+                            this.latestRelease['workItems'][item] = new Set<string>();
+                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
+                        } else {
+                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
+                        }
+                    }
+                }
+            }
+        }
+       }
+ 
+        // Convert each work item Set to Array
+        // Enables JSON stringification of work item
+        for (let key in this.latestRelease['workItems']) {
+            this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html new file mode 100644 index 000000000..53eaeeb78 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for impl/changelog + + + + + + + + + +
+
+

All files impl/changelog

+
+ +
+ 87.23% + Statements + 41/47 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 86.04% + Lines + 37/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
OrgsUpdater.ts +
+
82.35%28/34100%0/0100%6/681.25%26/32
WorkItemUpdater.ts +
+
100%13/13100%0/0100%2/2100%11/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html new file mode 100644 index 000000000..a1c5f37d3 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for impl/parallelBuilder/UndirectedGraph.ts + + + + + + + + + +
+
+

All files / impl/parallelBuilder UndirectedGraph.ts

+
+ +
+ 96.55% + Statements + 28/29 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +501x +  +  +  +8x +  +  +  +3x +  +  +  +14x +1x +  +  +  +12x +11x +9x +  +8x +8x +  +  +  +  +  +  +  +4x +4x +4x +  +4x +19x +19x +18x +18x +18x +  +15x +  +  +  +  +3x +  +  + 
export default class UndirectedGraph {
+    private _adjacencyList: { [p: string]: string[] };
+ 
+    constructor() {
+        this._adjacencyList = {};
+    }
+ 
+    get adjacencyList() {
+        return this._adjacencyList;
+    }
+ 
+    addVertex(name: string) {
+        if (!this._adjacencyList[name]) this._adjacencyList[name] = [];
+        else throw new Error(`Vertex with name '${name}' already exists`);
+    }
+ 
+    addEdge(vertexA: string, vertexB: string): void {
+        if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex');
+        if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`);
+        if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`);
+ 
+        if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB);
+        if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA);
+    }
+ 
+    /**
+     * Returns vertices in graph, using depth-first search from the starting vertex
+     * @param start
+     */
+    dfs(start: string): string[] {
+        const vertices: string[] = [];
+        const visited: { [p: string]: boolean } = {};
+        const adjacencyList = this._adjacencyList;
+ 
+        (function dfsHandler(vertex) {
+            Iif (!vertex) return null;
+            if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`);
+            visited[vertex] = true;
+            vertices.push(vertex);
+            adjacencyList[vertex].forEach((neighbor) => {
+                if (!visited[neighbor]) {
+                    return dfsHandler(neighbor);
+                }
+            });
+        })(start);
+ 
+        return vertices;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html new file mode 100644 index 000000000..8d42389df --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for impl/parallelBuilder + + + + + + + + + +
+
+

All files impl/parallelBuilder

+
+ +
+ 96.55% + Statements + 28/29 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
UndirectedGraph.ts +
+
96.55%28/2988.88%8/9100%7/7100%21/21
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html new file mode 100644 index 000000000..5e969bf1b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for impl/release/ReleaseDefinition.ts + + + + + + + + + +
+
+

All files / impl/release ReleaseDefinition.ts

+
+ +
+ 70% + Statements + 21/30 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 66.66% + Functions + 4/6 +
+ + +
+ 70% + Lines + 21/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +5x +5x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +5x +5x +  +  +  +4x +  +  +4x +6x +  +  +  +  +  +  +4x +  +  +  + 
import ReleaseDefinitionSchema from './ReleaseDefinitionSchema';
+import Ajv from 'ajv';
+const yaml = require('js-yaml');
+import lodash = require('lodash');
+import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId';
+import Git from '../../core/git/Git';
+import { ConsoleLogger } from '@flxblio/sfp-logger';
+const fs = require('fs-extra');
+const path = require('path');
+ 
+export default class ReleaseDefinition {
+    get releaseDefinition() {
+        // Return clone of releaseDefinition for immutability
+        return lodash.cloneDeep(this._releaseDefinitionSchema);
+    }
+    private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) {
+        this.validateReleaseDefinition(this._releaseDefinitionSchema);
+ 
+        // Workaround for jsonschema not supporting validation based on dependency value
+        if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled)
+            throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'");
+ 
+        if (this._releaseDefinitionSchema.packageDependencies) {
+            this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies);
+        }
+    }
+ 
+    public static async loadReleaseDefinition(pathToReleaseDefinition: string) {
+        //Check whether path contains gitRef
+        let releaseDefinitionSchema: ReleaseDefinitionSchema;
+        try {
+            if (pathToReleaseDefinition.includes(':')) {
+                let git = await Git.initiateRepo();
+                await git.fetch();
+                let releaseFile = await git.show([pathToReleaseDefinition]);
+                releaseDefinitionSchema = yaml.load(releaseFile);
+            } else {
+                releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8'));
+            }
+        } catch (error) {
+            throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`);
+        }
+ 
+        let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema);
+        return releaseDefinition;
+    }
+ 
+    private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) {
+        for (let pkg in packageDependencies) {
+            packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]);
+        }
+    }
+ 
+    private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void {
+        let schema = fs.readJSONSync(
+            path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'),
+            { encoding: 'UTF-8' }
+        );
+ 
+        let validator = new Ajv({ allErrors: true }).compile(schema);
+        let validationResult = validator(releaseDefinition);
+ 
+        if (!validationResult) {
+            let errorMsg: string =
+                `Release definition does not meet schema requirements, ` +
+                `found ${validator.errors.length} validation errors:\n`;
+ 
+            validator.errors.forEach((error, errorNum) => {
+                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
+                    error.params,
+                    null,
+                    4
+                )}`;
+            });
+ 
+            throw new Error(errorMsg);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html new file mode 100644 index 000000000..1b35ad14b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for impl/release + + + + + + + + + +
+
+

All files impl/release

+
+ +
+ 70% + Statements + 21/30 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 66.66% + Functions + 4/6 +
+ + +
+ 70% + Lines + 21/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ReleaseDefinition.ts +
+
70%21/30100%3/366.66%4/670%21/30
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/index.html new file mode 100644 index 000000000..7f485b199 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/index.html @@ -0,0 +1,581 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 46.8% + Statements + 1172/2504 +
+ + +
+ 35.03% + Branches + 144/411 +
+ + +
+ 45.09% + Functions + 193/428 +
+ + +
+ 46.95% + Lines + 1117/2379 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
100%26/26100%3/3100%7/7100%26/26
src/core/apex +
+
33.33%8/24100%0/033.33%2/636.36%8/22
src/core/apex/coverage +
+
61.29%19/3160%3/566.66%6/962.06%18/29
src/core/apextest +
+
43.13%22/5120%1/540%2/542.55%20/47
src/core/artifacts +
+
38.46%30/7853.84%7/1338.46%5/1337.33%28/75
src/core/display +
+
100%2/2100%0/0100%0/0100%2/2
src/core/git +
+
14.87%36/2424.87%2/4110.52%6/5714.09%32/227
src/core/metadata +
+
21.66%52/2400%0/4521.05%4/1921.75%52/239
src/core/org +
+
34.61%27/7841.17%7/1731.25%5/1637.5%27/72
src/core/org/packageQuery +
+
50%2/4100%0/00%0/150%2/4
src/core/package +
+
26.92%35/1309.52%2/2128.57%4/1428%35/125
src/core/package/analyser +
+
67.46%56/8360%6/1050%6/1266.66%52/78
src/core/package/components +
+
74.02%57/7750%2/482.35%14/1774.66%56/75
src/core/package/coverage +
+
93.67%74/7970%7/10100%15/1593.58%73/78
src/core/package/dependencies +
+
85.25%133/15674.35%29/3991.66%22/2484.56%126/149
src/core/package/deploymentFilters +
+
84.09%37/4442.85%3/766.66%2/390.24%37/41
src/core/package/diff +
+
36.44%82/22536.66%11/3036.84%7/1936.48%81/222
src/core/package/packageCreators +
+
14.43%28/1940%0/280%0/4015.73%28/178
src/core/package/propertyFetchers +
+
78.94%15/1966.66%4/6100%3/378.94%15/19
src/core/package/validators +
+
12.5%5/400%0/120%0/313.51%5/37
src/core/package/version +
+
75.92%41/5475%9/1257.14%4/775.55%34/45
src/core/permsets +
+
85.71%48/56100%3/3100%9/984.9%45/53
src/core/project +
+
74.1%83/11273.07%19/2679.31%23/2975%78/104
src/core/queryHelper +
+
100%23/23100%4/4100%3/3100%22/22
src/core/stats +
+
18.18%8/440%0/130%0/919.51%8/41
src/core/stats/nativeMetricSenderImpl +
+
21.05%12/570%0/20%0/1821.05%12/57
src/core/utils +
+
39.86%61/15320.68%6/2936.36%12/3340.41%59/146
src/impl/changelog +
+
87.5%56/64100%0/0100%11/1186.66%52/60
src/impl/dependency +
+
100%27/27100%0/0100%5/5100%26/26
src/impl/parallelBuilder +
+
93.75%45/4881.25%13/1685.71%12/1494.73%36/38
src/impl/release +
+
70%21/30100%3/366.66%4/670%21/30
src/utils +
+
7.69%1/130%0/70%0/18.33%1/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png b/packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js b/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js new file mode 100644 index 000000000..2bb296a8c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html new file mode 100644 index 000000000..d677368f2 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html @@ -0,0 +1,346 @@ + + + + + + Code coverage report for src/ProjectValidation.ts + + + + + + + + + +
+
+

All files / src ProjectValidation.ts

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +881x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +8x +8x +8x +  +  +  +4x +4x +4x +  +1x +  +1x +7x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +2x +4x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +2x +4x +  +4x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import ProjectConfig from './core/project/ProjectConfig';
+import Ajv from 'ajv';
+import path = require('path');
+import * as fs from 'fs-extra';
+import { PackageType } from './core//package/SfpPackage';
+import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
+ 
+export default class ProjectValidation {
+    private readonly projectConfig;
+    private ajv: Ajv;
+    resourcesDir: string;
+ 
+    constructor() {
+        this.projectConfig = ProjectConfig.getSFDXProjectConfig(null);
+        this.ajv = new Ajv({ allErrors: true });
+        this.resourcesDir = path.join(__dirname, '..', 'resources', 'schemas');
+    }
+ 
+    public validateSFDXProjectJSON() {
+        let schema = fs.readJSONSync(path.join(this.resourcesDir, `sfdx-project.schema.json`), { encoding: 'UTF-8' });
+        let validator = this.ajv.compile(schema);
+        let isSchemaValid = validator(this.projectConfig);
+        if (!isSchemaValid) {
+            let errorMsg: string = `The sfdx-project.json is invalid, Please fix the following errors\n`;
+ 
+            validator.errors.forEach((error, errorNum) => {
+                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
+                    error.params,
+                    null,
+                    4
+                )}`;
+            });
+ 
+ 
+          SFPLogger.log(`The following attributes are not recognized by sfp, You might need to remove them`,LoggerLevel.WARN)
+          SFPLogger.log(errorMsg, LoggerLevel.WARN);
+        }
+    }
+ 
+    public validatePackageNames() {
+        ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
+            let name = pkg.package;
+            if ( name.length > 38) {
+                throw new Error(
+                    'sfdx-project.json validation failed for package "' +
+                    pkg['package'] +
+                        '".' +
+                    `Package name exceed maximum length of 38 characters.`
+                )
+            }else if( name.match(/^[a-zA-Z0-9-._~]+$/) === null ){
+                throw new Error(
+                    'sfdx-project.json validation failed for package "' +
+                    pkg['package'] +
+                        '".' +
+                    `Package names can only contain alphanumeric characters and the symbols - . _ ~.`
+                )
+            }
+        });
+    }
+ 
+ 
+    public validatePackageBuildNumbers() {
+        ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
+            let packageType = ProjectConfig.getPackageType(this.projectConfig, pkg.package);
+ 
+            let pattern: RegExp = /NEXT$|LATEST$/i;
+            if (
+                pkg.versionNumber.match(pattern) &&
+                (packageType === PackageType.Source || packageType === PackageType.Data)
+            ) {
+                throw new Error(
+                    'sfdx-project.json validation failed for package "' +
+                        pkg['package'] +
+                        '".' +
+                        ' Build-number keywords "NEXT" & "LATEST" are not supported for ' +
+                        packageType +
+                        ' packages.' +
+                        '\nTry the following:' +
+                        '\n - If package should be built as a ' +
+                        packageType +
+                        ' package, use 0 instead of NEXT/LATEST' +
+                        '\n - If package should be built as an Unlocked package, ensure the package has been created in the Devhub and the ID included in packageAliases of sfdx-project.json'
+                );
+            }
+        });
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html new file mode 100644 index 000000000..c2fe836af --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/core/apex/ApexClassFetcher.ts + + + + + + + + + +
+
+

All files / src/core/apex ApexClassFetcher.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 36.36% + Lines + 4/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28  +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import chunkCollection from "../queryHelper/ChunkCollection";
+import QueryHelper from '../queryHelper/QueryHelper';
+ 
+export default class ApexClassFetcher {
+    constructor(private conn: Connection) {}
+ 
+    /**
+     * Query Apex Classes by Name
+     *
+     * @param classNames
+     * @returns
+     */
+    public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> {
+        let result: {Id: string; Name: string}[] = [];
+ 
+        const chunks = chunkCollection(classNames);
+        for (const chunk of chunks) {
+            const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query
+            const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`;
+ 
+            const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false);
+            result = result.concat(records);
+        }
+ 
+        return result;
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html new file mode 100644 index 000000000..0e93a90bc --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/core/apex/ApexTriggerFetcher.ts + + + + + + + + + +
+
+

All files / src/core/apex ApexTriggerFetcher.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 36.36% + Lines + 4/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import chunkCollection from '../queryHelper/ChunkCollection';
+import QueryHelper from '../queryHelper/QueryHelper';
+ 
+export default class ApexTriggerFetcher {
+    constructor(private conn: Connection) {}
+ 
+    /**
+     * Query Triggers by Name
+     *
+     * @param triggerNames
+     * @returns
+     */
+    public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> {
+        let result: {Id: string, Name: string}[] = [];
+ 
+        const chunks = chunkCollection(triggerNames);
+        for (const chunk of chunks) {
+            const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query
+            const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`;
+ 
+            const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false);
+            result = result.concat(records);
+        }
+ 
+        return result;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html new file mode 100644 index 000000000..7365d4376 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts + + + + + + + + + +
+
+

All files / src/core/apex/coverage ApexCodeCoverageAggregateFetcher.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 36.36% + Lines + 4/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import chunkCollection from '../../queryHelper/ChunkCollection';
+import QueryHelper from '../../queryHelper/QueryHelper';
+ 
+export default class ApexCodeCoverageAggregateFetcher {
+    constructor(private conn: Connection) {}
+ 
+    /**
+     * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId
+     * @param listOfApexClassOrTriggerId
+     * @returns
+     */
+    public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{
+        ApexClassOrTriggerId: string;
+        NumLinesCovered: number;
+        NumLinesUncovered: number;
+        Coverage: any;
+    }[]> {
+        let result: {
+            ApexClassOrTriggerId: string;
+            NumLinesCovered: number;
+            NumLinesUncovered: number;
+            Coverage: any;
+        }[] = [];
+ 
+        const chunks = chunkCollection(listOfApexClassOrTriggerId);
+        for (const chunk of chunks) {
+            const formattedChunk = chunk.map(elem => `'${elem}'`).toString();
+            let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`;
+ 
+            const records = await QueryHelper.query<{
+                ApexClassOrTriggerId: string;
+                NumLinesCovered: number;
+                NumLinesUncovered: number;
+                Coverage: any;
+            }>(query, this.conn, true);
+            result = result.concat(records);
+        }
+ 
+        return result;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html new file mode 100644 index 000000000..693cd7836 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/core/apex/coverage/IndividualClassCoverage.ts + + + + + + + + + +
+
+

All files / src/core/apex/coverage IndividualClassCoverage.ts

+
+ +
+ 78.94% + Statements + 15/19 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 77.77% + Lines + 14/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +772x +  +2x +9x +  +  +  +  +  +2x +  +  +2x +8x +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +4x +13x +  +  +4x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from "@flxblio/sfp-logger"
+ 
+export default class IndividualClassCoverage {
+    public constructor(private codeCoverage: any, private logger: Logger) {}
+ 
+    public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] {
+        let individualClassCoverage: {
+            name: string;
+            coveredPercent: number;
+        }[] = [];
+ 
+        // Return every class in coverage json if test level is not RunAllTestsInPackage
+        individualClassCoverage = this.codeCoverage.map((cls) => {
+            return { name: cls.name, coveredPercent: cls.coveredPercent };
+        });
+ 
+         // Filter individualClassCoverage based on classesToBeValidated
+        Iif(classesToBeValidated && classesToBeValidated.length > 0)
+        individualClassCoverage = individualClassCoverage.filter((cls) => {
+             return classesToBeValidated.includes(cls.name);
+        });
+ 
+ 
+        return individualClassCoverage;
+    }
+ 
+    public validateIndividualClassCoverage(
+        individualClassCoverage: ClassCoverage[],
+        coverageThreshold?: number
+    ): {
+        result: boolean;
+        message: string;
+        classesCovered?: ClassCoverage[];
+        classesWithInvalidCoverage?: ClassCoverage[];
+    } {
+        if (coverageThreshold < 75) {
+            SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger);
+            coverageThreshold = 75;
+        }
+ 
+        SFPLogger.log(
+            `Validating individual classes for code coverage greater than ${coverageThreshold} percent`,
+            LoggerLevel.INFO,
+            this.logger
+        );
+        let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => {
+            return cls.coveredPercent < coverageThreshold;
+        });
+ 
+        if (classesWithInvalidCoverage.length > 0) {
+            return {
+                result: false,
+                message: 'There are classes which do not satisfy the individual coverage requirements',
+                classesCovered: individualClassCoverage,
+                classesWithInvalidCoverage: classesWithInvalidCoverage,
+            };
+        } else
+            return {
+                result: true,
+                message: 'All classes in this test run meet the required coverage threshold',
+                classesCovered: individualClassCoverage,
+            };
+    }
+}
+ 
+export type CoverageOptions = {
+    isPackageCoverageToBeValidated: boolean;
+    isIndividualClassCoverageToBeValidated: boolean;
+    coverageThreshold: number;
+    classesToBeValidated?: string[];
+};
+ 
+export type ClassCoverage = {
+    name: string;
+    coveredPercent: number;
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html new file mode 100644 index 000000000..a4c7908d8 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/apex/coverage + + + + + + + + + +
+
+

All files src/core/apex/coverage

+
+ +
+ 61.29% + Statements + 19/31 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 66.66% + Functions + 6/9 +
+ + +
+ 62.06% + Lines + 18/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ApexCodeCoverageAggregateFetcher.ts +
+
33.33%4/12100%0/033.33%1/336.36%4/11
IndividualClassCoverage.ts +
+
78.94%15/1960%3/583.33%5/677.77%14/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html new file mode 100644 index 000000000..81becdc33 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/apex + + + + + + + + + +
+
+

All files src/core/apex

+
+ +
+ 33.33% + Statements + 8/24 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 33.33% + Functions + 2/6 +
+ + +
+ 36.36% + Lines + 8/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ApexClassFetcher.ts +
+
33.33%4/12100%0/033.33%1/336.36%4/11
ApexTriggerFetcher.ts +
+
33.33%4/12100%0/033.33%1/336.36%4/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html new file mode 100644 index 000000000..d626dc9d9 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/core/apextest/ApexTestSuite.ts + + + + + + + + + +
+
+

All files / src/core/apextest ApexTestSuite.ts

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +1x +1x +1x +1x +  +1x +3x +  +  +3x +  +  +  +  +3x +  +3x +  +2x +  +  +1x +  +1x +1x +1x +  +  +  + 
 
+const fs = require('fs-extra');
+import path from 'path';
+import xml2json from '../utils/xml2json';
+import { globSync } from 'glob';
+ 
+export default class ApexTestSuite {
+    public constructor(private sourceDir: string, private suiteName: string) {}
+ 
+    public async getConstituentClasses(): Promise<string[]> {
+        let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, {
+            cwd: this.sourceDir,
+            absolute: true,
+        });
+ 
+        console.log('testSuitePaths',testSuitePaths);
+ 
+        if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`);
+ 
+        let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0])));
+ 
+        if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) {
+            return apex_test_suite.ApexTestSuite.testClassName;
+        } else {
+            let testClassess = new Array<string>();
+            testClassess.push(apex_test_suite.ApexTestSuite.testClassName);
+            return testClassess;
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html new file mode 100644 index 000000000..8f05f1a9a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/core/apextest/ImpactedApexTestClassFetcher.ts + + + + + + + + + +
+
+

All files / src/core/apextest ImpactedApexTestClassFetcher.ts

+
+ +
+ 17.14% + Statements + 6/35 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 18.18% + Lines + 6/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +911x +1x +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as _ from 'lodash';
+import ApexDepedencyCheckImpl from "@flxblio/apexlink/lib/ApexDepedencyCheckImpl"
+import Component from '../dependency/Component';
+import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import SfpPackage, { PackageType } from '../package/SfpPackage';
+import path from 'path';
+ 
+export default class ImpactedApexTestClassFetcher {
+    public constructor(
+        private sfpPackage: SfpPackage,
+        private changedComponents: Component[],
+        private logger: Logger,
+        private loglevel?: LoggerLevel
+    ) {}
+ 
+    public async getImpactedTestClasses(): Promise<string[]> {
+    
+        let invalidatedClasses = [];
+        let invalidatedTestClasses = [];
+ 
+        try
+        {
+        let validatedChangedComponents = this.changedComponents.filter(
+            (component) => component.package == this.sfpPackage.packageName
+        );
+ 
+        SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger);
+        SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger);
+ 
+    
+       
+        let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory));
+        let dependencies = (await apexLinkImpl.execute()).dependencies;
+ 
+        if(dependencies.length==0)
+        {
+            //go for another attempt
+            SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger);
+            apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory);
+            dependencies = (await apexLinkImpl.execute()).dependencies;
+        }
+ 
+        SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger);
+ 
+        //compute invalidated apex classes
+        for (const changedComponent of validatedChangedComponents) {
+            //If the component is a permset or profile, add every test class
+            //There is a change in security model, add all test classes as invalidated
+            // Temoorarily disabled this check as it is not working as expected
+            if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) {
+                SFPLogger.log(
+                    COLOR_WARNING(`Change in Security Model, pushing all test classes through`),
+                    LoggerLevel.INFO,
+                    this.logger
+                );
+                invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses);
+                break;
+            }
+ 
+            for (const apexClass of dependencies) {
+                // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class
+                Iif (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name);
+ 
+                // push any apex class or test class who is dependent on the changed entity
+                for (const dependsOn of apexClass.dependencies) {
+                    Iif (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name);
+                }
+            }
+        }
+ 
+        SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger);
+        //Filter all apex classes by means of whats is detected in test classes list
+        invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses);
+        SFPLogger.log(
+            `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`,
+            LoggerLevel.INFO,
+            this.logger
+        );
+        }catch(error)
+        {
+            SFPLogger.log(
+                `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`,
+                LoggerLevel.ERROR,
+                this.logger
+            );
+            invalidatedClasses = this.sfpPackage.apexTestClassses;
+        }
+        return invalidatedTestClasses;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html new file mode 100644 index 000000000..d1dbe87a1 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/apextest + + + + + + + + + +
+
+

All files src/core/apextest

+
+ +
+ 43.13% + Statements + 22/51 +
+ + +
+ 20% + Branches + 1/5 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 42.55% + Lines + 20/47 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ApexTestSuite.ts +
+
100%16/16100%1/1100%2/2100%14/14
ImpactedApexTestClassFetcher.ts +
+
17.14%6/350%0/40%0/318.18%6/33
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html new file mode 100644 index 000000000..a597a3f7c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html @@ -0,0 +1,757 @@ + + + + + + Code coverage report for src/core/artifacts/ArtifactFetcher.ts + + + + + + + + + +
+
+

All files / src/core/artifacts ArtifactFetcher.ts

+
+ +
+ 38.46% + Statements + 30/78 +
+ + +
+ 53.84% + Branches + 7/13 +
+ + +
+ 38.46% + Functions + 5/13 +
+ + +
+ 37.33% + Lines + 28/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +2251x +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +1x +  +  +3x +  +  +  +  +3x +1x +1x +1x +1x +2x +  +  +  +  +  +  +  +  +1x +4x +4x +  +  +1x +1x +4x +4x +  +4x +  +  +  +  +1x +1x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import path = require('path');
+import * as fs from 'fs-extra';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { globSync } from 'glob';
+import AdmZip = require('adm-zip');
+import semver = require('semver');
+import tar = require('tar');
+ 
+export default class ArtifactFetcher {
+    /**
+     * Decider for which artifact retrieval method to use
+     * Returns empty array if no artifacts are found
+     * @param artifactDirectory
+     * @param sfdx_package
+     */
+    public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] {
+        let result: Artifact[] = [];
+ 
+        if (!fs.existsSync(artifactDirectory)) {
+            throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`);
+        }
+ 
+        let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package);
+ 
+        SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger);
+ 
+        for (let artifact of artifacts) {
+            let artifactFilePaths: Artifact;
+            if (path.extname(artifact) === '.zip') {
+                artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact);
+            } else if (path.extname(artifact) === '.tgz') {
+                artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact);
+            } else {
+                throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`);
+            }
+            result.push(artifactFilePaths);
+        }
+ 
+        return result;
+    }
+ 
+    /**
+     * Helper method for retrieving the ArtifactFilePaths of an artifact folder
+     * @param packageMetadataFilePath
+     */
+    private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact {
+        let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`);
+ 
+        let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`);
+ 
+        let artifactFilePaths: Artifact = {
+            packageMetadataFilePath: packageMetadataFilePath,
+            sourceDirectoryPath: sourceDirectory,
+            changelogFilePath: changelogFilePath,
+        };
+ 
+        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
+ 
+        return artifactFilePaths;
+    }
+ 
+    /**
+     * Helper method for retrieving ArtifactFilePaths of an artifact zip
+     * @param artifact
+     */
+    private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact {
+        let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`;
+ 
+        fs.mkdirpSync(unzippedArtifactsDirectory);
+        let zip = new AdmZip(artifact);
+ 
+        // Overwrite existing files
+        zip.extractAllTo(unzippedArtifactsDirectory, true);
+ 
+        let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0];
+        if (artifactName == null) {
+            throw new Error(`Failed to fetch artifact file paths for ${artifact}`);
+        }
+ 
+        let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json');
+ 
+        let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`);
+ 
+        let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`);
+ 
+        let artifactFilePaths: Artifact = {
+            packageMetadataFilePath: packageMetadataFilePath,
+            sourceDirectoryPath: sourceDirectory,
+            changelogFilePath: changelogFilePath,
+        };
+ 
+        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
+ 
+        return artifactFilePaths;
+    }
+ 
+    /**
+     * Helper method for retrieving ArtifactFilePaths of a tarball
+     * @param artifact
+     */
+    private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact {
+        let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`;
+        fs.mkdirpSync(unzippedArtifactsDirectory);
+ 
+        tar.x({
+            file: artifact,
+            cwd: unzippedArtifactsDirectory,
+            sync: true,
+        });
+ 
+        let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json');
+ 
+        let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`);
+ 
+        let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`);
+ 
+        let artifactFilePaths: Artifact = {
+            packageMetadataFilePath: packageMetadataFilePath,
+            sourceDirectoryPath: sourceDirectory,
+            changelogFilePath: changelogFilePath,
+        };
+ 
+        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
+ 
+        return artifactFilePaths;
+    }
+ 
+    /**
+     * Find zip and tarball artifacts
+     * Artifact format/s:
+     * sfp_artifact_<version>.zip,
+     * [sfdx_package]_sfp_artifact_[version].zip,
+     * [sfdx_package]_sfp_artifact_[version].tgz
+     */
+    public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] {
+        let pattern: string;
+        if (sfdx_package) {
+            pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`;
+        } else {
+            pattern = `**/*sfp_artifact*.@(zip|tgz)`;
+        }
+ 
+        let artifacts: string[] = globSync(pattern, {
+            cwd: artifactDirectory,
+            absolute: true,
+        });
+ 
+        if (sfdx_package && artifacts.length > 1) {
+            SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO);
+            let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts);
+            SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO);
+            return [latestArtifact];
+        } else return artifacts;
+    }
+ 
+    /**
+     * Get the artifact with the latest semantic version
+     * @param artifacts
+     */
+    private static getLatestArtifact(artifacts: string[]) {
+        // Consider zip & tarball artifacts only
+        artifacts = artifacts.filter((artifact) => {
+            let ext: string = path.extname(artifact);
+            return ext === '.zip' || ext === '.tgz';
+        });
+ 
+        let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?<version>.*)(?:\\.zip|\\.tgz)$');
+        let versions: string[] = artifacts.map((artifact) => {
+            let match: RegExpMatchArray = path.basename(artifact).match(pattern);
+            let version = match?.groups.version;
+ 
+            if (version) return version;
+            else Ethrow new Error('Corrupted artifact detected with no version number');
+        });
+ 
+        // Pick artifact with latest semantic version
+        let sortedVersions: string[] = semver.sort(versions);
+        let latestVersion: string = sortedVersions.pop();
+ 
+        return artifacts.find((artifact) => artifact.includes(latestVersion));
+    }
+ 
+    /**
+     * Verify that artifact filepaths exist on the file system
+     * @param artifactFilePaths
+     */
+    private static existsArtifactFilepaths(artifactFilePaths: Artifact): void {
+        Object.values(artifactFilePaths).forEach((filepath) => {
+            Iif (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`);
+        });
+    }
+ 
+    /**
+     * Decider for task outcome if the artifact cannot be found
+     * @param artifacts_filepaths
+     * @param isToSkipOnMissingArtifact
+     */
+    public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean {
+        if (artifacts.length === 0 && !isToSkipOnMissingArtifact) {
+            throw new Error(`Artifact not found, Please check the inputs`);
+        } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) {
+            SFPLogger.log(
+                `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}`
+            );
+            return true;
+        }
+    }
+ 
+    private static makefolderid(length): string {
+        var result = '';
+        var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+        var charactersLength = characters.length;
+        for (var i = 0; i < length; i++) {
+            result += characters.charAt(Math.floor(Math.random() * charactersLength));
+        }
+        return result;
+    }
+}
+ 
+export interface Artifact {
+    packageMetadataFilePath: string;
+    sourceDirectoryPath?: string;
+    changelogFilePath?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html new file mode 100644 index 000000000..291805c44 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/artifacts + + + + + + + + + +
+
+

All files src/core/artifacts

+
+ +
+ 38.46% + Statements + 30/78 +
+ + +
+ 53.84% + Branches + 7/13 +
+ + +
+ 38.46% + Functions + 5/13 +
+ + +
+ 37.33% + Lines + 28/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ArtifactFetcher.ts +
+
38.46%30/7853.84%7/1338.46%5/1337.33%28/75
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html new file mode 100644 index 000000000..2924471c4 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for src/core/display/TableConstants.ts + + + + + + + + + +
+
+

All files / src/core/display TableConstants.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
 
+export const ZERO_BORDER_TABLE = {
+    top: ' ',
+    'top-mid': ' ',
+    'top-left': ' ',
+    'top-right': ' ',
+    bottom: ' ',
+    'bottom-mid': ' ',
+    'bottom-left': ' ',
+    'bottom-right': ' ',
+    left: '',
+    'left-mid': '',
+    mid: '',
+    'mid-mid': '',
+    right: '',
+    'right-mid': '',
+    middle: ' ',
+};
+ 
+ 
+ 
+export const COLON_MIDDLE_BORDER_TABLE = {
+    top: '',
+    'top-mid': '',
+    'top-left': '',
+    'top-right': '',
+    bottom: '',
+    'bottom-mid': '',
+    'bottom-left': '',
+    'bottom-right': '',
+    left: '',
+    'left-mid': '',
+    mid: '',
+    'mid-mid': '',
+    right: '',
+    'right-mid': '',
+    middle: ':',
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html new file mode 100644 index 000000000..c0e6dc658 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/display + + + + + + + + + +
+
+

All files src/core/display

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
TableConstants.ts +
+
100%2/2100%0/0100%0/0100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html new file mode 100644 index 000000000..0e2e5312a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html @@ -0,0 +1,823 @@ + + + + + + Code coverage report for src/core/git/Git.ts + + + + + + + + + +
+
+

All files / src/core/git Git.ts

+
+ +
+ 6% + Statements + 6/100 +
+ + +
+ 0% + Branches + 0/15 +
+ + +
+ 0% + Functions + 0/26 +
+ + +
+ 6.38% + Lines + 6/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +2471x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import simplegit, { SimpleGit } from 'simple-git';
+import fs = require('fs-extra');
+import GitIdentity from './GitIdentity';
+const tmp = require('tmp');
+ 
+//Git Abstraction
+export default class Git {
+    private _git: SimpleGit;
+    private repositoryLocation: string;
+    private tempRepoLocation: any;
+    private _isATemporaryRepo: boolean = false;
+ 
+    private constructor(private projectDir?: string, private logger?: Logger) {
+        if (this.projectDir) {
+            this._git = simplegit(this.projectDir);
+            this.repositoryLocation = this.projectDir;
+        } else {
+            this._git = simplegit();
+            this.repositoryLocation = process.cwd();
+        }
+    }
+ 
+    async fetch() {
+        return this._git.fetch('origin');
+    }
+ 
+    async getHeadCommit(): Promise<string> {
+        return this._git.revparse(['HEAD']);
+    }
+ 
+    async show(options: string[]): Promise<string> {
+        return this._git.show(options);
+    }
+ 
+    async tag(options: string[]): Promise<string[]> {
+        let tagResult = await this._git.tag(options);
+ 
+        let temp: string[] = tagResult.split('\n');
+        temp.pop();
+ 
+        return temp;
+    }
+ 
+    async diff(options: string[]): Promise<string[]> {
+        let diffResult = await this._git.diff(options);
+ 
+        let temp: string[] = diffResult.split('\n');
+        temp.pop();
+ 
+        return temp;
+    }
+ 
+    async log(options: string[]): Promise<string[]> {
+        let gitLogResult = await this._git.log(options);
+ 
+        return gitLogResult['all'][0]['hash'].split('\n');
+    }
+ 
+    public async getRemoteOriginUrl(overrideOriginURL?: string): Promise<string> {
+        let remoteOriginURL;
+        if (!overrideOriginURL) {
+            remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
+            if (!remoteOriginURL) {
+                remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
+            }
+            SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG);
+        } else remoteOriginURL = overrideOriginURL;
+ 
+        Iif (!remoteOriginURL) throw new Error('Remote origin must be set in repository');
+ 
+        return remoteOriginURL;
+    }
+ 
+    public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) {
+        try {
+            await new GitIdentity(this._git).setUsernameAndEmail();
+            await this._git.add(pathToFiles);
+            await this._git.commit(message);
+            SFPLogger.log(`Committed File ${pathToFiles}`);
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to commit file, probably due to no change or something else,Please try manually`,
+                LoggerLevel.ERROR
+            );
+            throw error;
+        }
+    }
+ 
+    async pushTags(tags?: string[]) {
+        if (!tags) await this._git.pushTags();
+        else {
+            for (let tag of tags) {
+                await this._git.push('origin', tag);
+            }
+        }
+    }
+ 
+    async deleteTags(tags?: string[]) {
+        Iif (tags) await this._git.push('origin', '--delete', tags);
+    }
+ 
+    async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) {
+        try {
+            await new GitIdentity(this._git).setUsernameAndEmail();
+            if (!commitId) {
+                await this._git.addAnnotatedTag(tagName, annotation);
+            } else {
+                const commands = ['tag', tagName, commitId, '-m', annotation];
+                await this._git.raw(commands);
+            }
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to commit file, probably due to no change or something else,Please try manually`,
+                LoggerLevel.ERROR
+            );
+            throw error;
+        }
+    }
+ 
+    public async isBranchExists(branch: string): Promise<boolean> {
+        const listOfBranches = await this._git.branch(['-la']);
+ 
+        return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false;
+    }
+ 
+    static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise<Git> {
+        let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true });
+ 
+        SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger);
+        let repoDir = locationOfCopiedDirectory.name;
+ 
+        // Copy source directory to temp dir
+        fs.copySync(process.cwd(), repoDir);
+ 
+        //Initiate git on new repo on using the abstracted object
+        let git = new Git(repoDir, logger);
+        git._isATemporaryRepo = true;
+        git.tempRepoLocation = locationOfCopiedDirectory;
+ 
+        await git.addSafeConfig(repoDir);
+        await git.getRemoteOriginUrl();
+        await git.fetch();
+        if (branch) {
+            await git.createBranch(branch);
+        }
+        if (commitRef) {
+            await git.checkout(commitRef, true);
+        }
+ 
+        SFPLogger.log(
+            `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`,
+            LoggerLevel.INFO,
+            logger
+        );
+        return git;
+    }
+ 
+    static async initiateRepo(logger?: Logger, projectDir?: string) {
+        let git = new Git(projectDir, logger);
+        if (projectDir) await git.addSafeConfig(projectDir);
+        else {
+            await git.addSafeConfig(process.cwd());
+        }
+        await git.getRemoteOriginUrl();
+        return git;
+    }
+ 
+    public getRepositoryPath() {
+        return this.repositoryLocation;
+    }
+ 
+    async deleteTempoRepoIfAny() {
+        Iif (this.tempRepoLocation) this.tempRepoLocation.removeCallback();
+    }
+ 
+    async addSafeConfig(repoDir: string) {
+        try
+        {
+        //add workaround for safe directory (https://github.com/actions/runner/issues/2033)
+        await this._git.addConfig('safe.directory', repoDir, false, 'global');
+        }catch(error)
+        {
+            //ignore error
+            SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE)
+        }
+    }
+ 
+    async pushToRemote(branch: string, isForce: boolean) {
+        Iif (!branch) branch = (await this._git.branch()).current;
+        SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger);
+        if (process.env.sfp_OVERRIDE_ORIGIN_URL) {
+            await this._git.removeRemote('origin');
+            await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL);
+        }
+ 
+        if (isForce) {
+            await this._git.push('origin', branch, [`--force`]);
+        } else {
+            await this._git.push('origin', branch);
+        }
+    }
+ 
+    isATemporaryRepo(): boolean {
+        return this._isATemporaryRepo;
+    }
+ 
+    async getCurrentCommitId() {
+        return this._git.revparse(['HEAD']);
+    }
+ 
+    async checkout(commitRef: string, isForce?: boolean) {
+        if (isForce) {
+            return this._git.checkout(commitRef, [`--force`]);
+        } else return this._git.checkout(commitRef, {});
+    }
+ 
+    async checkoutPath(commitRef: string, path: string, isForce?: boolean) {
+        if (isForce) {
+            return this._git.checkout(commitRef, [path, `--force`]);
+        } else return this._git.checkout(commitRef, [path]);
+    }
+ 
+    async stageChangedFiles(path: string): Promise<boolean> {
+        try {
+            await this._git.add(path);
+            return true;
+        } catch (error) {
+            SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger);
+            return false;
+        }
+    }
+    async createBranch(branch: string) {
+        if (await this.isBranchExists(branch)) {
+            await this._git.checkout(branch, ['-f']);
+            try {
+                // For ease-of-use when running locally and local branch exists
+                await this._git.merge([`refs/remotes/origin/${branch}`]);
+            } catch (error) {
+                SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger);
+            }
+        } else {
+            await this._git.checkout(['-b', branch]);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html new file mode 100644 index 000000000..a326847ca --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html @@ -0,0 +1,610 @@ + + + + + + Code coverage report for src/core/git/GitDiffUtil.ts + + + + + + + + + +
+
+

All files / src/core/git GitDiffUtil.ts

+
+ +
+ 12.67% + Statements + 9/71 +
+ + +
+ 0% + Branches + 0/14 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 12.85% + Lines + 9/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +1761x +1x +1x +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as path from 'path';
+import * as fs from 'fs-extra';
+import * as _ from 'lodash';
+ 
+import { LoggerLevel } from '@salesforce/core';
+import simplegit, { SimpleGit } from 'simple-git';
+import SFPLogger, { Logger } from '@flxblio/sfp-logger';
+const SEP = /\/|\\/;
+ 
+export interface DiffFileStatus {
+    revisionFrom: string;
+    revisionTo: string;
+    path: string;
+    renamedPath?: string;
+}
+ 
+export interface DiffFile {
+    deleted: DiffFileStatus[];
+    addedEdited: DiffFileStatus[];
+}
+ 
+const git: SimpleGit = simplegit();
+ 
+export default class GitDiffUtils {
+    private gitTreeRevisionTo: {
+        revision: string;
+        path: string;
+    }[];
+ 
+    public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise<boolean> {
+        let fileAsString = await git.show(['--raw', diffFile.revisionFrom]);
+        let result = fileAsString.includes(content);
+        return result;
+    }
+ 
+    public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) {
+        SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger);
+        this.gitTreeRevisionTo = [];
+        let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]);
+        const sepRegex = /\n|\r/;
+        let lines = revisionTree.split(sepRegex);
+        for (let i = 0; i < lines.length; i++) {
+            Iif (lines[i] === '') continue;
+            let fields = lines[i].split(/\t/);
+            let pathStr = fields[1];
+            let revisionSha = fields[0].split(/\s/)[2];
+            let fileMetadata = {
+                revision: revisionSha,
+                path: path.join('.', pathStr),
+            };
+            this.gitTreeRevisionTo.push(fileMetadata);
+        }
+        return this.gitTreeRevisionTo;
+    }
+ 
+    public async copyFile(filePath: string, outputFolder: string, logger: Logger) {
+        SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger);
+        if (fs.existsSync(path.join(outputFolder, filePath))) {
+            SFPLogger.log(`File ${filePath}  already in output folder. `, LoggerLevel.TRACE, logger);
+            return;
+        }
+ 
+        let gitFiles: {
+            revision: string;
+            path: string;
+        }[] = [];
+        this.gitTreeRevisionTo.forEach((file) => {
+            if (file.path === filePath) {
+                gitFiles.push(file);
+            }
+        });
+ 
+        Iif(gitFiles.length==0)
+          throw new Error(`Unable to find the required file  ${filePath} in Git.., Did you really commit the file?`)
+ 
+        let copyOutputFolder = outputFolder;
+        for (let i = 0; i < gitFiles.length; i++) {
+            outputFolder = copyOutputFolder;
+            let gitFile = gitFiles[i];
+ 
+            SFPLogger.log(
+                `Associated file ${i}: ${gitFile.path}  Revision: ${gitFile.revision}`,
+                LoggerLevel.TRACE,
+                logger
+            );
+ 
+            let outputPath = path.join(outputFolder, gitFile.path);
+ 
+            let filePathParts = gitFile.path.split(SEP);
+ 
+            if (fs.existsSync(outputFolder) == false) {
+                fs.mkdirSync(outputFolder);
+            }
+            // Create folder structure
+            for (let i = 0; i < filePathParts.length - 1; i++) {
+                let folder = filePathParts[i].replace('"', '');
+                outputFolder = path.join(outputFolder, folder);
+                if (fs.existsSync(outputFolder) == false) {
+                    fs.mkdirSync(outputFolder);
+                }
+            }
+            let fileContent = await git.binaryCatFile(['-p', gitFile.revision]);
+            fs.writeFileSync(outputPath, fileContent);
+        }
+    }
+ 
+    public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) {
+        SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger);
+        if (fs.existsSync(path.join(outputFolder, folderPath))) {
+            SFPLogger.log(`Folder ${folderPath}  already in output folder. `, LoggerLevel.TRACE, logger);
+            return;
+        }
+ 
+        this.gitTreeRevisionTo.forEach((file) => {
+            let fileToCompare = file.path;
+            if (fileToCompare.startsWith(folderPath)) {
+                this.copyFile(fileToCompare, outputFolder, logger);
+            }
+        });
+    }
+ 
+    public getChangedOrAdded(list1: any[], list2: any[], key: string) {
+        let result: any = {
+            addedEdited: [],
+            deleted: [],
+        };
+ 
+        //Ensure array
+        if (!_.isNil(list1) && !Array.isArray(list1)) {
+            list1 = [list1];
+        }
+        if (!_.isNil(list2) && !Array.isArray(list2)) {
+            list2 = [list2];
+        }
+ 
+        if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) {
+            result.addedEdited.push(...list2);
+        }
+ 
+        if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) {
+            result.deleted.push(...list1);
+        }
+ 
+        if (!_.isNil(list1) && !_.isNil(list2)) {
+            list1.forEach((elem1) => {
+                let found = false;
+                for (let i = 0; i < list2.length; i++) {
+                    let elem2 = list2[i];
+                    if (elem1[key] === elem2[key]) {
+                        //check if edited
+                        if (!_.isEqual(elem1, elem2)) {
+                            result.addedEdited.push(elem2);
+                        }
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found) {
+                    result.deleted.push(elem1);
+                }
+            });
+ 
+            //Check for added elements
+ 
+            let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) {
+                return element1[key] === element2[key];
+            });
+ 
+            if (!_.isNil(addedElement)) {
+                result.addedEdited.push(...addedElement);
+            }
+        }
+        return result;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html new file mode 100644 index 000000000..c6699ec0f --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/core/git/GitIdentity.ts + + + + + + + + + +
+
+

All files / src/core/git GitIdentity.ts

+
+ +
+ 10% + Statements + 1/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 10% + Lines + 1/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { SimpleGit } from 'simple-git/promise';
+ 
+export default class GitIdentity {
+    constructor(private git: SimpleGit) {}
+ 
+    async setUsernameAndEmail(): Promise<void> {
+        await this.setUsername();
+        await this.setEmail();
+    }
+ 
+    private async setUsername(): Promise<void> {
+        let username: string;
+ 
+        if (process.env.sfp_GIT_USERNAME) {
+            username = process.env.sfp_GIT_USERNAME;
+        } else {
+            username = 'sfp';
+        }
+ 
+        await this.git.addConfig('user.name', username);
+    }
+ 
+    private async setEmail(): Promise<void> {
+        let email: string;
+ 
+        if (process.env.sfp_GIT_EMAIL) {
+            email = process.env.sfp_GIT_EMAIL;
+        } else {
+            email = 'sfp@flxblio.io';
+        }
+ 
+        await this.git.addConfig('user.email', email);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html new file mode 100644 index 000000000..a0f830cca --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html @@ -0,0 +1,538 @@ + + + + + + Code coverage report for src/core/git/GitTags.ts + + + + + + + + + +
+
+

All files / src/core/git GitTags.ts

+
+ +
+ 32.78% + Statements + 20/61 +
+ + +
+ 16.66% + Branches + 2/12 +
+ + +
+ 33.33% + Functions + 6/18 +
+ + +
+ 30.18% + Lines + 16/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152  +1x +  +1x +3x +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +3x +1x +  +  +  +  +2x +  +  +  +  +2x +  +  +  +  +  +2x +  +2x +2x +  +  +  +24x +  +  +2x +8x +  +  +  +8x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import Git from './Git';
+import child_process = require('child_process');
+ 
+export default class GitTags {
+    constructor(private git: Git, private sfdx_package: string) {}
+ 
+    /***
+     * Returns list of sorted tags, belonging to package, that are reachable from HEAD and
+     * follow the first parent on merge commits.
+     * If there are no tags, returns empty array
+     * @param sfdx_package
+     */
+    async listTagsOnBranch(): Promise<string[]> {
+        let tags: string[] = await this.git.tag([
+            `-l`,
+            `${this.sfdx_package}_v*`,
+            `--sort=creatordate`,
+            `--merged`,
+        ]);
+ 
+        if (tags.length > 0) return this.filterTagsAgainstBranch(tags);
+        else return tags;
+    }
+ 
+    private async filterTagsAgainstBranch(tags: string[]): Promise<string[]> {
+        // Get full-length commit ID's on the current branch, following the first parent on merge commits
+        let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]);
+ 
+        // Get the tags' associated commit ID
+        // Dereference (-d) tags into object IDs
+        //TODO: Remove this direct usage
+        let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, {
+            maxBuffer: 5 * 1024 * 1024,
+            stdio: 'pipe',
+            cwd: this.git.getRepositoryPath()
+        });
+ 
+        let gitShowRefTags = gitShowRefTagsBuffer.toString();
+ 
+        let refTags: string[] = gitShowRefTags.split('\n');
+        refTags.pop(); // Remove last empty element
+ 
+        // Filter ref tags, only including tags that point to the branch
+        // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log
+        let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40)));
+ 
+        // Only match the name of the tags pointing to the branch
+        refTagsPointingToBranch = refTagsPointingToBranch.map(
+            (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1]
+        );
+ 
+        // Filter the sorted tags - only including tags that point to the branch
+        let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag));
+ 
+        return tagsPointingToBranch;
+    }
+ 
+    public async getVersionFromLatestTag(): Promise<string> {
+        let version: string;
+ 
+        let tags = await this.listTagsOnBranch();
+        let latestTag = tags.pop();
+        if (latestTag) {
+            let match: RegExpMatchArray = latestTag.match(
+                /^.*_v(?<version>[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/
+            );
+            if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version);
+            else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`);
+        } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`);
+ 
+        return version;
+    }
+ 
+    private substituteBuildNumberWithPreRelease(packageVersionNumber: string) {
+        let segments = packageVersionNumber.split('.');
+        //Strip ALIGN
+        if (segments.length == 4 && segments[3].includes('ALIGN')) {
+            segments[3] = segments[3].substring(0, segments[3].indexOf('-'));
+        }
+ 
+        if (segments.length === 4) {
+            packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => {
+                if (segmentsIdx === 3) return version + '-' + segment;
+                else return version + '.' + segment;
+            });
+        }
+ 
+        return packageVersionNumber;
+    }
+ 
+ 
+    public async limitTags(limit: number): Promise<string[]>{
+        let rawTags = await this.listTagsOnBranch();
+ 
+        if (rawTags.length <= limit) {
+            return [];
+        }
+ 
+        const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1);
+        return tags;
+    }
+ 
+ 
+    public async filteredOldTags(daysToKeep: number, limit?: number): Promise<string[]> {
+        const currentTimestamp = Math.floor(Date.now() / 1000);
+ 
+        let rawTags: string[];
+        if (limit) {
+            rawTags = await this.limitTags(limit);
+        } else {
+            rawTags = await this.listTagsOnBranch();
+        }
+ 
+        if (rawTags.length < 0) {
+            return [];
+        }
+ 
+        let tags: string[] = await this.getTagsWithTimestamps(rawTags);
+ 
+        const filteredTags = tags
+          .map(tagStr => {
+            const [name, timestampStr] = tagStr.split(' ');
+            const timestamp = parseInt(timestampStr, 10);
+            return { name, timestamp };
+          })
+          .filter(tag => {
+            const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400;
+            return tag.name && daysSinceTag > daysToKeep;
+          });
+ 
+        return filteredTags.map(tag => tag.name);
+    }
+ 
+    private async getTagsWithTimestamps(tags: string[]): Promise<string[]> {
+        const timestampPromises: Promise<number>[] = [];
+ 
+        // Create an array of promises that will get the tagger date for each tag
+        tags.forEach((tag: string) => {
+        timestampPromises.push(
+            this.git.log(['--format=%at', `refs/tags/${tag}`])
+            .then((output: string[]) => parseInt(output[0].trim(), 10))
+        );
+        });
+ 
+        // Wait for all promises to resolve and format the output
+        const timestamps: number[] = await Promise.all(timestampPromises);
+        const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`);
+        return tagsWithTimestamp
+    }
+ 
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html new file mode 100644 index 000000000..d13bfd48b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/core/git + + + + + + + + + +
+
+

All files src/core/git

+
+ +
+ 14.87% + Statements + 36/242 +
+ + +
+ 4.87% + Branches + 2/41 +
+ + +
+ 10.52% + Functions + 6/57 +
+ + +
+ 14.09% + Lines + 32/227 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Git.ts +
+
6%6/1000%0/150%0/266.38%6/94
GitDiffUtil.ts +
+
12.67%9/710%0/140%0/912.85%9/70
GitIdentity.ts +
+
10%1/10100%0/00%0/410%1/10
GitTags.ts +
+
32.78%20/6116.66%2/1233.33%6/1830.18%16/53
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html new file mode 100644 index 000000000..c37923a46 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html @@ -0,0 +1,1114 @@ + + + + + + Code coverage report for src/core/metadata/MetadataFiles.ts + + + + + + + + + +
+
+

All files / src/core/metadata MetadataFiles.ts

+
+ +
+ 6.43% + Statements + 11/171 +
+ + +
+ 0% + Branches + 0/25 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 6.47% + Lines + 11/170 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
//TODO: Replace with SDR
+import * as path from 'path';
+import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo';
+import FileUtils from '../utils/Fileutils';
+import * as _ from 'lodash';
+import ignore from 'ignore';
+import * as fs from 'fs-extra';
+import ProjectConfig from '../project/ProjectConfig';
+import { globSync } from 'glob';
+ 
+const SEP = /\/|\\/;
+ 
+export default class MetadataFiles {
+    public static sourceOnly: boolean = false;
+    forceignore: any;
+    public constructor() {
+        if (fs.existsSync('.forceignore')) {
+            this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString());
+        } else {
+            this.forceignore = ignore();
+        }
+    }
+    static getFullApiName(fileName: string): string {
+        let fullName = '';
+        let metadateType = MetadataInfo.getMetadataName(fileName);
+        let splitFilepath = fileName.split(SEP);
+        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType);
+        if (isObjectChild) {
+            let objectName = splitFilepath[splitFilepath.length - 3];
+            let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0];
+            fullName = objectName.concat('.' + fieldName);
+        } else {
+            fullName = splitFilepath[splitFilepath.length - 1].split('.')[0];
+        }
+        return fullName;
+    }
+    static getFullApiNameWithExtension(fileName: string): string {
+        let fullName = '';
+        let metadateType = MetadataInfo.getMetadataName(fileName);
+        let splitFilepath = fileName.split(SEP);
+        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType);
+        if (isObjectChild) {
+            let objectName = splitFilepath[splitFilepath.length - 3];
+            let fieldName = splitFilepath[splitFilepath.length - 1];
+            fullName = objectName.concat('.' + fieldName);
+        } else {
+            fullName = splitFilepath[splitFilepath.length - 1];
+        }
+        return fullName;
+    }
+ 
+    public static isCustomMetadata(filepath: string, name: string): boolean {
+        let result = true;
+        let splitFilepath = filepath.split(SEP);
+        let componentName = splitFilepath[splitFilepath.length - 1];
+        componentName = componentName.substring(0, componentName.indexOf('.'));
+        if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) {
+            //Custom Field or Custom Object
+            result = componentName.endsWith('__c') || componentName.endsWith('__mdt');
+        }
+        return result;
+    }
+    public static getMemberNameFromFilepath(filepath: string, name: string): string {
+        let member: string;
+        let splitFilepath = filepath.split(SEP);
+        let lastIndex = splitFilepath.length - 1;
+        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name);
+        let metadataDescribe: MetadataDescribe = METADATA_INFO[name];
+        if (isObjectChild) {
+            let objectName = splitFilepath[lastIndex - 2];
+            let fieldName = splitFilepath[lastIndex].split('.')[0];
+            member = objectName.concat('.' + fieldName);
+        } else if (metadataDescribe.inFolder) {
+            let baseName = metadataDescribe.directoryName;
+            let baseIndex = filepath.indexOf(baseName) + baseName.length;
+            let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
+            cmpPath = cmpPath.substring(0, cmpPath.indexOf('.'));
+            member = cmpPath.replace(SEP, '/');
+        } else {
+            if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) {
+                member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, '');
+            } else {
+                const auraRegExp = new RegExp('aura');
+                const lwcRegExp = new RegExp('lwc');
+                const staticResourceRegExp = new RegExp('staticresources');
+                const experienceBundleRegExp = new RegExp('experiences');
+                if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) {
+                    member = splitFilepath[lastIndex - 1];
+                } else if (staticResourceRegExp.test(filepath)) {
+                    //Return the fileName
+                    let baseName = 'staticresources';
+                    let baseIndex = filepath.indexOf(baseName) + baseName.length;
+                    let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
+                    member = cmpPath.split(SEP)[0];
+                    let extension = path.parse(member).ext;
+ 
+                    member = member.replace(new RegExp(extension + '$'), '');
+                } else if (experienceBundleRegExp.test(filepath)) {
+                    //Return the fileName
+                    let baseName = 'experiences';
+                    let baseIndex = filepath.indexOf(baseName) + baseName.length;
+                    let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
+                    member = cmpPath.split(SEP)[0];
+                    let extension = path.parse(member).ext;
+ 
+                    member = member.replace(new RegExp(extension + '$'), '');
+                } else {
+                    let extension = path.parse(splitFilepath[lastIndex]).ext;
+                    member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), '');
+                }
+            }
+        }
+        return member;
+    }
+ 
+    public loadComponents(srcFolder: string, checkIgnore = true): void {
+        var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder);
+        let keys = Object.keys(METADATA_INFO);
+        if (Array.isArray(metadataFiles) && metadataFiles.length > 0) {
+            metadataFiles.forEach((metadataFile) => {
+                let found = false;
+ 
+                for (let i = 0; i < keys.length; i++) {
+                    let match = false;
+                    if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) {
+                        match = true;
+                    } else if (
+                        METADATA_INFO[keys[i]].inFolder &&
+                        metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension)
+                    ) {
+                        match = true;
+                    }
+                    if (match) {
+                        if (_.isNil(METADATA_INFO[keys[i]].files)) {
+                            METADATA_INFO[keys[i]].files = [];
+                            METADATA_INFO[keys[i]].components = [];
+                        }
+                        if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) {
+                            METADATA_INFO[keys[i]].files.push(metadataFile);
+ 
+                            let name = FileUtils.getFileNameWithoutExtension(
+                                metadataFile,
+                                METADATA_INFO[keys[i]].sourceExtension
+                            );
+ 
+                            if (METADATA_INFO[keys[i]].isChildComponent) {
+                                let fileParts = metadataFile.split(SEP);
+                                let parentName = fileParts[fileParts.length - 3];
+                                name = parentName + '.' + name;
+                            }
+ 
+                            METADATA_INFO[keys[i]].components.push(name);
+                        }
+                        found = true;
+                        break;
+                    }
+                }
+ 
+                if (!found) {
+                    const auraRegExp = new RegExp('aura');
+                    if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) {
+                        if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) {
+                            METADATA_INFO.AuraDefinitionBundle.files = [];
+                            METADATA_INFO.AuraDefinitionBundle.components = [];
+                        }
+                        if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) {
+                            METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile);
+ 
+                            let name = FileUtils.getFileNameWithoutExtension(metadataFile);
+                            METADATA_INFO.AuraDefinitionBundle.components.push(name);
+                        }
+                    }
+                }
+            });
+        } else {
+            keys.forEach((key) => {
+                if (_.isNil(METADATA_INFO[key].files)) {
+                    METADATA_INFO[key].files = [];
+                    METADATA_INFO[key].components = [];
+                }
+            });
+        }
+    }
+    //Check if a component is accepted by forceignore.
+    public accepts(filePath: string) {
+        return !this.forceignore.ignores(path.relative(process.cwd(), filePath));
+    }
+ 
+    public async isInModuleFolder(filePath: string) {
+        const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path);
+        if (!packageDirectories || packageDirectories.length == 0) {
+            return false;
+        }
+        const moduleFolder = packageDirectories.find((packageFolder) => {
+            let packageFolderNormalized = path.relative('', packageFolder);
+            return filePath.startsWith(packageFolderNormalized);
+        });
+        return moduleFolder !== undefined;
+    }
+ 
+    /**
+     * Copy a file to an outpu directory. If the filePath is a Metadata file Path,
+     * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls.
+     * Enforcing the .forceignore to ignire file ignored in the project.
+     * @param filePath
+     * @param outputFolder
+     */
+    public static copyFile(filePath: string, outputFolder: string) {
+        console.log(`Copying file ${filePath} from file system to ${outputFolder}`);
+        const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json'];
+        const pairStatResources = METADATA_INFO.StaticResource.directoryName;
+        const pairStatResourcesRegExp = new RegExp(pairStatResources);
+        const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName);
+ 
+        let copyOutputFolder = outputFolder;
+ 
+        if (!fs.existsSync(filePath)) {
+            return;
+        }
+ 
+        let exists = fs.existsSync(path.join(outputFolder, filePath));
+        if (exists) {
+            return;
+        }
+ 
+        if (filePath.startsWith('.')) {
+            let parts = path.parse(filePath);
+            if (parts.dir === '') {
+                fs.copyFileSync(filePath, path.join(outputFolder, filePath));
+                return;
+            }
+        }
+ 
+        let fileName = path.parse(filePath).base;
+        //exclude lwc ignored files
+        if (LWC_IGNORE_FILES.includes(fileName)) {
+            return;
+        }
+ 
+        let filePathParts = filePath.split(SEP);
+ 
+        if (fs.existsSync(outputFolder) == false) {
+            fs.mkdirSync(outputFolder);
+        }
+        // Create folder structure
+        for (let i = 0; i < filePathParts.length - 1; i++) {
+            let folder = filePathParts[i].replace('"', '');
+            outputFolder = path.join(outputFolder, folder);
+            if (fs.existsSync(outputFolder) == false) {
+                fs.mkdirSync(outputFolder);
+            }
+        }
+ 
+        // Copy all file with same base name
+        let associatedFilePattern = '';
+        if (SOURCE_EXTENSION_REGEX.test(filePath)) {
+            associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*');
+        } else {
+            let extension = path.parse(filePath).ext;
+            associatedFilePattern = filePath.replace(extension, '.*');
+        }
+        let files = globSync(associatedFilePattern);
+        for (let i = 0; i < files.length; i++) {
+            if (fs.lstatSync(files[i]).isDirectory() == false) {
+                let oneFilePath = path.join('.', files[i]);
+                let oneFilePathParts = oneFilePath.split(SEP);
+                fileName = oneFilePathParts[oneFilePathParts.length - 1];
+                let outputPath = path.join(outputFolder, fileName);
+                fs.copyFileSync(files[i], outputPath);
+            }
+        }
+ 
+        // Hadle ObjectTranslations
+        // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied
+        if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) {
+            let parentFolder = filePathParts[filePathParts.length - 2];
+            let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension;
+            let outputPath = path.join(outputFolder, objectTranslation);
+            let sourceFile = filePath.replace(fileName, objectTranslation);
+            if (fs.existsSync(sourceFile) == true) {
+                fs.copyFileSync(sourceFile, outputPath);
+            }
+        }
+ 
+        //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED
+        if (pairStatResourcesRegExp.test(filePath)) {
+            outputFolder = path.join('.', copyOutputFolder);
+            let srcFolder = '.';
+            let staticRecourceRoot = '';
+            let resourceFile = '';
+            for (let i = 0; i < filePathParts.length; i++) {
+                outputFolder = path.join(outputFolder, filePathParts[i]);
+                srcFolder = path.join(srcFolder, filePathParts[i]);
+                if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) {
+                    let fileOrDirname = filePathParts[i + 1];
+                    let fileOrDirnameParts = fileOrDirname.split('.');
+                    srcFolder = path.join(srcFolder, fileOrDirnameParts[0]);
+                    outputFolder = path.join(outputFolder, fileOrDirnameParts[0]);
+                    resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension;
+                    METADATA_INFO.StaticResource.sourceExtension;
+                    staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension;
+                    if (fs.existsSync(srcFolder)) {
+                        if (fs.existsSync(outputFolder) == false) {
+                            fs.mkdirSync(outputFolder);
+                        }
+                    }
+                    break;
+                }
+            }
+            if (fs.existsSync(srcFolder)) {
+                FileUtils.copyRecursiveSync(srcFolder, outputFolder);
+            }
+            if (fs.existsSync(resourceFile)) {
+                fs.copyFileSync(resourceFile, staticRecourceRoot);
+            }
+        }
+        //FOR AURA components and LWC components
+        if (pairAuaraRegExp.test(filePath)) {
+            outputFolder = path.join('.', copyOutputFolder);
+            let srcFolder = '.';
+            for (let i = 0; i < filePathParts.length; i++) {
+                outputFolder = path.join(outputFolder, filePathParts[i]);
+                srcFolder = path.join(srcFolder, filePathParts[i]);
+                if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') {
+                    let fileOrDirname = filePathParts[i + 1];
+                    let fileOrDirnameParts = fileOrDirname.split('.');
+                    srcFolder = path.join(srcFolder, fileOrDirnameParts[0]);
+                    outputFolder = path.join(outputFolder, fileOrDirnameParts[0]);
+ 
+                    if (fs.existsSync(srcFolder)) {
+                        if (fs.existsSync(outputFolder) == false) {
+                            fs.mkdirSync(outputFolder);
+                        }
+                    }
+                    break;
+                }
+            }
+            if (fs.existsSync(srcFolder)) {
+                FileUtils.copyRecursiveSync(srcFolder, outputFolder);
+            }
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html new file mode 100644 index 000000000..b4b92d17a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html @@ -0,0 +1,727 @@ + + + + + + Code coverage report for src/core/metadata/MetadataInfo.ts + + + + + + + + + +
+
+

All files / src/core/metadata MetadataInfo.ts

+
+ +
+ 61.4% + Statements + 35/57 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 61.4% + Lines + 35/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215  +1x +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +1x +1x +149x +  +  +1x +1x +  +1x +1x +  +  +149x +  +4x +  +  +  +4x +  +  +  +  +9x +25x +  +9x +9x +9x +9x +9x +9x +9x +9x +9x +  +  +  +149x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x + 
//TODO: Replace with SDR
+import * as _ from 'lodash';
+import * as path from 'path';
+import * as fs from 'fs-extra';
+ 
+export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/;
+const SPLITED_TYPES = {
+    CustomField: {
+        suffix: 'field',
+        folder: 'fields',
+    },
+    BusinessProcess: {
+        suffix: 'businessProcess',
+        folder: 'businessProcesses',
+    },
+    CompactLayout: {
+        suffix: 'compactLayout',
+        folder: 'compactLayouts',
+    },
+    FieldSet: {
+        suffix: 'fieldSet',
+        folder: 'fieldSets',
+    },
+    RecordType: {
+        suffix: 'recordType',
+        folder: 'recordTypes',
+    },
+    ListView: {
+        suffix: 'listView',
+        folder: 'listViews',
+    },
+    SharingReason: {
+        suffix: 'sharingReason',
+        folder: 'sharingReasons',
+    },
+    ValidationRule: {
+        suffix: 'validationRule',
+        folder: 'validationRules',
+    },
+    WebLink: {
+        suffix: 'webLink',
+        folder: 'webLinks',
+    },
+};
+ 
+export interface MetadataDescribe {
+    directoryName?: string;
+    inFolder?: boolean;
+    metaFile?: boolean;
+    suffix?: string;
+    xmlName?: string;
+    sourceExtension?: string;
+    childXmlNames?: string[];
+    folderExtension?: string;
+    files?: string[];
+    components?: string[];
+    isChildComponent?: boolean;
+}
+ 
+export interface MetadataInfo {
+    CustomApplication?: MetadataDescribe;
+    ApexClass?: MetadataDescribe;
+    ApexPage?: MetadataDescribe;
+    CustomField?: MetadataDescribe;
+    CustomObject?: MetadataDescribe;
+    CustomPermission?: MetadataDescribe;
+    ExternalDataSource?: MetadataDescribe;
+    ExperienceBundle?: MetadataDescribe;
+    Flow?: MetadataDescribe;
+    RecordType?: MetadataDescribe;
+    ListView?: MetadataDescribe;
+    WebLink?: MetadataDescribe;
+    ValidationRule?: MetadataDescribe;
+    CompactLayout?: MetadataDescribe;
+    BujsinessProcess?: MetadataDescribe;
+    CustomTab?: MetadataDescribe;
+    Layout?: MetadataDescribe;
+    Profile?: MetadataDescribe;
+    Translations?: MetadataDescribe;
+    CustomLabel?: MetadataDescribe;
+    CustomLabels?: MetadataDescribe;
+    GlobalValueSet?: MetadataDescribe;
+    CustomMetadata?: MetadataDescribe;
+    Document?: MetadataDescribe;
+    Queue?: MetadataDescribe;
+    Group?: MetadataDescribe;
+    Role?: MetadataDescribe;
+    Report?: MetadataDescribe;
+    Dashboard?: MetadataDescribe;
+    EmailTemplate?: MetadataDescribe;
+    CustomSite?: MetadataDescribe;
+    PermissionSet?: MetadataDescribe;
+    StaticResource?: MetadataDescribe;
+    CustomObjectTranslation?: MetadataDescribe;
+    AuraDefinitionBundle?: MetadataDescribe;
+    Workflow?: MetadataDescribe;
+    SharingRules?: MetadataDescribe;
+    LightningComponentBundle?: MetadataDescribe;
+}
+ 
+export class MetadataInfo {
+    static loadMetadataInfo(): MetadataInfo {
+        let metadataInfo: MetadataInfo = {};
+        let resourcePath = path.join(__dirname, '..', '..', '..', 'resources', 'metadatainfo.json');
+        const fileData = fs.readFileSync(resourcePath, 'utf8');
+        let metadataInfoJSON = JSON.parse(fileData);
+        metadataInfoJSON.metadataObjects.forEach((metadata) => {
+            let metadataDescribe = metadata as MetadataDescribe;
+            if (_.isNil(metadata.suffix)) {
+                if (metadata.xmlName === 'AuraDefinitionBundle') {
+                    metadata.suffix = 'cmp';
+                    metadataDescribe.suffix = 'cmp';
+                } else if (metadata.xmlName == 'LightningComponentBundle') {
+                    metadata.suffix = 'js';
+                    metadataDescribe.suffix = 'js';
+                }
+            }
+            metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`;
+            if (metadata.inFolder) {
+                let folderExtensionPrefix = metadata.suffix;
+                if (_.isNil(metadata.suffix)) {
+                    folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1);
+                }
+                metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`;
+            }
+ 
+            //Generate Describe of cheildItems if exists
+            if (!_.isNil(metadata.childXmlNames)) {
+                metadata.childXmlNames.forEach((element) => {
+                    let splitedElement = SPLITED_TYPES[element];
+                    if (!_.isNil(splitedElement)) {
+                        let childDescribe: MetadataDescribe = {};
+                        childDescribe.directoryName = SPLITED_TYPES[element].folder;
+                        childDescribe.suffix = SPLITED_TYPES[element].suffix;
+                        childDescribe.xmlName = element;
+                        childDescribe.inFolder = false;
+                        childDescribe.metaFile = false;
+                        childDescribe.isChildComponent = true;
+                        childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`;
+                        metadataInfo[childDescribe.xmlName] = childDescribe;
+                    }
+                });
+            }
+            metadataInfo[metadataDescribe.xmlName] = metadataDescribe;
+        });
+        return metadataInfo;
+    }
+ 
+    static getMetadataName(metadataFile: string, validateSourceExtension = true): string {
+        let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX);
+        let extension = '';
+        if (matcher) {
+            extension = matcher[0];
+        } else {
+            extension = path.parse(metadataFile).ext;
+        }
+        //SfPowerKit.ux.log(extension);
+        let metadataName = '';
+ 
+        const auraRegExp = new RegExp('aura');
+        const lwcRegExp = new RegExp('lwc');
+        const staticResourceRegExp = new RegExp('staticresources');
+        const experienceBundleRegExp = new RegExp('experiences');
+        const documentRegExp = new RegExp('documents');
+        if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) {
+            metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName;
+        } else if (
+            lwcRegExp.test(metadataFile) &&
+            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
+        ) {
+            metadataName = METADATA_INFO.LightningComponentBundle.xmlName;
+        } else if (
+            staticResourceRegExp.test(metadataFile) &&
+            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
+        ) {
+            metadataName = METADATA_INFO.StaticResource.xmlName;
+        } else if (
+            experienceBundleRegExp.test(metadataFile) &&
+            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
+        ) {
+            metadataName = METADATA_INFO.ExperienceBundle.xmlName;
+        } else if (
+            documentRegExp.test(metadataFile) &&
+            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
+        ) {
+            metadataName = METADATA_INFO.Document.xmlName;
+        } else {
+            let keys = Object.keys(METADATA_INFO);
+            for (let i = 0; i < keys.length; i++) {
+                let metaDescribe = METADATA_INFO[keys[i]];
+                if (
+                    metaDescribe.sourceExtension === extension ||
+                    ('.' + metaDescribe.suffix === extension && !validateSourceExtension) ||
+                    metaDescribe.folderExtension === extension
+                ) {
+                    metadataName = metaDescribe.xmlName;
+                    break;
+                }
+            }
+        }
+        return metadataName;
+    }
+}
+ 
+export const METADATA_INFO = MetadataInfo.loadMetadataInfo();
+export const UNSPLITED_METADATA = [
+    METADATA_INFO.Workflow,
+    METADATA_INFO.SharingRules,
+    METADATA_INFO.CustomLabels,
+    METADATA_INFO.Profile,
+    METADATA_INFO.PermissionSet,
+];
+ 
+export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet];
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html new file mode 100644 index 000000000..8e45990c9 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/core/metadata/SettingsFetcher.ts + + + + + + + + + +
+
+

All files / src/core/metadata SettingsFetcher.ts

+
+ +
+ 50% + Statements + 6/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 50% + Lines + 6/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +  +1x +1x +1x +  +1x +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import SFPOrg from '../org/SFPOrg';
+const fs = require('fs-extra');
+import { XMLParser } from 'fast-xml-parser';
+import MetadataFetcher from './MetadataFetcher';
+ 
+export default class SettingsFetcher extends MetadataFetcher {
+    constructor(logger: Logger) {
+        super(logger);
+    }
+ 
+    public async getSetttingMetadata(org: SFPOrg, setting: string) {
+        SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger);
+        let retriveLocation = (await this.fetchPackageFromOrg(org, {
+            types: { name: 'Settings', members: setting },
+        })).unzippedLocation;
+        let resultFile = `${retriveLocation}/settings/${setting}.settings`;
+        const parser = new XMLParser();
+        let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`];
+        return parsedSettings;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html new file mode 100644 index 000000000..f33f44008 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/metadata + + + + + + + + + +
+
+

All files src/core/metadata

+
+ +
+ 21.66% + Statements + 52/240 +
+ + +
+ 0% + Branches + 0/45 +
+ + +
+ 21.05% + Functions + 4/19 +
+ + +
+ 21.75% + Lines + 52/239 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MetadataFiles.ts +
+
6.43%11/1710%0/250%0/136.47%11/170
MetadataInfo.ts +
+
61.4%35/570%0/2075%3/461.4%35/57
SettingsFetcher.ts +
+
50%6/12100%0/050%1/250%6/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html new file mode 100644 index 000000000..3554dd9a5 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for src/core/org/SFPOrg.ts + + + + + + + + + +
+
+

All files / src/core/org SFPOrg.ts

+
+ +
+ 34.61% + Statements + 27/78 +
+ + +
+ 41.17% + Branches + 7/17 +
+ + +
+ 31.25% + Functions + 5/16 +
+ + +
+ 37.5% + Lines + 27/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +2724x +4x +  +  +4x +4x +4x +4x +  +4x +  +  +  +  +6x +  +6x +  +  +  +  +5x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +  +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +3x +  +3x +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +2x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Org } from '@salesforce/core';
+import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import Package2Detail from '../package/Package2Detail';
+import SfpPackage from '../package/SfpPackage';
+import QueryHelper from '../queryHelper/QueryHelper';
+import { convertUsernameToAlias } from '../utils/AliasList';
+import ObjectCRUDHelper from '../utils/ObjectCRUDHelper';
+import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor';
+ 
+export default class SFPOrg extends Org {
+    /**
+     * Get list of all artifacts in an org
+     */
+    public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) {
+        let records=[]
+        try {
+             records = await QueryHelper.query<sfpArtifact2__c>(
+                `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`,
+                this.getConnection(),
+                false
+            );
+            return records;
+        } catch (error) {
+            SFPLogger.log(
+                'Unable to fetch any sfp artifacts in the org\n' +
+                    '1. sfp package is not installed in the org\n' +
+                    '2. The required prerequisite object is not deployed to this org\n',
+                LoggerLevel.WARN,
+                logger
+            );
+        }
+        return records;
+    }
+    /**
+     * Check whether an artifact is installed in a Org
+     * @param  {Logger} logger
+     * @param  {SfpPackage} sfpPackage
+     */
+    public async isArtifactInstalledInOrg(
+        logger: Logger,
+        sfpPackage: SfpPackage
+    ): Promise<{ isInstalled: boolean; versionNumber?: string }> {
+        let result: { isInstalled: boolean; versionNumber?: string } = {
+            isInstalled: false,
+        };
+        try {
+            SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger);
+            result.isInstalled = false;
+            let installedArtifacts = await this.getInstalledArtifacts();
+            let packageName = sfpPackage.packageName;
+            for (const artifact of installedArtifacts) {
+                if (artifact.Name === packageName) {
+                    result.versionNumber = artifact.Version__c;
+                    if (artifact.Version__c === sfpPackage.package_version_number) {
+                        result.isInstalled = true;
+                        return result;
+                    }
+                }
+            }
+        } catch (error) {
+            SFPLogger.log(
+                'Unable to fetch any sfp artifacts in the org\n' +
+                    '1. sfp package is not installed in the org\n' +
+                    '2. The required prerequisite object is not deployed to this org\n',
+                LoggerLevel.WARN,
+                logger
+            );
+        }
+        return result;
+    }
+    /**
+     * Updates or Create information about an artifact in the org
+     * @param  {Logger} logger
+     * @param  {SfpPackage} sfpPackage
+     */
+    public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise<string> {
+        let artifactId = await this.getArtifactRecordId(sfpPackage);
+ 
+        SFPLogger.log(
+            COLOR_KEY_MESSAGE(
+                `Existing artifact record id for ${sfpPackage.packageName} in Org for ${
+                    sfpPackage.package_version_number
+                }: ${artifactId ? artifactId : 'N/A'}`
+            ),
+            LoggerLevel.INFO,
+            logger
+        );
+ 
+        let packageName = sfpPackage.package_name;
+ 
+        if (artifactId == null) {
+            artifactId = await ObjectCRUDHelper.createRecord(
+                this.getConnection(),
+                'sfpArtifact2__c',
+                {
+                    Name: packageName,
+                    Tag__c: sfpPackage.tag,
+                    Version__c: sfpPackage.package_version_number,
+                    CommitId__c: sfpPackage.sourceVersion,
+                }
+            );
+        } else {
+            artifactId = await ObjectCRUDHelper.updateRecord(
+                this.getConnection(),
+                'sfpArtifact2__c',
+                {
+                    Id: artifactId,
+                    Name: packageName,
+                    Tag__c: sfpPackage.tag,
+                    Version__c: sfpPackage.package_version_number,
+                    CommitId__c: sfpPackage.sourceVersion,
+                }
+            );
+        }
+ 
+        SFPLogger.log(
+            COLOR_KEY_MESSAGE(
+                `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${
+                    artifactId ? artifactId : ''
+                }`
+            ),
+            LoggerLevel.INFO,
+            logger
+        );
+        return artifactId;
+    }
+ 
+    private async getArtifactRecordId(sfpPackage: SfpPackage): Promise<string> {
+        let installedArtifacts = await this.getInstalledArtifacts();
+ 
+        let packageName = sfpPackage.packageName;
+        for (const artifact of installedArtifacts) {
+            if (artifact.Name === packageName) {
+                return artifact.Id;
+            }
+        }
+        return null;
+    }
+    /**
+     * Retrieves all packages(recognized by Salesforce) installed in the org
+     */
+    public async getAllInstalled2GPPackages(): Promise<Package2Detail[]> {
+        const installedPackages: Package2Detail[] = [];
+ 
+        let records = await InstalledPackagesQueryExecutor.exec(this.getConnection());
+ 
+        records.forEach((record) => {
+            let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`;
+ 
+            let packageDetails: Package2Detail = {
+                name: record.SubscriberPackage.Name,
+                package2Id: record.SubscriberPackageId,
+                namespacePrefix: record.SubscriberPackage.NamespacePrefix,
+                subscriberPackageVersionId: record.SubscriberPackageVersion.Id,
+                versionNumber: packageVersionNumber,
+                type: record.SubscriberPackageVersion.Package2ContainerOptions,
+                isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent,
+            };
+ 
+            installedPackages.push(packageDetails);
+        });
+ 
+        return installedPackages;
+    }
+ 
+    /**
+     * Retrives all managed packages in the org
+     */
+    public async getAllInstalledManagedPackages(): Promise<Package2Detail[]> {
+        const installedPackages = await this.getAllInstalled2GPPackages();
+        return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed');
+    }
+    /**
+     *  List all the packages created in DevHub, will throw an error, if its not a DevHub
+     */
+    public async listAllPackages() {
+        if (await this.determineIfDevHubOrg(true)) {
+            let records = await QueryHelper.query<PackageTypeInfo>(packageQuery, this.getConnection(), true);
+            records.forEach((record) => {
+                record.IsOrgDependent =
+                    record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No';
+            });
+ 
+            return records;
+        } else Ethrow new Error('Package Type Information can only be fetched from a DevHub');
+    }
+ 
+    public async getAlias(): Promise<string> {
+        return await convertUsernameToAlias(this.getUsername());
+    }
+ 
+    /**
+     *  Return all artifacts including sfp as well as external unlocked/managed
+     */
+    public async getAllInstalledArtifacts():Promise<InstalledArtifact[]> {
+        let artifacts = await this.getInstalledArtifacts(`Name`);
+        let installedArtifacts: InstalledArtifact[]=[];
+        let installed2GPPackages = await this.getAllInstalled2GPPackages();
+ 
+        artifacts.forEach((artifact) => {
+            let installedArtifact: InstalledArtifact = {
+                name: artifact.Name,
+                version: artifact.Version__c,
+                commitId:artifact.CommitId__c,
+                isInstalledBysfp: true,
+            };
+            let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name);
+            if (packageFound) {
+                installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId;
+                if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`;
+                else installedArtifact.type = `Unlocked`;
+            } else {
+                installedArtifact.subscriberVersion = `N/A`;
+                installedArtifact.type = `Source/Data`;
+            }
+            installedArtifacts.push(installedArtifact);
+        });
+ 
+        installed2GPPackages.forEach((installed2GPPackage) => {
+            let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name);
+            if (!packageFound) {
+                let installedArtifact: InstalledArtifact = {
+                    name: installed2GPPackage.name,
+                    version: installed2GPPackage.versionNumber,
+                    commitId: `N/A`,
+                };
+                if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`;
+                else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`;
+                else installedArtifact.type = `Unlocked`;
+ 
+                installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId;
+                installedArtifact.isInstalledBysfp = false;
+                installedArtifacts.push(installedArtifact);
+            }
+        });
+        return installedArtifacts;
+    }
+}
+ 
+const packageQuery =
+    'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' +
+    'FROM Package2 ' +
+    'WHERE IsDeprecated != true ' +
+    'ORDER BY NamespacePrefix, Name';
+ 
+ 
+export interface InstalledArtifact {
+    name: string;
+    version: string;
+    commitId?: string;
+    subscriberVersion?: string;
+    type?: string;
+    isInstalledBysfp?: boolean;
+}
+ 
+export interface sfpArtifact2__c {
+    Id?: string;
+    Name: string;
+    Tag__c: string;
+    Version__c: string;
+    CommitId__c: string;
+}
+ 
+export interface PackageTypeInfo {
+    Id: string;
+    Name: string;
+    Description: string;
+    NamespacePrefix: string;
+    ContainerOptions: string;
+    IsOrgDependent: boolean | string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html new file mode 100644 index 000000000..28e9e7a85 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/org + + + + + + + + + +
+
+

All files src/core/org

+
+ +
+ 34.61% + Statements + 27/78 +
+ + +
+ 41.17% + Branches + 7/17 +
+ + +
+ 31.25% + Functions + 5/16 +
+ + +
+ 37.5% + Lines + 27/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
SFPOrg.ts +
+
34.61%27/7841.17%7/1731.25%5/1637.5%27/72
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html new file mode 100644 index 000000000..a40d88bea --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts + + + + + + + + + +
+
+

All files / src/core/org/packageQuery InstalledPackagesQueryExecutor.ts

+
+ +
+ 50% + Statements + 2/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 50% + Lines + 2/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +4x +  +4x +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import QueryHelper from '../../queryHelper/QueryHelper';
+ 
+export default class InstalledPackagesQueryExecutor {
+    static async exec(conn: Connection) {
+        const installedPackagesQuery =
+            'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' +
+            'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' +
+            'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' +
+            'ORDER BY SubscriberPackageId';
+ 
+        return QueryHelper.query<any>(installedPackagesQuery, conn, true);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html new file mode 100644 index 000000000..bb8791528 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/org/packageQuery + + + + + + + + + +
+
+

All files src/core/org/packageQuery

+
+ +
+ 50% + Statements + 2/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 50% + Lines + 2/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
InstalledPackagesQueryExecutor.ts +
+
50%2/4100%0/00%0/150%2/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html new file mode 100644 index 000000000..fc657e941 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html @@ -0,0 +1,514 @@ + + + + + + Code coverage report for src/core/package/SfpPackage.ts + + + + + + + + + +
+
+

All files / src/core/package SfpPackage.ts

+
+ +
+ 47.82% + Statements + 11/23 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 50% + Functions + 4/8 +
+ + +
+ 47.82% + Lines + 11/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +14413x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +7x +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +13x +13x +13x +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import _ from 'lodash';
+import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher';
+ 
+export type ApexClasses = Array<string>;
+ 
+class PackageInfo {
+    id?: string;
+    package_name: string;
+    package_version_number?: string;
+    package_version_id?: string;
+    package_type?: string;
+    test_coverage?: number;
+    has_passed_coverage_check?: boolean;
+    repository_url?: string;
+    sourceVersion?: string;
+    branch?: string;
+    apextestsuite?: string;
+    isApexFound?: boolean;
+    assignPermSetsPreDeployment?: string[];
+    assignPermSetsPostDeployment?: string[];
+    apexTestClassses?: string[];
+    isPickListsFound?: boolean;
+    isTriggerAllTests?: boolean;
+    isProfilesFound?: boolean;
+    isPermissionSetGroupFound?: boolean;
+    isPromoted?: boolean;
+    tag?: string;
+    isDependencyValidated?: boolean;
+    destructiveChanges?: any;
+    destructiveChangesPath?: string;
+    payload?: any;
+    metadataCount?: number;
+    sourceDir?: string;
+    dependencies?: any;
+    reconcileProfiles?: boolean;
+    isPayLoadContainTypesSupportedByProfiles?: boolean;
+    creation_details?: { creation_time?: number; timestamp?: number };
+    deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[];
+    apiVersion?: string;
+    postDeploymentScript?: string;
+    preDeploymentScript?: string;
+    apexClassWithOutTestClasses?: ApexClasses;
+    triggers?: ApexClasses;
+    configFilePath?: string;
+    packageDescriptor?: any;
+    commitSHAFrom?:string;
+    commitSHATo?:string;
+    packageDirectory?: string;
+    apexClassesSortedByTypes?: ApexSortedByType;
+    projectConfig?: any;
+    changelogFilePath?: string;
+}
+ 
+export default class SfpPackage extends PackageInfo {
+    public projectDirectory: string;
+    public workingDirectory: string;
+    public mdapiDir: string;
+    public destructiveChangesPath: string;
+    public resolvedPackageDirectory: string;
+ 
+    public version: string = '5';
+ 
+    //Just a few helpers to resolve api differene
+    public get packageName(): string {
+        return this.package_name;
+    }
+ 
+    public get versionNumber(): string {
+        return this.package_version_number;
+    }
+ 
+    public set versionNumber(versionNumber:string)
+    {
+        this.package_version_number = versionNumber;
+    }
+ 
+    public get packageType(): string {
+        return this.package_type.toLocaleLowerCase();
+    }
+ 
+    public set packageType(packageType: string) {
+        this.package_type = packageType;
+    }
+    /**
+     * Do not use this constructor directly, use SfPPackageBuilder
+     * to build a package
+     *
+     */
+    public constructor() {
+        super();
+    }
+ 
+    toJSON(): PackageInfo {
+        let castToPackageMetadata = _.cloneDeep(this);
+        delete castToPackageMetadata.workingDirectory;
+        delete castToPackageMetadata.mdapiDir;
+        delete castToPackageMetadata.projectConfig;
+        delete castToPackageMetadata.packageDescriptor;
+        delete castToPackageMetadata.projectDirectory;
+        delete castToPackageMetadata.resolvedPackageDirectory;
+        delete castToPackageMetadata.isTriggerAllTests;
+        return castToPackageMetadata;
+    }
+}
+ 
+ 
+export enum PackageType {
+    Unlocked = "unlocked",
+    Source = "source",
+    Data = "data",
+    Diff = "diff"
+}
+ 
+export interface DiffPackageMetadata {
+ 
+ 
+    sourceVersionFrom?: string;
+    sourceVersionTo?: string;
+    isProfilesFound?: boolean;
+    apexTestClassses?: string[];
+    isApexFound?: boolean;
+    isPicklistFound?: boolean;
+    isPermissionSetGroupFound?: boolean;
+    isPermissionSetFound?: boolean;
+    payload?: any;
+    metadataCount?: number;
+    profilesToReconcile?: number;
+    destructiveChanges?: any;
+    sourceDir?: string;
+    invalidatedTestClasses?: ApexClasses;
+    isPayLoadContainTypesSupportedByProfiles?:boolean;
+}
+export interface SfpPackageParams {
+    overridePackageTypeWith?: string;
+    branch?: string;
+    packageVersionNumber?: string;
+    repositoryUrl?: string;
+    sourceVersion?: string;
+    configFilePath?: string;
+    pathToReplacementForceIgnore?: string;
+    revisionFrom?: string;
+    revisionTo?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html new file mode 100644 index 000000000..d95dcd7c0 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html @@ -0,0 +1,919 @@ + + + + + + Code coverage report for src/core/package/SfpPackageBuilder.ts + + + + + + + + + +
+
+

All files / src/core/package SfpPackageBuilder.ts

+
+ +
+ 22.42% + Statements + 24/107 +
+ + +
+ 0% + Branches + 0/19 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 23.52% + Lines + 24/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +2791x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher';
+import ProjectConfig from '../project/ProjectConfig';
+import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator';
+import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor';
+import PackageManifest from './components/PackageManifest';
+import MetadataCount from './components/MetadataCount';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import * as fs from 'fs-extra';
+import path from 'path';
+import { Artifact } from '../artifacts/ArtifactFetcher';
+import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage';
+import PropertyFetcher from './propertyFetchers/PropertyFetcher';
+import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher';
+import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher';
+import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher';
+import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl';
+import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl';
+import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl';
+import lodash = require('lodash');
+import { EOL } from 'os';
+import PackageVersionUpdater from './version/PackageVersionUpdater';
+import { AnalyzerRegistry } from './analyser/AnalyzerRegistry';
+import { ComponentSet } from '@salesforce/source-deploy-retrieve';
+import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl';
+import { COLOR_WARNING } from '@flxblio/sfp-logger';
+ 
+export default class SfpPackageBuilder {
+    public static async buildPackageFromProjectDirectory(
+        logger: Logger,
+        projectDirectory: string,
+        sfdx_package: string,
+        params?: SfpPackageParams,
+        packageCreationParams?: PackageCreationParams,
+        projectConfig?: any
+    ) {
+        if (!projectConfig) {
+            projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
+        } else {
+            // Clone the projectConfig to prevent mutation
+            projectConfig = lodash.cloneDeep(projectConfig);
+        }
+ 
+        let propertyFetchers: PropertyFetcher[] = [
+            new AssignPermissionSetFetcher(),
+            new DestructiveManifestPathFetcher(),
+            new ReconcilePropertyFetcher(),
+        ];
+ 
+        let startTime = Date.now;
+        let sfpPackage: SfpPackage = new SfpPackage();
+        sfpPackage.package_name = sfdx_package;
+        sfpPackage.projectConfig = projectConfig;
+        sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion;
+        sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(
+            sfdx_package,
+            sfpPackage.projectConfig
+        );
+        sfpPackage.projectDirectory = projectDirectory?projectDirectory:'';
+        sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path;
+        //Set Default Version Number
+        sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber;
+ 
+        //set additional options
+        sfpPackage.sourceVersion = params?.sourceVersion;
+        sfpPackage.branch = params?.branch;
+        sfpPackage.repository_url = params?.repositoryUrl;
+        if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json';
+        else sfpPackage.configFilePath = params?.configFilePath;
+ 
+        for (const propertyFetcher of propertyFetchers) {
+            await propertyFetcher.getsfpProperties(sfpPackage, logger);
+        }
+ 
+        //Get Package Type
+        sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package);
+ 
+        sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams);
+ 
+        // Requires destructiveChangesPath which is set by the property fetcher
+        sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory(
+            logger,
+            sfpPackage.projectDirectory,
+            sfpPackage.projectConfig,
+            sfpPackage.packageName,
+            sfpPackage.packageDescriptor.path,
+            sfpPackage.versionNumber,
+            sfpPackage.destructiveChangesPath,
+            sfpPackage.configFilePath,
+            params?.pathToReplacementForceIgnore
+        );
+ 
+        sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path);
+ 
+        //Don't proceed further if packageType is Data
+        if (sfpPackage.package_type != PackageType.Data) {
+            let sourceToMdapiConvertor = new SourceToMDAPIConvertor(
+                sfpPackage.workingDirectory,
+                sfpPackage.packageDescriptor.path,
+                ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion,
+                logger
+            );
+            sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath;
+            const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir);
+ 
+            sfpPackage.payload = packageManifest.manifestJson;
+            sfpPackage.triggers = packageManifest.fetchTriggers();
+            sfpPackage.isApexFound = packageManifest.isApexInPackage();
+            sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage();
+            sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage();
+            sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles();
+ 
+            let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir);
+            sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType();
+            sfpPackage.apexTestClassses = apexFetcher.getTestClasses();
+            sfpPackage.metadataCount = await MetadataCount.getMetadataCount(
+                sfpPackage.workingDirectory,
+                sfpPackage.packageDescriptor.path
+            );
+            sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces();
+ 
+            sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger);
+ 
+            //Load component Set
+            let componentSet = ComponentSet.fromSource(
+                path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory)
+            );
+ 
+            //Run through all analyzers
+            let analyzers = AnalyzerRegistry.getAnalyzers();
+            for (const analyzer of analyzers) {
+                Iif (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger);
+            }
+        }
+ 
+        //Create the actual package
+        let createPackage;
+ 
+        Iif (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true };
+ 
+        let packageType = sfpPackage.package_type;
+        Iif (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase();
+ 
+        //Get Implementors
+        switch (packageType) {
+            case PackageType.Unlocked:
+                createPackage = new CreateUnlockedPackageImpl(
+                    sfpPackage.workingDirectory,
+                    sfpPackage,
+                    packageCreationParams,
+                    logger,
+                    params
+                );
+                break;
+            case PackageType.Source:
+                createPackage = new CreateSourcePackageImpl(
+                    sfpPackage.workingDirectory,
+                    sfpPackage,
+                    packageCreationParams,
+                    logger,
+                    params
+                );
+                break;
+            case PackageType.Data:
+                createPackage = new CreateDataPackageImpl(
+                    sfpPackage.workingDirectory,
+                    sfpPackage,
+                    packageCreationParams,
+                    logger,
+                    params
+                );
+                break;
+            case PackageType.Diff:
+                packageCreationParams.revisionFrom = params.revisionFrom;
+                packageCreationParams.revisionTo = params.revisionTo; 
+                createPackage = new CreateDiffPackageImp(
+                    sfpPackage.workingDirectory,
+                    sfpPackage,
+                    packageCreationParams,
+                    logger,
+                    params
+                );
+                break;
+        }
+ 
+        return createPackage.exec();
+    }
+ 
+    /*
+     *  Handle version Numbers of package
+     *  If VersionNumber is explcitly passed, use that
+     * else allow autosubstitute using buildNumber for Source and Data if available
+     */
+    private static handleVersionNumber(
+        params: SfpPackageParams,
+        sfpPackage: SfpPackage,
+        packageCreationParams: PackageCreationParams
+    ) {
+        if (params?.packageVersionNumber) {
+            sfpPackage.versionNumber = params.packageVersionNumber;
+        } else if (packageCreationParams?.buildNumber) {
+            if (sfpPackage.packageType != PackageType.Unlocked) {
+                let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater();
+                sfpPackage.versionNumber = versionUpdater.substituteBuildNumber(
+                    sfpPackage,
+                    packageCreationParams.buildNumber
+                );
+            }
+        } else {
+            sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber;
+        }
+        return sfpPackage;
+    }
+ 
+    public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise<SfpPackage> {
+        //Read artifact metadata
+        let sfpPackage = new SfpPackage();
+        Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' }));
+        sfpPackage.sourceDir = artifact.sourceDirectoryPath;
+        sfpPackage.changelogFilePath = artifact.changelogFilePath;
+ 
+        sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath);
+        sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(
+            artifact.sourceDirectoryPath,
+            sfpPackage.package_name
+        );
+        sfpPackage.projectDirectory = artifact.sourceDirectoryPath;
+        sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path;
+        sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger);
+ 
+        return sfpPackage;
+    }
+ 
+  
+ 
+    private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) {
+        if (
+            this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false ||
+            (sfpPackage.packageType == PackageType.Source &&
+                sfpPackage.isApexFound == true &&
+                sfpPackage.apexTestClassses == null)
+        ) {
+            SFPLogger.printHeaderLine('WARNING!  NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger);
+            SFPLogger.log(
+                    `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` +
+                    `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` +
+                    `via triggering all local tests,This definitely is not optimal approach on large orgs` +
+                    `Please consider adding test classes for the classes in the package`,
+                LoggerLevel.INFO,
+                logger
+            );
+            SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger);
+            return true;
+        } else return false;
+    }
+ 
+    // Allow individual packages to use non optimized path
+    private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean {
+        if (pkgDescriptor['isOptimizedDeployment'] == null) return true;
+        else return pkgDescriptor['isOptimizedDeployment'];
+    }
+}
+ 
+// Options while creating package
+export class PackageCreationParams {
+    breakBuildIfEmpty: boolean = true;
+    devHub?: string;
+    installationkeybypass?: boolean;
+    installationkey?: string;
+    waitTime?: string;
+    isCoverageEnabled?: boolean;
+    isSkipValidation?: boolean;
+    isComputeDiffPackage?: boolean;
+    baseBranch?: string;
+    buildNumber?: string;
+    useSelectiveBuildOnly?: boolean;
+    revisionFrom?:string;
+    revisionTo?:string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html new file mode 100644 index 000000000..d7a4ed43d --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for src/core/package/analyser/AnalyzerRegistry.ts + + + + + + + + + +
+
+

All files / src/core/package/analyser AnalyzerRegistry.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 33.33% + Lines + 4/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import FHTAnalyser from './FHTAnalyzer';
+import FTAnalyser from './FTAnalyzer';
+import { PackageAnalyzer } from './PackageAnalyzer';
+import PicklistAnalyzer from './PicklistAnalyzer';
+ 
+export class AnalyzerRegistry {
+    static getAnalyzers(): PackageAnalyzer[] {
+        let packageAnalyzers: PackageAnalyzer[] = [];
+ 
+        //TODO: Make dynamic
+        let fhtAnalyzer = new FHTAnalyser();
+        let ftAnalyser = new FTAnalyser();
+        let picklistAnalyzer = new PicklistAnalyzer();
+        packageAnalyzers.push(fhtAnalyzer);
+        packageAnalyzers.push(ftAnalyser);
+        packageAnalyzers.push(picklistAnalyzer);
+ 
+        return packageAnalyzers;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html new file mode 100644 index 000000000..81ab4b224 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/core/package/analyser/FHTAnalyzer.ts + + + + + + + + + +
+
+

All files / src/core/package/analyser FHTAnalyzer.ts

+
+ +
+ 88.88% + Statements + 24/27 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 88% + Lines + 22/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +772x +2x +2x +2x +2x +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +4x +  +  +4x +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +4x +  +  +4x +4x +  +  +  +  +  +4x +  +  +  +  +  +  +4x +  +  +  +  +  +  +3x +  +2x +2x +2x +  +  +4x +  +  +  +3x +1x +  +  + 
import path from 'path';
+import * as fs from 'fs-extra';
+import * as yaml from 'js-yaml';
+import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
+import SfpPackage, { PackageType } from '../SfpPackage';
+import { PackageAnalyzer } from './PackageAnalyzer';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+ 
+export default class FHTAnalyser implements PackageAnalyzer {
+   
+   public getName() {
+       return "Field History Tracking Analyzer"
+    }
+ 
+    
+ 
+    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
+        try {
+ 
+            let fhtFields: { [key: string]: Array<string> } = {};
+ 
+            //read the yaml
+            let fhtYamlPath = path.join(
+                sfpPackage.workingDirectory,
+                sfpPackage.projectDirectory,
+                sfpPackage.packageDirectory,
+                '/postDeploy/history-tracking.yml'
+            );
+ 
+            //read components mentioned in yaml
+            if (fs.existsSync(fhtYamlPath)) {
+                //convert yaml to json
+                fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]};
+            }
+ 
+ 
+            //filter the components in the package
+            fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet);
+ 
+            if (Object.keys(fhtFields).length>0) {
+                sfpPackage['isFHTFieldFound'] = true;
+                sfpPackage['fhtFields'] = fhtFields;
+            }
+        } catch (error) {
+            //Ignore error for now
+            SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger);
+        }
+        return sfpPackage;
+    }
+ 
+    private async addFieldsFromComponentSet(
+        fhtFields: { [key: string]: Array<string> },
+        componentSet: ComponentSet
+    ): Promise<Record<string, Array<string>>> {
+        let sourceComponents = componentSet.getSourceComponents().toArray();
+ 
+        for (const sourceComponent of sourceComponents) {
+            if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) {
+                continue;
+            }
+ 
+            let customField = sourceComponent.parseXmlSync().CustomField;
+            if (customField['trackHistory'] == 'true') {
+                let objName = sourceComponent.parent.fullName;
+                if (!fhtFields[objName]) fhtFields[objName] = [];
+                fhtFields[objName].push(sourceComponent.name);
+            }
+        }
+        return fhtFields;
+    }
+ 
+    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
+        if (sfpPackage.packageType != PackageType.Data) return true;
+        else return false;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html new file mode 100644 index 000000000..3e5afcd7b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html @@ -0,0 +1,307 @@ + + + + + + Code coverage report for src/core/package/analyser/FTAnalyzer.ts + + + + + + + + + +
+
+

All files / src/core/package/analyser FTAnalyzer.ts

+
+ +
+ 88.88% + Statements + 24/27 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 88% + Lines + 22/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +752x +2x +2x +2x +2x +  +2x +  +2x +  +  +  +  +  +  +  +  +4x +  +  +4x +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +4x +  +  +4x +4x +  +  +  +  +  +4x +  +  +  +  +  +  +4x +  +  +  +  +  +  +3x +  +2x +2x +2x +  +  +4x +  +  +  +3x +1x +  +  + 
import path from 'path';
+import * as fs from 'fs-extra';
+import * as yaml from 'js-yaml';
+import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
+import SfpPackage, { PackageType } from '../SfpPackage';
+import { PackageAnalyzer } from './PackageAnalyzer';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+ 
+export default class FTAnalyser implements PackageAnalyzer {
+ 
+    public getName(): string {
+        return "Feed Tracking Analyzer";
+    };
+ 
+    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
+        try {
+ 
+            let ftFields: { [key: string]: Array<string> } = {};
+ 
+            //read the yaml
+            let ftYamlPath = path.join(
+                sfpPackage.workingDirectory,
+                sfpPackage.projectDirectory,
+                sfpPackage.packageDirectory,
+                '/postDeploy/feed-tracking.yml'
+            );
+ 
+            //read components mentioned in yaml
+            if (fs.existsSync(ftYamlPath)) {
+                //convert yaml to json
+                ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]};
+            }
+ 
+ 
+            //filter the components in the package
+            ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet);
+ 
+            if (Object.keys(ftFields).length>0) {
+                sfpPackage['isFTFieldFound'] = true;
+                sfpPackage['ftFields'] = ftFields;
+            }
+        } catch (error) {
+            //Ignore error for now
+            SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger);
+        }
+        return sfpPackage;
+    }
+ 
+    private async addFieldsFromComponentSet(
+        ftFields: { [key: string]: Array<string> },
+        componentSet: ComponentSet
+    ): Promise<Record<string, Array<string>>> {
+        let sourceComponents = componentSet.getSourceComponents().toArray();
+ 
+        for (const sourceComponent of sourceComponents) {
+            if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) {
+                continue;
+            }
+ 
+            let customField = sourceComponent.parseXmlSync().CustomField;
+            if (customField['trackFeedHistory'] == 'true') {
+                let objName = sourceComponent.parent.fullName;
+                if (!ftFields[objName]) ftFields[objName] = [];
+                ftFields[objName].push(sourceComponent.name);
+            }
+        }
+        return ftFields;
+    }
+ 
+    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
+        if (sfpPackage.packageType != PackageType.Data) return true;
+        else return false;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html new file mode 100644 index 000000000..9cc8a8baf --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html @@ -0,0 +1,241 @@ + + + + + + Code coverage report for src/core/package/analyser/PicklistAnalyzer.ts + + + + + + + + + +
+
+

All files / src/core/package/analyser PicklistAnalyzer.ts

+
+ +
+ 23.52% + Statements + 4/17 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 25% + Lines + 4/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +531x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
+import SfpPackage, { PackageType } from '../SfpPackage';
+import { PackageAnalyzer } from './PackageAnalyzer';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+ 
+export default class PicklistAnalyzer implements PackageAnalyzer {
+ 
+    public getName() {
+        return "Picklist Analyzer"
+     }
+ 
+     
+     
+    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
+        try {
+            let sourceComponents = componentSet.getSourceComponents().toArray();
+            let components = [];
+ 
+            for (const sourceComponent of sourceComponents) {
+                if (sourceComponent.type.name == registry.types.customobject.name) {
+                    //issues/1367
+                    //this can add child elements that are not custom fields..
+                    components.push(...sourceComponent.getChildren());
+                }
+ 
+                if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) {
+                    components.push(sourceComponent);
+                }
+            }
+ 
+            if (components) {
+                for (const fieldComponent of components) {
+                    let customField = fieldComponent.parseXmlSync().CustomField;
+                    //issues/1367
+                    //if the component isn't a field customField will be undefined..so check
+                    if (customField && customField['type'] == 'Picklist') {
+                        sfpPackage.isPickListsFound= true;
+                        break;
+                    }
+                }
+            }
+        } catch (error) {
+            SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger);
+        }
+        return sfpPackage;
+    }
+ 
+    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
+        if (sfpPackage.packageType != PackageType.Data) return true;
+        else return false;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html new file mode 100644 index 000000000..a5dc40752 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/core/package/analyser + + + + + + + + + +
+
+

All files src/core/package/analyser

+
+ +
+ 67.46% + Statements + 56/83 +
+ + +
+ 60% + Branches + 6/10 +
+ + +
+ 50% + Functions + 6/12 +
+ + +
+ 66.66% + Lines + 52/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AnalyzerRegistry.ts +
+
33.33%4/12100%0/00%0/133.33%4/12
FHTAnalyzer.ts +
+
88.88%24/27100%3/375%3/488%22/25
FTAnalyzer.ts +
+
88.88%24/27100%3/375%3/488%22/25
PicklistAnalyzer.ts +
+
23.52%4/170%0/40%0/325%4/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html new file mode 100644 index 000000000..32b806077 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for src/core/package/components/PackageManifest.ts + + + + + + + + + +
+
+

All files / src/core/package/components PackageManifest.ts

+
+ +
+ 82.08% + Statements + 55/67 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 93.33% + Functions + 14/15 +
+ + +
+ 81.81% + Lines + 54/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +2722x +2x +  +2x +2x +  +2x +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +6x +  +6x +  +6x +6x +  +6x +  +  +  +  +  +  +  +  +  +6x +  +6x +  +  +  +  +  +6x +150x +  +  +6x +  +  +42x +  +  +  +42x +  +  +  +6x +  +  +  +6x +  +  +  +6x +6x +  +6x +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +1x +  +1x +  +  +  +  +  +  +  +2x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +1x +1x +  +  +  +  +  +2x +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +2x +  +  +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +  + 
import path from 'path';
+import * as fs from 'fs-extra';
+import { ApexClasses } from '../SfpPackage';
+import xml2json from '../../utils/xml2json';
+const xml2js = require('xml2js');
+ 
+export default class PackageManifest {
+    private _manifestJson;
+    private _manifestXml: string;
+ 
+    /**
+     * Getter for package manifest JSON
+     */
+    get manifestJson() {
+        return this._manifestJson;
+    }
+ 
+    /**
+     * Getter for package manifest XML
+     */
+    get manifestXml(): string {
+        return this._manifestXml;
+    }
+ 
+    private constructor() {}
+ 
+    /**
+     * Factory method
+     * @param mdapiDir directory containing package.xml
+     * @returns instance of PackageManifest
+     */
+    static async create(mdapiDir: string): Promise<PackageManifest> {
+        const packageManifest = new PackageManifest();
+ 
+        const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8');
+ 
+        packageManifest._manifestXml = packageXml;
+        packageManifest._manifestJson = await xml2json(packageXml);
+ 
+        return packageManifest;
+    }
+ 
+    /**
+     * Factory method
+     * @param components
+     * @param apiVersion
+     * @returns intance of PackageManifest
+     */
+    static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest {
+        const packageManifest = new PackageManifest();
+ 
+        const packageJson = {
+            $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' },
+            types: [],
+            version: apiVersion,
+        };
+ 
+        components.forEach((component) => {
+            const type = packageJson.types.find((type) => type.name === component.type);
+            if (type) {
+                // Add member to existing type
+                type.members.push(component.fullName);
+            } else {
+                // create new type
+                const newType = {
+                    name: component.type,
+                    members: [component.fullName],
+                };
+                packageJson.types.push(newType);
+            }
+        });
+ 
+        const builder = new xml2js.Builder({
+            xmldec: { version: '1.0', encoding: 'UTF-8' },
+        });
+ 
+        let packageObj = {
+            Package: packageJson,
+        };
+ 
+        packageManifest._manifestXml = builder.buildObject(packageObj);
+        packageManifest._manifestJson = packageObj;
+ 
+        return packageManifest;
+    }
+ 
+    /**
+     * Factory method
+     * @param manifest package JSON
+     * @returns instance of PackageManifest
+     */
+    static async createWithJSONManifest(manifest: any): Promise<PackageManifest> {
+        const packageManifest = new PackageManifest();
+        packageManifest._manifestJson = manifest;
+ 
+        const builder = new xml2js.Builder({
+            xmldec: { version: '1.0', encoding: 'UTF-8' },
+        });
+ 
+        packageManifest._manifestXml = builder.buildObject(manifest);
+ 
+        return packageManifest;
+    }
+ 
+    /**
+     *
+     * @returns true or false, for whether there are profiles
+     */
+    public isProfilesInPackage(): boolean {
+        let isProfilesFound = false;
+ 
+        if (this._manifestJson.Package.types) {
+            if (Array.isArray(this._manifestJson.Package.types)) {
+                for (const type of this._manifestJson.Package.types) {
+                    if (type.name === 'Profile') {
+                        isProfilesFound = true;
+                        break;
+                    }
+                }
+            } else if (this.manifestJson.Package.types.name === 'Profile') {
+                isProfilesFound = true;
+            }
+        }
+ 
+        return isProfilesFound;
+    }
+ 
+    /**
+     *
+     * @returns true or false, for whether there are profiles
+     */
+     public isPermissionSetsInPackage(): boolean {
+        let isPermissionSetFound = false;
+ 
+        if (this._manifestJson.Package.types) {
+            if (Array.isArray(this._manifestJson.Package.types)) {
+                for (const type of this._manifestJson.Package.types) {
+                    if (type.name === 'PermissionSet') {
+                        isPermissionSetFound = true;
+                        break;
+                    }
+                }
+            } else if (this.manifestJson.Package.types.name === 'PermissionSet') {
+                isPermissionSetFound = true;
+            }
+        }
+ 
+        return isPermissionSetFound;
+    }
+ 
+    public isPermissionSetGroupsFoundInPackage(): boolean {
+        let isPermissionSetGroupFound = false;
+        if (Array.isArray(this._manifestJson?.Package?.types)) {
+            for (let type of this._manifestJson.Package.types) {
+                if (type.name === 'PermissionSetGroup') {
+                    isPermissionSetGroupFound = true;
+                    break;
+                }
+            }
+        } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') {
+            isPermissionSetGroupFound = true;
+        }
+        return isPermissionSetGroupFound;
+    }
+ 
+    /**
+     *
+     * @returns true or false, for whether there are Apex classes and/or triggers
+     */
+    public isApexInPackage(): boolean {
+        let isApexFound = false;
+ 
+        if (this._manifestJson.Package.types) {
+            if (Array.isArray(this._manifestJson.Package.types)) {
+                for (const type of this._manifestJson.Package.types) {
+                    if (type.name === 'ApexClass' || type.name === 'ApexTrigger') {
+                        isApexFound = true;
+                        break;
+                    }
+                }
+            } else if (
+                this._manifestJson.Package.types.name === 'ApexClass' ||
+                this._manifestJson.Package.types.name === 'ApexTrigger'
+            ) {
+                isApexFound = true;
+            }
+        }
+ 
+        return isApexFound;
+    }
+ 
+    /**
+     *
+     * @returns Apex triggers if there are any, otherwise returns undefined
+     */
+    public fetchTriggers(): ApexClasses {
+        let triggers: string[];
+ 
+        let types;
+        if (this._manifestJson.Package.types) {
+            if (this._manifestJson.Package.types instanceof Array) {
+                types = this._manifestJson.Package.types;
+            } else {
+                // Create array with single type
+                types = [this._manifestJson.Package.types];
+            }
+        }
+ 
+        if (types) {
+            for (const type of types) {
+                if (type.name === 'ApexTrigger') {
+                    if (type.members instanceof Array) {
+                        triggers = type.members;
+                    } else {
+                        // Create array with single member
+                        triggers = [type.members];
+                    }
+                    break;
+                }
+            }
+        }
+ 
+        return triggers;
+    }
+ 
+    public isPayloadContainTypesOtherThan(providedType: string): boolean {
+        let anyOtherType = false;
+        if (this._manifestJson.Package.types) {
+            if (Array.isArray(this._manifestJson.Package.types)) {
+                for (const type of this._manifestJson.Package.types) {
+                    if (type.name !== providedType) {
+                        anyOtherType = true;
+                        break;
+                    }
+                }
+            } else if (this._manifestJson.Package.types.name !== providedType) {
+                anyOtherType = true;
+            }
+        }
+        return anyOtherType;
+    }
+ 
+    public isPayLoadContainTypesSupportedByProfiles(): boolean {
+        const profileSupportedMetadataTypes = [
+            'ApexClass',
+            'CustomApplication',
+            'CustomObject',
+            'CustomField',
+            'Layout',
+            'ApexPage',
+            'CustomTab',
+            'RecordType',
+            'SystemPermissions',
+        ];
+ 
+        let containsProfileSupportedType = false;
+        if (this._manifestJson.Package.types) {
+            if (Array.isArray(this._manifestJson.Package.types)) {
+                for (const type of this._manifestJson.Package.types) {
+                    if (profileSupportedMetadataTypes.includes(type.name)) {
+                        containsProfileSupportedType = true;
+                        break;
+                    }
+                }
+            } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) {
+                containsProfileSupportedType = true;
+            }
+        }
+        return containsProfileSupportedType;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html new file mode 100644 index 000000000..a163fc21e --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/core/package/components/PackageToComponent.ts + + + + + + + + + +
+
+

All files / src/core/package/components PackageToComponent.ts

+
+ +
+ 20% + Statements + 2/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 22.22% + Lines + 2/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ComponentSet } from '@salesforce/source-deploy-retrieve';
+import Component from '../../dependency/Component';
+ 
+ 
+export default class PackageToComponent {
+    public constructor(private packageName:string,private packageDirectory:string) {}
+ 
+    public generateComponents() {
+        const components: Component[] = [];
+ 
+        let componentSet = ComponentSet.fromSource(this.packageDirectory);
+ 
+        let componentSetArray = componentSet.getSourceComponents().toArray();
+ 
+        for (const individualComponentFromComponentSet of componentSetArray) {
+            const component: Component = {
+                id: undefined,
+                fullName: individualComponentFromComponentSet.fullName,
+                type: individualComponentFromComponentSet.type.name,
+                files: [individualComponentFromComponentSet.xml],
+                package: this.packageName,
+            };
+            components.push(component);
+        }
+ 
+       return components;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html new file mode 100644 index 000000000..641259122 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/package/components + + + + + + + + + +
+
+

All files src/core/package/components

+
+ +
+ 74.02% + Statements + 57/77 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 82.35% + Functions + 14/17 +
+ + +
+ 74.66% + Lines + 56/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
PackageManifest.ts +
+
82.08%55/6750%2/493.33%14/1581.81%54/66
PackageToComponent.ts +
+
20%2/10100%0/00%0/222.22%2/9
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html new file mode 100644 index 000000000..d9cf86e4c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html @@ -0,0 +1,904 @@ + + + + + + Code coverage report for src/core/package/coverage/PackageTestCoverage.ts + + + + + + + + + +
+
+

All files / src/core/package/coverage PackageTestCoverage.ts

+
+ +
+ 93.67% + Statements + 74/79 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 93.58% + Lines + 73/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +2741x +1x +1x +  +1x +1x +1x +  +1x +  +7x +  +  +7x +7x +7x +7x +  +7x +  +  +  +7x +7x +  +7x +  +  +  +  +  +7x +7x +  +  +19x +19x +  +  +  +7x +  +7x +  +1x +  +1x +1x +  +  +7x +  +1x +  +1x +1x +  +  +  +1x +  +  +  +  +1x +1x +2x +  +1x +  +  +  +7x +7x +7x +  +  +  +  +  +  +  +  +  +  +  +5x +  +5x +  +5x +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +3x +  +3x +  +  +  +  +  +2x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +8x +8x +  +8x +  +  +  +  +  +  +  +20x +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +2x +2x +  +2x +  +  +  +8x +  +  +  +  +  +2x +2x +  +2x +  +  +8x +  +  +  +  +  +  +  +  +  +  +15x +15x +  +  +  +12x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +15x +15x +  +  +  +27x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +15x +  +  +63x +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +15x +  +  + 
import SFPLogger, { COLOR_WARNING, Logger } from '@flxblio/sfp-logger';
+import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage';
+import SfpPackage, { PackageType } from '../SfpPackage';
+import { Connection } from '@salesforce/core';
+import ApexClassFetcher from '../../apex/ApexClassFetcher';
+import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher';
+import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher';
+ 
+export default class PackageTestCoverage {
+    private individualClassCoverage: IndividualClassCoverage;
+    private packageTestCoverage: number = -1; // Set inital value
+ 
+    public constructor(
+        private pkg: SfpPackage,
+        private codeCoverage: any,
+        private logger: Logger,
+        private readonly conn: Connection
+    ) {
+        this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger);
+    }
+ 
+    public async getCurrentPackageTestCoverage(): Promise<number> {
+        let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses;
+        let triggers: string[] = this.pkg.triggers;
+ 
+        let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers(
+            this.codeCoverage,
+            packageClasses,
+            triggers
+        );
+ 
+        let totalLines: number = 0;
+        let totalCovered: number = 0;
+        for (let classCoverage of filteredCodeCoverage) {
+            if (classCoverage.coveredPercent !== null) {
+                totalLines += classCoverage.totalLines;
+                totalCovered += classCoverage.totalCovered;
+            }
+        }
+ 
+        let listOfApexClassOrTriggerId: string[] = [];
+ 
+        let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage);
+        if (classesNotTouchedByTestClass.length > 0) {
+            let apexClassIds = (
+                await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass)
+            ).map((apexClass) => apexClass.Id);
+            listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds);
+        }
+ 
+        let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage);
+        if (triggersNotTouchedByTestClass.length > 0) {
+            let triggerIds = (
+                await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass)
+            ).map((trigger) => trigger.Id);
+            listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds);
+        }
+ 
+        if (listOfApexClassOrTriggerId.length > 0) {
+            let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher(
+                this.conn
+            ).fetchACCAById(listOfApexClassOrTriggerId);
+ 
+            if (recordsOfApexCodeCoverageAggregate.length > 0) {
+                let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes
+                recordsOfApexCodeCoverageAggregate.forEach((record) => {
+                    numLinesUncovered += record.NumLinesUncovered;
+                });
+                totalLines += numLinesUncovered;
+            }
+        }
+ 
+        let testCoverage = Math.floor((totalCovered / totalLines) * 100);
+        this.packageTestCoverage = testCoverage;
+        return testCoverage;
+    }
+ 
+    public async validateTestCoverage(
+        coverageThreshold?: number
+    ): Promise<{
+        result: boolean;
+        message?: string;
+        packageTestCoverage: number;
+        classesCovered?: { name: string; coveredPercent: number }[];
+        classesWithInvalidCoverage?: { name: string; coveredPercent: number }[];
+    }> {
+        if (this.packageTestCoverage == -1)
+            //No Value available
+            await this.getCurrentPackageTestCoverage();
+ 
+        let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage);
+ 
+        if (coverageThreshold == undefined || coverageThreshold < 75) {
+            SFPLogger.log('Setting minimum coverage percentage to 75%.');
+            coverageThreshold = 75;
+        }
+ 
+        
+      
+        if (this.pkg.packageType === PackageType.Unlocked) {
+            if (this.packageTestCoverage < coverageThreshold) {
+                // Coverage inadequate, set result to false
+                return {
+                    result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting
+                    packageTestCoverage: this.packageTestCoverage,
+                    classesCovered: classesCovered,
+                    message: `${COLOR_WARNING(
+                        `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%`
+                    )}`,
+                };
+            } else {
+                return {
+                    result: true,
+                    packageTestCoverage: this.packageTestCoverage,
+                    classesCovered: classesCovered,
+                    message: `Package overall coverage is greater than ${coverageThreshold}%`,
+                };
+            }
+        } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) {
+            SFPLogger.log("Package type is Source. Validating individual class coverage");
+ 
+            let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage(
+                this.getIndividualClassCoverageByPackage(this.codeCoverage),
+                coverageThreshold
+            );
+ 
+            if (individualClassValidationResults.result) {
+                return {
+                    result: true,
+                    packageTestCoverage: this.packageTestCoverage,
+                    classesCovered: classesCovered,
+                    classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage,
+                    message: `Individidual coverage of classes is greater than ${coverageThreshold}%`,
+                };
+            } else {
+                return {
+                    result: false,
+                    packageTestCoverage: this.packageTestCoverage,
+                    classesCovered: classesCovered,
+                    classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage,
+                    message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`,
+                };
+            }
+        } else {
+            throw new Error('Unhandled package type');
+        }
+    }
+ 
+    private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] {
+        let individualClassCoverage: {
+            name: string;
+            coveredPercent: number;
+        }[] = [];
+ 
+        let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses;
+        let triggers: string[] = this.pkg.triggers;
+ 
+        codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers(
+            codeCoverageReport,
+            packageClasses,
+            triggers
+        );
+ 
+        for (let classCoverage of codeCoverageReport) {
+            if (classCoverage['coveredPercent'] !== null) {
+                individualClassCoverage.push({
+                    name: classCoverage['name'],
+                    coveredPercent: classCoverage['coveredPercent'],
+                });
+            }
+        }
+ 
+        let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass(
+            packageClasses,
+            codeCoverageReport
+        );
+ 
+        if (namesOfClassesWithoutTest.length > 0) {
+            let classesWithoutTest: {
+                name: string;
+                coveredPercent: number;
+            }[] = namesOfClassesWithoutTest.map((className) => {
+                return { name: className, coveredPercent: 0 };
+            });
+            individualClassCoverage = individualClassCoverage.concat(classesWithoutTest);
+        }
+ 
+        // Check for triggers with no test class
+        let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport);
+ 
+        if (namesOfTriggersWithoutTest.length > 0) {
+            let triggersWithoutTest: {
+                name: string;
+                coveredPercent: number;
+            }[] = namesOfTriggersWithoutTest.map((triggerName) => {
+                return { name: triggerName, coveredPercent: 0 };
+            });
+            individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest);
+        }
+ 
+        return individualClassCoverage;
+    }
+ 
+    /**
+     * Returns names of triggers in the package that are not triggered by the execution of any test classes
+     * Returns empty array if triggers is null or undefined
+     * @param triggers
+     * @param codeCoverageReport
+     * @returns
+     */
+    private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] {
+        if (triggers != null) {
+            return triggers.filter((trigger) => {
+                for (let classCoverage of codeCoverageReport) {
+                    if (classCoverage['name'] === trigger) {
+                        // Filter out triggers if accounted for in coverage json
+                        return false;
+                    }
+                }
+                return true;
+            });
+        } else Ereturn [];
+    }
+ 
+    /**
+     * Returns name of classes in the package that are not touched by the execution of any test classes
+     * Returns empty array if packageClasses is null or undefined
+     * @param packageClasses
+     * @param codeCoverageReport
+     * @returns
+     */
+    private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] {
+        if (packageClasses != null) {
+            return packageClasses.filter((packageClass) => {
+                for (let classCoverage of codeCoverageReport) {
+                    if (classCoverage['name'] === packageClass) {
+                        // Filter out package class if accounted for in coverage json
+                        return false;
+                    }
+                }
+                return true;
+            });
+        } else Ereturn [];
+    }
+ 
+    /**
+     * Filter code coverage to classes and triggers in the package
+     * @param codeCoverage
+     * @param packageClasses
+     * @param triggers
+     */
+    private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) {
+        let filteredCodeCoverage = codeCoverage.filter((classCoverage) => {
+            if (packageClasses != null) {
+                for (let packageClass of packageClasses) {
+                    if (packageClass === classCoverage['name']) return true;
+                }
+            }
+ 
+            if (triggers != null) {
+                for (let trigger of triggers) {
+                    if (trigger === classCoverage['name']) {
+                        return true;
+                    }
+                }
+            }
+ 
+            return false;
+        });
+ 
+        return filteredCodeCoverage;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html new file mode 100644 index 000000000..3e23e8d58 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/package/coverage + + + + + + + + + +
+
+

All files src/core/package/coverage

+
+ +
+ 93.67% + Statements + 74/79 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 93.58% + Lines + 73/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
PackageTestCoverage.ts +
+
93.67%74/7970%7/10100%15/1593.58%73/78
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html new file mode 100644 index 000000000..bb3b45099 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/core/package/dependencies/ExternalPackage2DependencyResolver.ts + + + + + + + + + +
+
+

All files / src/core/package/dependencies ExternalPackage2DependencyResolver.ts

+
+ +
+ 54.28% + Statements + 19/35 +
+ + +
+ 62.5% + Branches + 5/8 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 50% + Lines + 16/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104  +2x +  +2x +  +  +  +  +  +2x +  +2x +  +  +  +  +  +  +2x +  +  +2x +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +12x +  +  +  +10x +4x +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import PackageDependencyResolver from './PackageDependencyResolver';
+import _ from 'lodash';
+import Package2VersionFetcher from '../version/Package2VersionFetcher';
+import Package2Detail from '../Package2Detail';
+ 
+/**
+ * Resolves external package dependency versions to their subscriber version
+ */
+export default class ExternalPackage2DependencyResolver {
+    //TOOD: Finalize Keys
+    constructor(private conn: Connection, private projectConfig, private keys) {}
+ 
+    public async resolveExternalPackage2DependenciesToVersions(
+        packagesToBeResolved?: string[],
+        packagesToBeSkipped?: string[],
+        isDependencyValidated?: boolean
+    ): Promise<Package2Detail[]> {
+        if (isDependencyValidated == undefined) isDependencyValidated = true;
+        //Do a dependency resolution first only for external dependencies
+        //Resolve .LATEST to exact version numbers
+        let revisedProjectConfig = await new PackageDependencyResolver(
+            this.conn,
+            this.projectConfig,
+            packagesToBeSkipped,
+            null,
+            isDependencyValidated
+        ).resolvePackageDependencyVersions();
+ 
+        let packageVersions: Package2Detail[] = [];
+        let packageVersionFetcher = new Package2VersionFetcher(this.conn);
+ 
+        let packagesToKeys: { [p: string]: string };
+        if (this.keys) {
+            packagesToKeys = this.parseKeys(this.keys);
+        }
+ 
+        //Resolve provided version Number to SubscriberVersionId
+        for (const sfdxPackage of revisedProjectConfig.packageDirectories) {
+           
+            Iif(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package))
+              continue;
+ 
+            if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) {
+                for (let i = 0; i < sfdxPackage.dependencies.length; i++) {
+                    let dependency = sfdxPackage.dependencies[i];
+ 
+                    if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) 
+                    {
+                        let dependendentPackage: Package2Detail = { name: dependency.package };
+                        packageVersions.push(dependendentPackage);
+                        continue;
+                    }
+ 
+                    if (!packageVersions.find((elem) => elem.name == dependency.package)) {
+                        let dependendentPackage: Package2Detail = { name: dependency.package };
+                        if (dependency.versionNumber) {
+                            dependendentPackage.versionNumber = dependency.versionNumber;
+                            let packageVersion = await packageVersionFetcher.fetchByPackage2Id(
+                                revisedProjectConfig.packageAliases[dependendentPackage.name],
+                                dependendentPackage.versionNumber,
+                                true
+                            );
+                            dependendentPackage.subscriberPackageVersionId =
+                                packageVersion[0].SubscriberPackageVersionId;
+                        } else {
+                            dependendentPackage.subscriberPackageVersionId =
+                                revisedProjectConfig.packageAliases[dependendentPackage.name];
+                        }
+                        if (packagesToKeys?.[dependendentPackage.name]) {
+                            dependendentPackage.key = packagesToKeys[dependency.package];
+                        }
+                        packageVersions.push(dependendentPackage);
+                    }
+                }
+            }
+        }
+        return packageVersions;
+    }
+ 
+    /**
+     * Parse keys in string format "packageA:key packageB:key packageC:key"
+     * Returns map of packages to keys
+     * @param keys
+     */
+    private parseKeys(keys: string) {
+        let output: { [p: string]: string } = {};
+ 
+        keys = keys.trim();
+        let listOfKeys = keys.split(' ');
+ 
+        for (let key of listOfKeys) {
+            let packageKeyPair = key.split(':');
+            if (packageKeyPair.length === 2) {
+                output[packageKeyPair[0]] = packageKeyPair[1];
+            } else {
+                // Format is incorrect, throw an error
+                throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`);
+            }
+        }
+        return output;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html new file mode 100644 index 000000000..06be92654 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html @@ -0,0 +1,892 @@ + + + + + + Code coverage report for src/core/package/dependencies/PackageDependencyResolver.ts + + + + + + + + + +
+
+

All files / src/core/package/dependencies PackageDependencyResolver.ts

+
+ +
+ 97.4% + Statements + 75/77 +
+ + +
+ 88.88% + Branches + 24/27 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 97.29% + Lines + 72/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270  +3x +3x +3x +3x +3x +  +  +  +  +  +3x +10x +  +  +10x +10x +10x +10x +10x +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +24x +  +  +  +  +  +  +19x +28x +  +  +1x +  +  +27x +  +  +  +9x +  +  +  +  +2x +  +16x +  +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +15x +  +  +  +  +  +  +  +13x +10x +10x +  +3x +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +38x +16x +  +  +  +  +6x +6x +  +6x +  +  +  +  +1x +  +  +  +  +5x +  +  +1x +  +  +  +  +  +4x +  +  +  +  +  +  +5x +  +  +  +  +5x +  +  +  +  +  +  +1x +  +  +  +  +13x +4x +  +  +1x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +4x +  +  +9x +  +  +3x +3x +  +  +9x +  +  +  +1x +  +  +  +  +3x +  +  +  +55x +55x +  +  +  +  +10x +  +  +  +  +  +  +  +  +6x +6x +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +  +  +  +  +  +  +  +  +  +6x +6x +  +  + 
import { Connection } from '@salesforce/core';
+import lodash = require('lodash');
+import Git from '../../git/Git';
+import GitTags from '../../git/GitTags';
+import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher';
+import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
+ 
+ 
+/**
+ * Resolves package dependency versions to their exact versions
+ */
+export default class PackageDependencyResolver {
+    private package2VersionCache: Package2VersionCache = new Package2VersionCache();
+ 
+    constructor(
+        private conn: Connection,
+        private projectConfig,
+        private packagesToBeSkipped?: string[],
+        private packagesToBeResolved?: string[],
+        private resolveExternalDepenciesOnly?: boolean
+    ) {
+        // prevent mutation of original config
+        this.projectConfig = lodash.cloneDeep(this.projectConfig);
+    }
+ 
+    /**
+     * Resolves package dependency versions in project config
+     * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped)
+     * @returns new project config JSON, does not change original JSON
+     */
+    public async resolvePackageDependencyVersions() {
+        for (const packageDirectory of this.projectConfig.packageDirectories) {
+            if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) {
+                throw Error(`Unsupported path.. Use only one of the options at any given time`);
+            }
+ 
+            if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) {
+                continue;
+            }
+ 
+            if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) {
+                continue;
+            }
+            if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) {
+                for (let i = 0; i < packageDirectory.dependencies.length; i++) {
+                    let dependency = packageDirectory.dependencies[i];
+                    if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) {
+                        
+                        throw new Error(`Can't find package id for dependency: ` + dependency.package);
+                    }
+ 
+                    let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package]
+ 
+                    if (this.isSubscriberPackageVersionId(packageVersionId)) {
+                        // Already resolved
+                        continue;
+                    }
+ 
+                    if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) {
+                        // Dependency is part of the same build, will be resolved when new version is created
+                        continue;
+                    }
+                    let package2VersionForDependency: any = '';
+                    if ( dependency.branch && dependency.branch !== '' ) {
+                        SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO);
+                        package2VersionForDependency = await this.getPackage2VersionForDependency(
+                            this.conn,
+                            dependency,
+                            packageVersionId,
+                            dependency.branch
+                        );
+                        SFPLogger.log(`Fetched latest branched package of ${dependency.package},`
+                                        +`version: ${package2VersionForDependency.MajorVersion}.`
+                                                 +`${package2VersionForDependency.MinorVersion}.`
+                                                 +`${package2VersionForDependency.PatchVersion}.`
+                                                 +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO);
+ 
+                        let branchedPackageAlias = `${dependency.package}@`
+                                                    +`${package2VersionForDependency.MajorVersion}.`
+                                                    +`${package2VersionForDependency.MinorVersion}.`
+                                                    +`${package2VersionForDependency.PatchVersion}.`
+                                                    +`${package2VersionForDependency.BuildNumber}-`
+                                                    +`${dependency.branch}`;
+                        dependency.package = branchedPackageAlias;
+                        this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId;
+                        delete dependency.versionNumber;
+                        delete dependency.branch;
+                        continue;
+                        
+                    }else {
+                        package2VersionForDependency = await this.getPackage2VersionForDependency(
+                            this.conn,
+                            dependency,
+                            packageVersionId
+                        );
+                    }
+                    
+ 
+                    if (package2VersionForDependency == null) {
+                        packageDirectory.dependencies.splice(i, 1);
+                        i--;
+                    } else
+                        dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`;
+                }
+            }
+        }
+        return this.projectConfig;
+    }
+ 
+    /**
+     * Get last validated Package2 version for package dependency
+     * @param conn
+     * @param dependency
+     * @returns Package2Version
+     */
+    private async getPackage2VersionForDependency(
+        conn: Connection,
+        dependency: { package: string; versionNumber: string },
+        packageVersionId: string,
+        branch?: string,
+    ): Promise<Package2Version> {
+ 
+        //Dont hit api's if its only for external dependencies
+        if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) {
+            if (this.resolveExternalDepenciesOnly) return null;
+        }
+ 
+        let package2Version: Package2Version;
+ 
+        let versionNumber: string = dependency.versionNumber;
+        let vers: string[] = versionNumber.split('.');
+        if (vers.length === 4 && vers[3] === 'LATEST') {
+            versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`;
+        }
+ 
+        let package2Versions: Package2Version[];
+        if (this.package2VersionCache.has(packageVersionId, versionNumber)) {
+            package2Versions = this.package2VersionCache.get(
+                packageVersionId,
+                versionNumber
+            );
+        } else {
+            const package2VersionFetcher = new Package2VersionFetcher(conn);
+            let records;
+            if( branch ){
+                records = await package2VersionFetcher.fetchByPackageBranchAndName(
+                    branch,
+                    dependency.package,
+                    versionNumber
+                );
+            }else{
+                records = await package2VersionFetcher.fetchByPackage2Id(
+                    packageVersionId,
+                    versionNumber,
+                    true
+                );
+            }
+            
+            this.package2VersionCache.set(
+                packageVersionId,
+                versionNumber,
+                records
+            );
+            package2Versions = this.package2VersionCache.get(
+                packageVersionId,
+                versionNumber
+            );
+        }
+ 
+        if (package2Versions.length === 0) {
+            throw new Error(
+                `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}`
+            );
+        }
+ 
+        if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) {
+            package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency);
+        } else {
+            // Take last validated package for external packages
+            package2Version = package2Versions[0];
+        }
+        return package2Version;
+    }
+ 
+    /**
+     * Get Package2 version created from the current branch
+     * @param package2Versions
+     * @param dependency
+     * @returns Package2Version
+     */
+    private async getPackage2VersionFromCurrentBranch(
+        package2Versions: Package2Version[],
+        dependency: { package: string; versionNumber: string }
+    ) {
+        let package2VersionOnCurrentBranch: Package2Version;
+ 
+        const git = await Git.initiateRepo();
+        const gitTags = new GitTags(git, dependency.package);
+        const tags = await gitTags.listTagsOnBranch();
+ 
+        for (const package2Version of package2Versions) {
+            const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`;
+            for (const tag of tags) {
+                if (tag.endsWith(version)) {
+                    package2VersionOnCurrentBranch = package2Version;
+                    break;
+                }
+            }
+            if (package2VersionOnCurrentBranch) break;
+        }
+ 
+        if (!package2VersionOnCurrentBranch) {
+            throw new Error(
+                `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch`
+            );
+        }
+ 
+        return package2VersionOnCurrentBranch;
+    }
+ 
+    private isSubscriberPackageVersionId(packageAlias: string): boolean {
+        const subscriberPackageVersionIdPrefix = '04t';
+        return packageAlias.startsWith(subscriberPackageVersionIdPrefix);
+    }
+}
+ 
+class Package2VersionCache {
+    private cache: { [p: string]: Package2Version[] } = {};
+ 
+    /**
+     * Checks whether cache contains key for package ID and version number
+     * @param packageId
+     * @param versionNumberstartw
+     * @returns true or false
+     */
+    has(packageId: string, versionNumber: string): boolean {
+        const key = `${packageId}-${versionNumber}`;
+        if (this.cache[key]) return true;
+        else return false;
+    }
+ 
+    /**
+     * Set the cache value, Package2 versions, for package ID and version number
+     * @param packageId
+     * @param versionNumber
+     * @param package2Versions
+     * @returns cache
+     */
+    set(
+        packageId: string,
+        versionNumber: string,
+        package2Versions: Package2Version[]
+    ): { [p: string]: Package2Version[] } {
+        const key = `${packageId}-${versionNumber}`;
+        this.cache[key] = package2Versions;
+        return this.cache;
+    }
+ 
+    /**
+     *
+     * @param packageId
+     * @param versionNumber
+     * @returns Package2 versions for package ID and version number
+     */
+    get(packageId: string, versionNumber: string): Package2Version[] {
+        const key = `${packageId}-${versionNumber}`;
+        return this.cache[key];
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html new file mode 100644 index 000000000..7da072f8e --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/core/package/dependencies/TransitiveDependencyResolver.ts + + + + + + + + + +
+
+

All files / src/core/package/dependencies TransitiveDependencyResolver.ts

+
+ +
+ 88.63% + Statements + 39/44 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 88.88% + Functions + 8/9 +
+ + +
+ 88.37% + Lines + 38/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +1102x +2x +2x +2x +2x +2x +  +2x +  +2x +7x +  +  +7x +  +7x +7x +7x +7x +  +  +  +7x +  +7x +  +  +  +  +  +  +  +  +7x +  +  +7x +  +  +  +  +  +7x +  +42x +  +  +  +  +42x +  +  +  +65x +65x +  +  +  +  +  +  +  +  +87x +  +  +42x +221x +152x +42x +  +96x +  +96x +  +7x +  +  +  +  +  +7x +7x +  +  +  +  +  +145x +727x +727x +  +42x +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import ProjectConfig from '../../project/ProjectConfig';
+import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger';
+import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
+import _, { uniq } from 'lodash';
+import semver = require('semver');
+import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter';
+import { Connection } from '@salesforce/core';
+import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency';
+ 
+export default class TransitiveDependencyResolver {
+    constructor(private sfdxProjectConfig: any, private logger?: Logger) {}
+ 
+    public async resolveTransitiveDependencies(): Promise<Map<string, { package: string; versionNumber?: string }[]>> {
+        SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger);
+ 
+        let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig);
+        clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig);
+        let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig);
+        pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap(
+            pkgWithDependencies,
+            new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig)
+        );
+        pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies);
+ 
+        return pkgWithDependencies;
+    }
+ 
+    private fillDepsWithUserDefinedExternalDependencyMap(
+        pkgWithDependencies: Map<string, { package: string; versionNumber?: string }[]>,
+        externalDependencyMap: any
+    ): Map<string, { package: string; versionNumber?: string }[]> {
+        if (externalDependencyMap) {
+            for (let pkg of Object.keys(externalDependencyMap)) {
+                pkgWithDependencies.set(pkg, externalDependencyMap[pkg]);
+            }
+        }
+        return pkgWithDependencies;
+    }
+ 
+    private fillDepsTransitively(
+        dependencyMap: Map<string, { package: string; versionNumber?: string }[]>
+    ): Map<string, { package: string; versionNumber?: string }[]> {
+        let pkgs = Array.from(dependencyMap.keys());
+        for (let pkg of pkgs) {
+            SFPLogger.log(
+                COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg),
+                LoggerLevel.TRACE,
+                this.logger
+            );
+            let dependenencies: { package: string; versionNumber?: string }[] = [];
+            for (let dependency of dependencyMap.get(pkg)) {
+                if (dependencyMap.get(dependency.package)) {
+                    //push parents first
+                    dependenencies = dependenencies.concat(dependencyMap.get(dependency.package));
+                    SFPLogger.log(
+                        `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${
+                            dependency.package
+                        }`,
+                        LoggerLevel.TRACE,
+                        this.logger
+                    );
+                }
+                //push itself
+                dependenencies.push(dependency);
+            }
+            //deduplicate dependency list
+            let uniqueDependencies = [
+                ...new Set(dependenencies.map((objects) => JSON.stringify(objects))),
+            ].map((tmpString) => JSON.parse(tmpString));
+            for (let j = 0; j < uniqueDependencies.length; j++) {
+                if (uniqueDependencies[j].versionNumber) {
+                    let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber);
+ 
+                    for (let i = j + 1; i < uniqueDependencies.length; i++) {
+                        if (uniqueDependencies[j].package == uniqueDependencies[i].package) {
+                            let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber);
+                            // replace existing packageInfo if package version number is newer
+                            if (semver.lt(version, versionToCompare)) {
+                               uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i);
+                                
+                            } else {
+                                uniqueDependencies.splice(i, 1);
+                                i--;
+                            }
+                        }
+                    }
+                }
+                //do a dedup again
+                uniqueDependencies = [
+                    ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))),
+                ].map((tmpString) => JSON.parse(tmpString));
+            }
+            dependencyMap.set(pkg, uniqueDependencies);
+        }
+        return dependencyMap;
+    }
+ 
+    private swapAndDropArrayElement<T>(arr: T[], i: number, j: number): T[] {
+        if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) {
+          return arr;
+        }
+        
+        let newArr = [...arr];
+        [newArr[i], newArr[j]] = [newArr[j], newArr[i]];
+        return [...newArr.slice(0, j), ...newArr.slice(j + 1)];
+      }
+      
+      
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html new file mode 100644 index 000000000..4a2f2fffa --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/package/dependencies + + + + + + + + + +
+
+

All files src/core/package/dependencies

+
+ +
+ 85.25% + Statements + 133/156 +
+ + +
+ 74.35% + Branches + 29/39 +
+ + +
+ 91.66% + Functions + 22/24 +
+ + +
+ 84.56% + Lines + 126/149 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ExternalPackage2DependencyResolver.ts +
+
54.28%19/3562.5%5/875%3/450%16/32
PackageDependencyResolver.ts +
+
97.4%75/7788.88%24/27100%11/1197.29%72/74
TransitiveDependencyResolver.ts +
+
88.63%39/440%0/488.88%8/988.37%38/43
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html new file mode 100644 index 000000000..908d418b2 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html @@ -0,0 +1,415 @@ + + + + + + Code coverage report for src/core/package/deploymentFilters/EntitlementVersionFilter.ts + + + + + + + + + +
+
+

All files / src/core/package/deploymentFilters EntitlementVersionFilter.ts

+
+ +
+ 84.09% + Statements + 37/44 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 90.24% + Lines + 37/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +  +1x +1x +  +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +5x +5x +  +  +5x +5x +  +  +5x +  +  +5x +  +  +  +3x +3x +  +1x +1x +  +  +4x +  +4x +4x +  +  +  +  +8x +  +8x +7x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +  +3x +  +  +  +  +  +  +4x +  +  +  +  +  +  +4x +4x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
+import SFPOrg from '../../org/SFPOrg';
+import QueryHelper from '../../queryHelper/QueryHelper';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { DeploymentFilter } from './DeploymentFilter';
+import * as fs from 'fs-extra';
+import SettingsFetcher from '../../metadata/SettingsFetcher';
+import { PackageType } from '../SfpPackage';
+const { XMLBuilder } = require('fast-xml-parser');
+ 
+const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`;
+const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`;
+ 
+export default class EntitlementVersionFilter implements DeploymentFilter {
+  
+    public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise<ComponentSet> {
+        //Only do if entitlment exits in the package
+        let sourceComponents = componentSet.getSourceComponents().toArray();
+        let isEntitlementFound: boolean = false;
+        for (const sourceComponent of sourceComponents) {
+            if (sourceComponent.type.name === registry.types.entitlementprocess.name) {
+                isEntitlementFound = true;
+                break;
+            }
+        }
+        Iif (!isEntitlementFound) return componentSet;
+ 
+        try {
+            let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`);
+ 
+            let query;
+            if (entitlementSettings.enableEntitlementVersioning == true) {
+                SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger);
+                query = EXISTING_SLAPPROCESS_QUERY;
+            } else {
+                SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger);
+                query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING;
+            }
+ 
+            SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger);
+            //Fetch Entitlements currently in the org
+            let slaProcessesInOrg = await QueryHelper.query<SlaProcess>(query, org.getConnection(), false);
+            let modifiedComponentSet = new ComponentSet();
+            //Compare version numbers in the org vs version in the component set
+            //Remove if the version numbers match
+            for (const sourceComponent of sourceComponents) {
+                if (sourceComponent.type.name === registry.types.entitlementprocess.name) {
+                    let slaProcessLocal = sourceComponent.parseXmlSync();
+ 
+                    let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find(
+                        (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name']
+                    );
+ 
+                    if (
+                        slaProcessMatchedByName &&
+                        entitlementSettings.enableEntitlementVersioning &&
+                        slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber
+                    ) {
+                        //This is a deployment candidate
+                        //Modify versionMaster tag to match in the org
+                        slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster;
+                        let builder = new XMLBuilder({
+                            format: true,
+                            ignoreAttributes: false,
+                            attributeNamePrefix: '@_',
+                        });
+                        let xmlContent = builder.build(slaProcessLocal);
+                        fs.writeFileSync(sourceComponent.xml, xmlContent);
+                        modifiedComponentSet.add(sourceComponent);
+                    } else if (slaProcessMatchedByName) {
+                        SFPLogger.log(
+                            `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`,
+                            LoggerLevel.INFO,
+                            logger
+                        );
+                    } else {
+                        //Doesnt exist, deploy
+                        modifiedComponentSet.add(sourceComponent);
+                    }
+                } else {
+                    modifiedComponentSet.add(sourceComponent);
+                }
+            }
+ 
+            SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger);
+            return modifiedComponentSet;
+        } catch (error) {
+            SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger);
+            return componentSet;
+        }
+    }
+ 
+    public isToApply(projectConfig: any, packageType: string): boolean {
+        Iif (packageType != PackageType.Source) return false;
+ 
+        if (projectConfig?.plugins?.sfp?.disableEntitlementFilter) return false;
+        else return true;
+    }
+ 
+    
+ 
+   
+}
+ 
+interface SlaProcess {
+    Name: string;
+    NameNorm: string;
+    VersionNumber: string;
+    VersionMaster: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html new file mode 100644 index 000000000..365701931 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/package/deploymentFilters + + + + + + + + + +
+
+

All files src/core/package/deploymentFilters

+
+ +
+ 84.09% + Statements + 37/44 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 90.24% + Lines + 37/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
EntitlementVersionFilter.ts +
+
84.09%37/4442.85%3/766.66%2/390.24%37/41
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html new file mode 100644 index 000000000..97c3d3034 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html @@ -0,0 +1,1357 @@ + + + + + + Code coverage report for src/core/package/diff/PackageComponentDiff.ts + + + + + + + + + +
+
+

All files / src/core/package/diff PackageComponentDiff.ts

+
+ +
+ 13.72% + Statements + 21/153 +
+ + +
+ 10.52% + Branches + 2/19 +
+ + +
+ 8.33% + Functions + 1/12 +
+ + +
+ 13.72% + Lines + 21/153 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +4251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  + 
import * as xml2js from 'xml2js';
+import * as path from 'path';
+import * as fs from 'fs-extra';
+import * as rimraf from 'rimraf';
+import * as _ from 'lodash';
+import simplegit from 'simple-git';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import ProjectConfig from '../../project/ProjectConfig';
+import MetadataFiles from '../../metadata/MetadataFiles';
+import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo';
+import { MetadataResolver } from '@salesforce/source-deploy-retrieve';
+import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil';
+ 
+const deleteNotSupported = ['RecordType'];
+const git = simplegit();
+let sfdxManifest;
+ 
+export default class PackageComponentDiff {
+    private gitDiffUtils: GitDiffUtils;
+ 
+    destructivePackageObjPre: any[];
+    destructivePackageObjPost: any[];
+    resultOutput: {
+        action: string;
+        metadataType: string;
+        componentName: string;
+        message: string;
+        path: string;
+    }[];
+    public constructor(
+        private logger: Logger,
+        private sfdxPackage: string,
+        private revisionFrom?: string,
+        private revisionTo?: string,
+        private isDestructive?: boolean
+    ) {
+        if (this.revisionTo == null || this.revisionTo.trim() === '') {
+            this.revisionTo = 'HEAD';
+        }
+        if (this.revisionFrom == null) {
+            this.revisionFrom = '';
+        }
+        this.destructivePackageObjPost = [];
+        this.destructivePackageObjPre = [];
+        this.resultOutput = [];
+ 
+        sfdxManifest = ProjectConfig.getSFDXProjectConfig(null);
+        this.gitDiffUtils = new GitDiffUtils();
+    }
+ 
+    public async build(outputFolder: string) {
+        rimraf.sync(outputFolder);
+ 
+        const sepRegex = /\n|\r/;
+        let data = '';
+ 
+        //check if same commit
+        const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]);
+        const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]);
+        if (commitFrom === commitTo) {
+            throw new Error(`Unable to compute diff, as both commits are same`);
+        }
+        //Make it relative to make the command works from a project created as a subfolder in a repository
+        data = await git.diff([
+            '--raw',
+            this.revisionFrom,
+            this.revisionTo,
+            '--relative',
+            ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path,
+        ]);
+ 
+        let content = data.split(sepRegex);
+        let diffFile: DiffFile = await this.parseContent(content);
+        await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger);
+ 
+        let filesToCopy = diffFile.addedEdited;
+        let deletedFiles = diffFile.deleted;
+ 
+        deletedFiles = deletedFiles.filter((deleted) => {
+            let found = false;
+            let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path);
+            for (let i = 0; i < filesToCopy.length; i++) {
+                let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path);
+                if (deletedMetadata === addedOrEdited) {
+                    found = true;
+                    break;
+                }
+            }
+            return !found;
+        });
+ 
+        if (fs.existsSync(outputFolder) == false) {
+            fs.mkdirSync(outputFolder);
+        }
+ 
+        const resolver = new MetadataResolver();
+ 
+        if (filesToCopy && filesToCopy.length > 0) {
+            for (let i = 0; i < filesToCopy.length; i++) {
+ 
+                try {
+                    let filePath = filesToCopy[i].path;
+ 
+                    let sourceComponents = resolver.getComponentsFromPath(filePath);
+                    for (const sourceComponent of sourceComponents) {
+                        if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) {
+                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
+                            await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger);
+                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) {
+                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
+                            if(path.extname(sourceComponent.content))
+                              await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger);
+                            else
+                              await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger);
+                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) {
+                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
+                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) {
+                            await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger);
+                        } else {
+                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
+                        }
+                    }
+                } catch (error) {
+                    
+                   Iif(error.message.includes(`Unable to find the required file`))
+                    throw error;
+ 
+                    //Metadata resolver is not respecting forceignores at this stage
+                    // So it fails on diff packages with post deploy, so lets ignore and move on
+                    SFPLogger.log(
+                        `Error while inferencing type of  ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`,
+                        LoggerLevel.TRACE,
+                        this.logger
+                    );
+                }
+            }
+        }
+ 
+        if (this.isDestructive) {
+            SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger);
+            await this.createDestructiveChanges(deletedFiles, outputFolder);
+        }
+ 
+        //Folder is empty after all this operations, return without copying additional files
+        if (fs.readdirSync(outputFolder).length === 0) {
+            rimraf.sync(outputFolder);
+            return null;
+        }
+ 
+        SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger);
+ 
+        return this.resultOutput;
+    }
+ 
+    //TODO: Refactor using proper ignore
+    private checkForIngore(pathToIgnore: any[], filePath: string) {
+        pathToIgnore = pathToIgnore || [];
+        if (pathToIgnore.length === 0) {
+            return true;
+        }
+ 
+        let returnVal = true;
+        pathToIgnore.forEach((ignore) => {
+            if (
+                path.resolve(ignore) === path.resolve(filePath) ||
+                path.resolve(filePath).includes(path.resolve(ignore))
+            ) {
+                returnVal = false;
+            }
+        });
+        return returnVal;
+    }
+ 
+    private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) {
+        if (_.isNil(this.destructivePackageObjPost)) {
+            this.destructivePackageObjPost = [];
+        } else {
+            this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => {
+                return !_.isNil(metaType.members) && metaType.members.length > 0;
+            });
+        }
+        this.destructivePackageObjPre = [];
+        //returns root, dir, base and name
+        for (let i = 0; i < filePaths.length; i++) {
+            let filePath = filePaths[i].path;
+            try {
+                let matcher = filePath.match(SOURCE_EXTENSION_REGEX);
+                let extension = '';
+                if (matcher) {
+                    extension = matcher[0];
+                } else {
+                    extension = path.parse(filePath).ext;
+                }
+ 
+                let name = MetadataInfo.getMetadataName(filePath);
+ 
+                if (name) {
+                    if (!MetadataFiles.isCustomMetadata(filePath, name)) {
+                        // avoid to generate destructive for Standard Components
+                        //Support on Custom Fields and Custom Objects for now
+ 
+                        this.resultOutput.push({
+                            action: 'Skip',
+                            componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name),
+                            metadataType: 'StandardField/CustomMetadata',
+                            message: '',
+                            path: '--',
+                        });
+ 
+                        continue;
+                    }
+                    let member = MetadataFiles.getMemberNameFromFilepath(filePath, name);
+                    if (name === METADATA_INFO.CustomField.xmlName) {
+                        let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], '<formula>');
+                        if (isFormular) {
+                            this.destructivePackageObjPre = this.buildDestructiveTypeObj(
+                                this.destructivePackageObjPre,
+                                name,
+                                member
+                            );
+ 
+                            SFPLogger.log(
+                                `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`,
+                                LoggerLevel.DEBUG,
+                                this.logger
+                            );
+ 
+                            this.resultOutput.push({
+                                action: 'Delete',
+                                componentName: member,
+                                metadataType: name,
+                                message: '',
+                                path: 'Manual Intervention Required',
+                            });
+                        } else {
+                            this.destructivePackageObjPost = this.buildDestructiveTypeObj(
+                                this.destructivePackageObjPost,
+                                name,
+                                member
+                            );
+                        }
+                        SFPLogger.log(
+                            `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`,
+                            LoggerLevel.DEBUG,
+                            this.logger
+                        );
+ 
+                        this.resultOutput.push({
+                            action: 'Delete',
+                            componentName: member,
+                            metadataType: name,
+                            message: '',
+                            path: 'destructiveChanges.xml',
+                        });
+                    } else {
+                        if (!deleteNotSupported.includes(name)) {
+                            this.destructivePackageObjPost = this.buildDestructiveTypeObj(
+                                this.destructivePackageObjPost,
+                                name,
+                                member
+                            );
+                            this.resultOutput.push({
+                                action: 'Delete',
+                                componentName: member,
+                                metadataType: name,
+                                message: '',
+                                path: 'destructiveChanges.xml',
+                            });
+                        } else {
+                            //add the component in the manual action list
+                            // TODO
+                        }
+                    }
+                }
+            } catch (ex) {
+                this.resultOutput.push({
+                    action: 'ERROR',
+                    componentName: '',
+                    metadataType: '',
+                    message: ex.message,
+                    path: filePath,
+                });
+            }
+        }
+ 
+        this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml');
+    }
+ 
+    private writeDestructivechanges(destrucObj: Array<any>, outputFolder: string, fileName: string) {
+        //ensure unique component per type
+        for (let i = 0; i < destrucObj.length; i++) {
+            destrucObj[i].members = _.uniq(destrucObj[i].members);
+        }
+        destrucObj = destrucObj.filter((metaType) => {
+            return metaType.members && metaType.members.length > 0;
+        });
+ 
+        if (destrucObj.length > 0) {
+            let dest = {
+                Package: {
+                    $: {
+                        xmlns: 'http://soap.sforce.com/2006/04/metadata',
+                    },
+                    types: destrucObj,
+                },
+            };
+ 
+            let destructivePackageName = fileName;
+            let filepath = path.join(outputFolder, destructivePackageName);
+            let builder = new xml2js.Builder();
+            let xml = builder.buildObject(dest);
+            fs.writeFileSync(filepath, xml);
+        }
+    }
+ 
+    private buildDestructiveTypeObj(destructiveObj, name, member) {
+        let typeIsPresent = false;
+        for (let i = 0; i < destructiveObj.length; i++) {
+            if (destructiveObj[i].name === name) {
+                typeIsPresent = true;
+                destructiveObj[i].members.push(member);
+                break;
+            }
+        }
+        let typeNode: any;
+        if (typeIsPresent === false) {
+            typeNode = {
+                name: name,
+                members: [member],
+            };
+            destructiveObj.push(typeNode);
+        }
+        return destructiveObj;
+    }
+ 
+    private async parseContent(fileContents): Promise<DiffFile> {
+        const statusRegEx = /\sA\t|\sM\t|\sD\t/;
+        const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/;
+        const tabRegEx = /\t/;
+        const deletedFileRegEx = new RegExp(/\sD\t/);
+        const lineBreakRegEx = /\r?\n|\r|( $)/;
+ 
+        let metadataFiles = new MetadataFiles();
+ 
+        let diffFile: DiffFile = {
+            deleted: [],
+            addedEdited: [],
+        };
+ 
+        for (let i = 0; i < fileContents.length; i++) {
+            if (statusRegEx.test(fileContents[i])) {
+                let lineParts = fileContents[i].split(statusRegEx);
+ 
+                let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, ''));
+                finalPath = finalPath.trim();
+                finalPath = finalPath.replace('\\303\\251', 'é');
+ 
+                if (!(await metadataFiles.isInModuleFolder(finalPath))) {
+                    continue;
+                }
+ 
+                if (!metadataFiles.accepts(finalPath)) {
+                    continue;
+                }
+ 
+                let revisionPart = lineParts[0].split(/\t|\s/);
+ 
+                if (deletedFileRegEx.test(fileContents[i])) {
+                    //Deleted
+                    diffFile.deleted.push({
+                        revisionFrom: revisionPart[2].substring(0, 9),
+                        revisionTo: revisionPart[3].substring(0, 9),
+                        path: finalPath,
+                    });
+                } else {
+                    // Added or edited
+                    diffFile.addedEdited.push({
+                        revisionFrom: revisionPart[2].substring(0, 9),
+                        revisionTo: revisionPart[3].substring(0, 9),
+                        path: finalPath,
+                    });
+                }
+            } else if (renamedRegEx.test(fileContents[i])) {
+                let lineParts = fileContents[i].split(renamedRegEx);
+ 
+                let paths = lineParts[1].trim().split(tabRegEx);
+ 
+                let finalPath = path.join('.', paths[1].trim());
+                finalPath = finalPath.replace('\\303\\251', 'é');
+                let revisionPart = lineParts[0].split(/\t|\s/);
+ 
+                if (!(await metadataFiles.isInModuleFolder(finalPath))) {
+                    continue;
+                }
+ 
+                if (!metadataFiles.accepts(paths[0].trim())) {
+                    continue;
+                }
+ 
+                diffFile.addedEdited.push({
+                    revisionFrom: '0000000',
+                    revisionTo: revisionPart[3],
+                    renamedPath: path.join('.', paths[0].trim()),
+                    path: finalPath,
+                });
+ 
+                //allow deletion of renamed components
+                diffFile.deleted.push({
+                    revisionFrom: revisionPart[2],
+                    revisionTo: '0000000',
+                    path: paths[0].trim(),
+                });
+            }
+        }
+        return diffFile;
+    }
+}
+enum AdapterId {
+    Bundle = 'bundle',
+    Decomposed = 'decomposed',
+    Default = 'default',
+    MatchingContentFile = 'matchingContentFile',
+    MixedContent = 'mixedContent',
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html new file mode 100644 index 000000000..e99b30d1f --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/core/package/diff/PackageDiffImpl.ts + + + + + + + + + +
+
+

All files / src/core/package/diff PackageDiffImpl.ts

+
+ +
+ 84.72% + Statements + 61/72 +
+ + +
+ 81.81% + Branches + 9/11 +
+ + +
+ 85.71% + Functions + 6/7 +
+ + +
+ 86.95% + Lines + 60/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +1671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +1x +  +9x +9x +9x +9x +  +  +  +9x +  +9x +9x +  +8x +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +6x +  +  +  +  +6x +  +  +  +  +  +  +  +  +6x +  +6x +  +6x +  +  +  +  +  +  +  +  +7x +7x +  +7x +  +  +1x +1x +  +  +  +5x +  +  +  +  +5x +  +1x +  +  +4x +  +2x +  +  +  +  +2x +  +  +  +  +  +6x +6x +6x +  +6x +  +  +6x +  +6x +  +  +  +8x +8x +  +8x +  +  +  +8x +  +  +8x +  +  +  +5x +5x +  +  +  +  +5x +  +  +  +5x +2x +  +  +2x +1x +1x +1x +3x +  +  +  +  +  +  +  +  +  +  + 
const fs = require('fs');
+const path = require('path');
+import Git from '../../git/Git';
+import IgnoreFiles from '../../ignore/IgnoreFiles';
+import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import ProjectConfig from '../../project/ProjectConfig';
+import GitTags from '../../git/GitTags';
+import lodash = require('lodash');
+import { EOL } from 'os';
+import { PackageType } from '../SfpPackage';
+ 
+export class PackageDiffOptions {
+    skipPackageDescriptorChange?: boolean = false;
+    //If not set, utlize latest git tags
+    useLatestGitTags?:boolean=true;
+    packagesMappedToLastKnownCommitId?: { [p: string]: string };
+    pathToReplacementForceIgnore?: string;
+}
+ 
+export default class PackageDiffImpl {
+    public constructor(
+        private logger: Logger,
+        private sfdx_package: string,
+        private project_directory: string|null,
+        private diffOptions?: PackageDiffOptions
+    ) {}
+ 
+    public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> {
+        let git: Git = await Git.initiateRepo(this.logger,this.project_directory);
+ 
+        let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory);
+        let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig);
+ 
+        SFPLogger.log(
+            COLOR_KEY_MESSAGE(
+                `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`,
+            ),
+            LoggerLevel.TRACE,
+            this.logger
+        );
+ 
+        let tag: string;
+        if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) {
+            tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId);
+        } else {
+            tag = await this.getLatestTagFromGit(git, this.sfdx_package);
+        }
+ 
+        if (tag) {
+            SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger);
+ 
+            // Get the list of modified files between the tag and HEAD refs
+            let modified_files: string[];
+            try {
+                modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]);
+            } catch (error) {
+                SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`));
+                SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`));
+                SFPLogger.log(COLOR_ERROR(`Actual error received:`));
+                SFPLogger.log(COLOR_ERROR(error));
+                throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`)
+            }
+ 
+            let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package);
+ 
+            if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files);
+ 
+            SFPLogger.log(
+                `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`,
+                LoggerLevel.TRACE,
+                this.logger
+            );
+ 
+            // Check whether the package has been modified
+            for (let filename of modified_files) {
+                
+                let normalizedPkgPath = path.normalize(pkgDescriptor.path);
+                let normalizedFilename = path.normalize(filename);
+            
+                let relativePath = path.relative(normalizedPkgPath, normalizedFilename);
+            
+                if (!relativePath.startsWith('..')) {
+                    SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger);
+                    return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag };
+                }
+            }
+ 
+            SFPLogger.log(
+                `Checking for changes to package descriptor in sfdx-project.json`,
+                LoggerLevel.TRACE,
+                this.logger
+            );
+            let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor);
+            if (isPackageDescriptorChanged) {
+                return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag };
+            }
+ 
+            return { isToBeBuilt: false, reason: `No changes found`, tag: tag };
+        } else {
+            SFPLogger.log(
+                `Tag missing for ${this.sfdx_package}...marking package for build anyways`,
+                LoggerLevel.TRACE,
+                this.logger
+            );
+            return { isToBeBuilt: true, reason: `Previous version not found` };
+        }
+    }
+ 
+    private applyForceIgnoreToModifiedFiles(modified_files: string[]) {
+        let forceignorePath: string;
+        Iif (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore;
+        else Iif (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore');
+        else forceignorePath = '.forceignore';
+ 
+        let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString());
+ 
+        // Filter the list of modified files with .forceignore
+        modified_files = ignoreFiles.filter(modified_files);
+ 
+        return modified_files;
+    }
+ 
+    private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise<string> {
+        const gitTags: GitTags = new GitTags(git, sfdx_package);
+        let tags: string[] = await gitTags.listTagsOnBranch();
+ 
+        SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG);
+        if (tags.length > 10) {
+            SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger);
+        } else {
+            SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger);
+        }
+ 
+        return tags.pop();
+    }
+ 
+    private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise<boolean> {
+        let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]);
+        let projectConfig = JSON.parse(projectConfigJson);
+ 
+        let packageDescriptorFromLatestTag: string;
+        for (let dir of projectConfig['packageDirectories']) {
+            if (this.sfdx_package === dir.package) {
+                packageDescriptorFromLatestTag = dir;
+            }
+        }
+ 
+        if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) {
+            SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger);
+ 
+            //skip check and ignore
+            if (this.diffOptions?.skipPackageDescriptorChange) {
+                SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger);
+                return false;
+            } else return true;
+        } else return false;
+    }
+ 
+    private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string {
+        if (packagesToCommits[sfdx_package] != null) {
+            return packagesToCommits[sfdx_package];
+        } else {
+            return null;
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html new file mode 100644 index 000000000..945749465 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/package/diff + + + + + + + + + +
+
+

All files src/core/package/diff

+
+ +
+ 36.44% + Statements + 82/225 +
+ + +
+ 36.66% + Branches + 11/30 +
+ + +
+ 36.84% + Functions + 7/19 +
+ + +
+ 36.48% + Lines + 81/222 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
PackageComponentDiff.ts +
+
13.72%21/15310.52%2/198.33%1/1213.72%21/153
PackageDiffImpl.ts +
+
84.72%61/7281.81%9/1185.71%6/786.95%60/69
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html new file mode 100644 index 000000000..c9f65a9df --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/package + + + + + + + + + +
+
+

All files src/core/package

+
+ +
+ 26.92% + Statements + 35/130 +
+ + +
+ 9.52% + Branches + 2/21 +
+ + +
+ 28.57% + Functions + 4/14 +
+ + +
+ 28% + Lines + 35/125 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
SfpPackage.ts +
+
47.82%11/23100%2/250%4/847.82%11/23
SfpPackageBuilder.ts +
+
22.42%24/1070%0/190%0/623.52%24/102
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html new file mode 100644 index 000000000..333cd62d0 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html @@ -0,0 +1,343 @@ + + + + + + Code coverage report for src/core/package/packageCreators/CreateDataPackageImpl.ts + + + + + + + + + +
+
+

All files / src/core/package/packageCreators CreateDataPackageImpl.ts

+
+ +
+ 21.62% + Statements + 8/37 +
+ + +
+ 0% + Branches + 0/9 +
+ + +
+ 0% + Functions + 0/11 +
+ + +
+ 26.66% + Lines + 8/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +871x +1x +1x +1x +1x +  +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
+import path from 'path';
+import FileSystem from '../../utils/FileSystem';
+import { CreatePackage } from './CreatePackage';
+import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage';
+import { PackageCreationParams } from '../SfpPackageBuilder';
+ 
+const SFDMU_CONFIG = 'export.json';
+const VLOCITY_CONFIG = 'VlocityComponents.yaml';
+ 
+export default class CreateDataPackageImpl extends CreatePackage {
+    public constructor(
+        protected projectDirectory: string,
+        protected sfpPackage: SfpPackage,
+        protected packageCreationParams: PackageCreationParams,
+        protected logger?: Logger,
+        protected params?: SfpPackageParams
+    ) {
+        super(projectDirectory, sfpPackage, packageCreationParams, logger, params);
+    }
+ 
+    getTypeOfPackage() {
+        return PackageType.Data;
+    }
+ 
+    isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean {
+        let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory));
+ 
+        let hasExportJson = files.find((file) => path.basename(file) === 'export.json');
+ 
+        let hasCsvFile = files.find((file) => path.extname(file) === '.csv');
+ 
+        let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config
+ 
+        Iif(hasYAMLFile) return false;
+ 
+        if (!hasExportJson || !hasCsvFile) return true;
+        else return false;
+    }
+ 
+    preCreatePackage(sfpPackage) {
+        this.validateDataPackage(sfpPackage.resolvedPackageDirectory);
+    }
+ 
+    createPackage(sfpPackage: SfpPackage) {
+        //Do Nothing, as no external calls or processing is required
+    }
+ 
+    postCreatePackage(sfpPackage: SfpPackage) {}
+ 
+    printAdditionalPackageSpecificHeaders() {}
+ 
+    // Validate type of data package and existence of the correct configuration files
+    private validateDataPackage(packageDirectory: string) {
+        const files = FileSystem.readdirRecursive(packageDirectory);
+        let isSfdmu: boolean;
+        let isVlocity: boolean;
+ 
+        for (const file of files) {
+            Iif (path.basename(file) === SFDMU_CONFIG) isSfdmu = true;
+            Iif (path.basename(file) === VLOCITY_CONFIG) isVlocity = true;
+        }
+ 
+        if (isSfdmu && isVlocity) {
+            throw new Error(
+                `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration`
+            );
+        } else if (isSfdmu) {
+            SFPLogger.log(
+                `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`,
+                LoggerLevel.INFO,
+                this.logger
+            );
+        } else if (isVlocity) {
+            SFPLogger.log(
+                `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`,
+                LoggerLevel.INFO,
+                this.logger
+            );
+        } else {
+            throw new Error(
+                `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages`
+            );
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html new file mode 100644 index 000000000..8da0a4057 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for src/core/package/packageCreators/CreateDiffPackageImpl.ts + + + + + + + + + +
+
+

All files / src/core/package/packageCreators CreateDiffPackageImpl.ts

+
+ +
+ 14.41% + Statements + 16/111 +
+ + +
+ 0% + Branches + 0/9 +
+ + +
+ 0% + Functions + 0/22 +
+ + +
+ 15.53% + Lines + 16/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +2721x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
+import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher';
+import SFPStatsSender from '../../stats/SFPStatsSender';
+import PackageEmptyChecker from '../validators/PackageEmptyChecker';
+import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage';
+import { PackageCreationParams } from '../SfpPackageBuilder';
+import SFPOrg from '../../org/SFPOrg';
+import CreateSourcePackageImpl from './CreateSourcePackageImpl';
+import PackageToComponent from '../components/PackageToComponent';
+import path from 'path';
+import * as fs from 'fs-extra';
+import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher';
+import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor';
+import PackageManifest from '../components/PackageManifest';
+import MetadataCount from '../components/MetadataCount';
+import * as rimraf from 'rimraf';
+import Component from '../../dependency/Component';
+import PackageComponentDiff from '../diff/PackageComponentDiff';
+ 
+export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
+    public constructor(
+        protected projectDirectory: string,
+        protected sfpPackage: SfpPackage,
+        protected packageCreationParams: PackageCreationParams,
+        protected logger?: Logger,
+        protected params?: SfpPackageParams
+    ) {
+        super(projectDirectory, sfpPackage, packageCreationParams, logger, params);
+    }
+ 
+    getTypeOfPackage() {
+        return PackageType.Diff;
+    }
+ 
+    printAdditionalPackageSpecificHeaders() {}
+ 
+    isEmptyPackage(projectDirectory: string, packageDirectory: string) {
+        return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory);
+    }
+ 
+    async preCreatePackage(sfpPackage: SfpPackage) {
+        const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub });
+ 
+        //Fetch Baseline commit from DevHub
+        let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg);
+ 
+        if (this.packageCreationParams.revisionFrom) {
+            this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom;
+        } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) {
+            this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName];
+        } else {
+            this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion;
+        }
+ 
+        if (this.packageCreationParams.revisionTo) {
+            this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo;
+        } else {
+            this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion;
+        }
+    }
+ 
+    private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) {
+        let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts();
+        let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts);
+        return packagesInstalledInOrgMappedToCommits;
+    }
+ 
+    public async createPackage(sfpPackage: SfpPackage) {
+        //Unresolved SHAs can be same if the package is not installed in the org or is the same
+        if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) {
+            try {
+                let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff(
+                    this.logger,
+                    this.sfpPackage.packageName,
+                    this.sfpPackage.commitSHAFrom,
+                    this.sfpPackage.commitSHATo,
+                    true
+                );
+                await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff'));
+            } catch (error) {
+                //if both are same after git resolution.. just do nothing, treat is a normal source package
+                if (error.message.includes('Unable to compute diff, as both commits are same')) {
+                    SFPLogger.log(
+                        `Both commits are same, treating it as an empty package`,
+                        LoggerLevel.WARN,
+                        this.logger
+                    );
+                    //Create an empty diff directory to force skip of packages
+                    const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`);
+                    fs.mkdirpSync(diffSrcDir);
+                } else throw error;
+            }
+ 
+            await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger);
+ 
+            await this.replaceSourceWithDiff(
+                sfpPackage.workingDirectory,
+                sfpPackage.packageDirectory,
+                `diff/${sfpPackage.packageDirectory}`
+            );
+ 
+            SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, {
+                package: sfpPackage.packageName,
+                type: sfpPackage.packageType,
+            });
+        }
+    }
+ 
+    postCreatePackage(sfpPackage) {}
+ 
+    private async replaceSourceWithDiff(
+        workingDirectory: string,
+        packageDirectory: string,
+        diffPackageDirectory: string
+    ) {
+        const srcDir = path.join(workingDirectory, packageDirectory);
+        const diffSrcDir = path.join(workingDirectory, diffPackageDirectory);
+ 
+        // Check if src directories exist, if so remove them
+        Iif (fs.pathExistsSync(srcDir)) await fs.remove(srcDir);
+ 
+        // Rename diff/src directory to src
+        if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir);
+        else {
+            // Ensure package directory exists
+            await fs.mkdirpSync(diffSrcDir);
+            await fs.move(diffSrcDir, srcDir);
+        }
+ 
+        //check if destructiveChanges.xml exist in diff directory
+        const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml');
+        if (fs.existsSync(destructiveChangesPath)) {
+            //Move destructiveChanges.xml to diff directory
+            await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml'));
+        }
+        //remove diffSrcDir
+        Iif (fs.pathExistsSync(path.join(workingDirectory, 'diff')))
+            fs.removeSync(path.join(workingDirectory, 'diff'));
+    }
+ 
+    async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) {
+        let packagesMappedToLastKnownCommitId: { [p: string]: string } = {};
+        packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts);
+ 
+        return packagesMappedToLastKnownCommitId;
+ 
+        async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> {
+            const packagesToCommits: { [p: string]: string } = {};
+            let jsonOverrides = {};
+ 
+            // Add an option to override diff package from during debugging
+            // Also useful for when the record is yet to be baselined
+            try {
+                const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8');
+                jsonOverrides = JSON.parse(jsonData);
+            } catch (error) {
+                console.log('No JSON override file found or there is an error reading it');
+            }
+ 
+            // Merge the installedArtifacts data with the JSON overrides
+            if (installedArtifacts) {
+                installedArtifacts.forEach((artifact) => {
+                    packagesToCommits[artifact.Name] = artifact.CommitId__c;
+                });
+            }
+ 
+            // Add additional packages from the JSON overrides that are not in installedArtifacts
+            Object.keys(jsonOverrides).forEach((pkgName) => {
+                if (!packagesToCommits.hasOwnProperty(pkgName)) {
+                    packagesToCommits[pkgName] = jsonOverrides[pkgName];
+                }
+            });
+ 
+            Iif (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG];
+ 
+            return packagesToCommits;
+        }
+    }
+ 
+    private async introspectDiffPackageCreated(
+        sfpPackage: SfpPackage,
+        packageParams: SfpPackageParams,
+        logger: Logger
+    ): Promise<void> {
+        let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff');
+        if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) {
+            let changedComponents = new PackageToComponent(
+                sfpPackage.packageName,
+                path.join(workingDirectory, sfpPackage.packageDirectory)
+            ).generateComponents();
+ 
+            let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher(
+                sfpPackage,
+                changedComponents,
+                logger
+            );
+            let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses();
+ 
+            //Convert again for finding the values in the diff package
+            let sourceToMdapiConvertor = new SourceToMDAPIConvertor(
+                workingDirectory,
+                sfpPackage.packageDescriptor.path,
+                sfpPackage.apiVersion,
+                logger
+            );
+ 
+            let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath;
+ 
+            const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath);
+ 
+            sfpPackage.payload = packageManifest.manifestJson;
+            sfpPackage.apexTestClassses = impactedTestClasses;
+            sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage(
+                changedComponents,
+                sfpPackage.apexClassesSortedByTypes
+            );
+            sfpPackage.isApexFound = packageManifest.isApexInPackage();
+            sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage();
+            sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage();
+            sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles();
+ 
+            sfpPackage.metadataCount = await MetadataCount.getMetadataCount(
+                workingDirectory,
+                sfpPackage.packageDescriptor.path
+            );
+            rimraf.sync(mdapiDirPath);
+        } else {
+            //Souce Diff Directory is empty
+            sfpPackage.payload = {};
+            sfpPackage.apexTestClassses = [];
+            sfpPackage.apexClassWithOutTestClasses = [];
+            sfpPackage.isApexFound = false;
+            sfpPackage.isProfilesFound = false;
+            sfpPackage.isPermissionSetGroupFound = false;
+            sfpPackage.isPayLoadContainTypesSupportedByProfiles = false;
+            sfpPackage.metadataCount = 0;
+        }
+ 
+        function getOnlyChangedClassesFromPackage(
+            changedComponents: Component[],
+            apexClassesSortedByTypes: ApexSortedByType
+        ): string[] {
+            // Check if the parameters are not empty or undefined
+            if (!changedComponents || !apexClassesSortedByTypes) {
+                return undefined;
+            }
+ 
+            // Check if the 'class' property exists in apexClassesSortedByTypes
+            if (!apexClassesSortedByTypes.class) {
+                return undefined;
+            }
+ 
+            // Get the names of all classes in the ApexSortedByType
+            let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name);
+            let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name);
+            const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name);
+            apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name));
+            apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name));
+ 
+            // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass'
+            const filteredComponents = changedComponents.filter(
+                (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass'
+            );
+ 
+            // Extract the fullName property from the filtered components
+            const filteredChangedClasses = filteredComponents.map((component) => component.fullName);
+ 
+            return filteredChangedClasses;
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html new file mode 100644 index 000000000..a1194a353 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html @@ -0,0 +1,523 @@ + + + + + + Code coverage report for src/core/package/packageCreators/CreatePackage.ts + + + + + + + + + +
+
+

All files / src/core/package/packageCreators CreatePackage.ts

+
+ +
+ 8.69% + Statements + 4/46 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 8.88% + Lines + 4/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +1471x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import SFPStatsSender from '../../stats/SFPStatsSender';
+import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage';
+import { PackageCreationParams } from '../SfpPackageBuilder';
+ 
+export abstract class CreatePackage {
+    private startTime: number;
+ 
+    constructor(
+        protected projectDirectory: string,
+        protected sfpPackage: SfpPackage,
+        protected packageCreationParams?: PackageCreationParams,
+        protected logger?: Logger,
+        protected params?: SfpPackageParams
+    ) {
+        //Initialize Params
+        Iif (this.params == null) this.params = {};
+    }
+ 
+    public async exec(): Promise<SfpPackage> {
+        //Capture Start TimegetSFDXProjectConfig
+        this.startTime = Date.now();
+ 
+        //Print Header
+        this.printHeader();
+ 
+        //Check if the package is empty
+        await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path);
+        //Call lifecycle commands
+        await this.preCreatePackage(this.sfpPackage);
+        await this.createPackage(this.sfpPackage);
+        await this.postCreatePackage(this.sfpPackage);
+ 
+        //Add addtional descriptors available
+        this.writeDeploymentStepsToArtifact(this.sfpPackage);
+ 
+        //Send Metrics to Logging system
+        this.sendMetricsWhenSuccessfullyCreated();
+ 
+        return this.sfpPackage;
+    }
+ 
+    abstract getTypeOfPackage();
+ 
+    abstract preCreatePackage(sfpPackage: SfpPackage);
+    abstract createPackage(sfpPackage: SfpPackage);
+    abstract postCreatePackage(sfpPackage: SfpPackage);
+ 
+    private sendMetricsWhenSuccessfullyCreated() {
+        let elapsedTime = Date.now() - this.startTime;
+ 
+        this.sfpPackage.creation_details = {
+            creation_time: elapsedTime,
+            timestamp: Date.now(),
+        };
+ 
+        Iif (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked)
+            SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, {
+                package: this.sfpPackage.package_name,
+                type: this.sfpPackage.package_type,
+            });
+ 
+        SFPStatsSender.logCount('package.created', {
+            package: this.sfpPackage.package_name,
+            type: this.sfpPackage.package_type,
+            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
+        });
+ 
+        SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, {
+            package: this.sfpPackage.package_name,
+            type: this.sfpPackage.package_type,
+            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
+        });
+        SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, {
+            package: this.sfpPackage.package_name,
+            type: this.sfpPackage.package_type,
+            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
+        });
+    }
+ 
+    private writeDeploymentStepsToArtifact(packageDescriptor: any) {
+        if (packageDescriptor.assignPermSetsPreDeployment) {
+            if (packageDescriptor.assignPermSetsPreDeployment instanceof Array)
+                this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment;
+            else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array");
+        }
+ 
+        if (packageDescriptor.assignPermSetsPostDeployment) {
+            if (packageDescriptor.assignPermSetsPostDeployment instanceof Array)
+                this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment;
+            else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array");
+        }
+    }
+ 
+    private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) {
+        if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) {
+            if (this.packageCreationParams.breakBuildIfEmpty)
+                throw new Error(`Package directory ${packageDirectory} is empty`);
+            else this.printEmptyArtifactWarning();
+        }
+    }
+ 
+    abstract isEmptyPackage(projectDirectory: string, packageDirectory: string);
+ 
+    protected printEmptyArtifactWarning() {
+        SFPLogger.printHeaderLine(
+           `WARNING! Empty aritfact encountered`,
+            COLOR_WARNING,
+            LoggerLevel.INFO,
+            this.logger
+        );
+        SFPLogger.log(
+            'Either this folder is empty or the application of .forceignore results in an empty folder',
+            LoggerLevel.INFO,
+            this.logger
+        );
+        SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger);
+        SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger);
+    }
+ 
+    private printHeader() {
+        SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create  package`)}`), LoggerLevel.INFO, this.logger);
+        SFPLogger.log(
+            COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`),
+            LoggerLevel.INFO,
+            this.logger
+        );
+        SFPLogger.log(
+            COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`),
+            LoggerLevel.INFO,
+            this.logger
+        );
+ 
+        SFPLogger.log(
+            COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`),
+            LoggerLevel.INFO,
+            this.logger
+        );
+ 
+        this.printAdditionalPackageSpecificHeaders();
+ 
+        SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger);
+    }
+ 
+    abstract printAdditionalPackageSpecificHeaders();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html new file mode 100644 index 000000000..f997c332d --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/package/packageCreators + + + + + + + + + +
+
+

All files src/core/package/packageCreators

+
+ +
+ 14.43% + Statements + 28/194 +
+ + +
+ 0% + Branches + 0/28 +
+ + +
+ 0% + Functions + 0/40 +
+ + +
+ 15.73% + Lines + 28/178 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CreateDataPackageImpl.ts +
+
21.62%8/370%0/90%0/1126.66%8/30
CreateDiffPackageImpl.ts +
+
14.41%16/1110%0/90%0/2215.53%16/103
CreatePackage.ts +
+
8.69%4/460%0/100%0/78.88%4/45
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html new file mode 100644 index 000000000..e2b29b295 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts + + + + + + + + + +
+
+

All files / src/core/package/propertyFetchers AssignPermissionSetFetcher.ts

+
+ +
+ 75% + Statements + 6/8 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 75% + Lines + 6/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +2x +  +  +4x +4x +  +  +  +  +  +4x +4x +  +  +  +  +4x +  +  + 
import { Logger } from '@flxblio/sfp-logger';
+import SfpPackage from '../SfpPackage';
+import PropertyFetcher from './PropertyFetcher';
+ 
+export default class AssignPermissionSetFetcher implements PropertyFetcher {
+    public getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) {
+        if (packageContents.packageDescriptor.assignPermSetsPreDeployment) {
+            if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) {
+                packageContents.assignPermSetsPreDeployment =
+                    packageContents.packageDescriptor.assignPermSetsPreDeployment;
+            } else Ethrow new Error("Property 'assignPermSetsPreDeployment' must be of type array");
+        }
+ 
+        if (packageContents.packageDescriptor.assignPermSetsPostDeployment) {
+            if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) {
+                packageContents.assignPermSetsPostDeployment =
+                    packageContents.packageDescriptor.assignPermSetsPostDeployment;
+            } else Ethrow new Error("Property 'assignPermSetsPostDeployment' must be of type array");
+        }
+ 
+        return packageContents;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html new file mode 100644 index 000000000..40f04ae24 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts + + + + + + + + + +
+
+

All files / src/core/package/propertyFetchers DestructiveManifestPathFetcher.ts

+
+ +
+ 77.77% + Statements + 7/9 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 77.77% + Lines + 7/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +302x +  +  +2x +  +  +2x +  +  +  +  +  +  +  +  +4x +4x +  +  +  +  +4x +  +  +  +  +4x +  +  + 
import * as fs from 'fs-extra';
+import SfpPackage from '../SfpPackage';
+import PropertyFetcher from './PropertyFetcher';
+import xml2json from '../../utils/xml2json';
+import { Logger } from '@flxblio/sfp-logger';
+ 
+export default class DestructiveManifestPathFetcher implements PropertyFetcher {
+    public async getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) {
+        let destructiveChangesPath: string;
+ 
+        if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) {
+            throw new Error('Project Config (sfdx-project.json) is null');
+        }
+ 
+        if (packageContents.packageDescriptor['destructiveChangePath']) {
+            destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath'];
+            packageContents.destructiveChangesPath = destructiveChangesPath;
+        }
+ 
+        try {
+            if (destructiveChangesPath != null) {
+                packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8'));
+            }
+        } catch (error) {
+            throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest');
+        }
+        return packageContents;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html new file mode 100644 index 000000000..945a5a918 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts + + + + + + + + + +
+
+

All files / src/core/package/propertyFetchers ReconcileProfilePropertyFetcher.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +2x +  +  +2x +  +  +  + 
import SfpPackage from '../SfpPackage';
+import PropertyFetcher from './PropertyFetcher';
+ 
+export default class ReconcilePropertyFetcher implements PropertyFetcher {
+    getsfpProperties(packageContents: SfpPackage, packageLogger?: any) {
+        if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) {
+            packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles;
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html new file mode 100644 index 000000000..1742aac17 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/package/propertyFetchers + + + + + + + + + +
+
+

All files src/core/package/propertyFetchers

+
+ +
+ 78.94% + Statements + 15/19 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 78.94% + Lines + 15/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AssignPermissionSetFetcher.ts +
+
75%6/850%2/4100%1/175%6/8
DestructiveManifestPathFetcher.ts +
+
77.77%7/9100%2/2100%1/177.77%7/9
ReconcileProfilePropertyFetcher.ts +
+
100%2/2100%0/0100%1/1100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html new file mode 100644 index 000000000..681b92b0c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html @@ -0,0 +1,340 @@ + + + + + + Code coverage report for src/core/package/validators/PackageEmptyChecker.ts + + + + + + + + + +
+
+

All files / src/core/package/validators PackageEmptyChecker.ts

+
+ +
+ 12.5% + Statements + 5/40 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 13.51% + Lines + 5/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import path from 'path';
+import { readFileSync, existsSync } from 'fs';
+import FileSystem from '../../utils/FileSystem';
+import ignore from 'ignore';
+ 
+export default class PackageEmptyChecker {
+    public static isToBreakBuildForEmptyDirectory(
+        projectDir: string,
+        sourceDirectory: string,
+        isToBreakBuildIfEmpty: boolean
+    ): {
+        message: string;
+        result: string;
+    } {
+        let directoryToCheck;
+        let status: { message: string; result: string } = {
+            message: '',
+            result: '',
+        };
+ 
+        if (projectDir != null) {
+            directoryToCheck = path.join(projectDir, sourceDirectory);
+        } else directoryToCheck = sourceDirectory;
+ 
+        try {
+            if (!existsSync(directoryToCheck)) {
+                //Folder do not exists, break build
+                if (isToBreakBuildIfEmpty) {
+                    status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
+                    status.result = 'break';
+                } else {
+                    status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
+                    status.result = 'skip';
+                }
+                return status;
+            } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) {
+                if (isToBreakBuildIfEmpty) {
+                    status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
+                    status.result = 'break';
+                } else {
+                    status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
+                    status.result = 'skip';
+                }
+                return status;
+            } else {
+                status.result = 'continue';
+                return status;
+            }
+        } catch (err) {
+            if (err.code === 'ENOENT') {
+                throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist
+            } else if (!isToBreakBuildIfEmpty) {
+                status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`;
+                status.result = 'skip';
+                return status;
+            } else throw err;
+        }
+    }
+ 
+    public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean {
+        let dirToCheck;
+ 
+        if (projectDirectory != null) {
+            dirToCheck = path.join(projectDirectory, sourceDirectory);
+        } else {
+            dirToCheck = sourceDirectory;
+        }
+ 
+        let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false);
+        // Include source directory in filepaths, as it can be a pattern in forceignore
+        files = files.map((file) => path.join(sourceDirectory, file));
+ 
+        let forceignorePath;
+        if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore');
+        else forceignorePath = path.join(process.cwd(), '.forceignore');
+ 
+        // Ignore files that are listed in .forceignore
+        files = ignore()
+            .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'.
+            .filter(files);
+ 
+        if (files == null || files.length === 0) return true;
+        else return false;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html new file mode 100644 index 000000000..6418d85ad --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/core/package/validators + + + + + + + + + +
+
+

All files src/core/package/validators

+
+ +
+ 12.5% + Statements + 5/40 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 13.51% + Lines + 5/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
PackageEmptyChecker.ts +
+
12.5%5/400%0/120%0/313.51%5/37
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html new file mode 100644 index 000000000..4c3703af1 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/core/package/version/Package2VersionFetcher.ts + + + + + + + + + +
+
+

All files / src/core/package/version Package2VersionFetcher.ts

+
+ +
+ 86.95% + Statements + 40/46 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 80% + Functions + 4/5 +
+ + +
+ 86.84% + Lines + 33/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110  +4x +4x +  +  +  +  +4x +8x +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +4x +  +  +  +4x +  +4x +4x +4x +4x +  +  +4x +  +4x +4x +  +  +4x +  +  +4x +3x +6x +6x +6x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +  +1x +1x +1x +1x +  +2x +  +2x +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import QueryHelper from '../../queryHelper/QueryHelper';
+import semver from 'semver';
+ 
+/**
+ * Fetcher for second-generation package version in Dev Hub
+ */
+export default class Package2VersionFetcher {
+    private readonly query: string =
+        'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version ';
+ 
+    constructor(private conn: Connection) {}
+ 
+    /**
+     * Fetch Package2 versions by Package2 Id
+     * Sorts by semantic version, in descending order
+     * @param package2Id
+     * @param versionNumber
+     * @param isValidatedPackages
+     * @returns
+     */
+    async fetchByPackage2Id(
+        package2Id: string,
+        versionNumber?: string,
+        isValidatedPackages?: boolean
+    ): Promise<Package2Version[]> {
+        let query = this.query;
+ 
+        let whereClause: string = `where Package2Id='${package2Id}'  `;
+ 
+        if (versionNumber) {
+            // TODO: validate version number
+            const versions = versionNumber.split('.');
+ 
+            if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `;
+            if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `;
+            if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `;
+            Iif (versions[3]) whereClause += `and BuildNumber=${versions[3]} `;
+        }
+ 
+        if (isValidatedPackages) whereClause += `and ValidationSkipped = false `;
+ 
+        whereClause += `and IsDeprecated = false `;
+        query += whereClause;
+ 
+ 
+        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
+ 
+       
+        if (records.length > 1) {
+            return records.sort((a, b) => {
+                const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`;
+                const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`;
+                return semver.rcompare(v1, v2);
+            });
+        } else return records;
+    }
+ 
+    async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise<Package2Version> {
+        let query = this.query;
+ 
+        let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`;
+        query += whereClause;
+ 
+        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
+        return records[0];
+    }
+ 
+    async fetchByPackageBranchAndName(
+        packageBranch: string, 
+        packageName: string, 
+        versionNumber?: string,
+        ): Promise<Package2Version[]> {
+            
+        let query = this.query;
+ 
+        let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `;
+        if (versionNumber) {
+            // TODO: validate version number
+            const versions = versionNumber.split('.');
+            if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `;
+            if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `;
+            if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `;
+        }
+        query += whereClause;
+ 
+        let orderByClause: string = `order by CreatedDate desc`;
+        query += orderByClause;
+ 
+        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
+        return records;
+ 
+    }        
+}
+ 
+export interface Package2Version {
+    SubscriberPackageVersionId: string;
+    Package2Id: string;
+    Package2: { Name: string };
+    IsPasswordProtected: boolean;
+    IsReleased: boolean;
+    MajorVersion: number;
+    MinorVersion: number;
+    PatchVersion: number;
+    BuildNumber: number;
+    CodeCoverage: { apexCodeCoveragePercentage: number };
+    HasPassedCodeCoverageCheck: boolean;
+    Branch: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html new file mode 100644 index 000000000..6e1bc289c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/core/package/version/PackageVersionUpdater.ts + + + + + + + + + +
+
+

All files / src/core/package/version PackageVersionUpdater.ts

+
+ +
+ 12.5% + Statements + 1/8 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 14.28% + Lines + 1/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SfpPackage from '../SfpPackage';
+ 
+export default class PackageVersionUpdater {
+    public constructor() {}
+ 
+    public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string {
+        if (!sfpPackage.versionNumber) {
+            throw new Error('The package doesnt have a version attribute, Please check your definition');
+        } else {
+            let segments = sfpPackage.versionNumber.split('.');
+            let numberToBeAppended = parseInt(buildNumber);
+ 
+            if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number');
+            else segments[3] = buildNumber;
+            return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`;
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html new file mode 100644 index 000000000..212c33df9 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/package/version + + + + + + + + + +
+
+

All files src/core/package/version

+
+ +
+ 75.92% + Statements + 41/54 +
+ + +
+ 75% + Branches + 9/12 +
+ + +
+ 57.14% + Functions + 4/7 +
+ + +
+ 75.55% + Lines + 34/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Package2VersionFetcher.ts +
+
86.95%40/4690%9/1080%4/586.84%33/38
PackageVersionUpdater.ts +
+
12.5%1/80%0/20%0/214.28%1/7
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html new file mode 100644 index 000000000..548091816 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html @@ -0,0 +1,364 @@ + + + + + + Code coverage report for src/core/permsets/AssignPermissionSetsImpl.ts + + + + + + + + + +
+
+

All files / src/core/permsets AssignPermissionSetsImpl.ts

+
+ +
+ 90.9% + Statements + 30/33 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 90.9% + Lines + 30/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94  +1x +1x +1x +1x +1x +  +1x +  +3x +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +  +  +  +3x +  +  +  +3x +  +  +6x +12x +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +6x +6x +3x +3x +  +  +  +  +  +  +2x +2x +  +  +  +2x +2x +  +  +3x +  +  +  +4x +  +  +  +  +4x +6x +  +  +4x +  +  + 
import { Connection } from '@salesforce/core';
+import child_process = require('child_process');
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import PermissionSetFetcher from './PermissionSetFetcher';
+import { ZERO_BORDER_TABLE } from '../display/TableConstants';
+const Table = require('cli-table');
+ 
+export default class AssignPermissionSetsImpl {
+    constructor(
+        private conn: Connection,
+        private permSets: string[],
+        private project_directory: string,
+        private packageLogger: Logger
+    ) {}
+ 
+    public async exec(): Promise<{
+        successfullAssignments: {
+            username: string;
+            permset: string;
+        }[];
+        failedAssignments: {
+            username: string;
+            permset: string;
+        }[];
+    }> {
+        let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn);
+        let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment();
+ 
+        let failedAssignments: {
+            username: string;
+            permset: string;
+        }[] = [];
+        let successfullAssignments: {
+            username: string;
+            permset: string;
+        }[] = [];
+ 
+        for (let permSet of this.permSets) {
+            let permSetAssignmentMatch = assignedPermSets.find((record) => {
+                return record.PermissionSet.Name === permSet;
+            });
+ 
+            if (permSetAssignmentMatch !== undefined) {
+                // Treat permsets that have already been assigned as successes
+                successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet });
+                continue;
+            }
+ 
+            try {
+                let permsetAssignmentJson: string = child_process.execSync(
+                    `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`,
+                    {
+                        cwd: this.project_directory,
+                        encoding: 'utf8',
+                        stdio: ['pipe', 'pipe', 'inherit'],
+                    }
+                );
+ 
+                let permsetAssignment = JSON.parse(permsetAssignmentJson);
+                if (permsetAssignment.status === 0)
+                    successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet });
+                else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet });
+            } catch (err) {
+                failedAssignments.push({ username: this.conn.getUsername(), permset: permSet });
+            }
+        }
+ 
+        if (successfullAssignments.length > 0) {
+            SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger);
+            this.printPermsetAssignments(successfullAssignments);
+        }
+ 
+        if (failedAssignments.length > 0) {
+            SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger);
+            this.printPermsetAssignments(failedAssignments);
+        }
+ 
+        return { successfullAssignments, failedAssignments };
+    }
+ 
+    private printPermsetAssignments(assignments: { username: string; permset: string }[]) {
+        let table = new Table({
+            head: ['Username', 'Permission Set Assignment'],
+            chars: ZERO_BORDER_TABLE
+        });
+ 
+        assignments.forEach((assignment) => {
+            table.push([assignment.username, assignment.permset]);
+        });
+ 
+        SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html new file mode 100644 index 000000000..b70f990bf --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/core/permsets/PermissionSetFetcher.ts + + + + + + + + + +
+
+

All files / src/core/permsets PermissionSetFetcher.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +1x +  +  +  +  +1x +3x +  +  +3x +  +3x +  +  + 
import { Connection } from '@salesforce/core';
+import QueryHelper from '../queryHelper/QueryHelper';
+ 
+/*
+ * Retrieve Permsets for a user from a target org
+ */
+export default class PermissionSetFetcher {
+    constructor(private username: string, private conn: Connection) {}
+ 
+    public async fetchAllPermsetAssignment() {
+        const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`;
+ 
+        return QueryHelper.query<any>(query, this.conn, false);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html new file mode 100644 index 000000000..017d0ff90 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/core/permsets/PermissionSetGroupUpdateAwaiter.ts + + + + + + + + + +
+
+

All files / src/core/permsets PermissionSetGroupUpdateAwaiter.ts

+
+ +
+ 70.58% + Statements + 12/17 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 66.66% + Lines + 10/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47  +1x +1x +1x +  +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import QueryHelper from '../queryHelper/QueryHelper';
+import { delay } from '../utils/Delay';
+ 
+const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`;
+ 
+export default class PermissionSetGroupUpdateAwaiter {
+    constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {}
+ 
+    async waitTillAllPermissionSetGroupIsUpdated() {
+        SFPLogger.log(
+            `Checking status of permission sets group..`,
+            LoggerLevel.INFO,
+            this.logger
+        );
+        while (true) {
+            try {
+                let records = await QueryHelper.query(psGroupQuery, this.connection, false);
+                if (records.length > 0) {
+                    SFPLogger.log(
+                        `Pausing deployment as ${records.length} PermissionSetGroups are being updated`,
+                        LoggerLevel.INFO,
+                        this.logger
+                    );
+                    SFPLogger.log(
+                        `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`,
+                        LoggerLevel.INFO,
+                        this.logger
+                    );
+                    await delay(this.intervalBetweenRepeats);
+                } else {
+                    SFPLogger.log(
+                        `Proceeding with deployment, as no PermissionSetGroups are being updated`,
+                        LoggerLevel.INFO,
+                        this.logger
+                    );
+                    break;
+                }
+            } catch (error) {
+                SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger);
+                throw error;
+            }
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html new file mode 100644 index 000000000..e48b0995f --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/permsets + + + + + + + + + +
+
+

All files src/core/permsets

+
+ +
+ 85.71% + Statements + 48/56 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 84.9% + Lines + 45/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AssignPermissionSetsImpl.ts +
+
90.9%30/33100%2/2100%5/590.9%30/33
PermissionSetFetcher.ts +
+
100%6/6100%0/0100%2/2100%5/5
PermissionSetGroupUpdateAwaiter.ts +
+
70.58%12/17100%1/1100%2/266.66%10/15
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html new file mode 100644 index 000000000..1f9e646ef --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html @@ -0,0 +1,928 @@ + + + + + + Code coverage report for src/core/project/ProjectConfig.ts + + + + + + + + + +
+
+

All files / src/core/project ProjectConfig.ts

+
+ +
+ 71.59% + Statements + 63/88 +
+ + +
+ 72.72% + Branches + 16/22 +
+ + +
+ 76.92% + Functions + 20/26 +
+ + +
+ 72.5% + Lines + 58/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +2825x +  +5x +5x +5x +  +  +  +  +5x +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +5x +  +1x +  +  +  +  +  +2x +2x +2x +2x +3x +  +  +  +15x +  +  +  +  +1x +  +2x +  +  +  +  +  +  +  +1x +1x +  +5x +  +1x +  +  +  +  +  +7x +7x +  +  +35x +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +13x +  +60x +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +7x +  +6x +5x +  +5x +  +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +24x +  +23x +  +  +  +  +24x +  +23x +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +1x +1x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +4x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const fs = require('fs-extra');
+import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
+import _ from 'lodash';
+import { PackageType } from '../package/SfpPackage';
+let path = require('path');
+ 
+/**
+ * Helper functions for retrieving info from project config
+ */
+export default class ProjectConfig {
+    /**
+     * Returns 0H Id of package from project config
+     * @param projectConfig
+     * @param sfdxPackage
+     */
+    public static getPackageId(projectConfig: any, sfdxPackage: string) {
+        if (projectConfig['packageAliases']?.[sfdxPackage]) {
+            return projectConfig['packageAliases'][sfdxPackage];
+        } else {
+            throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added');
+        }
+    }
+ 
+    /**
+     * Returns package names, as an array of strings
+     * @param projectDirectory
+     */
+    public static getAllPackages(projectDirectory: string): string[] {
+        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
+        let sfdxpackages = [];
+        projectConfig['packageDirectories'].forEach((pkg) => {
+            //Only push packages that have package and versionNumber, ignore everything else
+            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package);
+        });
+        return sfdxpackages;
+    }
+ 
+    public static getAllExternalPackages(
+        projectConfig: any
+    ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] {
+        let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = [];
+        let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
+        const packageAliases = projectConfig.packageAliases || {};
+        Object.entries(packageAliases).forEach(([key, value]) => {
+            if (
+                !_.find(
+                    packagesInCurrentDirectory,
+                    (elem) => {
+                        return elem.package == key;
+                    },
+                    0
+                )
+            )
+                externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string });
+        });
+        return externalPackages;
+    }
+ 
+    /**
+     * Returns package names from projectConfig, as an array of strings
+     * @param projectDirectory
+     */
+    public static getAllPackagesFromProjectConfig(projectConfig: any): string[] {
+        let sfdxpackages = [];
+        projectConfig.packageDirectories.forEach((pkg) => {
+            //Only push packages that have package and versionNumber, ignore everything else
+            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package);
+        });
+        return sfdxpackages;
+    }
+ 
+    public static getAllPackagesAndItsDependencies(
+        projectConfig: any
+    ): Map<string, { package: string; versionNumber?: string }[]> {
+        let pkgWithDependencies = new Map<string, { package: string; versionNumber?: string }[]>();
+        let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
+        for (let pkg of packages) {
+            if (pkg.dependencies) {
+                pkgWithDependencies.set(pkg.package, pkg.dependencies);
+            }
+        }
+        return pkgWithDependencies;
+    }
+ 
+    public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] {
+        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
+        let sfdxpackages = [];
+        projectConfig.packageDirectories?.forEach((pkg) => {
+            //Only push packages that have package and versionNumber, ignore everything else
+            Iif (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg);
+        });
+        return sfdxpackages;
+    }
+ 
+    public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] {
+        let sfdxpackages = [];
+        projectConfig.packageDirectories?.forEach((pkg) => {
+            //Only push packages that have package and versionNumber, ignore everything else
+            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg);
+        });
+        return sfdxpackages;
+    }
+ 
+    /**
+     * Returns package manifest as JSON object
+     * @param projectDirectory
+     */
+    public static getSFDXProjectConfig(projectDirectory: string): any {
+        let projectConfigJSON: string;
+ 
+        if (projectDirectory) {
+            projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json');
+        } else {
+            projectConfigJSON = 'sfdx-project.json';
+        }
+ 
+        try {
+            return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8'));
+        } catch (error) {
+            throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`);
+        }
+    }
+ 
+    /**
+     * Returns type of package
+     * @param projectConfig
+     * @param sfdxPackage
+     */
+    public static getPackageType(
+        projectConfig: any,
+        sfdxPackage: string
+    ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff {
+        let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
+ 
+        if (projectConfig['packageAliases']?.[sfdxPackage]) {
+            return PackageType.Unlocked;
+        } else {
+            if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data;
+            else Iif(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff 
+            else
+             return PackageType.Source;
+        }
+    }
+ 
+    /**
+     * Returns package descriptor from package manifest at project directory
+     * @param projectDirectory
+     * @param sfdxPackage
+     */
+    public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any {
+        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
+ 
+        let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
+ 
+        return sfdxPackageDescriptor;
+    }
+ 
+    /**
+     * Returns package descriptor from project config JSON object
+     * @param sfdxPackage
+     * @param projectConfig
+     */
+    public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) {
+        let sfdxPackageDescriptor: any;
+ 
+        if (sfdxPackage) {
+            projectConfig['packageDirectories'].forEach((pkg) => {
+                if (sfdxPackage == pkg['package']) {
+                    sfdxPackageDescriptor = pkg;
+                }
+            });
+        }
+ 
+        if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`);
+ 
+        return sfdxPackageDescriptor;
+    }
+ 
+    /**
+     * Returns descriptor of default package
+     * @param projectDirectory
+     */
+    public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any {
+        let packageDirectory: string;
+        let sfdxPackageDescriptor: any;
+ 
+        let projectConfig = this.getSFDXProjectConfig(projectDirectory);
+ 
+        //Return the default package directory
+        projectConfig['packageDirectories'].forEach((pkg) => {
+            if (pkg['default'] == true) {
+                packageDirectory = pkg['path'];
+                sfdxPackageDescriptor = pkg;
+            }
+        });
+ 
+        Iif (packageDirectory == null) throw new Error('Package or package directory not exist');
+        else return sfdxPackageDescriptor;
+    }
+ 
+    /**
+     * Returns pruned package manifest, containing sfdxPackage only
+     * @param projectDirectory
+     * @param sfdxPackage
+     */
+    public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any {
+        const projectConfig = this.getSFDXProjectConfig(projectDirectory);
+ 
+        return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage);
+    }
+ 
+    /**
+     * Returns pruned package manifest, containing sfdxPackage only
+     * @param projectConfig
+     * @param sfdxPackage
+     */
+    public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any {
+        if (sfdxPackage) {
+            let i = projectConfig['packageDirectories'].length;
+            while (i--) {
+                if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) {
+                    projectConfig['packageDirectories'].splice(i, 1);
+                }
+            }
+        } else {
+            let i = projectConfig['packageDirectories'].length;
+            while (i--) {
+                if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) {
+                    projectConfig['packageDirectories'].splice(i, 1);
+                }
+            }
+        }
+        projectConfig['packageDirectories'][0]['default'] = true; //add default = true
+        return projectConfig;
+    }
+ 
+    /**
+     * Returns pruned package manifest, containing sfdxPackages only
+     * @param projectConfig
+     * @param sfdxPackages
+     */
+    public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any {
+        let revisedPackageDirectory = [];
+        let originalPackageDirectory = projectConfig['packageDirectories'];
+        for (let pkg of originalPackageDirectory) {
+            for (const sfdxPackage of sfdxPackages) {
+                if (pkg.name == sfdxPackage) {
+                    pkg.default = false;
+                    revisedPackageDirectory.push(pkg);
+                }
+            }
+        }
+        projectConfig['packageDirectories'][0]['default'] = true; //add default = true
+        projectConfig.packageDirectories = revisedPackageDirectory;
+        return projectConfig;
+    }
+ 
+    /**
+     * Returns pruned package manifest, containing sfdxPackages only
+     * @param projectConfig
+     * @param sfdxPackages
+     */
+    public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any {
+        const projectConfig = this.getSFDXProjectConfig(projectDirectory);
+        return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages);
+    }
+ 
+   
+ 
+    public static async updateProjectConfigWithDependencies(
+        projectConfig: any,
+        dependencyMap: Map<string, { package: string; versionNumber?: string }[]>
+    ) {
+        let updatedprojectConfig = await _.cloneDeep(projectConfig);
+        updatedprojectConfig.packageDirectories.map((pkg) => {
+            return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) });
+        });
+ 
+        return updatedprojectConfig;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html new file mode 100644 index 000000000..dabdc67c8 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for src/core/project/UserDefinedExternalDependency.ts + + + + + + + + + +
+
+

All files / src/core/project UserDefinedExternalDependency.ts

+
+ +
+ 83.33% + Statements + 20/24 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 83.33% + Lines + 20/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +622x +2x +2x +2x +  +  +  +  +  +2x +  +  +  +9x +9x +9x +9x +  +  +  +  +  +  +2x +2x +2x +  +2x +  +2x +  +  +2x +  +  +  +  +  +  +2x +2x +  +  +  +7x +  +7x +  +  +  +  +  +  +  +  +  +  +  +7x +  +  + 
import SFPLogger from '@flxblio/sfp-logger';
+import { Connection, LoggerLevel } from '@salesforce/core';
+import _ from 'lodash';
+import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver';
+ 
+/**
+ * Functions to deal with externalDependencyMap supplied by the user
+ * to aid in resolving transitive dependencies
+ */
+export default class UserDefinedExternalDependencyMap {
+   
+ 
+    public  fetchDependencyEntries(projectConfig: any) {
+        if (projectConfig.plugins?.sfp?.externalDependencyMap) {
+            let externalDependencyMap = projectConfig.plugins.sfp.externalDependencyMap;
+            SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG);
+            return externalDependencyMap;
+        }
+        else
+         Ereturn {};
+    }
+ 
+    public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) {
+        let externalDependencies = [];
+        let updatedProjectConfig = await _.cloneDeep(projectConfig);
+        let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null);
+ 
+        let externalDependencyMap = this.fetchDependencyEntries(projectConfig);
+ 
+        let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions();
+ 
+        for (let externalPackage2 of externalPackage2s) {
+            externalDependencies.push(externalPackage2.name);
+        }
+        for (let dependency of externalDependencies) {
+            if (!Object.keys(externalDependencyMap).includes(dependency)) {
+                externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }];
+            }
+        }
+        updatedProjectConfig.plugins.sfp.externalDependencyMap = externalDependencyMap;
+        return updatedProjectConfig;
+    }
+ 
+    public async cleanupEntries(projectConfig: any) {
+        let updatedProjectConfig = await _.cloneDeep(projectConfig);
+        if (updatedProjectConfig?.plugins?.sfp?.externalDependencyMap) {
+            const externalDependencyMap = updatedProjectConfig.plugins.sfp.externalDependencyMap;
+            for (let externalPackage of Object.keys(externalDependencyMap)) {
+                if (externalDependencyMap[externalPackage][0].package == '') {
+                    delete externalDependencyMap[externalPackage];
+                } else if (
+                    externalDependencyMap[externalPackage][0].package != '' &&
+                    externalDependencyMap[externalPackage][0].versionNumber == ''
+                ) {
+                    delete externalDependencyMap[externalPackage][0].versionNumber;
+                }
+            }
+        }
+        return updatedProjectConfig;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html new file mode 100644 index 000000000..36a0329c5 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/project + + + + + + + + + +
+
+

All files src/core/project

+
+ +
+ 74.1% + Statements + 83/112 +
+ + +
+ 73.07% + Branches + 19/26 +
+ + +
+ 79.31% + Functions + 23/29 +
+ + +
+ 75% + Lines + 78/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ProjectConfig.ts +
+
71.59%63/8872.72%16/2276.92%20/2672.5%58/80
UserDefinedExternalDependency.ts +
+
83.33%20/2475%3/4100%3/383.33%20/24
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html new file mode 100644 index 000000000..92a33a04a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/core/queryHelper/ChunkCollection.ts + + + + + + + + + +
+
+

All files / src/core/queryHelper ChunkCollection.ts

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38  +  +  +  +  +  +  +  +2x +3x +3x +  +3x +3x +  +  +1x +  +  +7x +  +6x +6x +  +1x +  +  +1x +1x +1x +1x +  +  +  +2x +  +2x + 
 
+ 
+/**
+ * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars)
+ * @param collection values in SOQL WHERE clause
+ * @param chunkSize default is 4000
+ * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000
+ */
+export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] {
+  const result: string[][] = [];
+  chunkSize = chunkSize - offset;
+ 
+  let chunk: string[] = [];
+  let numberOfCharsInChunk: number = 0;
+  for (const elem of collection) {
+    if (elem.length + 2 > chunkSize) {
+      throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`);
+    }
+ 
+    const commasAndQuotes = 2*(chunk.length+1) + chunk.length;
+    if (numberOfCharsInChunk + elem.length +  commasAndQuotes <= chunkSize) {
+      chunk.push(elem);
+      numberOfCharsInChunk += elem.length;
+    } else {
+      result.push(chunk);
+ 
+      // Create new chunk
+      chunk = [];
+      numberOfCharsInChunk = 0;
+      chunk.push(elem);
+      numberOfCharsInChunk += elem.length;
+    }
+  }
+ 
+  result.push(chunk);
+ 
+  return result;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html new file mode 100644 index 000000000..ba125afc0 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/core/queryHelper/QueryHelper.ts + + + + + + + + + +
+
+

All files / src/core/queryHelper QueryHelper.ts

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +11x +  +11x +  +21x +  +  +27x +20x +  +19x +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+ 
+const retry = require('async-retry');
+ 
+export default class QueryHelper {
+    static async query<T>(query: string, conn: Connection, isTooling: boolean): Promise<T[]> {
+        return retry(
+            async (bail) => {
+                let records;
+                if (isTooling) records = (await conn.tooling.query(query)).records;
+                else records = (await conn.query(query)).records;
+ 
+                return records;
+            },
+            { retries: 3, minTimeout: 2000 }
+        );
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html new file mode 100644 index 000000000..8d953ebe0 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/queryHelper + + + + + + + + + +
+
+

All files src/core/queryHelper

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ChunkCollection.ts +
+
100%16/16100%2/2100%1/1100%16/16
QueryHelper.ts +
+
100%7/7100%2/2100%2/2100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html new file mode 100644 index 000000000..87c6f55b8 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/core/stats/NativeMetricSender.ts + + + + + + + + + +
+
+

All files / src/core/stats NativeMetricSender.ts

+
+ +
+ 16.66% + Statements + 1/6 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 16.66% + Lines + 1/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Logger } from '@flxblio/sfp-logger';
+ 
+export abstract class NativeMetricSender {
+    constructor(protected logger: Logger) {}
+ 
+    abstract initialize(apiHost: string, apiKey: string): void;
+ 
+    abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void;
+ 
+    abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void;
+ 
+    protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] {
+        if (tags != null && !Array.isArray(tags)) {
+            let transformedTagArray: string[] = [];
+            for (const [key, value] of Object.entries(tags)) {
+                transformedTagArray.push(`${key}:${value}`);
+            }
+            return transformedTagArray;
+        }
+        return tags as string[];
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html new file mode 100644 index 000000000..5f8563238 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html @@ -0,0 +1,427 @@ + + + + + + Code coverage report for src/core/stats/SFPStatsSender.ts + + + + + + + + + +
+
+

All files / src/core/stats SFPStatsSender.ts

+
+ +
+ 18.42% + Statements + 7/38 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 20% + Lines + 7/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +1151x +1x +1x +  +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import StatsDClient, { ClientOptions, StatsD } from 'hot-shots';
+import * as fs from 'fs-extra';
+import { EOL } from 'os';
+import { NativeMetricSender } from './NativeMetricSender';
+import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender';
+import { Logger } from '@flxblio/sfp-logger';
+import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender';
+import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender';
+ 
+export default class SFPStatsSender {
+    private static client: StatsD;
+    private static metricsLogger;
+    private static nativeMetricsSender: NativeMetricSender;
+ 
+    static initialize(port: string, host: string, protocol: string) {
+        let options: ClientOptions = {
+            host: host,
+            port: port == null ? 8125 : Number(port),
+            protocol: protocol == 'tcp' ? 'tcp' : 'udp',
+            prefix: 'sfp.',
+        };
+        SFPStatsSender.client = new StatsDClient(options);
+    }
+ 
+    static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) {
+        switch (type) {
+            case 'DataDog':
+                this.nativeMetricsSender = new DataDogMetricsSender(logger);
+                this.nativeMetricsSender.initialize(apiHost, apiKey);
+                break;
+ 
+            case 'NewRelic':
+                this.nativeMetricsSender = new NewRelicMetricSender(logger);
+                this.nativeMetricsSender.initialize(apiHost, apiKey);
+                break;
+                
+            case 'Splunk':
+                this.nativeMetricsSender = new SplunkMetricSender(logger);
+                this.nativeMetricsSender.initialize(apiHost, apiKey);
+                break;
+ 
+            default:
+                throw new Error('Invalid Metric Type');
+        }
+    }
+ 
+    static initializeLogBasedMetrics() {
+        try {
+            fs.mkdirpSync('.sfp/logs');
+            SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`;
+        } catch (error) {
+            console.log('Unable to initiate Log based metrics', error);
+        }
+    }
+ 
+    static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) {
+        Iif (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags);
+ 
+        //Native Datadog integration
+        if (SFPStatsSender.nativeMetricsSender != null) {
+            SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags);
+        }
+ 
+        let metrics = {
+            metric: `sfp.${metric}`,
+            type: `timers`,
+            value: elapsedMilliSeconds,
+            timestamp: Date.now(),
+            tags: tags,
+        };
+        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
+    }
+ 
+    static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) {
+        Iif (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags);
+ 
+        //Native Metrics integration
+        if (SFPStatsSender.nativeMetricsSender != null) {
+            SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags);
+        }
+ 
+        let metrics = {
+            metric: `sfp.${metric}`,
+            type: `guage`,
+            value: value,
+            timestamp: Date.now(),
+            tags: tags,
+        };
+        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
+    }
+ 
+    static logCount(metric: string, tags?: { [key: string]: string } | string[]) {
+        Iif (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags);
+ 
+        //Native Metrics integration
+        if (SFPStatsSender.nativeMetricsSender != null) {
+            SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags);
+        }
+ 
+        let metrics = {
+            metric: `sfp.${metric}`,
+            type: `count`,
+            timestamp: Date.now(),
+            tags: tags,
+        };
+        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
+    }
+ 
+    static logMetrics(key: any, logger?: any) {
+        if (logger) {
+            fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8');
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html new file mode 100644 index 000000000..afbdc9391 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/core/stats + + + + + + + + + +
+
+

All files src/core/stats

+
+ +
+ 18.18% + Statements + 8/44 +
+ + +
+ 0% + Branches + 0/13 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 19.51% + Lines + 8/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
NativeMetricSender.ts +
+
16.66%1/60%0/20%0/216.66%1/6
SFPStatsSender.ts +
+
18.42%7/380%0/110%0/720%7/35
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html new file mode 100644 index 000000000..a847ecda3 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html @@ -0,0 +1,241 @@ + + + + + + Code coverage report for src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts + + + + + + + + + +
+
+

All files / src/core/stats/nativeMetricSenderImpl DataDogMetricSender.ts

+
+ +
+ 26.66% + Statements + 4/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 26.66% + Lines + 4/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +531x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { BufferedMetricsLogger } from 'datadog-metrics';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { NativeMetricSender } from '../NativeMetricSender';
+ 
+export class DataDogMetricsSender extends NativeMetricSender {
+    constructor(logger: Logger) {
+        super(logger);
+    }
+ 
+    private nativeDataDogMetricsLogger: BufferedMetricsLogger;
+ 
+    public initialize(apiHost: string, apiKey: string) {
+        try {
+            this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({
+                apiHost: apiHost,
+                apiKey: apiKey,
+                prefix: 'sfp.',
+                flushIntervalSeconds: 0,
+            });
+        } catch (error) {
+            SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger);
+        }
+    }
+ 
+    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
+        try {
+            let transformedTags = this.transformTagsToStringArray(tags);
+            this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags);
+            this.nativeDataDogMetricsLogger.flush();
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to transmit metrics for metric ${metric} due to` + error,
+                LoggerLevel.TRACE,
+                this.logger
+            );
+        }
+    }
+ 
+    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
+        try {
+            let transformedTags = this.transformTagsToStringArray(tags);
+            this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags);
+            this.nativeDataDogMetricsLogger.flush();
+        } catch (error) {
+            SFPLogger.log(
+                `Unable to transmit metrics for metric ${metric} due to` + error,
+                LoggerLevel.TRACE,
+                this.logger
+            );
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html new file mode 100644 index 000000000..1387b7910 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html @@ -0,0 +1,283 @@ + + + + + + Code coverage report for src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts + + + + + + + + + +
+
+

All files / src/core/stats/nativeMetricSenderImpl NewRelicMetricSender.ts

+
+ +
+ 15.38% + Statements + 4/26 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 15.38% + Lines + 4/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +671x +  +1x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { NativeMetricSender } from '../NativeMetricSender';
+import { telemetry } from '@newrelic/telemetry-sdk';
+import {
+    CountMetric,
+    GaugeMetric,
+    MetricBatch,
+    MetricClient,
+} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics';
+import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+ 
+export class NewRelicMetricSender extends NativeMetricSender {
+    constructor(logger: Logger) {
+        super(logger);
+    }
+ 
+    private nrMetricClient: telemetry.metrics.MetricClient;
+ 
+    //Ignore API Host, as newrelic sdk doesnt need it
+    public initialize(apiHost: string, apiKey: string) {
+        try {
+            this.nrMetricClient = new MetricClient({ apiKey: apiKey });
+        } catch (error) {
+            SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger);
+        }
+    }
+ 
+    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
+        metric = `sfp.${metric}`;
+        const guageMetric = new GaugeMetric(metric, value);
+        guageMetric.attributes = tags as { [key: string]: string };
+        const batch = new MetricBatch({}, Date.now(), 1);
+        batch.addMetric(guageMetric);
+        this.nrMetricClient.send(batch, (error, response, body) => {
+            if (response) {
+                SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger);
+            }
+            Iif (error)
+                SFPLogger.log(
+                    `Unable to transmit metrics for metric ${metric} due to` + error,
+                    LoggerLevel.WARN,
+                    this.logger
+                );
+        });
+    }
+ 
+    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
+        metric = `sfp.${metric}`;
+        const countMetric = new CountMetric(metric);
+        countMetric.record(1);
+        countMetric.attributes = tags as { [key: string]: string };
+        const batch = new MetricBatch({}, Date.now(), 1);
+        batch.addMetric(countMetric);
+ 
+        this.nrMetricClient.send(batch, (error, response, body) => {
+            if (response) {
+                SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger);
+            }
+            Iif (error)
+                SFPLogger.log(
+                    `Unable to transmit metrics for metric ${metric} due to` + error,
+                    LoggerLevel.WARN,
+                    this.logger
+                );
+        });
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html new file mode 100644 index 000000000..c6f36719b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts + + + + + + + + + +
+
+

All files / src/core/stats/nativeMetricSenderImpl SplunkMetricSender.ts

+
+ +
+ 25% + Statements + 4/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 25% + Lines + 4/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +501x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { NativeMetricSender } from '../NativeMetricSender';
+import axios ,{AxiosInstance} from 'axios';
+ 
+ 
+ 
+export class SplunkMetricSender extends NativeMetricSender {
+    constructor(logger: Logger) {
+        super(logger);
+    }
+ 
+    private instance: AxiosInstance;
+ 
+    public initialize(apiHost: string, apiKey: string) {
+          this.instance = axios.create({
+            baseURL: apiHost,
+            headers: {'Authorization': apiKey, 'Content-Type': 'application/json'}
+          });
+    }
+ 
+    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
+        metric = `sfp.${metric}`;
+        const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}};
+        this.instance.post('', JSON.stringify(payload))
+        .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)})
+        .catch((error) => {
+            SFPLogger.log(
+                `Unable to transmit metrics for metric ${metric} due to` + error,
+                LoggerLevel.WARN,
+                this.logger
+            );
+        });
+    }
+ 
+    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
+        metric = `sfp.${metric}`;
+        const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}};
+        this.instance.post('', JSON.stringify(payload))
+        .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)})
+        .catch((error) => {
+            SFPLogger.log(
+                `Unable to transmit metrics for metric ${metric} due to` + error,
+                LoggerLevel.WARN,
+                this.logger
+            );
+        });
+    }
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html new file mode 100644 index 000000000..810a21c05 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/core/stats/nativeMetricSenderImpl + + + + + + + + + +
+
+

All files src/core/stats/nativeMetricSenderImpl

+
+ +
+ 21.05% + Statements + 12/57 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/18 +
+ + +
+ 21.05% + Lines + 12/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
DataDogMetricSender.ts +
+
26.66%4/15100%0/00%0/426.66%4/15
NewRelicMetricSender.ts +
+
15.38%4/260%0/20%0/615.38%4/26
SplunkMetricSender.ts +
+
25%4/16100%0/00%0/825%4/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html new file mode 100644 index 000000000..0f431c7ea --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for src/core/utils/AliasList.ts + + + + + + + + + +
+
+

All files / src/core/utils AliasList.ts

+
+ +
+ 33.33% + Statements + 3/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 33.33% + Lines + 3/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +174x +  +  +4x +  +  +  +  +  +4x +  +  +  +  +  +  + 
import { StateAggregator } from '@salesforce/core';
+ 
+ 
+export async function convertAliasToUsername(alias: string) {
+    const stateAggregator = await StateAggregator.getInstance();
+    await stateAggregator.orgs.readAll();
+    return await stateAggregator.aliases.resolveUsername(alias)
+}
+ 
+export async function convertUsernameToAlias(username: string) {
+   
+    const stateAggregator = await StateAggregator.getInstance();
+    await stateAggregator.orgs.readAll();
+    return await stateAggregator.aliases.resolveAlias(username)
+  
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html new file mode 100644 index 000000000..280a18edc --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/core/utils/ChunkArray.ts + + + + + + + + + +
+
+

All files / src/core/utils ChunkArray.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +2x +2x +2x +  +  +9x +  +  +2x +  + 
export function chunkArray(perChunk: number, inputArray: any[]): Array<any> {
+    let chunks = [],
+        i = 0,
+        n = inputArray.length;
+ 
+    while (i < n) {
+        chunks.push(inputArray.slice(i, (i += perChunk)));
+    }
+ 
+    return chunks;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html new file mode 100644 index 000000000..6cd22982a --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for src/core/utils/Delay.ts + + + + + + + + + +
+
+

All files / src/core/utils Delay.ts

+
+ +
+ 33.33% + Statements + 1/3 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 50% + Lines + 1/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +  +  + 
export async function delay(ms: number = 0) {
+    return new Promise((resolve) => setTimeout(resolve, ms));
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html new file mode 100644 index 000000000..1b96d2715 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html @@ -0,0 +1,241 @@ + + + + + + Code coverage report for src/core/utils/FileSystem.ts + + + + + + + + + +
+
+

All files / src/core/utils FileSystem.ts

+
+ +
+ 94.11% + Statements + 16/17 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +532x +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +4x +  +4x +  +4x +24x +  +24x +  +  +22x +  +22x +  +  +  +  +  +5x +  +5x +  +  +20x +  +  +12x +  +12x +  +  +  +  +  +4x +  +  + 
import fs = require('fs-extra');
+import path = require('path');
+ 
+export default class FileSystem {
+    /**
+     * List nested files within a directory
+     * @param directory
+     * @param includeDirectories
+     * @returns
+     */
+    static readdirRecursive(
+        searchDirectory: string,
+        includeDirectories: boolean = false,
+        isAbsolute: boolean = false
+    ): string[] {
+        const result: string[] = [];
+ 
+        Iif (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`);
+ 
+        (function readdirRecursiveHandler(directory: string): void {
+            const files: string[] = fs.readdirSync(directory);
+ 
+            files.forEach((file) => {
+                let filepath: string;
+                if (isAbsolute) {
+                    filepath = path.resolve(directory, file);
+                } else {
+                    filepath = path.join(directory, file);
+                }
+ 
+                if (fs.lstatSync(filepath).isDirectory()) {
+                    if (includeDirectories) {
+                        if (isAbsolute) {
+                            result.push(path.resolve(filepath));
+                        } else {
+                            result.push(path.relative(searchDirectory, filepath));
+                        }
+                    }
+                    readdirRecursiveHandler(filepath);
+                } else {
+                    if (isAbsolute) {
+                        result.push(path.resolve(filepath));
+                    } else {
+                        result.push(path.relative(searchDirectory, filepath));
+                    }
+                }
+            });
+        })(searchDirectory);
+ 
+        return result;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html new file mode 100644 index 000000000..f31d63f49 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html @@ -0,0 +1,697 @@ + + + + + + Code coverage report for src/core/utils/Fileutils.ts + + + + + + + + + +
+
+

All files / src/core/utils Fileutils.ts

+
+ +
+ 9.09% + Statements + 7/77 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 9.09% + Lines + 7/77 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +2051x +1x +1x +1x +  +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const fs = require('fs');
+const path = require('path');
+const _ = require('lodash');
+const os = require('os');
+ 
+const SEP = /\/|\\/;
+ 
+export const PLUGIN_CACHE_FOLDER = 'sfpowerkit';
+ 
+export default class FileUtils {
+    /**
+     * Delete file or directories recursively from the project
+     * @param deletedComponents Files or directories to delete
+     */
+    public static deleteComponents(deletedComponents: string[]) {
+        deletedComponents.forEach((component) => {
+            if (fs.existsSync(component)) {
+                if (fs.lstatSync(component).isDirectory()) {
+                    FileUtils.deleteFolderRecursive(component);
+                } else {
+                    fs.unlinkSync(component);
+                }
+            }
+        });
+    }
+    /**
+     * Load all files from the given folder with the given extension
+     * @param folder the folder from which files wille be loaded
+     * @param extension File extension to load.
+     */
+    public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] {
+        let result: string[] = [];
+        let pathExists = fs.existsSync(folder);
+        let folderName = path.basename(folder);
+        if (!pathExists) {
+            console.log('Folder does not exist:', folderName);
+            return result;
+        }
+        let content: string[] = fs.readdirSync(folder);
+        content.forEach((file) => {
+            let curFile = path.join(folder, file);
+            let stats = fs.statSync(curFile);
+            if (stats.isFile()) {
+                if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') {
+                    result.push(curFile);
+                }
+            } else if (stats.isDirectory()) {
+                let files: string[] = this.getAllFilesSync(curFile, extension);
+                result = _.concat(result, files);
+            }
+        });
+        return result;
+    }
+ 
+    public static getGlobalCacheDir() {
+        let homedir = os.homedir();
+        let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER;
+        if (!fs.existsSync(configDir)) {
+            console.log('Config folder does not exists, Creating Folder');
+            fs.mkdirSync(configDir);
+        }
+ 
+        return configDir;
+    }
+ 
+    /**
+     * Get the cache path for the given cache file name
+     * @param fileName
+     */
+    public static getGlobalCachePath(fileName: string) {
+        let homedir = os.homedir();
+        let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER;
+        if (!fs.existsSync(configDir)) {
+            console.log('Config folder does not exists, Creating Folder');
+            fs.mkdirSync(configDir);
+        }
+        return configDir + path.sep + fileName;
+    }
+ 
+    /**
+     * Create a folder path recursively
+     * @param targetDir
+     * @param param1
+     */
+    public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) {
+        const sep = path.sep;
+        const initDir = path.isAbsolute(targetDir) ? sep : '';
+        const baseDir = isRelativeToScript ? __dirname : '.';
+ 
+        targetDir.split(sep).reduce((parentDir, childDir) => {
+            const curDir = path.resolve(baseDir, parentDir, childDir);
+            try {
+                fs.mkdirSync(curDir);
+            } catch (err) {
+                if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') {
+                    throw err;
+                }
+            }
+            return curDir;
+        }, initDir);
+    }
+    /**
+     * Get the file name withoud extension
+     * @param filePath file path
+     * @param extension extension
+     */
+    public static getFileNameWithoutExtension(filePath: string, extension?: string): string {
+        let fileParts = filePath.split(SEP);
+        let fileName = fileParts[fileParts.length - 1];
+        if (extension) {
+            fileName = fileName.substr(0, fileName.lastIndexOf(extension));
+        } else {
+            fileName = fileName.substr(0, fileName.indexOf('.'));
+        }
+        return fileName;
+    }
+ 
+    /**
+     * Copu folder recursively
+     * @param src source folder to copy
+     * @param dest destination folder
+     */
+    public static copyRecursiveSync(src, dest) {
+        let exists = fs.existsSync(src);
+        if (exists) {
+            let stats = fs.statSync(src);
+            let isDirectory = stats.isDirectory();
+            if (isDirectory) {
+                exists = fs.existsSync(dest);
+                if (!exists) {
+                    fs.mkdirSync(dest);
+                }
+                fs.readdirSync(src).forEach(function (childItemName) {
+                    FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
+                });
+            } else {
+                fs.copyFileSync(src, dest);
+            }
+        }
+    }
+    /**
+     * Get path to a given folder base on the parent folder
+     * @param src  Parent folder
+     * @param foldername folder to build the path to
+     */
+    public static getFolderPath(src, foldername) {
+        let exists = fs.existsSync(src);
+        let toReturn = '';
+        if (exists) {
+            let stats = fs.statSync(src);
+            let isDirectory = stats.isDirectory();
+            if (isDirectory) {
+                let childs = fs.readdirSync(src);
+                for (let i = 0; i < childs.length; i++) {
+                    let childItemName = childs[i];
+                    if (childItemName === foldername) {
+                        toReturn = path.join(src, childItemName);
+                    } else {
+                        let childStat = fs.statSync(path.join(src, childItemName));
+                        if (childStat.isDirectory()) {
+                            toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername);
+                        }
+                    }
+                    if (toReturn !== '') {
+                        break;
+                    }
+                }
+            }
+        }
+        return toReturn;
+    }
+ 
+    /**
+     * Delete a folder and its content recursively
+     * @param folder folder to delete
+     */
+    public static deleteFolderRecursive(folder) {
+        if (fs.existsSync(folder)) {
+            fs.readdirSync(folder).forEach(function (file, index) {
+                let curPath = path.join(folder, file);
+                if (fs.lstatSync(curPath).isDirectory()) {
+                    // recurse
+                    //console.log("Delete recursively");
+                    FileUtils.deleteFolderRecursive(curPath);
+                } else {
+                    // delete file
+                    //console.log("Delete file "+ curPath);
+                    fs.unlinkSync(curPath);
+                }
+            });
+            //console.log("delete folder "+ folder);
+            fs.rmdirSync(folder);
+        }
+    }
+    public static makefolderid(length): string {
+        var result = '';
+        var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+        var charactersLength = characters.length;
+        for (var i = 0; i < length; i++) {
+            result += characters.charAt(Math.floor(Math.random() * charactersLength));
+        }
+        return result;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html new file mode 100644 index 000000000..2589703d5 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for src/core/utils/ObjectCRUDHelper.ts + + + + + + + + + +
+
+

All files / src/core/utils ObjectCRUDHelper.ts

+
+ +
+ 42.1% + Statements + 8/19 +
+ + +
+ 25% + Branches + 2/8 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 43.75% + Lines + 7/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39  +  +4x +  +4x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +3x +1x +  +  +  +  +  + 
import { Connection } from '@salesforce/core';
+import { Record, SaveResult } from 'jsforce';
+import { isArray } from 'lodash';
+ 
+const retry = require('async-retry');
+ 
+export default class ObjectCRUDHelper {
+    static async updateRecord(conn: Connection, sObject: string, record: Record): Promise<string> {
+        return retry(
+            async (bail) => {
+                let result = await conn.update(sObject, record);
+                if (isArray(result)) {
+                    let isAllRecordsSucceeded = true;
+                    for (const individualResult of result as SaveResult[]) {
+                        if (!individualResult.success) {
+                            isAllRecordsSucceeded = false;
+                        }
+                    }
+                    if (isAllRecordsSucceeded) return 'All records updated';
+                    else throw new Error('Some records have been failed to update');
+                } else if ((result as SaveResult).success) return (result as SaveResult).id;
+                else bail();
+            },
+            { retries: 3, minTimeout: 2000 }
+        );
+    }
+ 
+    static async createRecord(conn: Connection, sObject: string, record: Record): Promise<string> {
+        return retry(
+            async (bail) => {
+                let result = await conn.create(sObject, record);
+                if (result.success) return result.id;
+                else bail();
+            },
+            { retries: 3, minTimeout: 2000 }
+        );
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html new file mode 100644 index 000000000..710eb3af9 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/core/utils/VersionNumberConverter.ts + + + + + + + + + +
+
+

All files / src/core/utils VersionNumberConverter.ts

+
+ +
+ 90% + Statements + 9/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 90% + Lines + 9/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +  +  +  +  +2x +103x +  +103x +  +103x +  +  +103x +  +  +  +  +  +  +  +  +103x +103x +  +309x +  +  +103x +  +  +  +  + 
/**
+ * Converts build-number dot delimeter to hyphen
+ * If dot delimeter does not exist, returns input
+ * @param version
+ */
+export default function convertBuildNumDotDelimToHyphen(version: string) {
+    let convertedVersion = version;
+ 
+    let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version);
+    if (version[indexOfBuildNumDelimiter] === '.') {
+        convertedVersion =
+            version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1);
+    }
+    return convertedVersion;
+}
+ 
+/**
+ * Get the index of the build-number delimeter
+ * Returns null if unable to find index of delimeter
+ * @param version
+ */
+function getIndexOfBuildNumDelimeter(version: string) {
+    let numOfDelimetersTraversed: number = 0;
+    for (let i = 0; i < version.length; i++) {
+        if (!Number.isInteger(parseInt(version[i], 10))) {
+            numOfDelimetersTraversed++;
+        }
+        if (numOfDelimetersTraversed === 3) {
+            return i;
+        }
+    }
+    return null;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html new file mode 100644 index 000000000..2d484f6b0 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/core/utils/extractDomainFromUrl.ts + + + + + + + + + +
+
+

All files / src/core/utils extractDomainFromUrl.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +  +  +1x +7x +4x +4x +  + 
/**
+ * Extracts domain name from full URL string
+ * @param url
+ * @returns
+ */
+export default function extractDomainFromUrl(url: string): string {
+    if (!url) return url;
+    const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
+    return matches && matches[1];
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html new file mode 100644 index 000000000..5f2b9c407 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html @@ -0,0 +1,236 @@ + + + + + + Code coverage report for src/core/utils + + + + + + + + + +
+
+

All files src/core/utils

+
+ +
+ 39.86% + Statements + 61/153 +
+ + +
+ 20.68% + Branches + 6/29 +
+ + +
+ 36.36% + Functions + 12/33 +
+ + +
+ 40.41% + Lines + 59/146 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AliasList.ts +
+
33.33%3/9100%0/00%0/233.33%3/9
ChunkArray.ts +
+
100%6/6100%0/0100%1/1100%6/6
Delay.ts +
+
33.33%1/30%0/10%0/250%1/2
FileSystem.ts +
+
94.11%16/170%0/3100%3/3100%16/16
Fileutils.ts +
+
9.09%7/770%0/120%0/159.09%7/77
ObjectCRUDHelper.ts +
+
42.1%8/1925%2/850%2/443.75%7/16
VersionNumberConverter.ts +
+
90%9/10100%0/0100%2/290%9/10
extractDomainFromUrl.ts +
+
100%5/5100%3/3100%1/1100%4/4
xml2json.ts +
+
85.71%6/750%1/2100%3/3100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html new file mode 100644 index 000000000..fed7111ec --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/core/utils/xml2json.ts + + + + + + + + + +
+
+

All files / src/core/utils xml2json.ts

+
+ +
+ 85.71% + Statements + 6/7 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +114x +  +4x +12x +12x +12x +12x +  +  +  + 
const xmlParser = require('xml2js').Parser({ explicitArray: false });
+ 
+export default function xml2json(xml) {
+    return new Promise<any>((resolve, reject) => {
+        xmlParser.parseString(xml, function (err, json) {
+            Iif (err) reject(err);
+            else resolve(json);
+        });
+    });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html new file mode 100644 index 000000000..856f28547 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for src/impl/changelog/CommitUpdater.ts + + + + + + + + + +
+
+

All files / src/impl/changelog CommitUpdater.ts

+
+ +
+ 88.23% + Statements + 15/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 88.23% + Lines + 15/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +  +  +  +1x +  +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +10x +  +  +  +6x +76x +  +  +2x +  +  +  +  +2x +2x +2x +  +  +  +  +4x +  +  +  +  +  +  +  +4x +  +  +  +  + 
import { Release } from './ReleaseChangelog';
+import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces';
+import ReadPackageChangelog from './ReadPackageChangelog';
+ 
+export default class CommitUpdater {
+    constructor(
+        private latestRelease: Release,
+        private artifactsToLatestCommitId: { [p: string]: string },
+        private packagesToChangelogFilePaths: { [p: string]: string },
+        private readPackageChangelog: ReadPackageChangelog
+    ) {}
+ 
+    /**
+     * Generate commits in latest release, for each artifact
+     * Also sets new latestCommitId for artifacts
+     * @returns
+     */
+    update(): void {
+        for (let artifact of this.latestRelease['artifacts']) {
+            let packageChangelog: PackageChangelog = this.readPackageChangelog(
+                this.packagesToChangelogFilePaths[artifact.name]
+            );
+ 
+            // Set new latestCommitId
+            artifact['latestCommitId'] = packageChangelog['commits'][0]['commitId'];
+ 
+            let indexOfLatestCommitId;
+            if (this.artifactsToLatestCommitId?.[artifact.name]) {
+                indexOfLatestCommitId = packageChangelog['commits'].findIndex(
+                    (commit) => commit['commitId'] === this.artifactsToLatestCommitId[artifact.name]
+                );
+                if (indexOfLatestCommitId === -1) {
+                    console.log(
+                        `Cannot find commit Id ${this.artifactsToLatestCommitId[artifact.name]} in ${
+                            artifact.name
+                        } changelog`
+                    );
+                    console.log('Assuming that there are no changes...');
+                    artifact['commits'] = [];
+                    continue;
+                }
+            }
+ 
+            if (indexOfLatestCommitId > 0) {
+                artifact['commits'] = packageChangelog['commits'].slice(0, indexOfLatestCommitId);
+            } else if (indexOfLatestCommitId === 0) {
+                // Artifact verison has not changed
+                artifact['commits'] = [];
+                // Skip to next artifact
+                continue;
+            } else if (indexOfLatestCommitId === undefined) {
+                // Artifact was not in previous release
+                artifact['commits'] = packageChangelog['commits'];
+            }
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html new file mode 100644 index 000000000..0608096da --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html @@ -0,0 +1,466 @@ + + + + + + Code coverage report for src/impl/changelog/OrgsUpdater.ts + + + + + + + + + +
+
+

All files / src/impl/changelog OrgsUpdater.ts

+
+ +
+ 82.35% + Statements + 28/34 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 81.25% + Lines + 26/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128  +1x +  +1x +  +  +  +  +4x +4x +4x +4x +  +4x +  +  +2x +  +  +  +  +  +  +2x +  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +3x +  +  +2x +2x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +1x +1x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  + 
import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog';
+import lodash = require('lodash');
+ 
+export default class OrgsUpdater {
+    private latestReleaseId: ReleaseId;
+    private idOfReleaseWithMatchingHashId: ReleaseId;
+ 
+    constructor(
+        private releaseChangelog: ReleaseChangelog,
+        private latestRelease: Release,
+        private org: string,
+        private releaseWithMatchingHashId: Release
+    ) {
+        this.latestReleaseId = this.convertReleaseToId(this.latestRelease);
+ 
+        if (this.releaseWithMatchingHashId) {
+            this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId);
+        }
+    }
+ 
+    update(): void {
+        if (!this.idOfReleaseWithMatchingHashId) {
+            if (this.releaseChangelog.orgs) {
+                let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
+ 
+                if (org) {
+                    org.releases.push(this.latestReleaseId);
+                    org.latestRelease = org.releases[org.releases.length - 1];
+                    org.retryCount = 0;
+                } else {
+                    this.releaseChangelog.orgs.push({
+                        name: this.org,
+                        releases: [this.latestReleaseId],
+                        latestRelease: this.latestReleaseId,
+                        retryCount: 0,
+                    });
+                }
+            } else {
+                // for backwards-compatibility with pre-existing changelogs
+                this.releaseChangelog.orgs = [
+                    {
+                        name: this.org,
+                        releases: [this.latestReleaseId],
+                        latestRelease: this.latestReleaseId,
+                        retryCount: 0,
+                    },
+                ];
+            }
+            console.log(
+                `Updating ${this.org} org with`,
+                this.latestRelease.names[this.latestRelease.names.length - 1] +
+                    '-' +
+                    this.latestRelease.buildNumber +
+                    `(0)`
+            );
+        } else {
+            // Update orgs
+            let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
+ 
+            if (org) {
+                let indexOfReleaseToOrg = org.releases.findIndex(
+                    (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId
+                );
+                if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) {
+                    if (indexOfReleaseToOrg >= 0) {
+                        // Update release names in releases to org
+                        org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
+                        org.releases[indexOfReleaseToOrg].date = new Date().toUTCString();
+                    } else {
+                        // Add releaseId in releases to org
+                        org.releases.push(this.idOfReleaseWithMatchingHashId);
+                    }
+ 
+                    // Update latest release
+                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
+                    org.retryCount = 0;
+                } else {
+                    if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) {
+                        org.retryCount++;
+                    } else {
+                        org.retryCount = 0;
+                    }
+ 
+                    // Update releases names in releases to org & latestRelease
+                    org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
+                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
+                }
+ 
+                console.log(
+                    `Updating ${this.org} org with`,
+                    org.latestRelease.names[org.latestRelease.names.length - 1] +
+                        '-' +
+                        org.latestRelease.buildNumber +
+                        `(${org.retryCount})`
+                );
+            } else {
+                // new org
+                this.releaseChangelog.orgs.push({
+                    name: this.org,
+                    releases: [this.idOfReleaseWithMatchingHashId],
+                    latestRelease: this.idOfReleaseWithMatchingHashId,
+                    retryCount: 0,
+                });
+                console.log(
+                    `Updating ${this.org} org with`,
+                    `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${
+                        this.idOfReleaseWithMatchingHashId.buildNumber
+                    }(0)`
+                );
+            }
+        }
+    }
+ 
+    /**
+     * Convert Release to Release Id
+     * @param release
+     * @returns
+     */
+    private convertReleaseToId(release: Release): ReleaseId {
+        let releaseNames = [...release.names]; // Shallow copy
+        return {
+            names: releaseNames,
+            buildNumber: release.buildNumber,
+            hashId: release.hashId,
+        };
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html new file mode 100644 index 000000000..5a2260a30 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html @@ -0,0 +1,208 @@ + + + + + + Code coverage report for src/impl/changelog/WorkItemUpdater.ts + + + + + + + + + +
+
+

All files / src/impl/changelog WorkItemUpdater.ts

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +421x +  +  +  +1x +1x +  +  +  +  +  +  +  +2x +2x +  +  +  +24x +24x +  +  +  +3x +3x +  +1x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
+import { Release } from './ReleaseChangelog';
+ 
+ 
+export default class WorkItemUpdater {
+    constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {}
+ 
+    /**
+     * Generate work items in latest release
+     */
+    update(): void {
+        for (const workItemFilter of this.workItemFilters) {
+     
+        let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi');
+        SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger);
+ 
+        for (let artifact of this.latestRelease['artifacts']) {
+            for (let commit of artifact['commits']) {
+                let commitMessage: String = commit['message'] + '\n' + commit['body'];
+                let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex);
+                if (workItems) {
+                    for (let item of workItems) {
+                        if (this.latestRelease['workItems'][item] == null) {
+                            this.latestRelease['workItems'][item] = new Set<string>();
+                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
+                        } else {
+                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
+                        }
+                    }
+                }
+            }
+        }
+       }
+ 
+        // Convert each work item Set to Array
+        // Enables JSON stringification of work item
+        for (let key in this.latestRelease['workItems']) {
+            this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html new file mode 100644 index 000000000..1d197cc97 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/impl/changelog + + + + + + + + + +
+
+

All files src/impl/changelog

+
+ +
+ 87.5% + Statements + 56/64 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 86.66% + Lines + 52/60 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CommitUpdater.ts +
+
88.23%15/17100%0/0100%3/388.23%15/17
OrgsUpdater.ts +
+
82.35%28/34100%0/0100%6/681.25%26/32
WorkItemUpdater.ts +
+
100%13/13100%0/0100%2/2100%11/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html new file mode 100644 index 000000000..07347a6ee --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/impl/dependency/ShrinkImpl.ts + + + + + + + + + +
+
+

All files / src/impl/dependency ShrinkImpl.ts

+
+ +
+ 100% + Statements + 27/27 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +821x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +2x +  +2x +  +2x +  +2x +  +  +  +2x +2x +  +2x +  +2x +  +  +  +2x +  +  +12x +  +  +  +  +12x +12x +  +  +22x +  +  +  +  +  +  +  +36x +  +24x +  +  +  +  +18x +  +  +  +  +  +  +  +12x +  +  +  +  +  +12x +  +10x +  +  +  +  +  + 
import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver';
+import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger';
+import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
+import _ from 'lodash';
+import { Connection } from '@salesforce/core';
+const Table = require('cli-table');
+import UserDefinedExternalDependency from '../../core/project/UserDefinedExternalDependency';
+ 
+export default class ShrinkImpl {
+    private dependencyMap;
+    private updatedprojectConfig: any;
+ 
+ 
+    constructor(private connToDevHub:Connection, private logger?: Logger) {}
+    public async shrinkDependencies(sfdxProjectConfig: any): Promise<any> {
+        SFPLogger.log('Shrinking Project Dependencies...', LoggerLevel.INFO, this.logger);
+ 
+        this.updatedprojectConfig = _.cloneDeep(sfdxProjectConfig);
+ 
+        const transitiveDependencyResolver = new TransitiveDependencyResolver(
+            sfdxProjectConfig
+        );
+ 
+        this.dependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies();
+        await this.resolveAndShrinkDependencies(this.dependencyMap);
+ 
+        this.updatedprojectConfig = new UserDefinedExternalDependency().addDependencyEntries(  this.updatedprojectConfig, this.connToDevHub);
+ 
+        return this.updatedprojectConfig;
+    }
+ 
+    private async resolveAndShrinkDependencies(dependencyMap: any) {
+        let pkgs = [...dependencyMap.keys()];
+ 
+        for (let pkg of pkgs) {
+            SFPLogger.log(
+                COLOR_HEADER(`cleaning up dependencies for package:`) + COLOR_KEY_MESSAGE(pkg),
+                LoggerLevel.TRACE,
+                this.logger
+            );
+            let dependenencies = dependencyMap.get(pkg);
+            let updatedDependencies = _.cloneDeep(dependenencies);
+            for (let dependency of dependencyMap.get(pkg)) {
+                if (dependencyMap.get(dependency.package)) {
+                    SFPLogger.log(
+                        `Shrinking ${dependencyMap.get(dependency.package).length} dependencies from package ${
+                            dependency.package
+                        }`,
+                        LoggerLevel.TRACE,
+                        this.logger
+                    );
+                    for (let temp of dependencyMap.get(dependency.package)) {
+                        for (let i = 0; i < updatedDependencies.length; i++) {
+                            if (updatedDependencies[i].package == temp.package) {
+                                updatedDependencies.splice(i, 1);
+                            }
+                        }
+                    }
+                } else {
+                    SFPLogger.log(
+                        `no dependency found for ${dependency.package} in the map`,
+                        LoggerLevel.TRACE,
+                        this.logger
+                    );
+                }
+            }
+            //Update project config
+            await this.updateProjectConfig(pkg, updatedDependencies);
+        }
+ 
+    }
+ 
+    private async updateProjectConfig(packageName: string, fixedDependencies: any) {
+        this.updatedprojectConfig.packageDirectories.map((pkg) => {
+            if (pkg.package == packageName) {
+                return Object.assign(pkg, { dependencies: fixedDependencies });
+            }
+        });
+    }
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html new file mode 100644 index 000000000..810c9907b --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/impl/dependency + + + + + + + + + +
+
+

All files src/impl/dependency

+
+ +
+ 100% + Statements + 27/27 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ShrinkImpl.ts +
+
100%27/27100%0/0100%5/5100%26/26
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html new file mode 100644 index 000000000..2d2dee9d6 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/impl/parallelBuilder/BuildCollections.ts + + + + + + + + + +
+
+

All files / src/impl/parallelBuilder BuildCollections.ts

+
+ +
+ 89.47% + Statements + 17/19 +
+ + +
+ 71.42% + Branches + 5/7 +
+ + +
+ 71.42% + Functions + 5/7 +
+ + +
+ 88.23% + Lines + 15/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +661x +1x +  +  +  +  +1x +  +  +  +  +4x +  +  +  +2x +  +  +  +  +  +  +  +4x +  +4x +  +  +7x +6x +  +6x +  +  +  +9x +2x +  +1x +  +  +  +  +5x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import UndirectedGraph from './UndirectedGraph';
+import ProjectConfig from '../../core/project/ProjectConfig';
+ 
+/**
+ * Class for the manipulation of package build collections
+ */
+export default class BuildCollections {
+    // Disconnected undirected graph is used to represent collections and their packages
+    private _graph: UndirectedGraph;
+ 
+    constructor(projectDirectory: string) {
+        this.createGraphOfBuildCollections(projectDirectory);
+    }
+ 
+    get graph(): UndirectedGraph {
+        return this._graph;
+    }
+ 
+    /**
+     * Constructs graph representation of collections
+     * @param projectDirectory
+     */
+    private createGraphOfBuildCollections(projectDirectory: string) {
+        this._graph = new UndirectedGraph();
+ 
+        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
+        for (let pkg of projectConfig.packageDirectories) {
+            if (pkg.buildCollection) {
+                if (pkg.buildCollection instanceof Array) {
+                    if (!this._graph.adjacencyList[pkg.package]) this._graph.addVertex(pkg.package);
+ 
+                    pkg.buildCollection.forEach((packageInCollection) => {
+                        // Create vertex for package in collection if it doesn't exist yet
+                        if (!this._graph.adjacencyList[packageInCollection]) {
+                            // Verify that the package in collection is a valid package, before adding to adj. list
+                            if (projectConfig.packageDirectories.find((elem) => elem.package === packageInCollection)) {
+                                this._graph.addVertex(packageInCollection);
+                            } else
+                                throw new Error(
+                                    `Package '${packageInCollection}' in collection ${pkg.buildCollection} is not a valid package`
+                                );
+                        }
+ 
+                        this._graph.addEdge(pkg.package, packageInCollection);
+                    });
+                } else
+                    throw new Error(
+                        `Property 'buildCollection' must be of type Array. Received ${pkg.buildCollection}`
+                    );
+            }
+        }
+    }
+ 
+    /**
+     * Returns list of packages contained in the same collection as the package
+     * @param pkg
+     */
+    listPackagesInCollection(pkg: string): string[] {
+        return this._graph.dfs(pkg);
+    }
+ 
+    isPackageInACollection(pkg: string): boolean {
+        return this._graph.adjacencyList[pkg] ? true : false;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html new file mode 100644 index 000000000..4b19b9f40 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for src/impl/parallelBuilder/UndirectedGraph.ts + + + + + + + + + +
+
+

All files / src/impl/parallelBuilder UndirectedGraph.ts

+
+ +
+ 96.55% + Statements + 28/29 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +502x +  +  +  +12x +  +  +  +17x +  +  +  +22x +1x +  +  +  +17x +16x +14x +  +13x +13x +  +  +  +  +  +  +  +4x +4x +4x +  +4x +19x +19x +18x +18x +18x +  +15x +  +  +  +  +3x +  +  + 
export default class UndirectedGraph {
+    private _adjacencyList: { [p: string]: string[] };
+ 
+    constructor() {
+        this._adjacencyList = {};
+    }
+ 
+    get adjacencyList() {
+        return this._adjacencyList;
+    }
+ 
+    addVertex(name: string) {
+        if (!this._adjacencyList[name]) this._adjacencyList[name] = [];
+        else throw new Error(`Vertex with name '${name}' already exists`);
+    }
+ 
+    addEdge(vertexA: string, vertexB: string): void {
+        if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex');
+        if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`);
+        if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`);
+ 
+        if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB);
+        if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA);
+    }
+ 
+    /**
+     * Returns vertices in graph, using depth-first search from the starting vertex
+     * @param start
+     */
+    dfs(start: string): string[] {
+        const vertices: string[] = [];
+        const visited: { [p: string]: boolean } = {};
+        const adjacencyList = this._adjacencyList;
+ 
+        (function dfsHandler(vertex) {
+            Iif (!vertex) return null;
+            if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`);
+            visited[vertex] = true;
+            vertices.push(vertex);
+            adjacencyList[vertex].forEach((neighbor) => {
+                if (!visited[neighbor]) {
+                    return dfsHandler(neighbor);
+                }
+            });
+        })(start);
+ 
+        return vertices;
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html new file mode 100644 index 000000000..e5f2f31fe --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/impl/parallelBuilder + + + + + + + + + +
+
+

All files src/impl/parallelBuilder

+
+ +
+ 93.75% + Statements + 45/48 +
+ + +
+ 81.25% + Branches + 13/16 +
+ + +
+ 85.71% + Functions + 12/14 +
+ + +
+ 94.73% + Lines + 36/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
BuildCollections.ts +
+
89.47%17/1971.42%5/771.42%5/788.23%15/17
UndirectedGraph.ts +
+
96.55%28/2988.88%8/9100%7/7100%21/21
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html new file mode 100644 index 000000000..a9eaa72c8 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/impl/release/ReleaseDefinition.ts + + + + + + + + + +
+
+

All files / src/impl/release ReleaseDefinition.ts

+
+ +
+ 70% + Statements + 21/30 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 66.66% + Functions + 4/6 +
+ + +
+ 70% + Lines + 21/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +5x +5x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +5x +5x +  +  +  +4x +  +  +4x +6x +  +  +  +  +  +  +4x +  +  +  + 
import ReleaseDefinitionSchema from './ReleaseDefinitionSchema';
+import Ajv from 'ajv';
+const yaml = require('js-yaml');
+import lodash = require('lodash');
+import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId';
+import Git from '../../core/git/Git';
+import { ConsoleLogger } from '@flxblio/sfp-logger';
+const fs = require('fs-extra');
+const path = require('path');
+ 
+export default class ReleaseDefinition {
+    get releaseDefinition() {
+        // Return clone of releaseDefinition for immutability
+        return lodash.cloneDeep(this._releaseDefinitionSchema);
+    }
+    private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) {
+        this.validateReleaseDefinition(this._releaseDefinitionSchema);
+ 
+        // Workaround for jsonschema not supporting validation based on dependency value
+        if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled)
+            throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'");
+ 
+        if (this._releaseDefinitionSchema.packageDependencies) {
+            this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies);
+        }
+    }
+ 
+    public static async loadReleaseDefinition(pathToReleaseDefinition: string) {
+        //Check whether path contains gitRef
+        let releaseDefinitionSchema: ReleaseDefinitionSchema;
+        try {
+            if (pathToReleaseDefinition.includes(':')) {
+                let git = await Git.initiateRepo();
+                await git.fetch();
+                let releaseFile = await git.show([pathToReleaseDefinition]);
+                releaseDefinitionSchema = yaml.load(releaseFile);
+            } else {
+                releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8'));
+            }
+        } catch (error) {
+            throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`);
+        }
+ 
+        let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema);
+        return releaseDefinition;
+    }
+ 
+    private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) {
+        for (let pkg in packageDependencies) {
+            packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]);
+        }
+    }
+ 
+    private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void {
+        let schema = fs.readJSONSync(
+            path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'),
+            { encoding: 'UTF-8' }
+        );
+ 
+        let validator = new Ajv({ allErrors: true }).compile(schema);
+        let validationResult = validator(releaseDefinition);
+ 
+        if (!validationResult) {
+            let errorMsg: string =
+                `Release definition does not meet schema requirements, ` +
+                `found ${validator.errors.length} validation errors:\n`;
+ 
+            validator.errors.forEach((error, errorNum) => {
+                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
+                    error.params,
+                    null,
+                    4
+                )}`;
+            });
+ 
+            throw new Error(errorMsg);
+        }
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html new file mode 100644 index 000000000..f3bef4d7c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/impl/release + + + + + + + + + +
+
+

All files src/impl/release

+
+ +
+ 70% + Statements + 21/30 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 66.66% + Functions + 4/6 +
+ + +
+ 70% + Lines + 21/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ReleaseDefinition.ts +
+
70%21/30100%3/366.66%4/670%21/30
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html new file mode 100644 index 000000000..06f4f0138 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ProjectValidation.ts +
+
100%26/26100%3/3100%7/7100%26/26
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html new file mode 100644 index 000000000..65aadb36d --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/utils/Get18DigitSalesforceId.ts + + + + + + + + + +
+
+

All files / src/utils Get18DigitSalesforceId.ts

+
+ +
+ 7.69% + Statements + 1/13 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 8.33% + Lines + 1/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export default function get18DigitSalesforceId(recordId: string) {
+    if (recordId && recordId.length === 18) {
+        return recordId;
+    } else if (recordId && recordId.length === 15) {
+        let addon = '';
+        for (let block = 0; block < 3; block++) {
+            let loop = 0;
+            for (let position = 0; position < 5; position++) {
+                let current = recordId.charAt(block * 5 + position);
+                Iif (current >= 'A' && current <= 'Z') loop += 1 << position;
+            }
+            addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop);
+        }
+        let convertedId = recordId + addon;
+        return convertedId;
+    } else {
+        throw new Error(`Invalid Salesforce Id ${recordId}`);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html new file mode 100644 index 000000000..c1385a4ad --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 7.69% + Statements + 1/13 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 8.33% + Lines + 1/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Get18DigitSalesforceId.ts +
+
7.69%1/130%0/70%0/18.33%1/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html new file mode 100644 index 000000000..510da83a6 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for utils/Get18DigitSalesforceId.ts + + + + + + + + + +
+
+

All files / utils Get18DigitSalesforceId.ts

+
+ +
+ 7.69% + Statements + 1/13 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 8.33% + Lines + 1/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export default function get18DigitSalesforceId(recordId: string) {
+    if (recordId && recordId.length === 18) {
+        return recordId;
+    } else if (recordId && recordId.length === 15) {
+        let addon = '';
+        for (let block = 0; block < 3; block++) {
+            let loop = 0;
+            for (let position = 0; position < 5; position++) {
+                let current = recordId.charAt(block * 5 + position);
+                Iif (current >= 'A' && current <= 'Z') loop += 1 << position;
+            }
+            addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop);
+        }
+        let convertedId = recordId + addon;
+        return convertedId;
+    } else {
+        throw new Error(`Invalid Salesforce Id ${recordId}`);
+    }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html new file mode 100644 index 000000000..88cd8cf7c --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for utils + + + + + + + + + +
+
+

All files utils

+
+ +
+ 7.69% + Statements + 1/13 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 8.33% + Lines + 1/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Get18DigitSalesforceId.ts +
+
7.69%1/130%0/70%0/18.33%1/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov.info b/packages/sfpowerscripts-cli/coverage/lcov.info new file mode 100644 index 000000000..89a657895 --- /dev/null +++ b/packages/sfpowerscripts-cli/coverage/lcov.info @@ -0,0 +1,4285 @@ +TN: +SF:src/ProjectValidation.ts +FN:13,(anonymous_7) +FN:19,(anonymous_8) +FN:26,(anonymous_9) +FN:40,(anonymous_10) +FN:41,(anonymous_11) +FN:62,(anonymous_12) +FN:63,(anonymous_13) +FNF:7 +FNH:7 +FNDA:8,(anonymous_7) +FNDA:4,(anonymous_8) +FNDA:7,(anonymous_9) +FNDA:2,(anonymous_10) +FNDA:4,(anonymous_11) +FNDA:2,(anonymous_12) +FNDA:4,(anonymous_13) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:14,8 +DA:15,8 +DA:16,8 +DA:20,4 +DA:21,4 +DA:22,4 +DA:24,1 +DA:26,1 +DA:27,7 +DA:35,1 +DA:36,1 +DA:41,2 +DA:42,4 +DA:44,1 +DA:51,1 +DA:63,2 +DA:64,4 +DA:66,4 +DA:71,1 +LF:26 +LH:26 +BRDA:68,0,0,4 +BRDA:68,0,1,2 +BRDA:68,0,2,1 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/core/apex/ApexClassFetcher.ts +FN:6,(anonymous_1) +FN:14,(anonymous_2) +FN:19,(anonymous_3) +FNF:3 +FNH:1 +FNDA:1,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:15,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:26,0 +LF:11 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/apex/ApexTriggerFetcher.ts +FN:6,(anonymous_1) +FN:14,(anonymous_2) +FN:19,(anonymous_3) +FNF:3 +FNH:1 +FNDA:1,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:15,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:26,0 +LF:11 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts +FN:6,(anonymous_1) +FN:13,(anonymous_2) +FN:28,(anonymous_3) +FNF:3 +FNH:1 +FNDA:1,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:24,0 +DA:26,0 +DA:28,0 +DA:29,0 +DA:31,0 +DA:37,0 +DA:40,0 +LF:11 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/apex/coverage/IndividualClassCoverage.ts +FN:4,(anonymous_6) +FN:6,(anonymous_7) +FN:13,(anonymous_8) +FN:19,(anonymous_9) +FN:27,(anonymous_10) +FN:46,(anonymous_11) +FNF:6 +FNH:5 +FNDA:9,(anonymous_6) +FNDA:2,(anonymous_7) +FNDA:8,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:4,(anonymous_10) +FNDA:13,(anonymous_11) +DA:1,2 +DA:3,2 +DA:4,9 +DA:10,2 +DA:13,2 +DA:14,8 +DA:18,2 +DA:19,0 +DA:20,0 +DA:24,2 +DA:37,0 +DA:38,0 +DA:41,4 +DA:46,4 +DA:47,13 +DA:50,4 +DA:51,2 +DA:58,2 +LF:18 +LH:14 +BRDA:18,0,0,0 +BRDA:18,1,0,2 +BRDA:18,1,1,0 +BRDA:50,2,0,2 +BRDA:50,2,1,2 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/core/apextest/ApexTestSuite.ts +FN:8,(anonymous_1) +FN:10,(anonymous_2) +FNF:2 +FNH:2 +FNDA:3,(anonymous_1) +FNDA:3,(anonymous_2) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,3 +DA:11,3 +DA:16,3 +DA:18,3 +DA:20,2 +DA:23,1 +DA:25,1 +DA:26,1 +DA:27,1 +LF:14 +LH:14 +BRDA:18,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/core/apextest/ImpactedApexTestClassFetcher.ts +FN:9,(anonymous_7) +FN:16,(anonymous_8) +FN:24,(anonymous_9) +FNF:3 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:18,0 +DA:19,0 +DA:23,0 +DA:24,0 +DA:27,0 +DA:28,0 +DA:32,0 +DA:33,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:43,0 +DA:51,0 +DA:56,0 +DA:57,0 +DA:62,0 +DA:66,0 +DA:71,0 +DA:73,0 +DA:74,0 +DA:81,0 +DA:86,0 +DA:88,0 +LF:33 +LH:6 +BRDA:50,0,0,0 +BRDA:50,0,1,0 +BRDA:62,1,0,0 +BRDA:66,2,0,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:src/core/artifacts/ArtifactFetcher.ts +FN:16,(anonymous_6) +FN:46,(anonymous_7) +FN:66,(anonymous_8) +FN:101,(anonymous_9) +FN:135,(anonymous_10) +FN:160,(anonymous_11) +FN:162,(anonymous_12) +FN:168,(anonymous_13) +FN:180,(anonymous_14) +FN:187,(anonymous_15) +FN:188,(anonymous_16) +FN:198,(anonymous_17) +FN:209,(anonymous_18) +FNF:13 +FNH:5 +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:3,(anonymous_10) +FNDA:1,(anonymous_11) +FNDA:4,(anonymous_12) +FNDA:4,(anonymous_13) +FNDA:4,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:17,0 +DA:20,0 +DA:23,0 +DA:25,0 +DA:30,0 +DA:32,0 +DA:34,0 +DA:36,0 +DA:39,0 +DA:47,0 +DA:49,0 +DA:51,0 +DA:57,0 +DA:59,0 +DA:67,0 +DA:69,0 +DA:70,0 +DA:73,0 +DA:75,0 +DA:77,0 +DA:80,0 +DA:82,0 +DA:84,0 +DA:86,0 +DA:92,0 +DA:94,0 +DA:102,0 +DA:103,0 +DA:105,0 +DA:111,0 +DA:113,0 +DA:115,0 +DA:117,0 +DA:123,0 +DA:125,0 +DA:138,2 +DA:140,1 +DA:143,3 +DA:148,3 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,2 +DA:162,1 +DA:163,4 +DA:164,4 +DA:167,1 +DA:168,1 +DA:169,4 +DA:170,4 +DA:172,4 +DA:173,0 +DA:177,1 +DA:178,1 +DA:180,4 +DA:188,0 +DA:189,0 +DA:200,0 +DA:202,0 +DA:205,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:216,0 +LF:75 +LH:28 +BRDA:148,0,0,1 +BRDA:148,0,1,2 +BRDA:148,1,0,3 +BRDA:148,1,1,2 +BRDA:164,2,0,4 +BRDA:164,2,1,1 +BRDA:172,3,0,4 +BRDA:172,3,1,0 +BRDA:189,4,0,0 +BRDA:199,5,0,0 +BRDA:199,5,1,0 +BRDA:201,6,0,0 +BRDA:201,6,1,0 +BRF:13 +BRH:7 +end_of_record +TN: +SF:src/core/display/TableConstants.ts +FNF:0 +FNH:0 +DA:2,1 +DA:22,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/git/Git.ts +FN:14,(anonymous_7) +FN:24,(anonymous_8) +FN:28,(anonymous_9) +FN:32,(anonymous_10) +FN:36,(anonymous_11) +FN:45,(anonymous_12) +FN:54,(anonymous_13) +FN:60,(anonymous_14) +FN:75,(anonymous_15) +FN:90,(anonymous_16) +FN:99,(anonymous_17) +FN:103,(anonymous_18) +FN:121,(anonymous_19) +FN:124,(anonymous_20) +FN:127,(anonymous_21) +FN:159,(anonymous_22) +FN:169,(anonymous_23) +FN:173,(anonymous_24) +FN:177,(anonymous_25) +FN:189,(anonymous_26) +FN:204,(anonymous_27) +FN:208,(anonymous_28) +FN:212,(anonymous_29) +FN:218,(anonymous_30) +FN:224,(anonymous_31) +FN:233,(anonymous_32) +FNF:26 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,(anonymous_32) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:12,0 +DA:14,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:25,0 +DA:29,0 +DA:33,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:42,0 +DA:46,0 +DA:48,0 +DA:49,0 +DA:51,0 +DA:55,0 +DA:57,0 +DA:62,0 +DA:63,0 +DA:65,0 +DA:67,0 +DA:68,0 +DA:70,0 +DA:72,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:82,0 +DA:86,0 +DA:91,0 +DA:94,0 +DA:100,0 +DA:105,0 +DA:107,0 +DA:109,0 +DA:110,0 +DA:113,0 +DA:117,0 +DA:122,0 +DA:124,0 +DA:128,0 +DA:130,0 +DA:131,0 +DA:134,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:145,0 +DA:148,0 +DA:151,0 +DA:156,0 +DA:160,0 +DA:161,0 +DA:163,0 +DA:165,0 +DA:166,0 +DA:170,0 +DA:174,0 +DA:181,0 +DA:185,0 +DA:190,0 +DA:191,0 +DA:193,0 +DA:194,0 +DA:198,0 +DA:200,0 +DA:205,0 +DA:209,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:226,0 +DA:227,0 +DA:229,0 +DA:230,0 +DA:235,0 +DA:238,0 +DA:240,0 +DA:243,0 +LF:94 +LH:6 +BRDA:62,0,0,0 +BRDA:62,0,1,0 +BRDA:70,1,0,0 +BRDA:75,2,0,0 +BRDA:100,3,0,0 +BRDA:124,4,0,0 +BRDA:124,4,1,0 +BRDA:152,5,0,0 +BRDA:152,5,1,0 +BRDA:174,6,0,0 +BRDA:190,7,0,0 +BRDA:213,8,0,0 +BRDA:213,8,1,0 +BRDA:219,9,0,0 +BRDA:219,9,1,0 +BRF:15 +BRH:0 +end_of_record +TN: +SF:src/core/git/GitDiffUtil.ts +FN:30,(anonymous_7) +FN:36,(anonymous_8) +FN:56,(anonymous_9) +FN:67,(anonymous_10) +FN:107,(anonymous_11) +FN:114,(anonymous_12) +FN:122,(anonymous_13) +FN:145,(anonymous_14) +FN:165,(anonymous_15) +FNF:9 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:22,1 +DA:24,1 +DA:31,0 +DA:32,0 +DA:33,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:51,0 +DA:53,0 +DA:57,0 +DA:59,0 +DA:60,0 +DA:66,0 +DA:67,0 +DA:69,0 +DA:73,0 +DA:74,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:87,0 +DA:89,0 +DA:92,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:102,0 +DA:103,0 +DA:108,0 +DA:110,0 +DA:111,0 +DA:114,0 +DA:115,0 +DA:117,0 +DA:123,0 +DA:130,0 +DA:133,0 +DA:137,0 +DA:141,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:152,0 +DA:154,0 +DA:155,0 +DA:159,0 +DA:165,0 +DA:166,0 +DA:170,0 +DA:173,0 +LF:70 +LH:9 +BRDA:43,0,0,0 +BRDA:73,1,0,0 +BRDA:129,2,0,0 +BRDA:129,2,1,0 +BRDA:132,3,0,0 +BRDA:132,3,1,0 +BRDA:136,4,0,0 +BRDA:136,4,1,0 +BRDA:136,4,2,0 +BRDA:140,5,0,0 +BRDA:140,5,1,0 +BRDA:140,5,2,0 +BRDA:144,6,0,0 +BRDA:144,6,1,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:src/core/git/GitIdentity.ts +FN:4,(anonymous_0) +FN:6,(anonymous_1) +FN:11,(anonymous_2) +FN:23,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:3,1 +DA:4,0 +DA:7,0 +DA:8,0 +DA:15,0 +DA:17,0 +DA:20,0 +DA:27,0 +DA:29,0 +DA:32,0 +LF:10 +LH:1 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/git/GitTags.ts +FN:5,(anonymous_0) +FN:13,(anonymous_1) +FN:25,(anonymous_2) +FN:45,(anonymous_3) +FN:49,(anonymous_4) +FN:53,(anonymous_5) +FN:58,(anonymous_6) +FN:74,(anonymous_7) +FN:82,(anonymous_8) +FN:92,(anonymous_9) +FN:104,(anonymous_10) +FN:121,(anonymous_11) +FN:126,(anonymous_12) +FN:131,(anonymous_13) +FN:134,(anonymous_14) +FN:138,(anonymous_15) +FN:141,(anonymous_16) +FN:147,(anonymous_17) +FNF:18 +FNH:6 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:24,(anonymous_3) +FNDA:8,(anonymous_4) +FNDA:8,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +DA:2,1 +DA:4,1 +DA:5,3 +DA:14,3 +DA:21,3 +DA:22,1 +DA:27,2 +DA:32,2 +DA:38,2 +DA:40,2 +DA:41,2 +DA:45,24 +DA:48,2 +DA:49,8 +DA:53,8 +DA:55,2 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:71,0 +DA:75,0 +DA:78,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:88,0 +DA:93,0 +DA:96,0 +DA:99,0 +DA:100,0 +DA:105,0 +DA:109,0 +DA:111,0 +DA:115,0 +DA:118,0 +DA:120,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:127,0 +DA:128,0 +DA:131,0 +DA:135,0 +DA:138,0 +DA:139,0 +DA:141,0 +DA:146,0 +DA:147,0 +DA:148,0 +LF:53 +LH:16 +BRDA:21,0,0,2 +BRDA:21,0,1,1 +BRDA:63,1,0,0 +BRDA:63,1,1,0 +BRDA:67,2,0,0 +BRDA:67,2,1,0 +BRDA:77,3,0,0 +BRDA:77,3,1,0 +BRDA:83,4,0,0 +BRDA:83,4,1,0 +BRDA:128,5,0,0 +BRDA:128,5,1,0 +BRF:12 +BRH:2 +end_of_record +TN: +SF:src/core/metadata/MetadataFiles.ts +FN:16,(anonymous_7) +FN:23,(anonymous_8) +FN:37,(anonymous_9) +FN:52,(anonymous_10) +FN:63,(anonymous_11) +FN:116,(anonymous_12) +FN:120,(anonymous_13) +FN:176,(anonymous_14) +FN:185,(anonymous_15) +FN:189,(anonymous_16) +FN:190,(anonymous_17) +FN:194,(anonymous_18) +FN:208,(anonymous_19) +FNF:13 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:18,0 +DA:20,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:35,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:47,0 +DA:49,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:59,0 +DA:61,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:81,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:88,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:106,0 +DA:108,0 +DA:109,0 +DA:113,0 +DA:117,0 +DA:118,0 +DA:120,0 +DA:121,0 +DA:123,0 +DA:124,0 +DA:126,0 +DA:131,0 +DA:135,0 +DA:136,0 +DA:139,0 +DA:141,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:152,0 +DA:154,0 +DA:155,0 +DA:160,0 +DA:163,0 +DA:164,0 +DA:167,0 +DA:169,0 +DA:170,0 +DA:176,0 +DA:178,0 +DA:179,0 +DA:186,0 +DA:190,0 +DA:192,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:198,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:215,0 +DA:218,0 +DA:221,0 +DA:223,0 +DA:227,0 +DA:229,0 +DA:230,0 +DA:234,0 +DA:237,0 +DA:240,0 +DA:243,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:250,0 +DA:255,0 +DA:257,0 +DA:259,0 +DA:260,0 +DA:262,0 +DA:263,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:281,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:304,0 +DA:307,0 +DA:311,0 +DA:314,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:332,0 +DA:335,0 +DA:339,0 +LF:170 +LH:11 +BRDA:57,0,0,0 +BRDA:57,0,1,0 +BRDA:59,1,0,0 +BRDA:59,1,1,0 +BRDA:87,2,0,0 +BRDA:87,2,1,0 +BRDA:116,3,0,0 +BRDA:119,4,0,0 +BRDA:119,4,1,0 +BRDA:128,5,0,0 +BRDA:128,5,1,0 +BRDA:138,6,0,0 +BRDA:138,6,1,0 +BRDA:138,6,2,0 +BRDA:161,7,0,0 +BRDA:161,7,1,0 +BRDA:166,8,0,0 +BRDA:166,8,1,0 +BRDA:166,8,2,0 +BRDA:191,9,0,0 +BRDA:191,9,1,0 +BRDA:275,10,0,0 +BRDA:275,10,1,0 +BRDA:324,11,0,0 +BRDA:324,11,1,0 +BRF:25 +BRH:0 +end_of_record +TN: +SF:src/core/metadata/MetadataInfo.ts +FN:102,(anonymous_6) +FN:107,(anonymous_7) +FN:129,(anonymous_8) +FN:149,(anonymous_9) +FNF:4 +FNH:3 +FNDA:1,(anonymous_6) +FNDA:149,(anonymous_7) +FNDA:25,(anonymous_8) +FNDA:0,(anonymous_9) +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:7,1 +DA:101,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,149 +DA:111,1 +DA:112,1 +DA:114,1 +DA:115,1 +DA:118,149 +DA:120,4 +DA:122,0 +DA:124,4 +DA:129,9 +DA:130,25 +DA:132,9 +DA:133,9 +DA:134,9 +DA:135,9 +DA:136,9 +DA:137,9 +DA:138,9 +DA:139,9 +DA:140,9 +DA:144,149 +DA:146,1 +DA:150,0 +DA:151,0 +DA:153,0 +DA:155,0 +DA:158,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:166,0 +DA:171,0 +DA:176,0 +DA:181,0 +DA:186,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:196,0 +DA:197,0 +DA:201,0 +DA:205,1 +DA:206,1 +DA:214,1 +LF:57 +LH:35 +BRDA:149,0,0,0 +BRDA:165,1,0,0 +BRDA:165,1,1,0 +BRDA:165,1,2,0 +BRDA:168,2,0,0 +BRDA:168,2,1,0 +BRDA:168,2,2,0 +BRDA:173,3,0,0 +BRDA:173,3,1,0 +BRDA:173,3,2,0 +BRDA:178,4,0,0 +BRDA:178,4,1,0 +BRDA:178,4,2,0 +BRDA:183,5,0,0 +BRDA:183,5,1,0 +BRDA:183,5,2,0 +BRDA:192,6,0,0 +BRDA:192,6,1,0 +BRDA:192,6,2,0 +BRDA:192,6,3,0 +BRF:20 +BRH:0 +end_of_record +TN: +SF:src/core/metadata/SettingsFetcher.ts +FN:8,(anonymous_7) +FN:12,(anonymous_8) +FNF:2 +FNH:1 +FNDA:5,(anonymous_7) +FNDA:0,(anonymous_8) +DA:1,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:9,5 +DA:13,0 +DA:14,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +LF:12 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/org/SFPOrg.ts +FN:14,(anonymous_7) +FN:39,(anonymous_8) +FN:76,(anonymous_9) +FN:128,(anonymous_10) +FN:142,(anonymous_11) +FN:147,(anonymous_12) +FN:169,(anonymous_13) +FN:171,(anonymous_14) +FN:176,(anonymous_15) +FN:179,(anonymous_16) +FN:188,(anonymous_17) +FN:195,(anonymous_18) +FN:200,(anonymous_19) +FN:207,(anonymous_20) +FN:219,(anonymous_21) +FN:220,(anonymous_22) +FNF:16 +FNH:5 +FNDA:6,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:3,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:1,(anonymous_15) +FNDA:2,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +DA:1,4 +DA:2,4 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:10,4 +DA:15,6 +DA:17,6 +DA:22,5 +DA:24,1 +DA:32,1 +DA:43,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:53,0 +DA:55,0 +DA:56,0 +DA:61,0 +DA:69,0 +DA:77,3 +DA:79,3 +DA:89,3 +DA:92,3 +DA:103,0 +DA:116,2 +DA:125,2 +DA:129,3 +DA:131,3 +DA:134,0 +DA:137,3 +DA:143,0 +DA:145,0 +DA:147,0 +DA:148,0 +DA:150,0 +DA:160,0 +DA:163,0 +DA:170,0 +DA:171,0 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,2 +DA:184,1 +DA:185,0 +DA:189,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:200,0 +DA:201,0 +DA:207,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:213,0 +DA:214,0 +DA:216,0 +DA:219,0 +DA:220,0 +DA:222,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:236,0 +DA:241,4 +LF:72 +LH:27 +BRDA:14,0,0,6 +BRDA:83,1,0,0 +BRDA:83,1,1,3 +BRDA:119,2,0,2 +BRDA:119,2,1,0 +BRDA:177,3,0,1 +BRDA:177,3,1,0 +BRDA:181,4,0,0 +BRDA:181,4,1,2 +BRDA:181,5,0,1 +BRDA:181,5,1,1 +BRDA:210,6,0,0 +BRDA:210,6,1,0 +BRDA:227,7,0,0 +BRDA:227,7,1,0 +BRDA:228,8,0,0 +BRDA:228,8,1,0 +BRF:17 +BRH:7 +end_of_record +TN: +SF:src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts +FN:5,(anonymous_1) +FNF:1 +FNH:0 +FNDA:0,(anonymous_1) +DA:2,4 +DA:4,4 +DA:7,0 +DA:12,0 +LF:4 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/package/SfpPackage.ts +FN:64,(anonymous_1) +FN:68,(anonymous_2) +FN:72,(anonymous_3) +FN:77,(anonymous_4) +FN:81,(anonymous_5) +FN:89,(anonymous_6) +FN:93,(anonymous_7) +FN:107,(anonymous_8) +FNF:8 +FNH:4 +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:8,(anonymous_4) +FNDA:7,(anonymous_5) +FNDA:12,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:13,(anonymous_8) +DA:1,13 +DA:54,13 +DA:61,12 +DA:65,0 +DA:69,0 +DA:74,0 +DA:78,8 +DA:82,7 +DA:90,12 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:107,13 +DA:108,13 +DA:109,13 +DA:110,13 +DA:111,13 +LF:23 +LH:11 +BRDA:107,0,0,13 +BRDA:107,0,1,13 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/core/package/SfpPackageBuilder.ts +FN:28,(anonymous_7) +FN:193,(anonymous_8) +FN:214,(anonymous_9) +FN:235,(anonymous_10) +FN:257,(anonymous_11) +FN:264,(anonymous_12) +FNF:6 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:27,1 +DA:37,0 +DA:40,0 +DA:43,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:71,0 +DA:75,0 +DA:77,0 +DA:80,0 +DA:92,0 +DA:96,0 +DA:102,0 +DA:103,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:119,0 +DA:121,0 +DA:124,0 +DA:129,0 +DA:131,0 +DA:138,0 +DA:140,0 +DA:141,0 +DA:146,0 +DA:153,0 +DA:155,0 +DA:162,0 +DA:164,0 +DA:171,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:182,0 +DA:185,0 +DA:199,0 +DA:202,0 +DA:203,0 +DA:209,0 +DA:211,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:221,0 +DA:222,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:230,0 +DA:236,0 +DA:242,0 +DA:243,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:258,0 +DA:259,0 +DA:264,1 +DA:265,0 +LF:102 +LH:24 +BRDA:58,0,0,0 +BRDA:58,0,1,0 +BRDA:67,1,0,0 +BRDA:67,1,1,0 +BRDA:131,2,0,0 +BRDA:138,3,0,0 +BRDA:141,4,0,0 +BRDA:145,5,0,0 +BRDA:145,5,1,0 +BRDA:145,5,2,0 +BRDA:145,5,3,0 +BRDA:236,6,0,0 +BRDA:236,6,1,0 +BRDA:237,7,0,0 +BRDA:237,7,1,0 +BRDA:237,7,2,0 +BRDA:237,7,3,0 +BRDA:258,8,0,0 +BRDA:258,8,1,0 +BRF:19 +BRH:0 +end_of_record +TN: +SF:src/core/package/analyser/AnalyzerRegistry.ts +FN:7,(anonymous_1) +FNF:1 +FNH:0 +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:4,1 +DA:6,1 +DA:8,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:18,0 +LF:12 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/package/analyser/FHTAnalyzer.ts +FN:11,(anonymous_7) +FN:17,(anonymous_8) +FN:51,(anonymous_9) +FN:72,(anonymous_10) +FNF:4 +FNH:3 +FNDA:0,(anonymous_7) +FNDA:4,(anonymous_8) +FNDA:4,(anonymous_9) +FNDA:3,(anonymous_10) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:7,2 +DA:9,2 +DA:12,0 +DA:20,4 +DA:23,4 +DA:33,3 +DA:38,4 +DA:41,4 +DA:42,4 +DA:46,0 +DA:48,4 +DA:55,4 +DA:59,0 +DA:62,3 +DA:64,2 +DA:65,2 +DA:66,2 +DA:69,4 +DA:73,3 +DA:74,1 +LF:25 +LH:22 +BRDA:65,0,0,2 +BRDA:73,1,0,2 +BRDA:73,1,1,1 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/core/package/analyser/FTAnalyzer.ts +FN:11,(anonymous_7) +FN:15,(anonymous_8) +FN:49,(anonymous_9) +FN:70,(anonymous_10) +FNF:4 +FNH:3 +FNDA:0,(anonymous_7) +FNDA:4,(anonymous_8) +FNDA:4,(anonymous_9) +FNDA:3,(anonymous_10) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:7,2 +DA:9,2 +DA:12,0 +DA:18,4 +DA:21,4 +DA:31,3 +DA:36,4 +DA:39,4 +DA:40,4 +DA:44,0 +DA:46,4 +DA:53,4 +DA:57,0 +DA:60,3 +DA:62,2 +DA:63,2 +DA:64,2 +DA:67,4 +DA:71,3 +DA:72,1 +LF:25 +LH:22 +BRDA:63,0,0,2 +BRDA:71,1,0,2 +BRDA:71,1,1,1 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/core/package/analyser/PicklistAnalyzer.ts +FN:8,(anonymous_6) +FN:14,(anonymous_7) +FN:48,(anonymous_8) +FNF:3 +FNH:0 +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:1,1 +DA:2,1 +DA:4,1 +DA:6,1 +DA:9,0 +DA:16,0 +DA:17,0 +DA:23,0 +DA:27,0 +DA:33,0 +DA:37,0 +DA:38,0 +DA:43,0 +DA:45,0 +DA:49,0 +DA:50,0 +LF:16 +LH:4 +BRDA:36,0,0,0 +BRDA:36,0,1,0 +BRDA:49,1,0,0 +BRDA:49,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:src/core/package/components/PackageManifest.ts +FN:14,(anonymous_7) +FN:21,(anonymous_8) +FN:25,(anonymous_9) +FN:32,(anonymous_10) +FN:49,(anonymous_11) +FN:58,(anonymous_12) +FN:59,(anonymous_13) +FN:92,(anonymous_14) +FN:109,(anonymous_15) +FN:132,(anonymous_16) +FN:151,(anonymous_17) +FN:170,(anonymous_18) +FN:196,(anonymous_19) +FN:226,(anonymous_20) +FN:243,(anonymous_21) +FNF:15 +FNH:14 +FNDA:3,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:13,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:6,(anonymous_11) +FNDA:48,(anonymous_12) +FNDA:150,(anonymous_13) +FNDA:1,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:2,(anonymous_17) +FNDA:1,(anonymous_18) +FNDA:2,(anonymous_19) +FNDA:1,(anonymous_20) +FNDA:1,(anonymous_21) +DA:1,2 +DA:2,2 +DA:4,2 +DA:5,2 +DA:7,2 +DA:15,3 +DA:22,3 +DA:33,6 +DA:35,6 +DA:37,6 +DA:38,6 +DA:40,6 +DA:50,6 +DA:52,6 +DA:58,6 +DA:59,150 +DA:62,6 +DA:65,42 +DA:69,42 +DA:73,6 +DA:77,6 +DA:81,6 +DA:82,6 +DA:84,6 +DA:93,1 +DA:94,1 +DA:96,1 +DA:100,1 +DA:102,1 +DA:110,2 +DA:116,1 +DA:117,1 +DA:121,0 +DA:125,2 +DA:133,0 +DA:139,0 +DA:140,0 +DA:144,0 +DA:148,0 +DA:152,2 +DA:156,1 +DA:157,1 +DA:161,0 +DA:163,2 +DA:171,1 +DA:177,1 +DA:178,1 +DA:185,0 +DA:189,1 +DA:202,2 +DA:205,0 +DA:213,1 +DA:216,0 +DA:218,1 +DA:223,2 +DA:227,1 +DA:232,1 +DA:233,1 +DA:237,0 +DA:240,1 +DA:244,1 +DA:256,1 +DA:261,1 +DA:262,1 +DA:266,0 +DA:269,1 +LF:66 +LH:54 +BRDA:176,0,0,2 +BRDA:176,0,1,1 +BRDA:182,1,0,0 +BRDA:182,1,1,0 +BRF:4 +BRH:2 +end_of_record +TN: +SF:src/core/package/components/PackageToComponent.ts +FN:6,(anonymous_0) +FN:8,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:5,1 +DA:6,0 +DA:9,0 +DA:11,0 +DA:13,0 +DA:16,0 +DA:23,0 +DA:26,0 +LF:9 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/package/coverage/PackageTestCoverage.ts +FN:13,(anonymous_7) +FN:22,(anonymous_8) +FN:47,(anonymous_9) +FN:55,(anonymous_10) +FN:66,(anonymous_11) +FN:78,(anonymous_12) +FN:149,(anonymous_13) +FN:182,(anonymous_14) +FN:195,(anonymous_15) +FN:211,(anonymous_16) +FN:213,(anonymous_17) +FN:232,(anonymous_18) +FN:234,(anonymous_19) +FN:252,(anonymous_20) +FN:253,(anonymous_21) +FNF:15 +FNH:15 +FNDA:7,(anonymous_7) +FNDA:7,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:5,(anonymous_12) +FNDA:8,(anonymous_13) +FNDA:2,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:15,(anonymous_16) +FNDA:15,(anonymous_17) +FNDA:15,(anonymous_18) +FNDA:30,(anonymous_19) +FNDA:15,(anonymous_20) +FNDA:39,(anonymous_21) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:11,7 +DA:14,7 +DA:15,7 +DA:16,7 +DA:17,7 +DA:19,7 +DA:23,7 +DA:24,7 +DA:26,7 +DA:32,7 +DA:33,7 +DA:36,19 +DA:37,19 +DA:41,7 +DA:43,7 +DA:45,1 +DA:47,1 +DA:48,1 +DA:51,7 +DA:53,1 +DA:55,1 +DA:56,1 +DA:60,1 +DA:65,1 +DA:66,1 +DA:67,2 +DA:69,1 +DA:73,7 +DA:74,7 +DA:75,7 +DA:87,5 +DA:89,5 +DA:91,5 +DA:94,3 +DA:95,3 +DA:103,0 +DA:112,2 +DA:120,3 +DA:122,3 +DA:128,2 +DA:136,1 +DA:145,0 +DA:153,8 +DA:155,8 +DA:156,8 +DA:158,8 +DA:166,20 +DA:173,8 +DA:182,2 +DA:183,2 +DA:185,2 +DA:189,8 +DA:195,2 +DA:196,2 +DA:198,2 +DA:201,8 +DA:212,15 +DA:213,15 +DA:217,12 +DA:220,3 +DA:222,0 +DA:233,15 +DA:234,15 +DA:238,27 +DA:241,3 +DA:243,0 +DA:253,15 +DA:256,63 +DA:263,12 +DA:268,0 +DA:271,15 +LF:78 +LH:73 +BRDA:87,0,0,5 +BRDA:93,1,0,5 +BRDA:93,1,1,2 +BRDA:119,2,0,3 +BRDA:119,2,1,0 +BRDA:212,3,0,15 +BRDA:212,3,1,0 +BRDA:233,4,0,15 +BRDA:233,4,1,0 +BRDA:256,5,0,27 +BRF:10 +BRH:7 +end_of_record +TN: +SF:src/core/package/dependencies/ExternalPackage2DependencyResolver.ts +FN:12,(anonymous_1) +FN:14,(anonymous_2) +FN:55,(anonymous_3) +FN:86,(anonymous_4) +FNF:4 +FNH:3 +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:2,(anonymous_3) +FNDA:0,(anonymous_4) +DA:2,2 +DA:4,2 +DA:10,2 +DA:12,2 +DA:19,2 +DA:22,2 +DA:30,2 +DA:31,2 +DA:35,0 +DA:41,12 +DA:42,0 +DA:45,10 +DA:46,4 +DA:50,0 +DA:51,0 +DA:52,0 +DA:55,2 +DA:56,2 +DA:58,0 +DA:59,0 +DA:64,0 +DA:67,2 +DA:71,0 +DA:73,2 +DA:78,2 +DA:87,0 +DA:89,0 +DA:90,0 +DA:93,0 +DA:95,0 +DA:98,0 +DA:101,0 +LF:32 +LH:16 +BRDA:19,0,0,2 +BRDA:41,1,0,0 +BRDA:41,2,0,12 +BRDA:41,2,1,0 +BRDA:44,3,0,12 +BRDA:44,3,1,10 +BRDA:48,4,0,4 +BRDA:48,4,1,0 +BRF:8 +BRH:5 +end_of_record +TN: +SF:src/core/package/dependencies/PackageDependencyResolver.ts +FN:15,(anonymous_7) +FN:31,(anonymous_8) +FN:116,(anonymous_9) +FN:124,(anonymous_10) +FN:176,(anonymous_11) +FN:191,(anonymous_12) +FN:221,(anonymous_13) +FN:227,(anonymous_14) +FN:236,(anonymous_15) +FN:249,(anonymous_16) +FN:265,(anonymous_17) +FNF:11 +FNH:11 +FNDA:10,(anonymous_7) +FNDA:10,(anonymous_8) +FNDA:16,(anonymous_9) +FNDA:38,(anonymous_10) +FNDA:13,(anonymous_11) +FNDA:4,(anonymous_12) +FNDA:55,(anonymous_13) +FNDA:10,(anonymous_14) +FNDA:6,(anonymous_15) +FNDA:5,(anonymous_16) +FNDA:6,(anonymous_17) +DA:2,3 +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:12,3 +DA:13,10 +DA:16,10 +DA:17,10 +DA:18,10 +DA:19,10 +DA:20,10 +DA:23,10 +DA:34,0 +DA:38,24 +DA:42,0 +DA:45,19 +DA:46,28 +DA:49,1 +DA:52,27 +DA:56,9 +DA:61,2 +DA:63,16 +DA:65,1 +DA:66,1 +DA:72,1 +DA:78,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:91,15 +DA:99,13 +DA:100,10 +DA:101,10 +DA:103,3 +DA:107,7 +DA:124,38 +DA:125,16 +DA:130,6 +DA:131,6 +DA:133,6 +DA:138,1 +DA:143,5 +DA:146,1 +DA:152,4 +DA:159,5 +DA:164,5 +DA:171,1 +DA:176,13 +DA:177,4 +DA:180,1 +DA:182,4 +DA:197,4 +DA:198,4 +DA:199,4 +DA:202,9 +DA:205,3 +DA:206,3 +DA:209,9 +DA:213,1 +DA:218,3 +DA:222,55 +DA:223,55 +DA:228,10 +DA:237,6 +DA:238,6 +DA:239,5 +DA:254,5 +DA:255,5 +DA:256,5 +DA:266,6 +DA:267,6 +LF:74 +LH:72 +BRDA:33,0,0,47 +BRDA:33,0,1,0 +BRDA:37,1,0,47 +BRDA:37,1,1,35 +BRDA:41,2,0,23 +BRDA:41,2,1,0 +BRDA:44,3,0,23 +BRDA:44,3,1,19 +BRDA:47,4,0,28 +BRDA:47,4,1,1 +BRDA:52,5,0,0 +BRDA:52,5,1,27 +BRDA:59,6,0,18 +BRDA:59,6,1,8 +BRDA:59,6,2,2 +BRDA:64,7,0,16 +BRDA:64,7,1,1 +BRDA:99,8,0,10 +BRDA:99,8,1,3 +BRDA:125,9,0,10 +BRDA:132,10,0,6 +BRDA:132,10,1,6 +BRDA:176,11,0,13 +BRDA:176,11,1,5 +BRDA:209,12,0,3 +BRDA:238,13,0,1 +BRDA:238,13,1,5 +BRF:27 +BRH:24 +end_of_record +TN: +SF:src/core/package/dependencies/TransitiveDependencyResolver.ts +FN:11,(anonymous_7) +FN:13,(anonymous_8) +FN:28,(anonymous_9) +FN:40,(anonymous_10) +FN:68,(anonymous_11) +FN:69,(anonymous_12) +FN:90,(anonymous_13) +FN:91,(anonymous_14) +FN:98,(anonymous_15) +FNF:9 +FNH:8 +FNDA:7,(anonymous_7) +FNDA:7,(anonymous_8) +FNDA:7,(anonymous_9) +FNDA:7,(anonymous_10) +FNDA:221,(anonymous_11) +FNDA:152,(anonymous_12) +FNDA:727,(anonymous_13) +FNDA:727,(anonymous_14) +FNDA:0,(anonymous_15) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:8,2 +DA:10,2 +DA:11,7 +DA:14,7 +DA:16,7 +DA:17,7 +DA:18,7 +DA:19,7 +DA:23,7 +DA:25,7 +DA:34,7 +DA:37,7 +DA:43,7 +DA:45,42 +DA:50,42 +DA:54,65 +DA:55,65 +DA:64,87 +DA:67,42 +DA:68,221 +DA:69,152 +DA:70,42 +DA:72,96 +DA:74,96 +DA:76,7 +DA:79,0 +DA:82,7 +DA:83,7 +DA:89,145 +DA:90,727 +DA:91,727 +DA:93,42 +DA:95,7 +DA:100,0 +DA:103,0 +DA:104,0 +DA:105,0 +LF:43 +LH:38 +BRDA:99,0,0,0 +BRDA:99,0,1,0 +BRDA:99,0,2,0 +BRDA:99,0,3,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:src/core/package/deploymentFilters/EntitlementVersionFilter.ts +FN:16,(anonymous_7) +FN:51,(anonymous_8) +FN:93,(anonymous_9) +FNF:3 +FNH:2 +FNDA:5,(anonymous_7) +FNDA:7,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:12,1 +DA:14,1 +DA:18,5 +DA:19,5 +DA:22,5 +DA:23,5 +DA:26,5 +DA:29,5 +DA:33,3 +DA:34,3 +DA:36,1 +DA:37,1 +DA:40,4 +DA:42,4 +DA:43,4 +DA:48,8 +DA:50,8 +DA:51,7 +DA:61,1 +DA:62,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:71,3 +DA:78,4 +DA:81,0 +DA:85,4 +DA:86,4 +DA:88,1 +DA:89,1 +DA:94,0 +DA:96,0 +DA:97,0 +LF:41 +LH:37 +BRDA:26,0,0,0 +BRDA:55,1,0,8 +BRDA:55,1,1,4 +BRDA:55,1,2,4 +BRDA:94,2,0,0 +BRDA:96,3,0,0 +BRDA:96,3,1,0 +BRF:7 +BRH:3 +end_of_record +TN: +SF:src/core/package/diff/PackageComponentDiff.ts +FN:30,(anonymous_7) +FN:51,(anonymous_8) +FN:79,(anonymous_9) +FN:156,(anonymous_10) +FN:163,(anonymous_11) +FN:174,(anonymous_12) +FN:178,(anonymous_13) +FN:289,(anonymous_14) +FN:294,(anonymous_15) +FN:316,(anonymous_16) +FN:336,(anonymous_17) +FN:418,(anonymous_18) +FNF:12 +FNH:1 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:1,(anonymous_18) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:14,1 +DA:15,1 +DA:18,1 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:38,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:47,0 +DA:48,0 +DA:52,0 +DA:54,0 +DA:55,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:64,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:76,0 +DA:77,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:85,0 +DA:86,0 +DA:89,0 +DA:93,0 +DA:96,0 +DA:99,0 +DA:102,0 +DA:104,0 +DA:107,0 +DA:108,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:114,0 +DA:116,0 +DA:118,0 +DA:120,0 +DA:125,0 +DA:126,0 +DA:130,0 +DA:140,0 +DA:141,0 +DA:146,0 +DA:147,0 +DA:150,0 +DA:152,0 +DA:157,0 +DA:159,0 +DA:162,0 +DA:163,0 +DA:168,0 +DA:171,0 +DA:176,0 +DA:178,0 +DA:179,0 +DA:182,0 +DA:184,0 +DA:185,0 +DA:187,0 +DA:188,0 +DA:190,0 +DA:192,0 +DA:195,0 +DA:202,0 +DA:210,0 +DA:212,0 +DA:214,0 +DA:216,0 +DA:222,0 +DA:228,0 +DA:236,0 +DA:242,0 +DA:248,0 +DA:256,0 +DA:257,0 +DA:262,0 +DA:276,0 +DA:286,0 +DA:291,0 +DA:292,0 +DA:294,0 +DA:295,0 +DA:299,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:317,0 +DA:318,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:327,0 +DA:331,0 +DA:333,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:343,0 +DA:345,0 +DA:350,0 +DA:352,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:359,0 +DA:363,0 +DA:366,0 +DA:370,0 +DA:377,0 +DA:384,0 +DA:386,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:393,0 +DA:397,0 +DA:400,0 +DA:408,0 +DA:415,0 +DA:418,1 +DA:419,1 +DA:420,1 +DA:421,1 +DA:422,1 +DA:423,1 +LF:153 +LH:21 +BRDA:37,0,0,0 +BRDA:37,0,1,0 +BRDA:98,1,0,0 +BRDA:98,1,1,0 +BRDA:111,2,0,0 +BRDA:111,2,1,0 +BRDA:125,3,0,0 +BRDA:157,4,0,0 +BRDA:157,4,1,0 +BRDA:165,5,0,0 +BRDA:165,5,1,0 +BRDA:179,6,0,0 +BRDA:179,6,1,0 +BRDA:256,7,0,0 +BRDA:256,7,1,0 +BRDA:295,8,0,0 +BRDA:295,8,1,0 +BRDA:418,9,0,1 +BRDA:418,9,1,1 +BRF:19 +BRH:2 +end_of_record +TN: +SF:src/core/package/diff/PackageDiffImpl.ts +FN:12,(anonymous_7) +FN:21,(anonymous_8) +FN:28,(anonymous_9) +FN:109,(anonymous_10) +FN:123,(anonymous_11) +FN:137,(anonymous_12) +FN:159,(anonymous_13) +FNF:7 +FNH:6 +FNDA:1,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:9,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:8,(anonymous_11) +FNDA:5,(anonymous_12) +FNDA:0,(anonymous_13) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:12,1 +DA:13,1 +DA:15,1 +DA:20,1 +DA:22,9 +DA:23,9 +DA:24,9 +DA:25,9 +DA:29,9 +DA:31,9 +DA:32,9 +DA:34,8 +DA:44,0 +DA:46,8 +DA:50,6 +DA:55,6 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:64,6 +DA:66,6 +DA:68,6 +DA:77,7 +DA:78,7 +DA:80,7 +DA:83,1 +DA:84,1 +DA:88,5 +DA:93,5 +DA:95,1 +DA:98,4 +DA:100,2 +DA:105,2 +DA:111,6 +DA:112,6 +DA:113,6 +DA:115,6 +DA:118,6 +DA:120,6 +DA:124,8 +DA:125,8 +DA:127,8 +DA:129,0 +DA:131,8 +DA:134,8 +DA:138,5 +DA:139,5 +DA:144,5 +DA:148,5 +DA:149,2 +DA:152,2 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,3 +DA:161,0 +DA:163,0 +LF:69 +LH:60 +BRDA:43,0,0,8 +BRDA:43,0,1,7 +BRDA:66,1,0,6 +BRDA:111,2,0,0 +BRDA:111,2,1,6 +BRDA:112,3,0,0 +BRDA:112,3,1,6 +BRDA:148,4,0,2 +BRDA:148,4,1,3 +BRDA:152,5,0,1 +BRDA:152,5,1,1 +BRF:11 +BRH:9 +end_of_record +TN: +SF:src/core/package/packageCreators/CreateDataPackageImpl.ts +FN:12,(anonymous_7) +FN:22,(anonymous_8) +FN:26,(anonymous_9) +FN:29,(anonymous_10) +FN:31,(anonymous_11) +FN:33,(anonymous_12) +FN:41,(anonymous_13) +FN:45,(anonymous_14) +FN:49,(anonymous_15) +FN:51,(anonymous_16) +FN:54,(anonymous_17) +FNF:11 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:23,0 +DA:27,0 +DA:29,0 +DA:31,0 +DA:33,0 +DA:35,0 +DA:37,0 +DA:38,0 +DA:42,0 +DA:55,0 +DA:60,0 +DA:61,0 +DA:65,0 +DA:69,0 +DA:75,0 +DA:81,0 +LF:30 +LH:8 +BRDA:35,0,0,0 +BRDA:37,1,0,0 +BRDA:37,1,1,0 +BRDA:37,2,0,0 +BRDA:37,2,1,0 +BRDA:60,3,0,0 +BRDA:61,4,0,0 +BRDA:64,5,0,0 +BRDA:64,5,1,0 +BRF:9 +BRH:0 +end_of_record +TN: +SF:src/core/package/packageCreators/CreateDiffPackageImpl.ts +FN:21,(anonymous_7) +FN:31,(anonymous_8) +FN:35,(anonymous_9) +FN:37,(anonymous_10) +FN:41,(anonymous_11) +FN:62,(anonymous_12) +FN:68,(anonymous_13) +FN:109,(anonymous_14) +FN:111,(anonymous_15) +FN:141,(anonymous_16) +FN:147,getPackagesToCommits +FN:162,(anonymous_18) +FN:168,(anonymous_19) +FN:180,(anonymous_20) +FN:239,getOnlyChangedClassesFromPackage +FN:254,(anonymous_22) +FN:255,(anonymous_23) +FN:256,(anonymous_24) +FN:257,(anonymous_25) +FN:258,(anonymous_26) +FN:262,(anonymous_27) +FN:266,(anonymous_28) +FNF:22 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,getPackagesToCommits +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,getOnlyChangedClassesFromPackage +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +DA:1,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:18,1 +DA:20,1 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:28,0 +DA:32,0 +DA:38,0 +DA:42,0 +DA:45,0 +DA:48,0 +DA:50,0 +DA:52,0 +DA:56,0 +DA:58,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:72,0 +DA:79,0 +DA:82,0 +DA:83,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:94,0 +DA:96,0 +DA:102,0 +DA:116,0 +DA:117,0 +DA:120,0 +DA:123,0 +DA:126,0 +DA:127,0 +DA:131,0 +DA:134,0 +DA:137,0 +DA:138,0 +DA:142,0 +DA:143,0 +DA:145,0 +DA:148,0 +DA:149,0 +DA:154,0 +DA:155,0 +DA:157,0 +DA:162,0 +DA:163,0 +DA:168,0 +DA:170,0 +DA:174,0 +DA:176,0 +DA:185,0 +DA:187,0 +DA:192,0 +DA:197,0 +DA:200,0 +DA:207,0 +DA:209,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:222,0 +DA:226,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:245,0 +DA:250,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:261,0 +DA:262,0 +DA:266,0 +DA:268,0 +LF:103 +LH:16 +BRDA:82,0,0,0 +BRDA:82,0,1,0 +BRDA:120,1,0,0 +BRDA:137,2,0,0 +BRDA:174,3,0,0 +BRDA:244,4,0,0 +BRDA:244,4,1,0 +BRDA:262,5,0,0 +BRDA:262,5,1,0 +BRF:9 +BRH:0 +end_of_record +TN: +SF:src/core/package/packageCreators/CreatePackage.ts +FN:9,(anonymous_7) +FN:20,(anonymous_8) +FN:49,(anonymous_9) +FN:81,(anonymous_10) +FN:95,(anonymous_11) +FN:105,(anonymous_12) +FN:121,(anonymous_13) +FNF:7 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +DA:1,1 +DA:2,1 +DA:3,1 +DA:6,1 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:17,0 +DA:22,0 +DA:25,0 +DA:28,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:35,0 +DA:38,0 +DA:40,0 +DA:50,0 +DA:52,0 +DA:57,0 +DA:58,0 +DA:63,0 +DA:69,0 +DA:74,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:106,0 +DA:112,0 +DA:117,0 +DA:118,0 +DA:122,0 +DA:123,0 +DA:128,0 +DA:134,0 +DA:140,0 +DA:142,0 +LF:45 +LH:4 +BRDA:17,0,0,0 +BRDA:57,1,0,0 +BRDA:57,2,0,0 +BRDA:57,2,1,0 +BRDA:83,3,0,0 +BRDA:83,3,1,0 +BRDA:89,4,0,0 +BRDA:89,4,1,0 +BRDA:97,5,0,0 +BRDA:97,5,1,0 +BRF:10 +BRH:0 +end_of_record +TN: +SF:src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts +FN:6,(anonymous_0) +FNF:1 +FNH:1 +FNDA:4,(anonymous_0) +DA:5,2 +DA:8,4 +DA:9,4 +DA:11,0 +DA:15,4 +DA:16,4 +DA:18,0 +DA:21,4 +LF:8 +LH:6 +BRDA:8,0,0,4 +BRDA:8,0,1,0 +BRDA:15,1,0,4 +BRDA:15,1,1,0 +BRF:4 +BRH:2 +end_of_record +TN: +SF:src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts +FN:8,(anonymous_7) +FNF:1 +FNH:1 +FNDA:4,(anonymous_7) +DA:1,2 +DA:4,2 +DA:7,2 +DA:12,0 +DA:16,4 +DA:17,4 +DA:22,4 +DA:25,0 +DA:27,4 +LF:9 +LH:7 +BRDA:11,0,0,4 +BRDA:11,0,1,4 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:2,(anonymous_0) +DA:4,2 +DA:7,2 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/package/validators/PackageEmptyChecker.ts +FN:7,(anonymous_1) +FN:60,(anonymous_2) +FN:71,(anonymous_3) +FNF:3 +FNH:0 +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:16,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:29,0 +DA:30,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:38,0 +DA:39,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:64,0 +DA:66,0 +DA:69,0 +DA:71,0 +DA:74,0 +DA:75,0 +DA:78,0 +DA:82,0 +DA:83,0 +LF:37 +LH:5 +BRDA:21,0,0,0 +BRDA:21,0,1,0 +BRDA:50,1,0,0 +BRDA:50,1,1,0 +BRDA:52,2,0,0 +BRDA:52,2,1,0 +BRDA:74,3,0,0 +BRDA:74,3,1,0 +BRDA:82,4,0,0 +BRDA:82,4,1,0 +BRDA:82,5,0,0 +BRDA:82,5,1,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:src/core/package/version/Package2VersionFetcher.ts +FN:12,(anonymous_1) +FN:22,(anonymous_2) +FN:51,(anonymous_3) +FN:59,(anonymous_4) +FN:69,(anonymous_5) +FNF:5 +FNH:4 +FNDA:8,(anonymous_1) +FNDA:4,(anonymous_2) +FNDA:6,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:2,(anonymous_5) +DA:2,4 +DA:3,4 +DA:8,4 +DA:9,8 +DA:12,8 +DA:27,4 +DA:29,4 +DA:33,4 +DA:35,4 +DA:36,4 +DA:37,4 +DA:38,4 +DA:41,4 +DA:43,4 +DA:44,4 +DA:47,4 +DA:50,4 +DA:51,3 +DA:52,6 +DA:53,6 +DA:54,6 +DA:56,1 +DA:60,0 +DA:62,0 +DA:63,0 +DA:65,0 +DA:66,0 +DA:75,2 +DA:77,2 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:85,2 +DA:87,2 +DA:88,2 +DA:90,2 +DA:91,2 +LF:38 +LH:33 +BRDA:35,0,0,4 +BRDA:36,1,0,4 +BRDA:37,2,0,4 +BRDA:38,3,0,0 +BRDA:41,4,0,4 +BRDA:50,5,0,3 +BRDA:50,5,1,1 +BRDA:81,6,0,1 +BRDA:82,7,0,1 +BRDA:83,8,0,1 +BRF:10 +BRH:9 +end_of_record +TN: +SF:src/core/package/version/PackageVersionUpdater.ts +FN:4,(anonymous_0) +FN:6,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:3,1 +DA:8,0 +DA:10,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:15,0 +LF:7 +LH:1 +BRDA:13,0,0,0 +BRDA:13,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/core/permsets/AssignPermissionSetsImpl.ts +FN:9,(anonymous_7) +FN:16,(anonymous_8) +FN:39,(anonymous_9) +FN:81,(anonymous_10) +FN:87,(anonymous_11) +FNF:5 +FNH:5 +FNDA:3,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:12,(anonymous_9) +FNDA:4,(anonymous_10) +FNDA:6,(anonymous_11) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:10,3 +DA:11,3 +DA:12,3 +DA:13,3 +DA:26,3 +DA:27,3 +DA:32,3 +DA:36,3 +DA:39,6 +DA:40,12 +DA:45,0 +DA:46,0 +DA:50,6 +DA:59,6 +DA:60,6 +DA:61,3 +DA:62,3 +DA:64,0 +DA:69,2 +DA:70,2 +DA:74,2 +DA:75,2 +DA:78,3 +DA:82,4 +DA:87,4 +DA:88,6 +DA:91,4 +LF:33 +LH:30 +BRDA:60,0,0,3 +BRDA:60,0,1,3 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/core/permsets/PermissionSetFetcher.ts +FN:8,(anonymous_1) +FN:10,(anonymous_2) +FNF:2 +FNH:2 +FNDA:3,(anonymous_1) +FNDA:3,(anonymous_2) +DA:2,1 +DA:7,1 +DA:8,3 +DA:11,3 +DA:13,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/permsets/PermissionSetGroupUpdateAwaiter.ts +FN:9,(anonymous_7) +FN:11,(anonymous_8) +FNF:2 +FNH:2 +FNDA:1,(anonymous_7) +FNDA:1,(anonymous_8) +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:8,1 +DA:9,1 +DA:12,1 +DA:19,1 +DA:21,0 +DA:26,0 +DA:31,0 +DA:33,1 +DA:38,1 +DA:41,0 +DA:42,0 +LF:15 +LH:10 +BRDA:9,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/core/project/ProjectConfig.ts +FN:16,(anonymous_1) +FN:28,(anonymous_2) +FN:31,(anonymous_3) +FN:38,(anonymous_4) +FN:44,(anonymous_5) +FN:48,(anonymous_6) +FN:63,(anonymous_7) +FN:65,(anonymous_8) +FN:72,(anonymous_9) +FN:85,(anonymous_10) +FN:88,(anonymous_11) +FN:95,(anonymous_12) +FN:97,(anonymous_13) +FN:108,(anonymous_14) +FN:129,(anonymous_15) +FN:150,(anonymous_16) +FN:163,(anonymous_17) +FN:167,(anonymous_18) +FN:183,(anonymous_19) +FN:190,(anonymous_20) +FN:206,(anonymous_21) +FN:217,(anonymous_22) +FN:242,(anonymous_23) +FN:263,(anonymous_24) +FN:270,(anonymous_25) +FN:275,(anonymous_26) +FNF:26 +FNH:20 +FNDA:2,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:5,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:3,(anonymous_5) +FNDA:15,(anonymous_6) +FNDA:1,(anonymous_7) +FNDA:5,(anonymous_8) +FNDA:7,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:13,(anonymous_12) +FNDA:60,(anonymous_13) +FNDA:4,(anonymous_14) +FNDA:13,(anonymous_15) +FNDA:1,(anonymous_16) +FNDA:24,(anonymous_17) +FNDA:123,(anonymous_18) +FNDA:1,(anonymous_19) +FNDA:5,(anonymous_20) +FNDA:1,(anonymous_21) +FNDA:1,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +DA:1,5 +DA:3,5 +DA:4,5 +DA:5,5 +DA:10,5 +DA:18,1 +DA:20,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:33,5 +DA:35,1 +DA:41,2 +DA:42,2 +DA:43,2 +DA:44,2 +DA:45,3 +DA:49,15 +DA:54,1 +DA:56,2 +DA:64,1 +DA:65,1 +DA:67,5 +DA:69,1 +DA:75,7 +DA:76,7 +DA:79,35 +DA:82,7 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:92,0 +DA:96,13 +DA:97,13 +DA:99,60 +DA:101,13 +DA:112,0 +DA:114,4 +DA:118,4 +DA:120,0 +DA:133,13 +DA:136,7 +DA:138,6 +DA:139,5 +DA:141,5 +DA:151,1 +DA:153,1 +DA:155,1 +DA:167,24 +DA:169,23 +DA:174,24 +DA:176,23 +DA:187,1 +DA:190,1 +DA:192,1 +DA:193,1 +DA:197,1 +DA:198,1 +DA:207,1 +DA:209,1 +DA:219,1 +DA:222,4 +DA:226,0 +DA:229,0 +DA:233,1 +DA:234,1 +DA:243,0 +DA:244,0 +DA:248,0 +DA:249,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:264,0 +DA:265,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:279,0 +LF:80 +LH:58 +BRDA:33,0,0,5 +BRDA:33,1,0,5 +BRDA:33,1,1,5 +BRDA:43,2,0,2 +BRDA:43,2,1,0 +BRDA:45,3,0,1 +BRDA:67,4,0,5 +BRDA:67,5,0,5 +BRDA:67,5,1,5 +BRDA:90,6,0,0 +BRDA:90,7,0,0 +BRDA:90,7,1,0 +BRDA:99,8,0,60 +BRDA:99,9,0,60 +BRDA:99,9,1,60 +BRDA:138,10,0,1 +BRDA:138,10,1,5 +BRDA:139,11,0,0 +BRDA:139,11,1,5 +BRDA:174,12,0,1 +BRDA:197,13,0,0 +BRDA:197,13,1,1 +BRF:22 +BRH:16 +end_of_record +TN: +SF:src/core/project/UserDefinedExternalDependency.ts +FN:13,(anonymous_1) +FN:23,(anonymous_2) +FN:44,(anonymous_3) +FNF:3 +FNH:3 +FNDA:9,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:7,(anonymous_3) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:10,2 +DA:14,9 +DA:15,9 +DA:16,9 +DA:17,9 +DA:20,0 +DA:24,2 +DA:25,2 +DA:26,2 +DA:28,2 +DA:30,2 +DA:33,2 +DA:37,0 +DA:40,2 +DA:41,2 +DA:45,7 +DA:47,7 +DA:50,0 +DA:55,0 +DA:59,7 +LF:24 +LH:20 +BRDA:14,0,0,9 +BRDA:14,0,1,0 +BRDA:52,1,0,7 +BRDA:52,1,1,7 +BRF:4 +BRH:3 +end_of_record +TN: +SF:src/core/queryHelper/ChunkCollection.ts +FN:9,chunkCollection +FNF:1 +FNH:1 +FNDA:3,chunkCollection +DA:9,2 +DA:10,3 +DA:11,3 +DA:13,3 +DA:14,3 +DA:17,1 +DA:20,7 +DA:22,6 +DA:23,6 +DA:25,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:35,2 +DA:37,2 +LF:16 +LH:16 +BRDA:9,0,0,1 +BRDA:9,1,0,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/core/queryHelper/QueryHelper.ts +FN:6,(anonymous_0) +FN:8,(anonymous_1) +FNF:2 +FNH:2 +FNDA:21,(anonymous_0) +FNDA:27,(anonymous_1) +DA:3,11 +DA:5,11 +DA:7,21 +DA:10,27 +DA:11,20 +DA:13,19 +LF:6 +LH:6 +BRDA:10,0,0,7 +BRDA:10,0,1,20 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/core/stats/NativeMetricSender.ts +FN:4,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:3,1 +DA:4,0 +DA:14,0 +DA:16,0 +DA:18,0 +DA:20,0 +LF:6 +LH:1 +BRDA:13,0,0,0 +BRDA:13,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/core/stats/SFPStatsSender.ts +FN:15,(anonymous_7) +FN:25,(anonymous_8) +FN:47,(anonymous_9) +FN:56,(anonymous_10) +FN:74,(anonymous_11) +FN:92,(anonymous_12) +FN:109,(anonymous_13) +FNF:7 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:16,0 +DA:22,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:43,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:57,0 +DA:61,0 +DA:64,0 +DA:71,0 +DA:75,0 +DA:79,0 +DA:82,0 +DA:89,0 +DA:93,0 +DA:97,0 +DA:100,0 +DA:106,0 +DA:111,0 +LF:35 +LH:7 +BRDA:18,0,0,0 +BRDA:18,0,1,0 +BRDA:19,1,0,0 +BRDA:19,1,1,0 +BRDA:27,2,0,0 +BRDA:27,2,1,0 +BRDA:27,2,2,0 +BRDA:27,2,3,0 +BRDA:57,3,0,0 +BRDA:75,4,0,0 +BRDA:93,5,0,0 +BRF:11 +BRH:0 +end_of_record +TN: +SF:src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts +FN:6,(anonymous_6) +FN:12,(anonymous_7) +FN:25,(anonymous_8) +FN:39,(anonymous_9) +FNF:4 +FNH:0 +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:7,0 +DA:14,0 +DA:21,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:31,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:45,0 +LF:15 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts +FN:12,(anonymous_6) +FN:19,(anonymous_7) +FN:27,(anonymous_8) +FN:33,(anonymous_9) +FN:46,(anonymous_10) +FN:54,(anonymous_11) +FNF:6 +FNH:0 +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +DA:1,1 +DA:3,1 +DA:9,1 +DA:11,1 +DA:13,0 +DA:21,0 +DA:23,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:37,0 +DA:38,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:54,0 +DA:56,0 +DA:58,0 +DA:59,0 +LF:26 +LH:4 +BRDA:37,0,0,0 +BRDA:58,1,0,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts +FN:8,(anonymous_7) +FN:14,(anonymous_8) +FN:21,(anonymous_9) +FN:25,(anonymous_10) +FN:26,(anonymous_11) +FN:35,(anonymous_12) +FN:39,(anonymous_13) +FN:40,(anonymous_14) +FNF:8 +FNH:0 +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,1 +DA:9,0 +DA:15,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:41,0 +LF:16 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/utils/AliasList.ts +FN:4,convertAliasToUsername +FN:10,convertUsernameToAlias +FNF:2 +FNH:0 +FNDA:0,convertAliasToUsername +FNDA:0,convertUsernameToAlias +DA:1,4 +DA:4,4 +DA:5,0 +DA:6,0 +DA:7,0 +DA:10,4 +DA:12,0 +DA:13,0 +DA:14,0 +LF:9 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/utils/ChunkArray.ts +FN:1,chunkArray +FNF:1 +FNH:1 +FNDA:2,chunkArray +DA:1,1 +DA:2,2 +DA:3,2 +DA:4,2 +DA:7,9 +DA:10,2 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/utils/Delay.ts +FN:1,delay +FN:2,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,delay +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,0 +LF:2 +LH:1 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/core/utils/FileSystem.ts +FN:11,(anonymous_0) +FN:20,readdirRecursiveHandler +FN:23,(anonymous_2) +FNF:3 +FNH:3 +FNDA:4,(anonymous_0) +FNDA:24,readdirRecursiveHandler +FNDA:44,(anonymous_2) +DA:1,2 +DA:2,2 +DA:4,2 +DA:16,4 +DA:18,4 +DA:20,4 +DA:21,24 +DA:23,24 +DA:26,22 +DA:28,22 +DA:34,5 +DA:36,5 +DA:39,20 +DA:42,12 +DA:44,12 +DA:50,4 +LF:16 +LH:16 +BRDA:13,0,0,0 +BRDA:14,1,0,0 +BRDA:18,2,0,0 +BRF:3 +BRH:0 +end_of_record +TN: +SF:src/core/utils/Fileutils.ts +FN:15,(anonymous_0) +FN:16,(anonymous_1) +FN:31,(anonymous_2) +FN:40,(anonymous_3) +FN:55,(anonymous_4) +FN:70,(anonymous_5) +FN:85,(anonymous_6) +FN:90,(anonymous_7) +FN:107,(anonymous_8) +FN:123,(anonymous_9) +FN:133,(anonymous_10) +FN:146,(anonymous_11) +FN:177,(anonymous_12) +FN:179,(anonymous_13) +FN:195,(anonymous_14) +FNF:15 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:8,1 +DA:10,1 +DA:16,0 +DA:19,0 +DA:21,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:45,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:56,0 +DA:57,0 +DA:59,0 +DA:60,0 +DA:63,0 +DA:71,0 +DA:72,0 +DA:74,0 +DA:75,0 +DA:77,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:91,0 +DA:93,0 +DA:96,0 +DA:99,0 +DA:108,0 +DA:109,0 +DA:111,0 +DA:113,0 +DA:115,0 +DA:124,0 +DA:126,0 +DA:127,0 +DA:129,0 +DA:131,0 +DA:133,0 +DA:134,0 +DA:137,0 +DA:147,0 +DA:148,0 +DA:150,0 +DA:151,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:157,0 +DA:159,0 +DA:161,0 +DA:165,0 +DA:170,0 +DA:179,0 +DA:180,0 +DA:184,0 +DA:188,0 +DA:192,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:202,0 +LF:77 +LH:7 +BRDA:31,0,0,0 +BRDA:44,1,0,0 +BRDA:44,1,1,0 +BRDA:85,2,0,0 +BRDA:85,3,0,0 +BRDA:87,4,0,0 +BRDA:87,4,1,0 +BRDA:88,5,0,0 +BRDA:88,5,1,0 +BRDA:95,6,0,0 +BRDA:95,6,1,0 +BRDA:95,6,2,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:src/core/utils/ObjectCRUDHelper.ts +FN:8,(anonymous_0) +FN:10,(anonymous_1) +FN:28,(anonymous_2) +FN:30,(anonymous_3) +FNF:4 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:3,(anonymous_3) +DA:3,4 +DA:5,4 +DA:7,4 +DA:9,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:16,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:29,3 +DA:31,3 +DA:32,3 +DA:33,1 +LF:16 +LH:7 +BRDA:12,0,0,0 +BRDA:12,0,1,0 +BRDA:19,1,0,0 +BRDA:19,1,1,0 +BRDA:21,2,0,0 +BRDA:21,2,1,0 +BRDA:32,3,0,2 +BRDA:32,3,1,1 +BRF:8 +BRH:2 +end_of_record +TN: +SF:src/core/utils/VersionNumberConverter.ts +FN:6,convertBuildNumDotDelimToHyphen +FN:22,getIndexOfBuildNumDelimeter +FNF:2 +FNH:2 +FNDA:103,convertBuildNumDotDelimToHyphen +FNDA:103,getIndexOfBuildNumDelimeter +DA:6,2 +DA:7,103 +DA:9,103 +DA:11,103 +DA:14,103 +DA:23,103 +DA:24,103 +DA:26,309 +DA:29,103 +DA:32,0 +LF:10 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/utils/extractDomainFromUrl.ts +FN:6,extractDomainFromUrl +FNF:1 +FNH:1 +FNDA:7,extractDomainFromUrl +DA:6,1 +DA:7,7 +DA:8,4 +DA:9,4 +LF:4 +LH:4 +BRDA:7,0,0,3 +BRDA:9,1,0,4 +BRDA:9,1,1,3 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/core/utils/xml2json.ts +FN:3,xml2json +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FNF:3 +FNH:3 +FNDA:12,xml2json +FNDA:12,(anonymous_1) +FNDA:12,(anonymous_2) +DA:1,4 +DA:3,4 +DA:4,12 +DA:5,12 +DA:6,12 +DA:7,12 +LF:6 +LH:6 +BRDA:6,0,0,0 +BRDA:6,0,1,12 +BRF:2 +BRH:1 +end_of_record +TN: +SF:src/impl/changelog/CommitUpdater.ts +FN:6,(anonymous_0) +FN:18,(anonymous_1) +FN:30,(anonymous_2) +FNF:3 +FNH:3 +FNDA:4,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:76,(anonymous_2) +DA:5,1 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:20,10 +DA:25,10 +DA:29,6 +DA:30,76 +DA:33,2 +DA:38,2 +DA:39,2 +DA:40,2 +DA:45,4 +DA:48,0 +DA:50,0 +DA:53,4 +LF:17 +LH:15 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/impl/changelog/OrgsUpdater.ts +FN:8,(anonymous_0) +FN:21,(anonymous_1) +FN:24,(anonymous_2) +FN:58,(anonymous_3) +FN:62,(anonymous_4) +FN:119,(anonymous_5) +FNF:6 +FNH:6 +FNDA:4,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:6,(anonymous_5) +DA:2,1 +DA:4,1 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:14,4 +DA:17,2 +DA:24,2 +DA:27,1 +DA:28,1 +DA:29,1 +DA:31,1 +DA:40,0 +DA:49,2 +DA:58,3 +DA:61,2 +DA:62,2 +DA:67,0 +DA:68,0 +DA:71,1 +DA:75,1 +DA:76,1 +DA:79,1 +DA:81,0 +DA:85,1 +DA:86,1 +DA:89,2 +DA:98,0 +DA:104,0 +DA:120,6 +DA:121,6 +LF:32 +LH:26 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/impl/changelog/WorkItemUpdater.ts +FN:6,(anonymous_6) +FN:11,(anonymous_7) +FNF:2 +FNH:2 +FNDA:1,(anonymous_6) +FNDA:1,(anonymous_7) +DA:1,1 +DA:5,1 +DA:6,1 +DA:14,2 +DA:15,2 +DA:19,24 +DA:20,24 +DA:24,3 +DA:25,3 +DA:27,1 +DA:38,3 +LF:11 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/impl/dependency/ShrinkImpl.ts +FN:14,(anonymous_7) +FN:15,(anonymous_8) +FN:32,(anonymous_9) +FN:73,(anonymous_10) +FN:74,(anonymous_11) +FNF:5 +FNH:5 +FNDA:2,(anonymous_7) +FNDA:2,(anonymous_8) +FNDA:2,(anonymous_9) +FNDA:12,(anonymous_10) +FNDA:72,(anonymous_11) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:14,2 +DA:16,2 +DA:18,2 +DA:20,2 +DA:24,2 +DA:25,2 +DA:27,2 +DA:29,2 +DA:33,2 +DA:36,12 +DA:41,12 +DA:42,12 +DA:45,22 +DA:53,36 +DA:55,24 +DA:60,18 +DA:68,12 +DA:74,12 +DA:76,10 +LF:26 +LH:26 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/impl/parallelBuilder/BuildCollections.ts +FN:11,(anonymous_1) +FN:15,(anonymous_2) +FN:23,(anonymous_3) +FN:32,(anonymous_4) +FN:36,(anonymous_5) +FN:58,(anonymous_6) +FN:62,(anonymous_7) +FNF:7 +FNH:5 +FNDA:4,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:6,(anonymous_4) +FNDA:9,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +DA:1,1 +DA:2,1 +DA:7,1 +DA:12,4 +DA:16,2 +DA:24,4 +DA:26,4 +DA:29,7 +DA:30,6 +DA:32,6 +DA:36,9 +DA:37,2 +DA:39,1 +DA:44,5 +DA:47,1 +DA:59,0 +DA:63,0 +LF:17 +LH:15 +BRDA:29,0,0,6 +BRDA:29,0,1,1 +BRDA:30,1,0,6 +BRDA:36,2,0,2 +BRDA:36,2,1,1 +BRDA:63,3,0,0 +BRDA:63,3,1,0 +BRF:7 +BRH:5 +end_of_record +TN: +SF:src/impl/parallelBuilder/UndirectedGraph.ts +FN:4,(anonymous_0) +FN:8,(anonymous_1) +FN:12,(anonymous_2) +FN:17,(anonymous_3) +FN:30,(anonymous_4) +FN:35,dfsHandler +FN:40,(anonymous_6) +FNF:7 +FNH:7 +FNDA:12,(anonymous_0) +FNDA:17,(anonymous_1) +FNDA:22,(anonymous_2) +FNDA:17,(anonymous_3) +FNDA:4,(anonymous_4) +FNDA:19,dfsHandler +FNDA:42,(anonymous_6) +DA:1,2 +DA:5,12 +DA:9,17 +DA:13,22 +DA:14,1 +DA:18,17 +DA:19,16 +DA:20,14 +DA:22,13 +DA:23,13 +DA:31,4 +DA:32,4 +DA:33,4 +DA:35,4 +DA:36,19 +DA:37,19 +DA:38,18 +DA:39,18 +DA:40,18 +DA:42,15 +DA:47,3 +LF:21 +LH:21 +BRDA:13,0,0,21 +BRDA:13,0,1,1 +BRDA:18,1,0,1 +BRDA:19,2,0,2 +BRDA:20,3,0,1 +BRDA:22,4,0,13 +BRDA:23,5,0,13 +BRDA:36,6,0,0 +BRDA:37,7,0,1 +BRF:9 +BRH:8 +end_of_record +TN: +SF:src/impl/release/ReleaseDefinition.ts +FN:12,(anonymous_1) +FN:16,(anonymous_2) +FN:28,(anonymous_3) +FN:48,(anonymous_4) +FN:54,(anonymous_5) +FN:68,(anonymous_6) +FNF:6 +FNH:4 +FNDA:0,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:5,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:5,(anonymous_5) +FNDA:6,(anonymous_6) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:14,0 +DA:16,5 +DA:17,5 +DA:20,1 +DA:21,1 +DA:24,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:38,5 +DA:41,0 +DA:44,5 +DA:45,0 +DA:50,0 +DA:55,5 +DA:60,5 +DA:61,5 +DA:65,4 +DA:68,4 +DA:69,6 +DA:76,4 +LF:30 +LH:21 +BRDA:20,0,0,1 +BRDA:20,1,0,1 +BRDA:20,1,1,1 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/utils/Get18DigitSalesforceId.ts +FN:1,get18DigitSalesforceId +FNF:1 +FNH:0 +FNDA:0,get18DigitSalesforceId +DA:1,1 +DA:3,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:14,0 +DA:15,0 +DA:17,0 +LF:12 +LH:1 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:4,1,0,0 +BRDA:4,1,1,0 +BRDA:10,2,0,0 +BRDA:10,3,0,0 +BRDA:10,3,1,0 +BRF:7 +BRH:0 +end_of_record diff --git a/packages/sfpowerscripts-cli/messages/generate_changelog.json b/packages/sfpowerscripts-cli/messages/generate_changelog.json index fb6f78cf1..8844686d9 100644 --- a/packages/sfpowerscripts-cli/messages/generate_changelog.json +++ b/packages/sfpowerscripts-cli/messages/generate_changelog.json @@ -1,7 +1,7 @@ { "commandDescription": "Generates release changelog, providing a summary of artifact versions, work items and commits introduced in a release. Creates a release definition based on artifacts contained in the artifact directory, and compares it to previous release definition in changelog stored on a source repository", "limitFlagDescription": "limit the number of releases to display in changelog markdown", - "artifactDirectoryFlagDescription": "Directory containing sfpowerscripts artifacts", + "artifactDirectoryFlagDescription": "Directory containing sfp artifacts", "releaseNameFlagDescription": "Name of the release for which to generate changelog", "workItemFilterFlagDescription": "Regular expression used to search for work items (user stories) introduced in release", "workItemUrlFlagDescription": "Generic URL for work items. Each work item ID will be appended to the URL, providing quick access to work items", diff --git a/packages/sfpowerscripts-cli/messages/install_package.json b/packages/sfpowerscripts-cli/messages/install_package.json index 89db89720..2dfc9c318 100644 --- a/packages/sfpowerscripts-cli/messages/install_package.json +++ b/packages/sfpowerscripts-cli/messages/install_package.json @@ -1,5 +1,5 @@ { - "commandDescription": "Installs a sfpowerscripts artifact to an org", + "commandDescription": "Installs a sfp artifact to an org", "packageFlagDescription": "Name of the package to be installed", "targetOrgFlagDescription": "Alias/User Name of the target environment", "apexCompileOnlyPackageFlagDescription": "(unlocked) package installation triggers a compilation of apex, flag to trigger compilation of package only", diff --git a/packages/sfpowerscripts-cli/messages/install_source_package.json b/packages/sfpowerscripts-cli/messages/install_source_package.json index 11e743801..0d5be458a 100644 --- a/packages/sfpowerscripts-cli/messages/install_source_package.json +++ b/packages/sfpowerscripts-cli/messages/install_source_package.json @@ -1,5 +1,5 @@ { - "commandDescription": "(DEPRECATED) Installs a sfpowerscripts source package to the target org", + "commandDescription": "(DEPRECATED) Installs a sfp source package to the target org", "packageFlagDescription": "Name of the package to be installed", "targetOrgFlagDescription": "Alias/User Name of the target environment", "artifactDirectoryFlagDescription": "The directory where the artifact is located", diff --git a/packages/sfpowerscripts-cli/messages/install_unlocked_package.json b/packages/sfpowerscripts-cli/messages/install_unlocked_package.json index 454034c9d..ac93c9e9d 100644 --- a/packages/sfpowerscripts-cli/messages/install_unlocked_package.json +++ b/packages/sfpowerscripts-cli/messages/install_unlocked_package.json @@ -1,5 +1,5 @@ { - "commandDescription": "(DEPRECATED) Installs an unlocked package using sfpowerscripts metadata", + "commandDescription": "(DEPRECATED) Installs an unlocked package using sfp metadata", "packageFlagDescription": "Name of the package to be installed", "targetOrgFlagDescription": "Alias/User Name of the target environment", "packageInstalledFromFlagDescription": "automatically retrieve the version ID of the package to be installed, from the build artifact", diff --git a/packages/sfpowerscripts-cli/messages/metrics_report.json b/packages/sfpowerscripts-cli/messages/metrics_report.json index 77853e3af..9a2718a83 100644 --- a/packages/sfpowerscripts-cli/messages/metrics_report.json +++ b/packages/sfpowerscripts-cli/messages/metrics_report.json @@ -1,3 +1,3 @@ { - "commandDescription": "Report a custom metric to any sfpowerscripts supported metric provider" + "commandDescription": "Report a custom metric to any sfp supported metric provider" } diff --git a/packages/sfpowerscripts-cli/messages/pool_delete.json b/packages/sfpowerscripts-cli/messages/pool_delete.json index 1e558d567..a1ddb8c53 100644 --- a/packages/sfpowerscripts-cli/messages/pool_delete.json +++ b/packages/sfpowerscripts-cli/messages/pool_delete.json @@ -4,5 +4,5 @@ "mypoolDescription": "Filter only Scratch orgs created by current user in the pool", "allscratchorgsDescription": "Deletes all used and unused Scratch orgs from pool by the tag", "inprogressonlyDescription": "Deletes all In Progress Scratch orgs from pool by the tag", - "recoverOrphanedScratchOrgsDescription": "Recovers scratch orgs that were created by salesforce but were not tagged to sfpowerscripts due to timeouts etc." + "recoverOrphanedScratchOrgsDescription": "Recovers scratch orgs that were created by salesforce but were not tagged to sfp due to timeouts etc." } diff --git a/packages/sfpowerscripts-cli/package.json b/packages/sfpowerscripts-cli/package.json index 426418c15..c65d9f6bb 100644 --- a/packages/sfpowerscripts-cli/package.json +++ b/packages/sfpowerscripts-cli/package.json @@ -1,20 +1,33 @@ { - "name": "@dxatscale/sfpowerscripts", - "description": "DX@Scale Toolkit", - "version": "25.6.0", + "name": "@flxblio/sfp", + "description": "Flxbl Toolkit", + "version": "1.0.0", "license": "MIT", - "author": "dxatscale", + "author": "flxblio", "release": "January 24", "bin": { - "sfp": "./bin/run", - "sfpowerscripts": "./bin/run" + "sfp": "./bin/run" }, - "bugs": "https://github.com/dxatscale/sfpowerscripts/issues", + "bugs": "https://github.com/flxblio/sfp/issues", "dependencies": { - "@dxatscale/sfdx-process-wrapper": "^1.0.2", - "@dxatscale/sfp-logger": "^2.1.2", - "@dxatscale/sfpowerscripts.core": "^36.5.3", - "@dxatscale/sfprofiles": "^2.0.8", + "@flxblio/apexlink": "^1.0.2", + "@newrelic/telemetry-sdk": "^0.6.0", + "@salesforce/apex-node": "2.1.0", + "@salesforce/packaging": "2.3.3", + "@salesforce/source-deploy-retrieve": "9.7.24", + "@salesforce/source-tracking": "4.2.16", + "apex-parser": "2.13.0", + "axios": "^1.4.0", + "datadog-metrics": "^0.9.3", + "fast-xml-parser": "4.2.7", + "hot-shots": "^8.5.0", + "ignore": "^5.1.6", + "tar": "^6.1.9", + "tmp": "^0.2.1", + "xml2js": "^0.6.0", + "@flxblio/sfdx-process-wrapper": "^1.0.2", + "@flxblio/sfp-logger": "^2.1.2", + "@flxblio/sfprofiles": "^2.0.8", "@oclif/core": "2.11.8", "@oclif/plugin-commands": "^3.0.3", "@oclif/plugin-help": "5.2.17", @@ -61,6 +74,7 @@ "oclif": "^3.10.0", "ts-jest": "29.1.1", "ts-node": "10.7.0", + "@types/fs-extra": "11.0.4", "typescript": "^5" }, "engines": { @@ -74,10 +88,10 @@ "/resources", "/oclif.manifest.json" ], - "homepage": "https://github.com/dxatscale/sfpowerscripts", + "homepage": "https://github.com/flxblio/sfp", "keywords": [ - "dxatscale", - "sf-cli", + "flxblio", + "sfp-cli", "sfdx", "salesforce", "sf", @@ -93,7 +107,7 @@ "description": "Orchestrate packages from a monorepo through its lifecycle, driven by descriptors in your sfdx-project.json" }, "pool": { - "description": "Manage the pooled orgs created by the sfpowerscripts orchestrator in prepare stage" + "description": "Manage the pooled orgs created by the sfp orchestrator in prepare stage" }, "changelog": { "description": "Track your artifacts & user stories as they progress through different environments, with release changelogs" @@ -108,12 +122,12 @@ "description": "Commands to create and install unlocked packages" }, "source": { - "description": "Commands to create and install sfpowerscripts source packages" + "description": "Commands to create and install sfp source packages" } } }, "impact": { - "description": "Figures out the impact of various components of sfpowerscripts", + "description": "Figures out the impact of various components of sfp", "external": true }, "analyze": { @@ -148,8 +162,8 @@ }, "repository": { "type": "git", - "url": "https://github.com/dxatscale/sfpowerscripts.git", - "directory": "packages/sfpowerscripts-cli" + "url": "https://github.com/flxblio/sfp.git", + "directory": "packages/sfp-cli" }, "scripts": { "build": "pnpm run clean && pnpm run compile", diff --git a/packages/sfpowerscripts-cli/resources/metadatainfo.json b/packages/sfpowerscripts-cli/resources/metadatainfo.json new file mode 100644 index 000000000..abcbaba65 --- /dev/null +++ b/packages/sfpowerscripts-cli/resources/metadatainfo.json @@ -0,0 +1,1075 @@ +{ + "metadataObjects": [ + { + "directoryName": "installedPackages", + "inFolder": false, + "metaFile": false, + "suffix": "installedPackage", + "xmlName": "InstalledPackage" + }, + { + "childXmlNames": ["CustomLabel"], + "directoryName": "labels", + "inFolder": false, + "metaFile": false, + "suffix": "labels", + "xmlName": "CustomLabels" + }, + { + "directoryName": "staticresources", + "inFolder": false, + "metaFile": true, + "suffix": "resource", + "xmlName": "StaticResource" + }, + { + "directoryName": "scontrols", + "inFolder": false, + "metaFile": true, + "suffix": "scf", + "xmlName": "Scontrol" + }, + { + "directoryName": "certs", + "inFolder": false, + "metaFile": true, + "suffix": "crt", + "xmlName": "Certificate" + }, + { + "directoryName": "messageChannels", + "inFolder": false, + "metaFile": false, + "suffix": "messageChannel", + "xmlName": "LightningMessageChannel" + }, + { + "directoryName": "aura", + "inFolder": false, + "metaFile": false, + "xmlName": "AuraDefinitionBundle" + }, + { + "directoryName": "lwc", + "inFolder": false, + "metaFile": false, + "xmlName": "LightningComponentBundle" + }, + { + "directoryName": "components", + "inFolder": false, + "metaFile": true, + "suffix": "component", + "xmlName": "ApexComponent" + }, + { + "directoryName": "pages", + "inFolder": false, + "metaFile": true, + "suffix": "page", + "xmlName": "ApexPage" + }, + { + "directoryName": "queues", + "inFolder": false, + "metaFile": false, + "suffix": "queue", + "xmlName": "Queue" + }, + { + "directoryName": "CaseSubjectParticles", + "inFolder": false, + "metaFile": false, + "suffix": "CaseSubjectParticle", + "xmlName": "CaseSubjectParticle" + }, + { + "directoryName": "dataSources", + "inFolder": false, + "metaFile": false, + "suffix": "dataSource", + "xmlName": "ExternalDataSource" + }, + { + "directoryName": "namedCredentials", + "inFolder": false, + "metaFile": false, + "suffix": "namedCredential", + "xmlName": "NamedCredential" + }, + { + "directoryName": "externalServiceRegistrations", + "inFolder": false, + "metaFile": false, + "suffix": "externalServiceRegistration", + "xmlName": "ExternalServiceRegistration" + }, + { + "directoryName": "roles", + "inFolder": false, + "metaFile": false, + "suffix": "role", + "xmlName": "Role" + }, + { + "directoryName": "groups", + "inFolder": false, + "metaFile": false, + "suffix": "group", + "xmlName": "Group" + }, + { + "directoryName": "globalValueSets", + "inFolder": false, + "metaFile": false, + "suffix": "globalValueSet", + "xmlName": "GlobalValueSet" + }, + { + "directoryName": "standardValueSets", + "inFolder": false, + "metaFile": false, + "suffix": "standardValueSet", + "xmlName": "StandardValueSet" + }, + { + "directoryName": "customPermissions", + "inFolder": false, + "metaFile": false, + "suffix": "customPermission", + "xmlName": "CustomPermission" + }, + { + "childXmlNames": [ + "CustomField", + "Index", + "BusinessProcess", + "RecordType", + "CompactLayout", + "WebLink", + "ValidationRule", + "SharingReason", + "ListView", + "FieldSet" + ], + "directoryName": "objects", + "inFolder": false, + "metaFile": false, + "suffix": "object", + "xmlName": "CustomObject" + }, + { + "directoryName": "reportTypes", + "inFolder": false, + "metaFile": false, + "suffix": "reportType", + "xmlName": "ReportType" + }, + { + "directoryName": "reports", + "inFolder": true, + "metaFile": false, + "suffix": "report", + "xmlName": "Report" + }, + { + "directoryName": "dashboards", + "inFolder": true, + "metaFile": false, + "suffix": "dashboard", + "xmlName": "Dashboard" + }, + { + "directoryName": "analyticSnapshots", + "inFolder": false, + "metaFile": false, + "suffix": "snapshot", + "xmlName": "AnalyticSnapshot" + }, + { + "directoryName": "feedFilters", + "inFolder": false, + "metaFile": false, + "suffix": "feedFilter", + "xmlName": "CustomFeedFilter" + }, + { + "directoryName": "layouts", + "inFolder": false, + "metaFile": false, + "suffix": "layout", + "xmlName": "Layout" + }, + { + "directoryName": "documents", + "inFolder": true, + "metaFile": true, + "suffix": "document", + "xmlName": "Document" + }, + { + "directoryName": "weblinks", + "inFolder": false, + "metaFile": false, + "suffix": "weblink", + "xmlName": "CustomPageWebLink" + }, + { + "directoryName": "letterhead", + "inFolder": false, + "metaFile": false, + "suffix": "letter", + "xmlName": "Letterhead" + }, + { + "directoryName": "email", + "inFolder": true, + "metaFile": true, + "suffix": "email", + "xmlName": "EmailTemplate" + }, + { + "directoryName": "quickActions", + "inFolder": false, + "metaFile": false, + "suffix": "quickAction", + "xmlName": "QuickAction" + }, + { + "directoryName": "flexipages", + "inFolder": false, + "metaFile": false, + "suffix": "flexipage", + "xmlName": "FlexiPage" + }, + { + "directoryName": "tabs", + "inFolder": false, + "metaFile": false, + "suffix": "tab", + "xmlName": "CustomTab" + }, + { + "directoryName": "customApplicationComponents", + "inFolder": false, + "metaFile": false, + "suffix": "customApplicationComponent", + "xmlName": "CustomApplicationComponent" + }, + { + "directoryName": "applications", + "inFolder": false, + "metaFile": false, + "suffix": "app", + "xmlName": "CustomApplication" + }, + { + "directoryName": "customMetadata", + "inFolder": false, + "metaFile": false, + "suffix": "md", + "xmlName": "CustomMetadata" + }, + { + "directoryName": "flows", + "inFolder": false, + "metaFile": false, + "suffix": "flow", + "xmlName": "Flow" + }, + { + "directoryName": "flowDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "flowDefinition", + "xmlName": "FlowDefinition" + }, + { + "childXmlNames": [ + "WorkflowFieldUpdate", + "WorkflowKnowledgePublish", + "WorkflowTask", + "WorkflowAlert", + "WorkflowSend", + "WorkflowOutboundMessage", + "WorkflowRule" + ], + "directoryName": "workflows", + "inFolder": false, + "metaFile": false, + "suffix": "workflow", + "xmlName": "Workflow" + }, + { + "childXmlNames": ["AssignmentRule"], + "directoryName": "assignmentRules", + "inFolder": false, + "metaFile": false, + "suffix": "assignmentRules", + "xmlName": "AssignmentRules" + }, + { + "childXmlNames": ["AutoResponseRule"], + "directoryName": "autoResponseRules", + "inFolder": false, + "metaFile": false, + "suffix": "autoResponseRules", + "xmlName": "AutoResponseRules" + }, + { + "childXmlNames": ["EscalationRule"], + "directoryName": "escalationRules", + "inFolder": false, + "metaFile": false, + "suffix": "escalationRules", + "xmlName": "EscalationRules" + }, + { + "directoryName": "postTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "postTemplate", + "xmlName": "PostTemplate" + }, + { + "directoryName": "approvalProcesses", + "inFolder": false, + "metaFile": false, + "suffix": "approvalProcess", + "xmlName": "ApprovalProcess" + }, + { + "directoryName": "homePageComponents", + "inFolder": false, + "metaFile": false, + "suffix": "homePageComponent", + "xmlName": "HomePageComponent" + }, + { + "directoryName": "homePageLayouts", + "inFolder": false, + "metaFile": false, + "suffix": "homePageLayout", + "xmlName": "HomePageLayout" + }, + { + "directoryName": "objectTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "objectTranslation", + "xmlName": "CustomObjectTranslation" + }, + { + "directoryName": "objectTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "fieldTranslation", + "xmlName": "CustomFieldTranslation" + }, + { + "directoryName": "translations", + "inFolder": false, + "metaFile": false, + "suffix": "translation", + "xmlName": "Translations" + }, + { + "directoryName": "globalValueSetTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "globalValueSetTranslation", + "xmlName": "GlobalValueSetTranslation" + }, + { + "directoryName": "standardValueSetTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "standardValueSetTranslation", + "xmlName": "StandardValueSetTranslation" + }, + { + "directoryName": "classes", + "inFolder": false, + "metaFile": true, + "suffix": "cls", + "xmlName": "ApexClass" + }, + { + "directoryName": "triggers", + "inFolder": false, + "metaFile": true, + "suffix": "trigger", + "xmlName": "ApexTrigger" + }, + { + "directoryName": "testSuites", + "inFolder": false, + "metaFile": false, + "suffix": "testSuite", + "xmlName": "ApexTestSuite" + }, + { + "directoryName": "profiles", + "inFolder": false, + "metaFile": false, + "suffix": "profile", + "xmlName": "Profile" + }, + { + "directoryName": "permissionsets", + "inFolder": false, + "metaFile": false, + "suffix": "permissionset", + "xmlName": "PermissionSet" + }, + { + "directoryName": "mutingpermissionsets", + "inFolder": false, + "metaFile": false, + "suffix": "mutingpermissionset", + "xmlName": "MutingPermissionSet" + }, + { + "directoryName": "permissionsetgroups", + "inFolder": false, + "metaFile": false, + "suffix": "permissionsetgroup", + "xmlName": "PermissionSetGroup" + }, + { + "directoryName": "profilePasswordPolicies", + "inFolder": false, + "metaFile": false, + "suffix": "profilePasswordPolicy", + "xmlName": "ProfilePasswordPolicy" + }, + { + "directoryName": "profileSessionSettings", + "inFolder": false, + "metaFile": false, + "suffix": "profileSessionSetting", + "xmlName": "ProfileSessionSetting" + }, + { + "directoryName": "myDomainDiscoverableLogins", + "inFolder": false, + "metaFile": false, + "suffix": "myDomainDiscoverableLogin", + "xmlName": "MyDomainDiscoverableLogin" + }, + { + "directoryName": "oauthcustomscopes", + "inFolder": false, + "metaFile": false, + "suffix": "oauthcustomscope", + "xmlName": "OauthCustomScope" + }, + { + "directoryName": "datacategorygroups", + "inFolder": false, + "metaFile": false, + "suffix": "datacategorygroup", + "xmlName": "DataCategoryGroup" + }, + { + "directoryName": "remoteSiteSettings", + "inFolder": false, + "metaFile": false, + "suffix": "remoteSite", + "xmlName": "RemoteSiteSetting" + }, + { + "directoryName": "cspTrustedSites", + "inFolder": false, + "metaFile": false, + "suffix": "cspTrustedSite", + "xmlName": "CspTrustedSite" + }, + { + "directoryName": "redirectWhitelistUrls", + "inFolder": false, + "metaFile": false, + "suffix": "redirectWhitelistUrl", + "xmlName": "RedirectWhitelistUrl" + }, + { + "childXmlNames": ["MatchingRule"], + "directoryName": "matchingRules", + "inFolder": false, + "metaFile": false, + "suffix": "matchingRule", + "xmlName": "MatchingRules" + }, + { + "directoryName": "duplicateRules", + "inFolder": false, + "metaFile": false, + "suffix": "duplicateRule", + "xmlName": "DuplicateRule" + }, + { + "directoryName": "cleanDataServices", + "inFolder": false, + "metaFile": false, + "suffix": "cleanDataService", + "xmlName": "CleanDataService" + }, + { + "directoryName": "skills", + "inFolder": false, + "metaFile": false, + "suffix": "skill", + "xmlName": "Skill" + }, + { + "directoryName": "serviceChannels", + "inFolder": false, + "metaFile": false, + "suffix": "serviceChannel", + "xmlName": "ServiceChannel" + }, + { + "directoryName": "queueRoutingConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "queueRoutingConfig", + "xmlName": "QueueRoutingConfig" + }, + { + "directoryName": "servicePresenceStatuses", + "inFolder": false, + "metaFile": false, + "suffix": "servicePresenceStatus", + "xmlName": "ServicePresenceStatus" + }, + { + "directoryName": "presenceDeclineReasons", + "inFolder": false, + "metaFile": false, + "suffix": "presenceDeclineReason", + "xmlName": "PresenceDeclineReason" + }, + { + "directoryName": "presenceUserConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "presenceUserConfig", + "xmlName": "PresenceUserConfig" + }, + { + "directoryName": "authproviders", + "inFolder": false, + "metaFile": false, + "suffix": "authprovider", + "xmlName": "AuthProvider" + }, + { + "directoryName": "eclair", + "inFolder": false, + "metaFile": true, + "suffix": "geodata", + "xmlName": "EclairGeoData" + }, + { + "directoryName": "sites", + "inFolder": false, + "metaFile": false, + "suffix": "site", + "xmlName": "CustomSite" + }, + { + "directoryName": "channelLayouts", + "inFolder": false, + "metaFile": false, + "suffix": "channelLayout", + "xmlName": "ChannelLayout" + }, + { + "directoryName": "contentassets", + "inFolder": false, + "metaFile": true, + "suffix": "asset", + "xmlName": "ContentAsset" + }, + { + "directoryName": "sites", + "inFolder": false, + "metaFile": false, + "suffix": "site", + "xmlName": "CustomSite" + }, + { + "childXmlNames": ["SharingOwnerRule", "SharingCriteriaRule"], + "directoryName": "sharingRules", + "inFolder": false, + "metaFile": false, + "suffix": "sharingRules", + "xmlName": "SharingRules" + }, + { + "directoryName": "sharingSets", + "inFolder": false, + "metaFile": false, + "suffix": "sharingSet", + "xmlName": "SharingSet" + }, + { + "directoryName": "communities", + "inFolder": false, + "metaFile": false, + "suffix": "community", + "xmlName": "Community" + }, + { + "directoryName": "ChatterExtensions", + "inFolder": false, + "metaFile": false, + "suffix": "ChatterExtension", + "xmlName": "ChatterExtension" + }, + { + "directoryName": "platformEventChannels", + "inFolder": false, + "metaFile": false, + "suffix": "platformEventChannel", + "xmlName": "PlatformEventChannel" + }, + { + "directoryName": "platformEventChannelMembers", + "inFolder": false, + "metaFile": false, + "suffix": "platformEventChannelMember", + "xmlName": "PlatformEventChannelMember" + }, + { + "directoryName": "callCenters", + "inFolder": false, + "metaFile": false, + "suffix": "callCenter", + "xmlName": "CallCenter" + }, + { + "directoryName": "milestoneTypes", + "inFolder": false, + "metaFile": false, + "suffix": "milestoneType", + "xmlName": "MilestoneType" + }, + { + "directoryName": "entitlementProcesses", + "inFolder": false, + "metaFile": false, + "suffix": "entitlementProcess", + "xmlName": "EntitlementProcess" + }, + { + "directoryName": "entitlementTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "entitlementTemplate", + "xmlName": "EntitlementTemplate" + }, + { + "directoryName": "timeSheetTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "timeSheetTemplate", + "xmlName": "TimeSheetTemplate" + }, + { + "directoryName": "Canvases", + "inFolder": false, + "metaFile": false, + "suffix": "Canvas", + "xmlName": "CanvasMetadata" + }, + { + "directoryName": "MobileApplicationDetails", + "inFolder": false, + "metaFile": false, + "suffix": "MobileApplicationDetail", + "xmlName": "MobileApplicationDetail" + }, + { + "directoryName": "notificationtypes", + "inFolder": false, + "metaFile": false, + "suffix": "notiftype", + "xmlName": "CustomNotificationType" + }, + { + "directoryName": "connectedApps", + "inFolder": false, + "metaFile": false, + "suffix": "connectedApp", + "xmlName": "ConnectedApp" + }, + { + "directoryName": "appMenus", + "inFolder": false, + "metaFile": false, + "suffix": "appMenu", + "xmlName": "AppMenu" + }, + { + "directoryName": "notificationTypeConfig", + "inFolder": false, + "metaFile": false, + "suffix": "config", + "xmlName": "NotificationTypeConfig" + }, + { + "directoryName": "delegateGroups", + "inFolder": false, + "metaFile": false, + "suffix": "delegateGroup", + "xmlName": "DelegateGroup" + }, + { + "directoryName": "siteDotComSites", + "inFolder": false, + "metaFile": true, + "suffix": "site", + "xmlName": "SiteDotCom" + }, + { + "directoryName": "experiences", + "inFolder": false, + "metaFile": false, + "xmlName": "ExperienceBundle" + }, + { + "directoryName": "networks", + "inFolder": false, + "metaFile": false, + "suffix": "network", + "xmlName": "Network" + }, + { + "directoryName": "networkBranding", + "inFolder": false, + "metaFile": true, + "suffix": "networkBranding", + "xmlName": "NetworkBranding" + }, + { + "directoryName": "audience", + "inFolder": false, + "metaFile": false, + "suffix": "audience", + "xmlName": "Audience" + }, + { + "directoryName": "brandingSets", + "inFolder": false, + "metaFile": false, + "suffix": "brandingSet", + "xmlName": "BrandingSet" + }, + { + "directoryName": "communityThemeDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "communityThemeDefinition", + "xmlName": "CommunityThemeDefinition" + }, + { + "directoryName": "communityTemplateDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "communityTemplateDefinition", + "xmlName": "CommunityTemplateDefinition" + }, + { + "directoryName": "navigationMenus", + "inFolder": false, + "metaFile": false, + "suffix": "navigationMenu", + "xmlName": "NavigationMenu" + }, + { + "directoryName": "flowCategories", + "inFolder": false, + "metaFile": false, + "suffix": "flowCategory", + "xmlName": "FlowCategory" + }, + { + "directoryName": "lightningBolts", + "inFolder": false, + "metaFile": false, + "suffix": "lightningBolt", + "xmlName": "LightningBolt" + }, + { + "directoryName": "lightningExperienceThemes", + "inFolder": false, + "metaFile": false, + "suffix": "lightningExperienceTheme", + "xmlName": "LightningExperienceTheme" + }, + { + "directoryName": "lightningOnboardingConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "lightningOnboardingConfig", + "xmlName": "LightningOnboardingConfig" + }, + { + "directoryName": "customHelpMenuSections", + "inFolder": false, + "metaFile": false, + "suffix": "customHelpMenuSection", + "xmlName": "CustomHelpMenuSection" + }, + { + "directoryName": "prompts", + "inFolder": false, + "metaFile": false, + "suffix": "prompt", + "xmlName": "Prompt" + }, + { + "childXmlNames": ["ManagedTopic"], + "directoryName": "managedTopics", + "inFolder": false, + "metaFile": false, + "suffix": "managedTopics", + "xmlName": "ManagedTopics" + }, + { + "directoryName": "moderation", + "inFolder": false, + "metaFile": false, + "suffix": "keywords", + "xmlName": "KeywordList" + }, + { + "directoryName": "userCriteria", + "inFolder": false, + "metaFile": false, + "suffix": "userCriteria", + "xmlName": "UserCriteria" + }, + { + "directoryName": "moderation", + "inFolder": false, + "metaFile": false, + "suffix": "rule", + "xmlName": "ModerationRule" + }, + { + "directoryName": "cmsConnectSource", + "inFolder": false, + "metaFile": false, + "suffix": "cmsConnectSource", + "xmlName": "CMSConnectSource" + }, + { + "directoryName": "managedContentTypes", + "inFolder": false, + "metaFile": false, + "suffix": "managedContentType", + "xmlName": "ManagedContentType" + }, + { + "directoryName": "samlssoconfigs", + "inFolder": false, + "metaFile": false, + "suffix": "samlssoconfig", + "xmlName": "SamlSsoConfig" + }, + { + "directoryName": "corsWhitelistOrigins", + "inFolder": false, + "metaFile": false, + "suffix": "corsWhitelistOrigin", + "xmlName": "CorsWhitelistOrigin" + }, + { + "directoryName": "actionLinkGroupTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "actionLinkGroupTemplate", + "xmlName": "ActionLinkGroupTemplate" + }, + { + "directoryName": "liveChatDeployments", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatDeployment", + "xmlName": "LiveChatDeployment" + }, + { + "directoryName": "liveChatButtons", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatButton", + "xmlName": "LiveChatButton" + }, + { + "directoryName": "liveChatAgentConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatAgentConfig", + "xmlName": "LiveChatAgentConfig" + }, + { + "directoryName": "liveChatSensitiveDataRule", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatSensitiveDataRule", + "xmlName": "LiveChatSensitiveDataRule" + }, + { + "directoryName": "transactionSecurityPolicies", + "inFolder": false, + "metaFile": false, + "suffix": "transactionSecurityPolicy", + "xmlName": "TransactionSecurityPolicy" + }, + { + "directoryName": "synonymDictionaries", + "inFolder": false, + "metaFile": false, + "suffix": "synonymDictionary", + "xmlName": "SynonymDictionary" + }, + { + "directoryName": "pathAssistants", + "inFolder": false, + "metaFile": false, + "suffix": "pathAssistant", + "xmlName": "PathAssistant" + }, + { + "directoryName": "animationRules", + "inFolder": false, + "metaFile": false, + "suffix": "animationRule", + "xmlName": "AnimationRule" + }, + { + "directoryName": "LeadConvertSettings", + "inFolder": false, + "metaFile": false, + "suffix": "LeadConvertSetting", + "xmlName": "LeadConvertSettings" + }, + { + "directoryName": "cachePartitions", + "inFolder": false, + "metaFile": false, + "suffix": "cachePartition", + "xmlName": "PlatformCachePartition" + }, + { + "directoryName": "topicsForObjects", + "inFolder": false, + "metaFile": false, + "suffix": "topicsForObjects", + "xmlName": "TopicsForObjects" + }, + { + "directoryName": "recommendationStrategies", + "inFolder": false, + "metaFile": false, + "suffix": "recommendationStrategy", + "xmlName": "RecommendationStrategy" + }, + { + "directoryName": "emailservices", + "inFolder": false, + "metaFile": false, + "suffix": "xml", + "xmlName": "EmailServicesFunction" + }, + { + "directoryName": "recordActionDeployments", + "inFolder": false, + "metaFile": false, + "suffix": "deployment", + "xmlName": "RecordActionDeployment" + }, + { + "directoryName": "salesAgreementSettings", + "inFolder": false, + "metaFile": false, + "suffix": "salesAgreementSetting", + "xmlName": "SalesAgreementSettings" + }, + { + "directoryName": "AccountForecastSettings", + "inFolder": false, + "metaFile": false, + "suffix": "accountForecastSetting", + "xmlName": "AccountForecastSettings" + }, + { + "directoryName": "icons", + "inFolder": false, + "metaFile": false, + "suffix": "icon", + "xmlName": "Icon" + }, + { + "directoryName": "EmbeddedServiceLiveAgent", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceLiveAgent", + "xmlName": "EmbeddedServiceLiveAgent" + }, + { + "directoryName": "EmbeddedServiceConfig", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceConfig", + "xmlName": "EmbeddedServiceConfig" + }, + { + "directoryName": "EmbeddedServiceBranding", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceBranding", + "xmlName": "EmbeddedServiceBranding" + }, + { + "directoryName": "EmbeddedServiceFlowConfig", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceFlowConfig", + "xmlName": "EmbeddedServiceFlowConfig" + }, + { + "directoryName": "EmbeddedServiceMenuSettings", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceMenuSettings", + "xmlName": "EmbeddedServiceMenuSettings" + }, + { + "directoryName": "uiObjectRelationConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "uiObjectRelationConfig", + "xmlName": "UIObjectRelationConfig" + }, + { + "directoryName": "careProviderSearchConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "careProviderSearchConfig", + "xmlName": "CareProviderSearchConfig" + }, + { + "directoryName": "settings", + "inFolder": false, + "metaFile": false, + "suffix": "settings", + "xmlName": "Settings" + } + ], + "organizationNamespace": "", + "partialSaveAllowed": false, + "testRequired": true +} diff --git a/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json b/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json new file mode 100644 index 000000000..b3102e17d --- /dev/null +++ b/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json @@ -0,0 +1,147 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json", + "title": "pool definition", + "description": "The definition for creating a pool of scratch orgs in sfp", + "type": "object", + "required": ["tag", "maxAllocation"], + "additionalProperties": false, + "properties": { + "$schema": { + "description": "Support editors like vscode to help with IntelliSense", + "type": "string", + "default": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json" + }, + "tag": { + "title": "Tag of the pool", + "description": "Tag or name to identify the scratch org pool", + "type": "string" + }, + "waitTime": { + "title": "wait time", + "description": "Time to wait for scratch org creation in minutes (default:6 mins)", + "type": "integer", + "default": 6 + }, + "expiry": { + "title": "expiry", + "description": "Duration of the scratch org (in days) (default:2)", + "type": "integer", + "default": 2 + }, + "maxAllocation": { + "title": "Max number of scratch orgs to be allocated", + "description": "Maximum number of scratch orgs to be allocated in the pool", + "type": "integer" + }, + "batchSize": { + "title": "Batch Size", + "description": "Control the parallelism of the pool creation (default:5)", + "type": "integer", + "default": 5 + }, + "configFilePath": { + "title": "Path to config file", + "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition.", + "type": "string", + "default": "config/project-scratch-def.json" + }, + "releaseConfigFile": { + "title": "Path to release config file", + "description": "Path to the config file which determines how a release defintion should be generated, enable this for pools to use this release config to only utilize artifacts described the releae config", + "type": "string" + }, + "succeedOnDeploymentErrors": { + "title": "Succeed on Deployment Errors", + "description": "In case of a deployment error, whether to keep that scratch org in the pool", + "type": "boolean", + "default": true + }, + "installAll": { + "title": "Install all packages", + "description": "Install all package artifacts, in addition to the managed package dependencies", + "type": "boolean", + "default": false + }, + "enableVlocity": { + "title": "Enable vlocity config deployment", + "description": "[alpha] Enable vlocity settings and config deployment. Please note it doesnt install vlocity managed package", + "type": "boolean", + "default": "false" + }, + "enableSourceTracking": { + "title": "Enable source tracking", + "description": "Enable source tracking by deploying packages using source:push , and persisting local source tracking files", + "type": "boolean", + "default": true + }, + "relaxAllIPRanges": { + "title": "Relax all IP Ranges", + "description": "Relax all IP addresses to enable developers to login to scratch orgs", + "type": "boolean", + "default": "false" + }, + "ipRangesToBeRelaxed": { + "title": "IP ranges to be relaxed", + "description": "Relax IP address of developers to allow access to scratch orgs", + "type": "array" + }, + "retryOnFailure": { + "title": "Retry on failure", + "description": "Retry installation of packages on failed deployment", + "type": "boolean", + "default": "false" + }, + "maxRetryCount": { + "title": "Max Retry Count", + "description": "Maximum number of attempts sfp should retry installation of packages on failed deployment", + "type": "number", + "default": "2" + }, + "snapshotPool": { + "title": "Snapshot Pool", + "description": "Use a pre-prepared pool to further add packages on top of it", + "type": "string" + }, + "postDeploymentScriptPath": { + "title": "Post Script", + "description": "Execute a custom script after all the artifacts are deployed into a particular org", + "type": "string" + }, + "preDependencyInstallationScriptPath": { + "title": "Pre Script", + "description": "Execute a custom script before denpendencies install into a particular org", + "type": "string" + }, + "disableSourcePackageOverride": { + "title": "Disable installation of unlocked packages as source package", + "description": "Prepare by default utilizes source package for installing unlocked packages to the scratchorg, disabling this flag will allow to install it ", + "type": "boolean", + "default":false + }, + "fetchArtifacts": { + "title": "Fetch Artifacts using below mechanism", + "description": "Fetch artifacts from artifact registry using below mechanism", + "type": "object", + "oneOf": [{ "required": ["artifactFetchScript"] }, { "required": ["npm"] }], + "properties": { + "artifactFetchScript": { + "title": "Path to the script for fetching artifacts", + "description": "Path to Shell script that handles fetching artifacts from a registry", + "type": "string" + }, + "npm": { + "type": "object", + "required": ["scope"], + "properties": { + "scope": { + "title": "Scope of NPM packages", + "description": "Scope of NPM packages", + "type": "string" + } + } + } + } + } + } +} diff --git a/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json b/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json index 04c4f5d93..7a9071925 100644 --- a/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json +++ b/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/dxatscale/sfpowerscripts/blob/develop/packages/sfpowerscripts-cli/resources/releasedefinition.schema.json", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", "title": "release definition", - "description": "The definition for a release using sfpowerscripts orchestrator", + "description": "The definition for a release using sfp orchestrator", "type": "object", "required": ["release", "artifacts"], "additionalProperties": false, diff --git a/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json b/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json index 9a7f2cc7c..9b9c4372d 100644 --- a/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json +++ b/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/dxatscale/sfpowerscripts/blob/develop/packages/sfpowerscripts-cli/resources/releasedefinitiongenerator.schema.json", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", "title": "release definition generator", "description": "The definition for generating a release defintion using generator command", "type": "object", diff --git a/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json b/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json index 743d62127..db002e40b 100644 --- a/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json +++ b/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/dxatscale/sfpowerscripts/blob/develop/packages/sfpowerscripts-cli/resources/sfdx-project.schema.json", - "title": "sfpowerscripts DX Project File", - "description": "The properties and shape of the SFDX project enhanced for sfpowerscripts", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/sfdx-project.schema.json", + "title": "sfp DX Project File", + "description": "The properties and shape of the SFDX project enhanced for sfp", "type": "object", "additionalProperties": true, "required": [ @@ -12,7 +12,7 @@ "$schema": { "description": "Support editors like vscode to help with IntelliSense", "type": "string", - "default": "https://raw.githubusercontent.com/dxatscale/sfpowerscripts/main/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json" + "default": "https://raw.githubusercontent.com/flxblio/sfp/main/packages/sfp-cli/resources/schemas/sfdx-project.schema.json" }, "packageDirectories": { "title": "Package Directories", @@ -236,8 +236,8 @@ "description": "Salesforce CLI plugin configurations used with this project.", "additionalProperties": true, "properties": { - "sfpowerscripts": { - "$ref": "#/definitions/plugins.sfpowerscripts" + "sfp": { + "$ref": "#/definitions/plugins.sfp" } } }, @@ -560,10 +560,10 @@ "title": "Package branch", "description": "branched package for the specific dev team" }, - "plugins.sfpowerscripts": { + "plugins.sfp": { "type": "object", - "title": "sfpowerscripts plugin configuration", - "description": "Configuration for sfpowerscripts plugin", + "title": "sfp plugin configuration", + "description": "Configuration for sfp plugin", "additionalProperties": false, "properties": { "ignoreFiles": { @@ -626,7 +626,7 @@ "externalDependencyMap": { "title": "Map of external package and its dependencies", "type": "object", - "description": "Use this map to define dependencies of unlocked packages built elsewhere, This information will be used by sfpowerscripts while expanding package dependencies", + "description": "Use this map to define dependencies of unlocked packages built elsewhere, This information will be used by sfp while expanding package dependencies", "patternProperties": { ".*": { "type": "array", diff --git a/packages/sfpowerscripts-cli/src/BuildBase.ts b/packages/sfpowerscripts-cli/src/BuildBase.ts index d6eae1e1b..9f6e40201 100644 --- a/packages/sfpowerscripts-cli/src/BuildBase.ts +++ b/packages/sfpowerscripts-cli/src/BuildBase.ts @@ -1,12 +1,12 @@ -import ArtifactGenerator from '@dxatscale/sfpowerscripts.core/lib/artifacts/generators/ArtifactGenerator'; +import ArtifactGenerator from './core//artifacts/generators/ArtifactGenerator'; import { EOL } from 'os'; -import SfpowerscriptsCommand from './SfpowerscriptsCommand'; +import sfpCommand from './SfpCommand'; import { Messages } from '@salesforce/core'; import fs = require('fs'); -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from './core/stats/SFPStatsSender'; import BuildImpl, { BuildProps } from './impl/parallelBuilder/BuildImpl'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from './core/project/ProjectConfig'; import { Stage } from './impl/Stage'; import SFPLogger, { COLOR_ERROR, @@ -19,9 +19,9 @@ import SFPLogger, { ConsoleLogger, LoggerLevel, COLOR_KEY_VALUE, -} from '@dxatscale/sfp-logger'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +} from '@flxblio/sfp-logger'; +import getFormattedTime from './core//utils/GetFormattedTime'; +import SfpPackage from './core//package/SfpPackage'; import ReleaseConfig from './impl/release/ReleaseConfig'; import { Flags } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from './flags/sfdxflags'; @@ -32,9 +32,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'build'); +const messages = Messages.loadMessages('@flxblio/sfp', 'build'); -export default abstract class BuildBase extends SfpowerscriptsCommand { +export default abstract class BuildBase extends sfpCommand { protected static requiresUsername = false; protected static requiresDevhubUsername = false; protected static requiresProject = true; @@ -115,7 +115,7 @@ export default abstract class BuildBase extends SfpowerscriptsCommand { SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(this.getStage())}`)); SFPLogger.log(COLOR_HEADER(`Build Packages Only Changed: ${flags.diffcheck}`)); - if(projectConfig?.plugins?.sfpowerscripts?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles){ + if(projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles){ SFPLogger.log(COLOR_HEADER(`Multiple Config Files Mode: enabled`)); }else{ SFPLogger.log(COLOR_HEADER(`Config File Path: ${flags.configfilepath}`)); diff --git a/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts b/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts index ed6767c53..51c4fc53b 100644 --- a/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts +++ b/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts @@ -1,23 +1,23 @@ -import SfpowerscriptsCommand from './SfpowerscriptsCommand'; +import sfpCommand from './SfpCommand'; import { Messages } from '@salesforce/core'; -import ArtifactFetcher, { Artifact } from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; +import ArtifactFetcher, { Artifact } from './core//artifacts/ArtifactFetcher'; import * as rimraf from 'rimraf'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +import SfpPackage from './core//package/SfpPackage'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from './core//package/SfpPackageBuilder'; +import SFPOrg from './core//org/SFPOrg'; import { Flags } from '@oclif/core'; import { requiredUserNameFlag } from './flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'install_package_command'); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_package_command'); /** * Base class providing common functionality for package installation * - * @extends SfpowerscriptsCommand + * @extends sfpCommand */ -export default abstract class InstallPackageCommand extends SfpowerscriptsCommand { +export default abstract class InstallPackageCommand extends sfpCommand { protected sfpPackage: SfpPackage; protected sfpOrg: SFPOrg; /** @@ -86,6 +86,6 @@ export default abstract class InstallPackageCommand extends SfpowerscriptsComman */ private postInstall(): void { // Delete temp directory containing unzipped artifacts - rimraf.sync('.sfpowerscripts/unzippedArtifacts'); + rimraf.sync('.sfp/unzippedArtifacts'); } } diff --git a/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts b/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts index 0036b1ed1..f46a182f1 100644 --- a/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts +++ b/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts @@ -1,20 +1,20 @@ -import ArtifactGenerator from '@dxatscale/sfpowerscripts.core/lib/artifacts/generators/ArtifactGenerator'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger } from '@dxatscale/sfp-logger'; -import PackageDiffImpl from '@dxatscale/sfpowerscripts.core/lib/package/diff/PackageDiffImpl'; +import ArtifactGenerator from './core//artifacts/generators/ArtifactGenerator'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageDiffImpl from './core//package/diff/PackageDiffImpl'; import { Messages } from '@salesforce/core'; import { EOL } from 'os'; -import SfpowerscriptsCommand from './SfpowerscriptsCommand'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; +import sfpCommand from './SfpCommand'; +import SfpPackage, { PackageType } from './core//package/SfpPackage'; +import getFormattedTime from './core//utils/GetFormattedTime'; const fs = require('fs-extra'); -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; +import Git from './core//git/Git'; import { Flags } from '@oclif/core'; import { loglevel } from './flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'create-package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'create-package'); -export default abstract class PackageCreateCommand extends SfpowerscriptsCommand { +export default abstract class PackageCreateCommand extends sfpCommand { protected static requiresUsername = false; protected static requiresDevhubUsername = false; protected static requiresProject = true; @@ -115,7 +115,7 @@ export default abstract class PackageCreateCommand extends SfpowerscriptsCommand let git = await Git.initiateRepo(new ConsoleLogger()); let tagname = `${this.sfdxPackage}_v${sfpPackage.package_version_number}`; - await git.addAnnotatedTag(tagname, `${sfpPackage.packageName} sfpowerscripts package ${sfpPackage.package_version_number}`) + await git.addAnnotatedTag(tagname, `${sfpPackage.packageName} sfp package ${sfpPackage.package_version_number}`) sfpPackage.tag = tagname; } @@ -131,7 +131,7 @@ export default abstract class PackageCreateCommand extends SfpowerscriptsCommand } private generateEnvironmentVariables(artifactFilepath: string, sfpPackage: SfpPackage) { - let prefix = 'sfpowerscripts'; + let prefix = 'sfp'; if (this.refname != null) prefix = `${this.refname}_${prefix}`; console.log('\nOutput variables:'); diff --git a/packages/sfpowerscripts-cli/src/ProjectValidation.ts b/packages/sfpowerscripts-cli/src/ProjectValidation.ts index 64606e013..3ba631ec2 100644 --- a/packages/sfpowerscripts-cli/src/ProjectValidation.ts +++ b/packages/sfpowerscripts-cli/src/ProjectValidation.ts @@ -1,9 +1,9 @@ -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from './core/project/ProjectConfig'; import Ajv from 'ajv'; import path = require('path'); import * as fs from 'fs-extra'; -import { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; +import { PackageType } from './core//package/SfpPackage'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; export default class ProjectValidation { private readonly projectConfig; @@ -32,7 +32,7 @@ export default class ProjectValidation { }); - SFPLogger.log(`The following attributes are not recognized by sfpowerscripts, You might need to remove them`,LoggerLevel.WARN) + SFPLogger.log(`The following attributes are not recognized by sfp, You might need to remove them`,LoggerLevel.WARN) SFPLogger.log(errorMsg, LoggerLevel.WARN); } } diff --git a/packages/sfpowerscripts-cli/src/SfpowerscriptsCommand.ts b/packages/sfpowerscripts-cli/src/SfpCommand.ts similarity index 78% rename from packages/sfpowerscripts-cli/src/SfpowerscriptsCommand.ts rename to packages/sfpowerscripts-cli/src/SfpCommand.ts index 78c3b1ab3..cff888a9a 100644 --- a/packages/sfpowerscripts-cli/src/SfpowerscriptsCommand.ts +++ b/packages/sfpowerscripts-cli/src/SfpCommand.ts @@ -1,8 +1,7 @@ -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from './core/stats/SFPStatsSender'; import * as rimraf from 'rimraf'; import ProjectValidation from './ProjectValidation'; -import * as fs from 'fs-extra'; -import SFPLogger, { COLOR_HEADER, ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_HEADER, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; import GroupConsoleLogs from './ui/GroupConsoleLogs'; import { Command, Flags, ux } from '@oclif/core'; import { FlagOutput } from '@oclif/core/lib/interfaces/parser'; @@ -10,11 +9,11 @@ import { Org } from '@salesforce/core'; /** - * A base class that provides common funtionality for sfpowerscripts commands + * A base class that provides common funtionality for sfp commands * * @extends SfdxCommand */ -export default abstract class SfpowerscriptsCommand extends Command { +export default abstract class sfpCommand extends Command { protected static requiresProject: boolean; @@ -24,7 +23,7 @@ export default abstract class SfpowerscriptsCommand extends Command { private isSfpowerkitFound: boolean; - private sfpowerscriptsConfig; + private sfpConfig; private isSfdmuFound: boolean; protected static requiresUsername: boolean=false; protected static requiresDevhubUsername: boolean=false; @@ -40,7 +39,7 @@ export default abstract class SfpowerscriptsCommand extends Command { */ async run(): Promise { //Always enable color by default - if (process.env.SFPOWERSCRIPTS_NOCOLOR) SFPLogger.disableColor(); + if (process.env.sfp_NOCOLOR) SFPLogger.disableColor(); else SFPLogger.enableColor(); @@ -78,7 +77,7 @@ export default abstract class SfpowerscriptsCommand extends Command { //Clear temp directory before every run - rimraf.sync('.sfpowerscripts'); + rimraf.sync('.sfp'); //Initialise StatsD @@ -122,32 +121,32 @@ export default abstract class SfpowerscriptsCommand extends Command { private initializeStatsD() { - if (process.env.SFPOWERSCRIPTS_STATSD) { + if (process.env.sfp_STATSD) { SFPStatsSender.initialize( - process.env.SFPOWERSCRIPTS_STATSD_PORT, - process.env.SFPOWERSCRIPTS_STATSD_HOST, - process.env.SFPOWERSCRIPTS_STATSD_PROTOCOL + process.env.sfp_STATSD_PORT, + process.env.sfp_STATSD_HOST, + process.env.sfp_STATSD_PROTOCOL ); } - if (process.env.SFPOWERSCRIPTS_DATADOG) { + if (process.env.sfp_DATADOG) { SFPStatsSender.initializeNativeMetrics( 'DataDog', - process.env.SFPOWERSCRIPTS_DATADOG_HOST, - process.env.SFPOWERSCRIPTS_DATADOG_API_KEY, + process.env.sfp_DATADOG_HOST, + process.env.sfp_DATADOG_API_KEY, new ConsoleLogger() ); - } else if (process.env.SFPOWERSCRIPTS_NEWRELIC) { + } else if (process.env.sfp_NEWRELIC) { SFPStatsSender.initializeNativeMetrics( 'NewRelic', null, - process.env.SFPOWERSCRIPTS_NEWRELIC_API_KEY, + process.env.sfp_NEWRELIC_API_KEY, new ConsoleLogger() ); - } else if (process.env.SFPOWERSCRIPTS_SPLUNK) { + } else if (process.env.sfp_SPLUNK) { SFPStatsSender.initializeNativeMetrics( 'Splunk', - process.env.SFPOWERSCRIPTS_SPLUNK_HOST, - process.env.SFPOWERSCRIPTS_SPLUNK_API_KEY, + process.env.sfp_SPLUNK_HOST, + process.env.sfp_SPLUNK_API_KEY, new ConsoleLogger() ); } @@ -171,8 +170,8 @@ export default abstract class SfpowerscriptsCommand extends Command { } - protected get statics(): typeof SfpowerscriptsCommand { - return this.constructor as typeof SfpowerscriptsCommand; + protected get statics(): typeof sfpCommand { + return this.constructor as typeof sfpCommand; } } diff --git a/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts b/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts index afeeed9a2..53e600e87 100644 --- a/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts +++ b/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts @@ -6,16 +6,16 @@ import { TestLevel, TestOptions, RunAllTestsInPackageOptions, -} from '@dxatscale/sfpowerscripts.core/lib/apextest/TestOptions'; -import TriggerApexTests from '@dxatscale/sfpowerscripts.core/lib/apextest/TriggerApexTests'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +} from '../../core/apextest/TestOptions'; +import TriggerApexTests from '../../core/apextest/TriggerApexTests'; +import sfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import SfpPackage from '../../core/package/SfpPackage'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import { CoverageOptions } from '@dxatscale/sfpowerscripts.core/lib/apex/coverage/IndividualClassCoverage'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { CoverageOptions } from '../../core/apex/coverage/IndividualClassCoverage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import { PackageType } from '../../core/package/SfpPackage'; import { Flags } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; const path = require('path'); @@ -25,9 +25,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'trigger_apex_test'); +const messages = Messages.loadMessages('@flxblio/sfp', 'trigger_apex_test'); -export default class TriggerApexTest extends SfpowerscriptsCommand { +export default class TriggerApexTest extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts b/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts index 849ec10a0..1a8854edd 100644 --- a/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts +++ b/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts @@ -1,18 +1,18 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import FetchImpl, { ArtifactVersion } from '../../impl/artifacts/FetchImpl'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; import FetchArtifactsError from '../../impl/artifacts/FetchArtifactsError'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; -import SFPLogger from '@dxatscale/sfp-logger'; -import { COLOR_HEADER } from '@dxatscale/sfp-logger'; +import SFPLogger from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'fetch'); +const messages = Messages.loadMessages('@flxblio/sfp', 'fetch'); -export default class Fetch extends SfpowerscriptsCommand { +export default class Fetch extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts b/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts index 464755f64..7c0ed8ba7 100644 --- a/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts +++ b/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts @@ -1,15 +1,15 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; -import SFPLogger, { ConsoleLogger } from '@dxatscale/sfp-logger'; +import SFPOrg from '../../core/org/SFPOrg'; +import SFPLogger, { ConsoleLogger } from '@flxblio/sfp-logger'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; const Table = require('cli-table'); Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'artifacts_query'); +const messages = Messages.loadMessages('@flxblio/sfp', 'artifacts_query'); -export default class Query extends SfpowerscriptsCommand { +export default class Query extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp artifacts:query -u `]; @@ -35,7 +35,7 @@ export default class Query extends SfpowerscriptsCommand { 'Commmit Id', 'Subcriber Version', 'Type', - 'Is Sfpowerscripts Installed', + 'Is sfp Installed', ], chars: ZERO_BORDER_TABLE }); @@ -46,7 +46,7 @@ export default class Query extends SfpowerscriptsCommand { installedArtifact.commitId.substring(0,8), installedArtifact.subscriberVersion, installedArtifact.type, - installedArtifact.isInstalledBySfpowerscripts, + installedArtifact.isInstalledBysfp, ]); }); SFPLogger.log(minTable.toString(), LoggerLevel.INFO, new ConsoleLogger()); diff --git a/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts b/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts index a65b56183..bc94d8ce8 100644 --- a/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts +++ b/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts @@ -1,14 +1,14 @@ -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'generate_changelog'); +const messages = Messages.loadMessages('@flxblio/sfp', 'generate_changelog'); -export default class GenerateChangelog extends SfpowerscriptsCommand { +export default class GenerateChangelog extends sfpCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts b/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts index 0faac4c5c..87070e906 100644 --- a/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts +++ b/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts @@ -1,11 +1,11 @@ -import TransitiveDependencyResolver from '@dxatscale/sfpowerscripts.core/lib/package/dependencies/TransitiveDependencyResolver'; +import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; +import sfpCommand from '../../SfpCommand'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; import path = require('path'); -import UserDefinedExternalDependency from "@dxatscale/sfpowerscripts.core/lib/project/UserDefinedExternalDependency"; +import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; import { Flags } from '@oclif/core'; import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; @@ -14,9 +14,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'dependency_expand'); +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_expand'); -export default class Expand extends SfpowerscriptsCommand { +export default class Expand extends sfpCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/install.ts b/packages/sfpowerscripts-cli/src/commands/dependency/install.ts index 9414fa37a..9d275a225 100644 --- a/packages/sfpowerscripts-cli/src/commands/dependency/install.ts +++ b/packages/sfpowerscripts-cli/src/commands/dependency/install.ts @@ -1,11 +1,11 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; -import ExternalPackage2DependencyResolver from '@dxatscale/sfpowerscripts.core/lib/package/dependencies/ExternalPackage2DependencyResolver'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import ExternalDependencyDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/ExternalDependencyDisplayer'; -import InstallUnlockedPackageCollection from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallUnlockedPackageCollection'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; +import SFPOrg from '../../core/org/SFPOrg'; import { Flags } from '@oclif/core'; import { loglevel, targetdevhubusername, requiredUserNameFlag } from '../../flags/sfdxflags'; @@ -14,9 +14,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'dependency_install'); +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_install'); -export default class Install extends SfpowerscriptsCommand { +export default class Install extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresUsername = true; protected static requiresDevhubUsername = true; diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts b/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts index 2a2573f06..c6aa0ced2 100644 --- a/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts +++ b/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts @@ -1,10 +1,10 @@ import ShrinkImpl from '../../impl/dependency/ShrinkImpl'; import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import sfpCommand from '../../SfpCommand'; +import ProjectConfig from '../../core/project/ProjectConfig'; import * as fs from 'fs-extra'; import path = require('path'); -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; @@ -14,9 +14,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'dependency_shrink'); +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_shrink'); -export default class Shrink extends SfpowerscriptsCommand { +export default class Shrink extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfpowerscripts-cli/src/commands/impact/package.ts b/packages/sfpowerscripts-cli/src/commands/impact/package.ts index a550b7d3f..4b803d1a1 100644 --- a/packages/sfpowerscripts-cli/src/commands/impact/package.ts +++ b/packages/sfpowerscripts-cli/src/commands/impact/package.ts @@ -1,7 +1,7 @@ import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Stage } from '../../impl/Stage'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; @@ -12,9 +12,9 @@ import * as fs from 'fs-extra'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'impact_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'impact_package'); -export default class Package extends SfpowerscriptsCommand { +export default class Package extends sfpCommand { public static flags = { loglevel, basebranch: Flags.string({ diff --git a/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts b/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts index c3dac0b9d..b8e7bec9c 100644 --- a/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts +++ b/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts @@ -1,8 +1,8 @@ import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Stage } from '../../impl/Stage'; import * as fs from 'fs-extra'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; @@ -13,9 +13,9 @@ const Table = require('cli-table'); Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'impact_release_config'); +const messages = Messages.loadMessages('@flxblio/sfp', 'impact_release_config'); -export default class ReleaseConfig extends SfpowerscriptsCommand { +export default class ReleaseConfig extends sfpCommand { public static flags = { loglevel, basebranch: Flags.string({ diff --git a/packages/sfpowerscripts-cli/src/commands/metrics/report.ts b/packages/sfpowerscripts-cli/src/commands/metrics/report.ts index bf596628b..6b5b0a3a7 100644 --- a/packages/sfpowerscripts-cli/src/commands/metrics/report.ts +++ b/packages/sfpowerscripts-cli/src/commands/metrics/report.ts @@ -1,6 +1,6 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import sfpCommand from '../../SfpCommand'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; @@ -10,9 +10,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'metrics_report'); +const messages = Messages.loadMessages('@flxblio/sfp', 'metrics_report'); -export default class Report extends SfpowerscriptsCommand { +export default class Report extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = false; @@ -75,10 +75,10 @@ export default class Report extends SfpowerscriptsCommand { private validateEnvVars() { if ( !( - process.env.SFPOWERSCRIPTS_STATSD || - process.env.SFPOWERSCRIPTS_DATADOG || - process.env.SFPOWERSCRIPTS_NEWRELIC || - process.env.SFPOWERSCRIPTS_SPLUNK + process.env.sfp_STATSD || + process.env.sfp_DATADOG || + process.env.sfp_NEWRELIC || + process.env.sfp_SPLUNK ) ) { throw new Error('Environment variable not set for metrics. No metrics will be published.'); diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts index 0d2c20cff..6cbcfb656 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts @@ -8,7 +8,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'build'); +const messages = Messages.loadMessages('@flxblio/sfp', 'build'); export default class Build extends BuildBase { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts index 968610594..18844663b 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts @@ -1,6 +1,6 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../../impl/deploy/DeployImpl'; import { Stage } from '../../impl/Stage'; import SFPLogger, { @@ -8,21 +8,21 @@ import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, -} from '@dxatscale/sfp-logger'; -import { COLOR_TIME } from '@dxatscale/sfp-logger'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; +} from '@flxblio/sfp-logger'; +import { COLOR_TIME } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; import { Flags } from '@oclif/core'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; +import { LoggerLevel } from '@flxblio/sfp-logger'; // Initialize Messages with the current plugin directory Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'deploy'); +const messages = Messages.loadMessages('@flxblio/sfp', 'deploy'); -export default class Deploy extends SfpowerscriptsCommand { +export default class Deploy extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:deploy -u `]; diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts index 36910cd39..18aa7daa9 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts @@ -1,13 +1,13 @@ import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import PrepareImpl from '../../impl/prepare/PrepareImpl'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; import { Stage } from '../../impl/Stage'; import * as fs from 'fs-extra'; -import ScratchOrgInfoFetcher from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgInfoFetcher from '../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher'; import Ajv from 'ajv'; import path = require('path'); -import { PoolErrorCodes } from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolError'; +import { PoolErrorCodes } from '../../core/scratchorg/pool/PoolError'; import SFPLogger, { LoggerLevel, COLOR_ERROR, @@ -15,19 +15,18 @@ import SFPLogger, { COLOR_SUCCESS, COLOR_TIME, COLOR_KEY_MESSAGE, -} from '@dxatscale/sfp-logger'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; -import { PoolConfig } from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolConfig'; -import { COLOR_WARNING } from '@dxatscale/sfp-logger'; -import PoolSchema from '@dxatscale/sfpowerscripts.core/resources/pooldefinition.schema.json'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +} from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +import SFPOrg from '../../core/org/SFPOrg'; import { Flags } from '@oclif/core'; import { loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'prepare'); +const messages = Messages.loadMessages('@flxblio/sfp', 'prepare'); -export default class Prepare extends SfpowerscriptsCommand { +export default class Prepare extends sfpCommand { protected static requiresDevhubUsername = true; protected static requiresProject = true; @@ -200,7 +199,11 @@ export default class Prepare extends SfpowerscriptsCommand { public validatePoolConfig(poolConfig: any) { let ajv = new Ajv({ allErrors: true }); - let validator = ajv.compile(PoolSchema); + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'pooldefinition.schema.json'), + { encoding: 'UTF-8' } + ); + let validator = ajv.compile(schema); let isSchemaValid = validator(poolConfig); if (!isSchemaValid) { let errorMsg: string = `The pool configuration is invalid, Please fix the following errors\n`; diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts index ea585d4c9..205acb622 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts @@ -1,20 +1,20 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; -import PromoteUnlockedPackageImpl from '@dxatscale/sfpowerscripts.core/lib/package/promote/PromoteUnlockedPackageImpl' -import ArtifactFetcher from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl' +import ArtifactFetcher from '../../core/artifacts/ArtifactFetcher'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import { PackageType } from '../../core/package/SfpPackage'; import { Flags, ux } from '@oclif/core'; import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; -import { COLOR_HEADER } from '@dxatscale/sfp-logger'; -import SFPLogger from '@dxatscale/sfp-logger'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import SFPLogger from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'promote'); +const messages = Messages.loadMessages('@flxblio/sfp', 'promote'); -export default class Promote extends SfpowerscriptsCommand { +export default class Promote extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:promote -d path/to/artifacts -v `]; diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts index 71b255523..1ceb82900 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts @@ -1,35 +1,35 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import * as fs from 'fs-extra'; import path = require('path'); -import ArtifactFetcher, { Artifact } from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; import SFPLogger, { COLOR_ERROR, COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_TIME, -} from '@dxatscale/sfp-logger'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; -import defaultShell from '@dxatscale/sfpowerscripts.core/lib/utils/DefaultShell'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; +} from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import defaultShell from '../../core/utils/DefaultShell'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import Git from '../../core/git/Git'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import PackageVersionLister from '@dxatscale/sfpowerscripts.core/lib/package/version/PackageVersionLister'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; -import ExecuteCommand from '@dxatscale/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; -import GitTags from '@dxatscale/sfpowerscripts.core/lib/git/GitTags'; +import PackageVersionLister from '../../core/package/version/PackageVersionLister'; +import SFPOrg from '../../core/org/SFPOrg'; +import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import GitTags from '../../core/git/GitTags'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag } from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'publish'); +const messages = Messages.loadMessages('@flxblio/sfp', 'publish'); -export default class Promote extends SfpowerscriptsCommand { +export default class Promote extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ @@ -92,7 +92,7 @@ export default class Promote extends SfpowerscriptsCommand { required: false, deprecated: { message: - '--npmtag is deprecated, sfpowerscripts will automatically tag the artifact with the branch name', + '--npmtag is deprecated, sfp will automatically tag the artifact with the branch name', }, }), npmrcpath: Flags.file({ @@ -140,7 +140,7 @@ export default class Promote extends SfpowerscriptsCommand { let artifactFilePaths = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); // Pattern captures two named groups, the "package" name and "version" number - let pattern = new RegExp('(?^.*)(?:_sfpowerscripts_artifact_)(?.*)(?:\\.zip)'); + let pattern = new RegExp('(?^.*)(?:_sfp_artifact_)(?.*)(?:\\.zip)'); for (let artifact of artifacts) { let packageName: string; let packageVersionNumber: string; @@ -261,7 +261,7 @@ export default class Promote extends SfpowerscriptsCommand { let artifactRootDirectory = path.dirname(sfpPackage.sourceDir); // NPM does not accept packages with uppercase characters - let name: string = sfpPackage.packageName.toLowerCase() + '_sfpowerscripts_artifact'; + let name: string = sfpPackage.packageName.toLowerCase() + '_sfp_artifact'; //Check whether the user has already passed in @ diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts index b8aabaf6f..0ff13dabb 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts @@ -8,7 +8,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'quickbuild'); +const messages = Messages.loadMessages('@flxblio/sfp', 'quickbuild'); export default class QuickBuild extends BuildBase { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts index 930184777..57f8d913b 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts @@ -1,6 +1,6 @@ -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; import ReleaseImpl, { ReleaseProps, ReleaseResult } from '../../impl/release/ReleaseImpl'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; import ReleaseError from '../../errors/ReleaseError'; @@ -13,15 +13,15 @@ import SFPLogger, { COLOR_WARNING, COLOR_KEY_MESSAGE, ConsoleLogger, -} from '@dxatscale/sfp-logger'; +} from '@flxblio/sfp-logger'; import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag, requiredUserNameFlag } from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'release'); +const messages = Messages.loadMessages('@flxblio/sfp', 'release'); -export default class Release extends SfpowerscriptsCommand { +export default class Release extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts index 70f4567f8..45dc3ffcb 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts @@ -1,19 +1,19 @@ import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import ValidateError from '../../errors/ValidateError'; import ValidateResult from '../../impl/validate/ValidateResult'; import * as fs from 'fs-extra'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; +import { LoggerLevel } from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'validate'); +const messages = Messages.loadMessages('@flxblio/sfp', 'validate'); -export default class Validate extends SfpowerscriptsCommand { +export default class Validate extends sfpCommand { protected static requiresProject = true; public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts index 1c5a9d6c1..0b9b1f2ec 100644 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts +++ b/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts @@ -1,8 +1,8 @@ import { LoggerLevel, Messages, Org } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; import ValidateError from '../../errors/ValidateError'; import ValidateResult from '../../impl/validate/ValidateResult'; @@ -11,9 +11,9 @@ import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'validateAgainstOrg'); +const messages = Messages.loadMessages('@flxblio/sfp', 'validateAgainstOrg'); -export default class ValidateAgainstOrg extends SfpowerscriptsCommand { +export default class ValidateAgainstOrg extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:validateAgainstOrg -u `]; diff --git a/packages/sfpowerscripts-cli/src/commands/package/data/create.ts b/packages/sfpowerscripts-cli/src/commands/package/data/create.ts index aa4b5fbb3..4631d2c51 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/data/create.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/data/create.ts @@ -1,14 +1,14 @@ import { Messages } from '@salesforce/core'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; -import { COLOR_SUCCESS, ConsoleLogger } from '@dxatscale/sfp-logger'; +import ProjectConfig from '../../../core/project/ProjectConfig' +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; import PackageCreateCommand from '../../../PackageCreateCommand'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; +import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; import { Flags } from '@oclif/core'; import { loglevel } from '../../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'create_data_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'create_data_package'); export default class CreateDataPackage extends PackageCreateCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/package/data/install.ts b/packages/sfpowerscripts-cli/src/commands/package/data/install.ts index 945d078d7..51827ebb6 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/data/install.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/data/install.ts @@ -1,9 +1,9 @@ import { Messages } from '@salesforce/core'; import InstallPackageCommand from '../../../InstallPackageCommand'; -import { PackageInstallationStatus } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SfpPackageInstaller from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInstaller'; -import { SfpPackageInstallationOptions } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallPackage'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; import { Flags } from '@oclif/core'; import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; @@ -13,7 +13,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'install_data_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_data_package'); export default class InstallDataPackage extends InstallPackageCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/package/install.ts b/packages/sfpowerscripts-cli/src/commands/package/install.ts index aa36e0717..7dd37751d 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/install.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/install.ts @@ -1,16 +1,16 @@ import { Messages } from '@salesforce/core'; import InstallPackageCommand from '../../InstallPackageCommand'; -import { PackageInstallationStatus } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { SfpPackageInstallationOptions } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInstaller'; +import { PackageInstallationStatus } from '../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; import { Flags } from '@oclif/core'; import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import { PackageType } from '../../core/package/SfpPackage'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'install_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_package'); export default class Install extends InstallPackageCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/package/source/create.ts b/packages/sfpowerscripts-cli/src/commands/package/source/create.ts index c36fb405f..0c2817fd6 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/source/create.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/source/create.ts @@ -1,13 +1,13 @@ import { Messages } from '@salesforce/core'; -import { COLOR_SUCCESS, ConsoleLogger } from '@dxatscale/sfp-logger'; +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; import PackageCreateCommand from '../../../PackageCreateCommand'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; +import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; import { Flags } from '@oclif/core'; import { loglevel } from '../../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'create_source_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'create_source_package'); export default class CreateSourcePackage extends PackageCreateCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/package/source/install.ts b/packages/sfpowerscripts-cli/src/commands/package/source/install.ts index f553bc66a..14746c316 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/source/install.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/source/install.ts @@ -1,11 +1,11 @@ import { Messages } from '@salesforce/core'; import InstallPackageCommand from '../../../InstallPackageCommand'; import * as fs from 'fs-extra'; -import { PackageInstallationStatus } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { DeploymentType } from '@dxatscale/sfpowerscripts.core/lib/deployers/DeploymentExecutor'; -import { SfpPackageInstallationOptions } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInstaller'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { DeploymentType } from '../../../core/deployers/DeploymentExecutor'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; import { Flags } from '@oclif/core'; @@ -14,7 +14,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'install_source_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_source_package'); export default class InstallSourcePackage extends InstallPackageCommand { public static description = messages.getMessage('commandDescription'); @@ -74,7 +74,7 @@ export default class InstallSourcePackage extends InstallPackageCommand { const wait_time: string = this.flags.waittime; const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; - console.log('sfpowerscripts.Install Source Package To Org'); + console.log('sfp.Install Source Package To Org'); try { let options: SfpPackageInstallationOptions = { @@ -106,19 +106,19 @@ export default class InstallSourcePackage extends InstallPackageCommand { if (this.flags.refname) { fs.writeFileSync( '.env', - `${this.flags.refname}_sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}\n`, + `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, { flag: 'a' } ); console.log( - `${this.flags.refname}_sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}` + `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}` ); } else { fs.writeFileSync( '.env', - `sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}\n`, + `sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, { flag: 'a' } ); - console.log(`sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}`); + console.log(`sfp_installsourcepackage_deployment_id=${result.deploy_id}`); } } } diff --git a/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts b/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts index fc233f270..81972d059 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts @@ -1,8 +1,8 @@ import { Messages } from '@salesforce/core'; import PackageCreateCommand from '../../../PackageCreateCommand'; -import { COLOR_SUCCESS, ConsoleLogger } from '@dxatscale/sfp-logger'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackage from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; import { Flags } from '@oclif/core'; @@ -11,7 +11,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'create_unlocked_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'create_unlocked_package'); export default class CreateUnlockedPackage extends PackageCreateCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts b/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts index e41fdb666..001e06743 100644 --- a/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts +++ b/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts @@ -1,9 +1,9 @@ import { Messages } from '@salesforce/core'; import InstallPackageCommand from '../../../InstallPackageCommand'; -import { PackageInstallationStatus } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { SfpPackageInstallationOptions } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInstaller'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; import { Flags } from '@oclif/core'; import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; @@ -13,7 +13,7 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'install_unlocked_package'); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_unlocked_package'); export default class InstallUnlockedPackage extends InstallPackageCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfpowerscripts-cli/src/commands/pool/delete.ts b/packages/sfpowerscripts-cli/src/commands/pool/delete.ts index eb049636e..8ef6856d3 100644 --- a/packages/sfpowerscripts-cli/src/commands/pool/delete.ts +++ b/packages/sfpowerscripts-cli/src/commands/pool/delete.ts @@ -1,12 +1,12 @@ import { Messages } from '@salesforce/core'; -import PoolDeleteImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolDeleteImpl'; -import OrphanedOrgsDeleteImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/OrphanedOrgsDeleteImpl'; -import ScratchOrg from '@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import PoolDeleteImpl from '../../core/scratchorg/pool/PoolDeleteImpl'; +import OrphanedOrgsDeleteImpl from '../../core/scratchorg/pool/OrphanedOrgsDeleteImpl'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import sfpCommand from '../../SfpCommand'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import { COLOR_WARNING } from '@dxatscale/sfp-logger'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; const Table = require('cli-table'); @@ -16,17 +16,17 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'pool_delete'); +const messages = Messages.loadMessages('@flxblio/sfp', 'pool_delete'); -export default class Delete extends SfpowerscriptsCommand { +export default class Delete extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; public static examples = [ - `$ sfpowerscripts pool:delete -t core `, - `$ sfpowerscripts pool:delete -t core -v devhub`, - `$ sfpowerscripts pool:delete --orphans -v devhub`, + `$ sfp pool:delete -t core `, + `$ sfp pool:delete -t core -v devhub`, + `$ sfp pool:delete --orphans -v devhub`, ]; public static flags = { diff --git a/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts b/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts index c96fe9472..02baaa0d8 100644 --- a/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts +++ b/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts @@ -1,18 +1,18 @@ import { Messages } from '@salesforce/core'; -import ScratchOrg from '@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; import { AnyJson } from '@salesforce/ts-types'; -import PoolFetchImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolFetchImpl'; +import PoolFetchImpl from '../../core/scratchorg/pool/PoolFetchImpl'; import * as fs from 'fs-extra'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import InstalledArtifactsDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/InstalledArtifactsDisplayer'; -import InstalledPackageDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/InstalledPackagesDisplayer'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; -import { COLOR_HEADER } from '@dxatscale/sfp-logger'; -import { COLOR_SUCCESS } from '@dxatscale/sfp-logger'; -import { COLOR_TIME } from '@dxatscale/sfp-logger'; -import getFormattedTime from '@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import InstalledArtifactsDisplayer from '../../core/display/InstalledArtifactsDisplayer'; +import InstalledPackageDisplayer from '../../core/display/InstalledPackagesDisplayer'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import SFPOrg from '../../core/org/SFPOrg'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; +import { COLOR_TIME } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import sfpCommand from '../../SfpCommand'; import { Flags, ux } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; @@ -21,9 +21,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'scratchorg_poolFetch'); +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poolFetch'); -export default class Fetch extends SfpowerscriptsCommand { +export default class Fetch extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfpowerscripts-cli/src/commands/pool/list.ts b/packages/sfpowerscripts-cli/src/commands/pool/list.ts index 3d24d8c36..e4761f392 100644 --- a/packages/sfpowerscripts-cli/src/commands/pool/list.ts +++ b/packages/sfpowerscripts-cli/src/commands/pool/list.ts @@ -1,10 +1,10 @@ import { AnyJson } from '@salesforce/ts-types'; -import poolListImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolListImpl'; -import ScratchOrg from '@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; +import poolListImpl from '../../core/scratchorg/pool/PoolListImpl'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Flags, ux } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; @@ -13,19 +13,19 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'scratchorg_poollist'); +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poollist'); -export default class List extends SfpowerscriptsCommand { +export default class List extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; public static enableJsonFlag = true public static examples = [ - `$ sfpowerscripts pool:list -t core `, - `$ sfpowerscripts pool:list -t core -v devhub`, - `$ sfpowerscripts pool:list -t core -v devhub -m`, - `$ sfpowerscripts pool:list -t core -v devhub -m -a`, + `$ sfp pool:list -t core `, + `$ sfp pool:list -t core -v devhub`, + `$ sfp pool:list -t core -v devhub -m`, + `$ sfp pool:list -t core -v devhub -m -a`, ]; public static flags = { diff --git a/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts b/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts index 2466c76a7..6a0251f65 100644 --- a/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts +++ b/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts @@ -1,10 +1,10 @@ -import SfpowerscriptsCommand from '../../../SfpowerscriptsCommand'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import PoolListImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolListImpl'; -import ScratchOrg from '@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg'; -import LimitsFetcher from '@dxatscale/sfpowerscripts.core/lib/limits/LimitsFetcher'; +import sfpCommand from '../../../SfpCommand'; +import SFPStatsSender from '../../../core/stats/SFPStatsSender'; +import PoolListImpl from '../../../core/scratchorg/pool/PoolListImpl'; +import ScratchOrg from '../../../core/scratchorg/ScratchOrg'; +import LimitsFetcher from '../../../core/limits/LimitsFetcher'; const Table = require('cli-table'); -import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; @@ -13,9 +13,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'scratchorg_pool_metrics_publish'); +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_metrics_publish'); -export default class Publish extends SfpowerscriptsCommand { +export default class Publish extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; @@ -58,11 +58,11 @@ export default class Publish extends SfpowerscriptsCommand { SFPStatsSender.logGauge(`scratchorgs.active.remaining`, remainingActiveScratchOrgs, {target_org: devhubUserName}); SFPStatsSender.logGauge(`scratchorgs.daily.remaining`, remainingDailyScratchOrgs, {target_org: devhubUserName}); - table.push(['sfpowerscripts.scratchorgs.active.remaining', remainingActiveScratchOrgs, devhubUserName]); - table.push(['sfpowerscripts.scratchorgs.daily.remaining', remainingDailyScratchOrgs, devhubUserName]); + table.push(['sfp.scratchorgs.active.remaining', remainingActiveScratchOrgs, devhubUserName]); + table.push(['sfp.scratchorgs.daily.remaining', remainingDailyScratchOrgs, devhubUserName]); SFPStatsSender.logGauge(`pool.footprint`, nPooledScratchOrgs); - table.push(['sfpowerscripts.pool.footprint', nPooledScratchOrgs, '']); + table.push(['sfp.pool.footprint', nPooledScratchOrgs, '']); if (pools) { for (let pool of Object.entries(pools)) { @@ -71,10 +71,10 @@ export default class Publish extends SfpowerscriptsCommand { SFPStatsSender.logGauge('pool.inuse', pool[1].nInUse, { poolName: pool[0] }); SFPStatsSender.logGauge('pool.provisioning', pool[1].nProvisioningInProgress, { poolName: pool[0] }); - table.push(['sfpowerscripts.pool.total', pool[1].nTotal, pool[0]]); - table.push(['sfpowerscripts.pool.available', pool[1].nAvailable, pool[0]]); - table.push(['sfpowerscripts.pool.inuse', pool[1].nInUse, pool[0]]); - table.push(['sfpowerscripts.pool.provisioning', pool[1].nProvisioningInProgress, pool[0]]); + table.push(['sfp.pool.total', pool[1].nTotal, pool[0]]); + table.push(['sfp.pool.available', pool[1].nAvailable, pool[0]]); + table.push(['sfp.pool.inuse', pool[1].nInUse, pool[0]]); + table.push(['sfp.pool.provisioning', pool[1].nProvisioningInProgress, pool[0]]); } } @@ -114,10 +114,10 @@ export default class Publish extends SfpowerscriptsCommand { private validateEnvVars() { if ( !( - process.env.SFPOWERSCRIPTS_STATSD || - process.env.SFPOWERSCRIPTS_DATADOG || - process.env.SFPOWERSCRIPTS_NEWRELIC || - process.env.SFPOWERSCRIPTS_SPLUNK + process.env.sfp_STATSD || + process.env.sfp_DATADOG || + process.env.sfp_NEWRELIC || + process.env.sfp_SPLUNK ) ) { throw new Error('Environment variable not set for metrics. No metrics will be published.'); diff --git a/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts b/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts index 8b1c06573..98916f405 100644 --- a/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts +++ b/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts @@ -1,7 +1,7 @@ import { AnyJson } from '@salesforce/ts-types'; -import SfpowerscriptsCommand from '../../../SfpowerscriptsCommand'; -import PoolOrgDeleteImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolOrgDeleteImpl'; -import SFPLogger from '@dxatscale/sfp-logger'; +import sfpCommand from '../../../SfpCommand'; +import PoolOrgDeleteImpl from '../../../core/scratchorg/pool/PoolOrgDeleteImpl'; +import SFPLogger from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import { loglevel, @@ -16,9 +16,9 @@ Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'scratchorg_pool_org_delete'); +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_org_delete'); -export default class Delete extends SfpowerscriptsCommand { +export default class Delete extends sfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfpowerscripts-cli/src/commands/profile/merge.ts b/packages/sfpowerscripts-cli/src/commands/profile/merge.ts index 01d93482d..1955a40d1 100644 --- a/packages/sfpowerscripts-cli/src/commands/profile/merge.ts +++ b/packages/sfpowerscripts-cli/src/commands/profile/merge.ts @@ -1,10 +1,10 @@ import { Messages, Org } from '@salesforce/core'; import { isNil } from 'lodash'; -import { Sfpowerkit } from '@dxatscale/sfprofiles/lib/utils/sfpowerkit'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import ProfileRetriever from '@dxatscale/sfprofiles/lib/impl/metadata/retriever/profileRetriever'; -import ProfileMerge from '@dxatscale/sfprofiles/lib/impl/source/profileMerge'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import ProfileRetriever from '@flxblio/sfprofiles/lib/impl/metadata/retriever/profileRetriever'; +import ProfileMerge from '@flxblio/sfprofiles/lib/impl/source/profileMerge'; +import sfpCommand from '../../SfpCommand'; import Table from 'cli-table'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; @@ -12,9 +12,9 @@ import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'profile_merge'); +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_merge'); -export default class Merge extends SfpowerscriptsCommand { +export default class Merge extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts b/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts index cb9e85402..571af5b55 100644 --- a/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts +++ b/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts @@ -1,12 +1,12 @@ import { Messages, Org } from '@salesforce/core'; import * as _ from 'lodash'; -import { Sfpowerkit } from '@dxatscale/sfprofiles/lib/utils/sfpowerkit'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import { METADATA_INFO } from '@dxatscale/sfprofiles/lib/impl/metadata/metadataInfo'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { METADATA_INFO } from '@flxblio/sfprofiles/lib/impl/metadata/metadataInfo'; import * as path from 'path'; -import ProfileReconcile from '@dxatscale/sfprofiles/lib/impl/source/profileReconcile'; -import MetadataFiles from '@dxatscale/sfprofiles/lib/impl/metadata/metadataFiles'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; +import MetadataFiles from '@flxblio/sfprofiles/lib/impl/metadata/metadataFiles'; +import sfpCommand from '../../SfpCommand'; const Table = require('cli-table'); import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { Flags } from '@oclif/core'; @@ -15,9 +15,9 @@ import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserN Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'profile_reconcile'); +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_reconcile'); -export default class Reconcile extends SfpowerscriptsCommand { +export default class Reconcile extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts b/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts index 0f55d6be9..d1b1853e0 100644 --- a/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts +++ b/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts @@ -1,20 +1,20 @@ import { Messages, Org } from '@salesforce/core'; import * as fs from 'fs-extra'; import { isNil } from 'lodash'; -import { Sfpowerkit } from '@dxatscale/sfprofiles/lib/utils/sfpowerkit'; -import ProfileSync from '@dxatscale/sfprofiles/lib/impl/source/profileSync'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import ProfileSync from '@flxblio/sfprofiles/lib/impl/source/profileSync'; +import sfpCommand from '../../SfpCommand'; import Table from 'cli-table'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'profile_retrieve'); +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_retrieve'); -export default class Retrieve extends SfpowerscriptsCommand { +export default class Retrieve extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts b/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts index ab8928011..0bad08e90 100644 --- a/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts +++ b/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts @@ -1,14 +1,14 @@ -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import ReleaseDefinitionGenerator from '../../impl/release/ReleaseDefinitionGenerator'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'releasedefinition_generate'); +const messages = Messages.loadMessages('@flxblio/sfp', 'releasedefinition_generate'); -export default class Generate extends SfpowerscriptsCommand { +export default class Generate extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfpowerscripts-cli/src/commands/repo/patch.ts b/packages/sfpowerscripts-cli/src/commands/repo/patch.ts index 4eea2d5b4..1781b3286 100644 --- a/packages/sfpowerscripts-cli/src/commands/repo/patch.ts +++ b/packages/sfpowerscripts-cli/src/commands/repo/patch.ts @@ -1,29 +1,29 @@ import { Messages } from '@salesforce/core'; -import SfpowerscriptsCommand from '../../SfpowerscriptsCommand'; +import sfpCommand from '../../SfpCommand'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; import FetchImpl from '../../impl/artifacts/FetchImpl'; import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; import path = require('path'); -import ArtifactFetcher, { Artifact } from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import SFPLogger, { ConsoleLogger, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SfpPackageInquirer from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInquirer'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import SFPLogger, { ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; +import Git from '../../core/git/Git'; import * as fs from 'fs-extra'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import { EOL } from 'os'; -import { COLOR_WARNING } from '@dxatscale/sfp-logger'; -import { COLOR_HEADER } from '@dxatscale/sfp-logger'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'patch'); +const messages = Messages.loadMessages('@flxblio/sfp', 'patch'); -export default class Patch extends SfpowerscriptsCommand { +export default class Patch extends sfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp repo:patch -n `]; diff --git a/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts new file mode 100644 index 000000000..b7e20ea49 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts @@ -0,0 +1,28 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from "../queryHelper/ChunkCollection"; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ApexClassFetcher { + constructor(private conn: Connection) {} + + /** + * Query Apex Classes by Name + * + * @param classNames + * @returns + */ + public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> { + let result: {Id: string; Name: string}[] = []; + + const chunks = chunkCollection(classNames); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query + const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); + result = result.concat(records); + } + + return result; + } +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts new file mode 100644 index 000000000..9b17c3d4d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts @@ -0,0 +1,28 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from '../queryHelper/ChunkCollection'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ApexTriggerFetcher { + constructor(private conn: Connection) {} + + /** + * Query Triggers by Name + * + * @param triggerNames + * @returns + */ + public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> { + let result: {Id: string, Name: string}[] = []; + + const chunks = chunkCollection(triggerNames); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query + const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); + result = result.concat(records); + } + + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts new file mode 100644 index 000000000..f1f543365 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts @@ -0,0 +1,42 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from '../../queryHelper/ChunkCollection'; +import QueryHelper from '../../queryHelper/QueryHelper'; + +export default class ApexCodeCoverageAggregateFetcher { + constructor(private conn: Connection) {} + + /** + * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId + * @param listOfApexClassOrTriggerId + * @returns + */ + public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{ + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }[]> { + let result: { + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }[] = []; + + const chunks = chunkCollection(listOfApexClassOrTriggerId); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); + let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }>(query, this.conn, true); + result = result.concat(records); + } + + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts b/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts new file mode 100644 index 000000000..978361887 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts @@ -0,0 +1,76 @@ +import SFPLogger, { Logger, LoggerLevel } from "@flxblio/sfp-logger" + +export default class IndividualClassCoverage { + public constructor(private codeCoverage: any, private logger: Logger) {} + + public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] { + let individualClassCoverage: { + name: string; + coveredPercent: number; + }[] = []; + + // Return every class in coverage json if test level is not RunAllTestsInPackage + individualClassCoverage = this.codeCoverage.map((cls) => { + return { name: cls.name, coveredPercent: cls.coveredPercent }; + }); + + // Filter individualClassCoverage based on classesToBeValidated + if(classesToBeValidated && classesToBeValidated.length > 0) + individualClassCoverage = individualClassCoverage.filter((cls) => { + return classesToBeValidated.includes(cls.name); + }); + + + return individualClassCoverage; + } + + public validateIndividualClassCoverage( + individualClassCoverage: ClassCoverage[], + coverageThreshold?: number + ): { + result: boolean; + message: string; + classesCovered?: ClassCoverage[]; + classesWithInvalidCoverage?: ClassCoverage[]; + } { + if (coverageThreshold < 75) { + SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger); + coverageThreshold = 75; + } + + SFPLogger.log( + `Validating individual classes for code coverage greater than ${coverageThreshold} percent`, + LoggerLevel.INFO, + this.logger + ); + let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => { + return cls.coveredPercent < coverageThreshold; + }); + + if (classesWithInvalidCoverage.length > 0) { + return { + result: false, + message: 'There are classes which do not satisfy the individual coverage requirements', + classesCovered: individualClassCoverage, + classesWithInvalidCoverage: classesWithInvalidCoverage, + }; + } else + return { + result: true, + message: 'All classes in this test run meet the required coverage threshold', + classesCovered: individualClassCoverage, + }; + } +} + +export type CoverageOptions = { + isPackageCoverageToBeValidated: boolean; + isIndividualClassCoverageToBeValidated: boolean; + coverageThreshold: number; + classesToBeValidated?: string[]; +}; + +export type ClassCoverage = { + name: string; + coveredPercent: number; +}; diff --git a/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts new file mode 100644 index 000000000..a4d7eb57e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts @@ -0,0 +1,134 @@ +import * as fs from 'fs-extra'; +const path = require('path'); +const { globSync } = require('glob'); + +import ApexTypeListener from './listeners/ApexTypeListener'; + +import { + ApexLexer, + ApexParser, + ApexParserListener, + CaseInsensitiveInputStream, + ThrowingErrorListener, + CommonTokenStream, + ParseTreeWalker, +} from 'apex-parser'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { ApexClasses } from '../../package/SfpPackage'; + +/** + * Get Apex type of cls files in a search directory. + * Sorts files into classes, test classes and interfaces. + */ +export default class ApexTypeFetcher { + private apexSortedByType: ApexSortedByType = { + class: [], + testClass: [], + interface: [], + parseError: [], + }; + + constructor(private searchDir: string) {} + + public getClassesClassifiedByType(): ApexSortedByType { + let clsFiles: string[]; + if (fs.existsSync(this.searchDir)) { + clsFiles = globSync(`**/*.cls`, { + cwd: this.searchDir, + absolute: true, + }); + } else { + throw new Error(`Search directory does not exist`); + } + + for (let clsFile of clsFiles) { + let clsPayload: string = fs.readFileSync(clsFile, 'utf8'); + let fileDescriptor: FileDescriptor = { + name: path.basename(clsFile, '.cls'), + filepath: clsFile, + }; + + // Parse cls file + let compilationUnitContext; + try { + let lexer = new ApexLexer(new CaseInsensitiveInputStream(clsFile, clsPayload)); + let tokens: CommonTokenStream = new CommonTokenStream(lexer); + + let parser = new ApexParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(new ThrowingErrorListener()); + + compilationUnitContext = parser.compilationUnit(); + } catch (err) { + SFPLogger.log(`Failed to parse ${clsFile} in ${this.searchDir}`, LoggerLevel.WARN); + SFPLogger.log(err.message, LoggerLevel.WARN); + + fileDescriptor.error = err; + this.apexSortedByType.parseError.push(fileDescriptor); + + continue; + } + + let apexTypeListener: ApexTypeListener = new ApexTypeListener(); + + // Walk parse tree to determine Apex type + ParseTreeWalker.DEFAULT.walk(apexTypeListener as ApexParserListener, compilationUnitContext); + + let apexType = apexTypeListener.getApexType(); + + if (apexType.class) { + this.apexSortedByType.class.push(fileDescriptor); + if (apexType.testClass) { + this.apexSortedByType.testClass.push(fileDescriptor); + } + } else if (apexType.interface) { + this.apexSortedByType.interface.push(fileDescriptor); + } else { + fileDescriptor.error = { message: 'Unknown Apex Type' }; + this.apexSortedByType.parseError.push(fileDescriptor); + } + } + return this.apexSortedByType; + } + + public getTestClasses(): ApexClasses { + let testClassNames: ApexClasses = this.apexSortedByType.testClass.map((fileDescriptor) => fileDescriptor.name); + return testClassNames; + } + + public getClassesOnlyExcludingTestsAndInterfaces(): ApexClasses { + let packageClasses: ApexClasses = this.apexSortedByType.class.map((fileDescriptor) => fileDescriptor.name); + + if (packageClasses != null) { + let testClassesInPackage: ApexClasses = this.apexSortedByType.testClass.map( + (fileDescriptor) => fileDescriptor.name + ); + if (testClassesInPackage != null && testClassesInPackage.length > 0) + packageClasses = packageClasses.filter((item) => !testClassesInPackage.includes(item)); + + let interfacesInPackage: ApexClasses = this.apexSortedByType.testClass.map( + (fileDescriptor) => fileDescriptor.name + ); + if (interfacesInPackage != null && interfacesInPackage.length > 0) + packageClasses = packageClasses.filter((item) => !interfacesInPackage.includes(item)); + + let parseError: ApexClasses = this.apexSortedByType.parseError.map((fileDescriptor) => fileDescriptor.name); + if (parseError != null && parseError.length > 0) + packageClasses = packageClasses.filter((item) => !parseError.includes(item)); + } + return packageClasses; + } +} + +export type ApexSortedByType = { + class: FileDescriptor[]; + testClass: FileDescriptor[]; + interface: FileDescriptor[]; + parseError: FileDescriptor[]; +}; + +export type FileDescriptor = { + name: string; + filepath: string; + error?: any; +}; diff --git a/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts b/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts new file mode 100644 index 000000000..12e6e2181 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts @@ -0,0 +1,38 @@ +import { + ApexParserListener, + AnnotationContext, + InterfaceDeclarationContext, + ClassDeclarationContext, +} from 'apex-parser'; + +export default class ApexTypeListener implements ApexParserListener { + private apexType: ApexType = { + class: false, + testClass: false, + interface: false, + }; + + enterAnnotation(ctx: AnnotationContext): void { + if (ctx.text.toUpperCase().startsWith('@ISTEST')) { + this.apexType.testClass= true; + } + } + + enterInterfaceDeclaration(ctx: InterfaceDeclarationContext): void { + this.apexType.interface = true; + } + + enterClassDeclaration(ctx: ClassDeclarationContext): void { + this.apexType.class = true; + } + + public getApexType(): ApexType { + return this.apexType; + } +} + +interface ApexType { + class: boolean; + testClass: boolean; + interface: boolean; +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts b/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts new file mode 100644 index 000000000..ca2dbd0e0 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts @@ -0,0 +1,30 @@ + +const fs = require('fs-extra'); +import path from 'path'; +import xml2json from '../utils/xml2json'; +import { globSync } from 'glob'; + +export default class ApexTestSuite { + public constructor(private sourceDir: string, private suiteName: string) {} + + public async getConstituentClasses(): Promise { + let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, { + cwd: this.sourceDir, + absolute: true, + }); + + console.log('testSuitePaths',testSuitePaths); + + if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`); + + let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0]))); + + if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) { + return apex_test_suite.ApexTestSuite.testClassName; + } else { + let testClassess = new Array(); + testClassess.push(apex_test_suite.ApexTestSuite.testClassName); + return testClassess; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts b/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts new file mode 100644 index 000000000..bd6fb7712 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts @@ -0,0 +1,53 @@ +import { Connection, Org } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { chunkArray } from '../utils/ChunkArray'; +const CODECOV_AGGREGATE_QUERY = `SELECT Id FROM ApexCodeCoverageAggregate`; +const APEX_TEST_RESULT_QUERY = `SELECT Id FROM ApexTestResult`; +import { delay } from '../utils/Delay'; + +export default class ClearTestResults { + private conn: Connection; + + public constructor(private org: Org, private logger: Logger) {} + /** + * Clear coverage and test results + */ + public async clear() { + this.conn = this.org.getConnection(); + + SFPLogger.log(`Clearing Coverage Results`, LoggerLevel.DEBUG, this.logger); + let codeCoverageAggregate = await QueryHelper.query(CODECOV_AGGREGATE_QUERY, this.conn, true); + await this.deleteRecords('ApexCodeCoverageAggregate', codeCoverageAggregate); + SFPLogger.log(`Cleared Coverage Results`, LoggerLevel.DEBUG, this.logger); + + SFPLogger.log(`Clearing Test Results`, LoggerLevel.DEBUG, this.logger); + let testResults = await QueryHelper.query(APEX_TEST_RESULT_QUERY, this.conn, true); + await this.deleteRecords('ApexTestResult', testResults); + SFPLogger.log(`Cleared Test Results`, LoggerLevel.DEBUG, this.logger); + + SFPLogger.log(`Cleared Existing Coverage and Test Results`, LoggerLevel.INFO, this.logger); + + //allow org to catchup + await delay(10000); + } + + private async deleteRecords(objectType: string, records: any[]) { + if (records && records.length > 0) { + let idsList: string[] = records.map((elem) => elem.Id); + let errors = []; + for (let idsToDelete of chunkArray(2000, idsList)) { + const deleteResults: any = await this.conn.tooling.destroy(objectType, idsToDelete); + deleteResults.forEach((elem) => { + if (!elem.success) { + errors = errors.concat(elem.errors); + } + }); + } + + if (errors.length > 0) { + throw new Error(JSON.stringify(errors)); + } + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts b/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts new file mode 100644 index 000000000..a271a79b7 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts @@ -0,0 +1,90 @@ +import * as _ from 'lodash'; +import ApexDepedencyCheckImpl from "@flxblio/apexlink/lib/ApexDepedencyCheckImpl" +import Component from '../dependency/Component'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackage, { PackageType } from '../package/SfpPackage'; +import path from 'path'; + +export default class ImpactedApexTestClassFetcher { + public constructor( + private sfpPackage: SfpPackage, + private changedComponents: Component[], + private logger: Logger, + private loglevel?: LoggerLevel + ) {} + + public async getImpactedTestClasses(): Promise { + + let invalidatedClasses = []; + let invalidatedTestClasses = []; + + try + { + let validatedChangedComponents = this.changedComponents.filter( + (component) => component.package == this.sfpPackage.packageName + ); + + SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger); + + + + let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory)); + let dependencies = (await apexLinkImpl.execute()).dependencies; + + if(dependencies.length==0) + { + //go for another attempt + SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger); + apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory); + dependencies = (await apexLinkImpl.execute()).dependencies; + } + + SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger); + + //compute invalidated apex classes + for (const changedComponent of validatedChangedComponents) { + //If the component is a permset or profile, add every test class + //There is a change in security model, add all test classes as invalidated + // Temoorarily disabled this check as it is not working as expected + if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) { + SFPLogger.log( + COLOR_WARNING(`Change in Security Model, pushing all test classes through`), + LoggerLevel.INFO, + this.logger + ); + invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses); + break; + } + + for (const apexClass of dependencies) { + // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class + if (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name); + + // push any apex class or test class who is dependent on the changed entity + for (const dependsOn of apexClass.dependencies) { + if (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name); + } + } + } + + SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger); + //Filter all apex classes by means of whats is detected in test classes list + invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses); + SFPLogger.log( + `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`, + LoggerLevel.INFO, + this.logger + ); + }catch(error) + { + SFPLogger.log( + `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`, + LoggerLevel.ERROR, + this.logger + ); + invalidatedClasses = this.sfpPackage.apexTestClassses; + } + return invalidatedTestClasses; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts b/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts new file mode 100644 index 000000000..315f3d47a --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts @@ -0,0 +1,174 @@ +/* + * 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 + */ +import { ApexTestResultData, ApexTestResultOutcome, TestResult } from '@salesforce/apex-node'; + +export type CliJsonFormat = { + summary: object; + tests: CliTestResult[]; + coverage?: CliCoverageResult; +}; + +type CliTestResult = { + Id: string; + QueueItemId: string; + StackTrace: string; + Message: string; + AsyncApexJobId: string; + MethodName: string; + Outcome: ApexTestResultOutcome; + ApexClass: { Id: string; Name: string; NamespacePrefix: string }; + RunTime: number; + FullName: string; +}; + +type ClassCoverage = { + id: string; + name: string; + totalLines: number; + lines: {}; + totalCovered: number; + coveredPercent: number; +}; + +type PerClassCoverage = { + ApexTestClass: { + Id: string; + Name: string; + }; + Coverage?: { coveredLines: number[]; uncoveredLines: number[] }; + TestMethodName: string; + NumLinesCovered: number; + ApexClassOrTrigger: { + Id: string; + Name: string; + }; + NumLinesUncovered: number; +}; + +type CliCoverageResult = { + coverage: ClassCoverage[]; + records: PerClassCoverage[]; + summary: { + totalLines: number; + coveredLines: number; + testRunCoverage: string; + orgWideCoverage: string; + }; +}; + +const skippedProperties = ['skipRate', 'coveredLines', 'totalLines']; +const timeProperties = ['testExecutionTimeInMs', 'testTotalTimeInMs', 'commandTimeInMs']; + +export class JsonReporter { + public format( + result: TestResult + ): { + summary: object; + tests: CliTestResult[]; + coverage?: CliCoverageResult; + } { + return { + summary: this.formatSummary(result), + tests: this.formatTestResults(result.tests), + ...(result.codecoverage + ? { + coverage: this.formatCoverage(result), + } + : {}), + }; + } + + private formatSummary(testResult: TestResult): object { + const summary = {}; + + Object.entries(testResult.summary).forEach(([key, value]) => { + if (skippedProperties.includes(key)) { + return; + } + + if (timeProperties.includes(key)) { + key = key.replace('InMs', ''); + value = `${value} ms`; + } + + Object.assign(summary, { [key]: value }); + }); + + return summary; + } + + private formatTestResults(testResults: ApexTestResultData[]): CliTestResult[] { + return testResults.map((test) => { + return { + Id: test.id, + QueueItemId: test.queueItemId, + StackTrace: test.stackTrace, + Message: test.message, + AsyncApexJobId: test.asyncApexJobId, + MethodName: test.methodName, + Outcome: test.outcome, + ApexClass: { + Id: test.apexClass.id, + Name: test.apexClass.name, + NamespacePrefix: test.apexClass.namespacePrefix, + }, + RunTime: test.runTime, + FullName: test.fullName, + }; + }) as CliTestResult[]; + } + + private formatCoverage(testResult: TestResult): CliCoverageResult { + const formattedCov = { + coverage: [], + records: [], + summary: { + totalLines: testResult.summary.totalLines, + coveredLines: testResult.summary.coveredLines, + orgWideCoverage: testResult.summary.orgWideCoverage, + testRunCoverage: testResult.summary.testRunCoverage, + }, + } as CliCoverageResult; + + if (testResult.codecoverage) { + formattedCov.coverage = testResult.codecoverage.map((cov) => { + const lines: { [key: number]: number } = {}; + cov.coveredLines.forEach((covLine) => (lines[covLine] = 1)); + cov.uncoveredLines.forEach((uncovLine) => (lines[uncovLine] = 0)); + + return { + id: cov.apexId, + name: cov.name, + totalLines: cov.numLinesCovered + cov.numLinesUncovered, + lines, + totalCovered: cov.numLinesCovered, + coveredPercent: parseInt(cov.percentage), + } as ClassCoverage; + }); + + testResult.tests.forEach((test) => { + if (test.perClassCoverage) { + test.perClassCoverage.forEach((perClassCov) => { + formattedCov.records.push({ + ApexTestClass: { Id: test.id, Name: test.apexClass.name }, + ...(perClassCov.coverage ? { Coverage: perClassCov.coverage } : {}), + TestMethodName: test.methodName, + NumLinesCovered: perClassCov.numLinesCovered, + ApexClassOrTrigger: { + Id: perClassCov.apexClassOrTriggerId, + Name: perClassCov.apexClassOrTriggerName, + }, + NumLinesUncovered: perClassCov.numLinesUncovered, + } as PerClassCoverage); + }); + } + }); + } + + return formattedCov; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts b/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts new file mode 100644 index 000000000..15faf1fcd --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts @@ -0,0 +1,73 @@ +import * as _ from 'lodash'; +import SfpPackage from '../package/SfpPackage'; + +export class TestOptions { + synchronous?: boolean; + wait_time: number; + outputdir: string; + testLevel: TestLevel; +} + +export class RunSpecifiedTestsOption extends TestOptions { + specifiedTests: string; + constructor(wait_time: number, outputdir: string, specifiedTests: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.specifiedTests = specifiedTests; + this.testLevel = TestLevel.RunSpecifiedTests; + } +} + +export class RunApexTestSuitesOption extends TestOptions { + suiteNames: string; + constructor(wait_time: number, outputdir: string, suiteNames: string, pkg?: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.suiteNames = suiteNames; + this.testLevel = TestLevel.RunApexTestSuite; + } +} + +export class RunLocalTests extends TestOptions { + constructor(wait_time: number, outputdir: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.testLevel = TestLevel.RunLocalTests; + } +} + +export class RunAllTestsInOrg extends TestOptions { + constructor(wait_time: number, outputdir: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.testLevel = TestLevel.RunAllTestsInOrg; + } +} + +export class RunAllTestsInPackageOptions extends RunSpecifiedTestsOption { + public constructor(private _sfppackage: SfpPackage, wait_time: number, outputdir: string) { + super(wait_time, outputdir, _sfppackage.apexTestClassses.toString(), false); + this.synchronous = _sfppackage.packageDescriptor.testSynchronous == true ? true : false; + } + + public get sfppackage() { + return this._sfppackage; + } +} + +export enum TestLevel { + RunNoTests = 'NoTestRun', + RunSpecifiedTests = 'RunSpecifiedTests', + RunApexTestSuite = 'RunApexTestSuite', + RunLocalTests = 'RunLocalTests', + RunAllTestsInOrg = 'RunAllTestsInOrg', + RunAllTestsInPackage = 'RunAllTestsInPackage', +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts b/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts new file mode 100644 index 000000000..a66e55dc3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts @@ -0,0 +1,118 @@ +import { RunAllTestsInPackageOptions, RunApexTestSuitesOption, TestOptions } from './TestOptions'; +import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from '../display/TableConstants'; + +const Table = require('cli-table'); + +export class TestReportDisplayer { + constructor(private apexTestReport: any, private testOptions: TestOptions, private fileLogger?: any) {} + + public printTestSummary(packageCoverage?: number): string { + let apexTestReport = { ...this.apexTestReport }; + SFPLogger.log('\n\n\n=== Test Summary', LoggerLevel.INFO, this.fileLogger); + let table = new Table({ + head: ['Name', 'Value'], + chars: ZERO_BORDER_TABLE + }); + + if ( + this.testOptions instanceof RunAllTestsInPackageOptions || + this.testOptions instanceof RunApexTestSuitesOption || + this.testOptions instanceof RunAllTestsInPackageOptions + ) { + delete apexTestReport.summary.testRunCoverage; + delete apexTestReport.summary.orgWideCoverage; + + if (this.testOptions instanceof RunAllTestsInPackageOptions) + apexTestReport.summary.packageCoverage = packageCoverage; + } + + Object.entries(apexTestReport.summary).forEach((keyValuePair) => { + keyValuePair[1] = keyValuePair[1] || ''; + table.push(keyValuePair); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } + + public printTestResults(): string { + SFPLogger.log('=== Test Results', LoggerLevel.INFO, this.fileLogger); + + let table = new Table({ + head: ['Test Name', 'Outcome', 'Message', 'Runtime (ms)'], + chars: ZERO_BORDER_TABLE + }); + + this.apexTestReport.tests.forEach((test) => { + if (test.Outcome === 'Pass') { + table.push([ + COLOR_SUCCESS(test.FullName || ''), + COLOR_SUCCESS(test.Outcome), + COLOR_SUCCESS(test.Message || ''), + COLOR_SUCCESS(test.RunTime || ''), + ]); + } else { + table.push([ + COLOR_ERROR(test.FullName || ''), + COLOR_ERROR(test.Outcome || ''), + COLOR_ERROR(test.Message || ''), + COLOR_ERROR(test.RunTime || ''), + ]); + } + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } + + public printCoverageReport( + coverageThreshold: number, + classesCovered?: { name: string; coveredPercent: number }[], + classesWithInvalidCoverage?: { name: string; coveredPercent: number }[] + ): { classesCoveredTable: string; classInvalidCoverageTable?: string } { + SFPLogger.log('\n\n=== Test Coverage', LoggerLevel.INFO, this.fileLogger); + let classesCoveredTable; + if (classesCovered) { + classesCoveredTable = this.printIndividualClassCoverage(classesCovered); + } + if (classesWithInvalidCoverage) { + let classInvalidCoverageTable = this.printClassesWithInvalidCoverage( + classesWithInvalidCoverage, + coverageThreshold + ); + return { classesCoveredTable, classInvalidCoverageTable }; + } else return { classesCoveredTable }; + } + + private printClassesWithInvalidCoverage( + classesWithInvalidCoverage: { name: string; coveredPercent: number }[], + coverageThreshold: number + ): string { + SFPLogger.log( + `The following classes do not satisfy the ${coverageThreshold}% code coverage requirement:`, + LoggerLevel.INFO, + this.fileLogger + ); + + return this.printIndividualClassCoverage(classesWithInvalidCoverage); + } + + private printIndividualClassCoverage(individualClassCoverage: { name: string; coveredPercent: number }[]): string { + let table = new Table({ + head: ['Class', 'Coverage Percent'], + chars: ZERO_BORDER_TABLE + }); + + individualClassCoverage.forEach((cls) => { + if (cls.coveredPercent !== null && cls.coveredPercent < 75) { + table.push([COLOR_ERROR(cls.name || ''), COLOR_ERROR(cls.coveredPercent)]); + } else if (cls.coveredPercent !== null && cls.coveredPercent >= 75) { + table.push([COLOR_SUCCESS(cls.name || ''), COLOR_SUCCESS(cls.coveredPercent)]); + } else table.push([cls.name || '', 'N/A']); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts b/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts new file mode 100644 index 000000000..18c45aff5 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts @@ -0,0 +1,767 @@ +const fs = require('fs-extra'); +import path = require('path'); +import { + RunSpecifiedTestsOption, + TestOptions, + RunApexTestSuitesOption, + RunLocalTests, + RunAllTestsInOrg, + RunAllTestsInPackageOptions, +} from './TestOptions'; +import IndividualClassCoverage, { CoverageOptions } from '../apex/coverage/IndividualClassCoverage'; +import { TestReportDisplayer } from './TestReportDisplayer'; +import PackageTestCoverage from '../package/coverage/PackageTestCoverage'; +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPStatsSender from '../stats/SFPStatsSender'; +import { Connection, Org } from '@salesforce/core'; +import { + TestLevel, + TestResult, + TestService, + JUnitReporter, + Progress, + ApexTestProgressValue, + CancellationTokenSource, + ApexTestResultOutcome, + ApexTestResultData, + CodeCoverageResult, +} from '@salesforce/apex-node'; +import { CliJsonFormat, JsonReporter } from './JSONReporter'; +import { Duration } from '@salesforce/kit'; +import ClearCodeCoverage from './ClearCodeCoverage'; +import _ from 'lodash'; +const retry = require('async-retry'); + +export default class TriggerApexTests { + private conn: Connection; + protected cancellationTokenSource = new CancellationTokenSource(); + + public constructor( + private target_org: string, + private testOptions: TestOptions, + private coverageOptions: CoverageOptions, + private project_directory: string, + private fileLogger?: any + ) {} + + public async exec(): Promise<{ + id: string; + result: boolean; + message: string; + }> { + let org = await Org.create({ aliasOrUsername: this.target_org }); + this.conn = org.getConnection(); + + // graceful shutdown + const exitHandler = async (): Promise => { + await this.cancellationTokenSource.asyncCancel(); + process.exit(); + }; + process.on('SIGINT', exitHandler); + process.on('SIGTERM', exitHandler); + + let startTime = Date.now(); + let testExecutionResult: boolean = false; + let testsRan: number; + let commandTime: number; + + try { + const testService = new TestService(this.conn); + + //Clear Code Coverage before triggering tests + try { + let clearCodeCoverage = new ClearCodeCoverage(org, this.fileLogger); + await clearCodeCoverage.clear(); + } catch (error) { + SFPLogger.log( + `Ignoring error in clearing code coverage attributed to ${error}.`, + LoggerLevel.DEBUG, + this.fileLogger + ); + } + + //Translate Tests to test levels used by apex-node + let translatedTestLevel: TestLevel; + //Fetch tests passed in the testOptions + let tests: string = null; + let suites: string = null; + let isCoverageToBeFetched: boolean = + this.coverageOptions.isIndividualClassCoverageToBeValidated || + this.coverageOptions.isPackageCoverageToBeValidated; + + //Translate Test Option + ({ translatedTestLevel, tests, suites } = await this.translateTestOptionToAPIVars(this.testOptions)); + //Trigger tests asynchronously + let testRunResult: TestResult; + try { + testRunResult = (await this.triggerTestAsynchronously( + testService, + translatedTestLevel, + isCoverageToBeFetched, + tests, + suites + )) as TestResult; + } catch (error) { + return { + result: false, + id: null, + message: error.message, + }; + } + + //Fetch Test Results + let testResult = await retry( + async (bail) => { + return await testService.reportAsyncResults( + testRunResult.summary.testRunId, + isCoverageToBeFetched, + this.cancellationTokenSource.token + ); + }, + { retries: 2, minTimeout: 3000 } + ); + + testResult = this.fixBadNamespaceClassFullNames(testResult); + + //Collect Failed Tests only if Parallel + testResult = await this.triggerSecondRunInSerialForParallelFailedTests( + testResult, + testService, + translatedTestLevel, + isCoverageToBeFetched + ); + + //Filter testResult for duplicate test listing + testResult = this.removeDuplicateTestListing(testResult); + + //Write Test Results to file + let jsonOutput = undefined; + try + { + jsonOutput = this.writeTestOutput(testResult); + }catch(error) + { + SFPLogger.log( + `Unable to write test results to file due to ${error}`, + LoggerLevel.DEBUG, + this.fileLogger + ); + return { + result: false, + id: testResult.summary.testRunId, + message: 'Unable to fetch test execution results, Please retry', + }; + } + + //Print tests result to screen + let testReportDisplayer = new TestReportDisplayer(jsonOutput, this.testOptions, this.fileLogger); + testReportDisplayer.printTestResults(); + + commandTime = testResult.summary.commandTimeInMs; + + if (testResult.summary.outcome == 'Failed') { + testExecutionResult = false; + + return { + result: false, + id: testResult.summary.testRunId, + message: 'Test Execution failed', + }; + } else { + if (isCoverageToBeFetched) { + let coverageResults = await this.validateForApexCoverage(jsonOutput.coverage.coverage); + testReportDisplayer.printCoverageReport( + this.coverageOptions.coverageThreshold, + coverageResults.classesCovered, + coverageResults.classesWithInvalidCoverage + ); + + testsRan = testResult.summary.testsRan; + testReportDisplayer.printTestSummary(coverageResults.packageTestCoverage); + + testExecutionResult = coverageResults.result; + SFPStatsSender.logGauge('apextest.testcoverage', coverageResults.packageTestCoverage, { + package: + this.testOptions instanceof RunAllTestsInPackageOptions + ? this.testOptions.sfppackage.packageName + : null, + }); + return { + result: coverageResults.result, + id: testResult.summary.testRunId, + message: coverageResults.message, + }; + } else { + testExecutionResult = true; + SFPStatsSender.logGauge( + 'apextest.testcoverage', + Number.parseInt(testResult.summary.testRunCoverage), + { + package: + this.testOptions instanceof RunAllTestsInPackageOptions + ? this.testOptions.sfppackage.packageName + : null, + } + ); + return { + result: true, + id: testResult.summary.testRunId, + message: `Test execution succesfully completed`, + }; + } + } + } finally { + this.reportMetrics(this.testOptions, { + targetOrg: this.target_org, + startTime, + testExecutionResult, + testsRan, + commandTime, + }); + } + } + + private async translateTestOptionToAPIVars( + testOptions: TestOptions + ): Promise<{ translatedTestLevel: TestLevel; tests: string; suites: string }> { + let translatedTestLevel: TestLevel; + let tests: string; + let suites: string; + if (testOptions instanceof RunAllTestsInPackageOptions) { + ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForAllTestInPackageOptions(testOptions)); + } else if (testOptions instanceof RunSpecifiedTestsOption) { + ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForSpecifiedTests(testOptions)); + } else if (testOptions instanceof RunApexTestSuitesOption) { + translatedTestLevel = TestLevel.RunSpecifiedTests; + suites = (testOptions as RunApexTestSuitesOption).suiteNames; + SFPLogger.log( + `Test Suites to be executed: ${COLOR_KEY_MESSAGE(suites)}`, + LoggerLevel.INFO, + this.fileLogger + ); + } else if (testOptions instanceof RunLocalTests) { + translatedTestLevel = TestLevel.RunLocalTests; + SFPLogger.log( + `Triggering all ${COLOR_KEY_MESSAGE(`local tests`)}in the org`, + LoggerLevel.INFO, + this.fileLogger + ); + } else if (testOptions instanceof RunAllTestsInOrg) { + SFPLogger.log( + `Triggering all ${COLOR_KEY_MESSAGE(`all tests`)}in the org`, + LoggerLevel.INFO, + this.fileLogger + ); + translatedTestLevel = TestLevel.RunAllTestsInOrg; + } + return { translatedTestLevel, tests, suites }; + } + + private removeDuplicateTestListing(testResult: any): any { + let modifiedTestResult = _.cloneDeep(testResult); + + let toEliminateIndices = []; + for (let index = 0; index < modifiedTestResult.tests.length; index++) { + let idx = index; + let duplicateIndices = [index]; + while (idx != -1) { + idx = _.findIndex( + modifiedTestResult.tests, + (elem: any) => { + return elem.methodName == modifiedTestResult.tests[index].methodName + && elem.apexClass.name == modifiedTestResult.tests[index].apexClass.name; + }, + idx + 1 + ); + if (idx != -1) duplicateIndices.push(idx); + } + if (duplicateIndices.length > 1) { + for (const idx of duplicateIndices) { + if (modifiedTestResult.tests[idx].outcome != 'Pass') toEliminateIndices.push(idx); + } + } + } + + modifiedTestResult.tests = modifiedTestResult.tests.filter(function (value, index, arr) { + return !toEliminateIndices.includes(index); + }); + + if (toEliminateIndices.length > 0) modifiedTestResult = this.combineTestResult(modifiedTestResult); + + return modifiedTestResult; + } + + private async getTranslatedOptionsForSpecifiedTests(testOptions: RunSpecifiedTestsOption) { + let translatedTestLevel = TestLevel.RunSpecifiedTests; + let tests = testOptions.specifiedTests; + SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); + SFPLogger.log( + `Test Mode: ${COLOR_KEY_MESSAGE(this.testOptions.synchronous == true ? 'serial' : 'parallel')}`, + LoggerLevel.INFO, + this.fileLogger + ); + //Toggle to serial + await this.toggleParallelApexTesting( + this.conn, + this.fileLogger, + this.testOptions.synchronous == true ? true : false + ); + return { translatedTestLevel, tests }; + } + + private async getTranslatedOptionsForAllTestInPackageOptions(testOptions: RunAllTestsInPackageOptions) { + SFPLogger.log( + `Test Mode Descriptor in Package 'testSynchronous': ${ + testOptions.sfppackage.packageDescriptor.testSynchronous + ? testOptions.sfppackage.packageDescriptor.testSynchronous + : false + }`, + LoggerLevel.TRACE, + this.fileLogger + ); + SFPLogger.log( + `Test Mode: ${COLOR_KEY_MESSAGE(testOptions.synchronous == true ? 'serial' : 'parallel')}`, + LoggerLevel.INFO, + this.fileLogger + ); + await this.toggleParallelApexTesting( + this.conn, + this.fileLogger, + testOptions.synchronous == true ? true : false + ); + let translatedTestLevel = TestLevel.RunSpecifiedTests; + let tests = testOptions.specifiedTests; + SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); + return { translatedTestLevel, tests }; + } + + private async triggerSecondRunInSerialForParallelFailedTests( + testResult: TestResult, + testService: TestService, + translatedTestLevel: TestLevel, + isCoverageToBeFetched: boolean + ) { + let modifiedTestResult = _.cloneDeep(testResult); + if (!this.testOptions.synchronous) { + let parallelFailedTestClasses: string[] = []; + let testClassesThatDonotContributedCoverage: string[] = []; + + let testToBeTriggered: string[] = []; + for (const test of modifiedTestResult.tests) { + if (test.outcome == ApexTestResultOutcome.Fail) { + //Check for messages + if ( + test.message.includes(`Your request exceeded the time limit for processing`) || + test.message.includes(`UNABLE_TO_LOCK_ROW`) || + test.message.includes(`Internal Salesforce Error`) || + test.message.includes(`LIMIT_EXCEEDED`) || + test.message.includes(`Too many concurrent Apex compilations during resource mitigation`) + ) { + if (!testToBeTriggered.includes(test.apexClass.fullName)) { + parallelFailedTestClasses.push(test.apexClass.fullName); + testToBeTriggered.push(test.apexClass.fullName); + } + } + } + + if (test.outcome == ApexTestResultOutcome.Pass) { + if ( + !test.perClassCoverage && + (this.coverageOptions.isPackageCoverageToBeValidated || + this.coverageOptions.isIndividualClassCoverageToBeValidated) + ) { + if (!testToBeTriggered.includes(test.apexClass.fullName)) { + testClassesThatDonotContributedCoverage.push(test.apexClass.fullName); + if (!testToBeTriggered.includes(test.apexClass.fullName)) + testToBeTriggered.push(test.apexClass.fullName); + } + } + } + } + + if (parallelFailedTestClasses.length > 0) { + SFPLogger.log( + `Failed Tests while triggered in parallel: ${COLOR_KEY_MESSAGE( + parallelFailedTestClasses.toString() + )}`, + LoggerLevel.INFO, + this.fileLogger + ); + } + + if (testClassesThatDonotContributedCoverage.length > 0) { + SFPLogger.log( + `Test Classes that were not able to contribute coverage: ${COLOR_KEY_MESSAGE( + testClassesThatDonotContributedCoverage.toString() + )}`, + LoggerLevel.INFO, + this.fileLogger + ); + } + + if (testToBeTriggered.length > 0) { + SFPLogger.log( + `Triggering tests synchronously: ${COLOR_KEY_MESSAGE(testToBeTriggered.toString())}`, + LoggerLevel.INFO, + this.fileLogger + ); + //Trigger Second Test Run + //Convert to sequential + await this.toggleParallelApexTesting(this.conn, this.fileLogger, true); + + //Trigger tests asynchronously + let secondRuntestRunResult: TestResult; + secondRuntestRunResult = await retry( + async (bail) => { + return (await this.triggerTestAsynchronously( + testService, + translatedTestLevel, + isCoverageToBeFetched, + testToBeTriggered.toString(), + null + )) as TestResult; + }, + { retries: 2, minTimeout: 3000 } + ); + + secondRuntestRunResult = this.fixBadNamespaceClassFullNames(secondRuntestRunResult); + + //Fetch Test Results + const secondTestResult = this.fixBadNamespaceClassFullNames( + await testService.reportAsyncResults( + secondRuntestRunResult.summary.testRunId, + true, + this.cancellationTokenSource.token + ) + ); + + this.writeTestOutput(secondTestResult); + + //Merge original test results with second run + const mergedTestResults: ApexTestResultData[] = modifiedTestResult.tests; + for (const testObject of secondTestResult.tests){ + const index = mergedTestResults.findIndex((test) => test.fullName === testObject.fullName); + if (index !== -1) { + mergedTestResults[index] = testObject; + }else{ + mergedTestResults.push(testObject); + } + } + modifiedTestResult.tests = mergedTestResults; + + //Merge original code coverage with second run + if (isCoverageToBeFetched) { + const mergedCodecoverage: CodeCoverageResult[] = modifiedTestResult.codecoverage; + for (const codeCoverageObject of secondTestResult.codecoverage){ + + const index = mergedCodecoverage.findIndex((codeCoverage) => codeCoverage.name === codeCoverageObject.name); + if (index !== -1) { + mergedCodecoverage[index] = codeCoverageObject; + }else{ + mergedCodecoverage.push(codeCoverageObject); + } + } + modifiedTestResult.codecoverage = mergedCodecoverage; + } + + //Now redo the math + modifiedTestResult = this.combineTestResult(modifiedTestResult, secondRuntestRunResult); + } + } + + return modifiedTestResult; + } + + private fixBadNamespaceClassFullNames(testResult: any): any { + let modifiedTestResult = _.cloneDeep(testResult); + + try + { + modifiedTestResult.tests = modifiedTestResult.tests.map((test) => { + return { + ...test, + ...{ + fullName: test.fullName?.replace('__', '.'), + apexClass: { + ...test.apexClass, + ...{ + fullName: test.apexClass?.fullName?.replace('__', '.'), + }, + }, + }, + }; + }); + }catch(error) + { + SFPLogger.log( + `Unable to fix bad namespace class full names due to ${error}`, + LoggerLevel.DEBUG, + this.fileLogger + ); + modifiedTestResult = _.cloneDeep(testResult); + } + + return modifiedTestResult; + } + + private combineTestResult(testResult: TestResult, testResultSecondRun?: TestResult) { + testResult.summary.failing = 0; + testResult.summary.passing = 0; + testResult.summary.skipped = 0; + + for (const test of testResult.tests) { + if (test.outcome === ApexTestResultOutcome.Pass) testResult.summary.passing++; + else if (test.outcome === ApexTestResultOutcome.Fail) testResult.summary.failing++; + else if (test.outcome === ApexTestResultOutcome.Skip) testResult.summary.skipped++; + } + + if (testResult.summary.failing > 0) testResult.summary.outcome = 'Failed'; + else testResult.summary.outcome = 'Passed'; + + testResult.summary.passRate = (testResult.summary.passing / testResult.summary.testsRan) * 100 + '%'; + testResult.summary.failRate = (testResult.summary.failing / testResult.summary.testsRan) * 100 + '%'; + testResult.summary.commandTimeInMs = + testResult.summary.commandTimeInMs + testResultSecondRun?.summary.commandTimeInMs; + testResult.summary.testExecutionTimeInMs = + testResult.summary.testExecutionTimeInMs + testResultSecondRun?.summary.testExecutionTimeInMs; + testResult.summary.testTotalTimeInMs = + testResult.summary.testTotalTimeInMs + testResultSecondRun?.summary.testTotalTimeInMs; + + delete testResult.summary.testRunCoverage; + delete testResult.summary.orgWideCoverage; + delete testResult.summary.totalLines; + delete testResult.summary.coveredLines; + + if (testResultSecondRun) + testResult.summary.testRunId = testResult.summary.testRunId.concat( + '_', + testResultSecondRun.summary.testRunId + ); + return testResult; + } + + /** + * Trigger tests asynchronously + * @param {TestService} testService + * @param {TestLevel} testLevel + * @param {string} tests? + * @param {string} suites? + */ + private async triggerTestAsynchronously( + testService: TestService, + testLevel: TestLevel, + isCoverageToBeFetched: boolean, + tests?: string, + suites?: string + ) { + const payload = await testService.buildAsyncPayload(testLevel, null, tests, suites); + + let result = await testService.runTestAsynchronous( + payload, + isCoverageToBeFetched, + false, + new ProgressReporter(this.fileLogger), + this.cancellationTokenSource.token + ); + + if (this.cancellationTokenSource.token.isCancellationRequested) { + throw new Error(`A previous run is being cancelled.. Please try after some time`); + } + + return result; + } + + private async validateForApexCoverage( + coverageReport: any + ): Promise<{ + result: boolean; + message?: string; + packageTestCoverage?: number; + classesCovered?: { + name: string; + coveredPercent: number; + }[]; + classesWithInvalidCoverage?: { + name: string; + coveredPercent: number; + }[]; + }> { + if (this.testOptions instanceof RunAllTestsInPackageOptions) { + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + this.testOptions.sfppackage, + coverageReport, + this.fileLogger, + this.conn + ); + + return packageTestCoverage.validateTestCoverage(this.coverageOptions.coverageThreshold); + } else { + if (this.coverageOptions.isIndividualClassCoverageToBeValidated) { + let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( + coverageReport, + this.fileLogger + ); + return coverageValidator.validateIndividualClassCoverage( + coverageValidator.getIndividualClassCoverage(this.coverageOptions.classesToBeValidated), + this.coverageOptions.coverageThreshold + ); + } else { + let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( + coverageReport, + this.fileLogger + ); + return coverageValidator.validateIndividualClassCoverage( + coverageValidator.getIndividualClassCoverage() + ); + } + } + } + + private writeJUnit(testResult: TestResult) { + SFPLogger.log( + `Junit Report file available at ${path.join( + this.testOptions.outputdir, + `test-result-${testResult.summary.testRunId}-junit.xml` + )}` + ); + let reportAsJUnitReport = new JUnitReporter().format(testResult); + fs.writeFileSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-junit.xml`), + reportAsJUnitReport + ); + } + + private writeTestOutput(testResult: TestResult): CliJsonFormat { + const jsonOutput = this.formatResultInJson(testResult); + + //write output files + fs.ensureDirSync(this.testOptions.outputdir); + + //Write files + fs.writeJSONSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}.json`), + testResult, + { spaces: 4 } + ); + + if (jsonOutput.coverage) + fs.writeJSONSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-coverage.json`), + jsonOutput.coverage?.coverage, + { spaces: 4 } + ); + + //Write Junit Result no matter what + this.writeJUnit(testResult); + + return jsonOutput; + } + + private formatResultInJson(result: TestResult): CliJsonFormat { + try { + const reporter = new JsonReporter(); + return reporter.format(result); + } catch (error) { + return null; + } + } + + //Enable Synchronus Compile on Deploy + private async toggleParallelApexTesting(conn: Connection, logger: Logger, toEnable: boolean) { + try { + SFPLogger.log(`Set enableDisableParallelApexTesting:${toEnable}`, LoggerLevel.TRACE, logger); + let apexSettingMetadata = { fullName: 'ApexSettings', enableDisableParallelApexTesting: toEnable }; + let result = await conn.metadata.upsert('ApexSettings', apexSettingMetadata); + if (result.success) { + SFPLogger.log(`Successfully updated apex testing setting`, LoggerLevel.INFO, logger); + } + } catch (error) { + SFPLogger.log( + `Skipping toggling of enableDisableParallelApexTesting due to ${error}..`, + LoggerLevel.INFO, + logger + ); + } + } + + private reportMetrics( + testOptions: TestOptions, + testMetrics: { + targetOrg: string; + startTime: number; + testExecutionResult: boolean; + testsRan: number; + commandTime?: number; + } + ) { + let elapsedTime = Date.now() - testMetrics.startTime; + + if (testMetrics.testExecutionResult) + SFPStatsSender.logGauge('apextest.tests.ran', testMetrics.testsRan, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + + SFPStatsSender.logGauge('apextest.testtotal.time', elapsedTime, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions['testlevel'], + target_org: testMetrics.targetOrg, + }); + + if (testMetrics.commandTime) + SFPStatsSender.logGauge('apextest.command.time', testMetrics.commandTime, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + + SFPStatsSender.logCount('apextests.triggered', { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + } +} +export class ProgressReporter implements Progress { + private lastExecutedTime; + constructor(private logger: Logger) { + this.lastExecutedTime = Date.now(); + } + + report(value: ApexTestProgressValue): void { + try { + let count = {}; + //Limit printing an update to 30 seconds + if (Date.now() - this.lastExecutedTime > Duration.seconds(30).milliseconds) { + if (value.type == 'TestQueueProgress') { + for (const elem of value.value.records) { + if (elem?.Status) { + if (!count[elem.Status]) { + count[elem.Status] = 1; + } else count[elem.Status]++; + } + } + let statusString = ''; + + //Compute total + let total: number = 0; + for (const [key, value] of Object.entries(count)) { + total += value as number; + } + statusString = `Completed:${count['Completed'] ? count['Completed'] : 0}/${total} Queued(${ + count['Queued'] ? count['Queued'] : 0 + }) Failed(${COLOR_ERROR(count['Failed'] ? count['Failed'] : 0)}) `; + SFPLogger.log(`Test Status: ` + COLOR_KEY_MESSAGE(statusString), LoggerLevel.INFO, this.logger); + this.lastExecutedTime = Date.now(); + } + } + } catch (error) { + //Ignore any results during reporting + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts b/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts new file mode 100644 index 000000000..fd0c94644 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts @@ -0,0 +1,224 @@ +import path = require('path'); +import * as fs from 'fs-extra'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { globSync } from 'glob'; +import AdmZip = require('adm-zip'); +import semver = require('semver'); +import tar = require('tar'); + +export default class ArtifactFetcher { + /** + * Decider for which artifact retrieval method to use + * Returns empty array if no artifacts are found + * @param artifactDirectory + * @param sfdx_package + */ + public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] { + let result: Artifact[] = []; + + if (!fs.existsSync(artifactDirectory)) { + throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`); + } + + let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package); + + SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger); + + for (let artifact of artifacts) { + let artifactFilePaths: Artifact; + if (path.extname(artifact) === '.zip') { + artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact); + } else if (path.extname(artifact) === '.tgz') { + artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact); + } else { + throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`); + } + result.push(artifactFilePaths); + } + + return result; + } + + /** + * Helper method for retrieving the ArtifactFilePaths of an artifact folder + * @param packageMetadataFilePath + */ + private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact { + let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`); + + let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Helper method for retrieving ArtifactFilePaths of an artifact zip + * @param artifact + */ + private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact { + let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + + fs.mkdirpSync(unzippedArtifactsDirectory); + let zip = new AdmZip(artifact); + + // Overwrite existing files + zip.extractAllTo(unzippedArtifactsDirectory, true); + + let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0]; + if (artifactName == null) { + throw new Error(`Failed to fetch artifact file paths for ${artifact}`); + } + + let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json'); + + let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`); + + let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Helper method for retrieving ArtifactFilePaths of a tarball + * @param artifact + */ + private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact { + let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + fs.mkdirpSync(unzippedArtifactsDirectory); + + tar.x({ + file: artifact, + cwd: unzippedArtifactsDirectory, + sync: true, + }); + + let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json'); + + let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`); + + let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Find zip and tarball artifacts + * Artifact format/s: + * sfp_artifact_.zip, + * [sfdx_package]_sfp_artifact_[version].zip, + * [sfdx_package]_sfp_artifact_[version].tgz + */ + public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] { + let pattern: string; + if (sfdx_package) { + pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`; + } else { + pattern = `**/*sfp_artifact*.@(zip|tgz)`; + } + + let artifacts: string[] = globSync(pattern, { + cwd: artifactDirectory, + absolute: true, + }); + + if (sfdx_package && artifacts.length > 1) { + SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO); + let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts); + SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO); + return [latestArtifact]; + } else return artifacts; + } + + /** + * Get the artifact with the latest semantic version + * @param artifacts + */ + private static getLatestArtifact(artifacts: string[]) { + // Consider zip & tarball artifacts only + artifacts = artifacts.filter((artifact) => { + let ext: string = path.extname(artifact); + return ext === '.zip' || ext === '.tgz'; + }); + + let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); + let versions: string[] = artifacts.map((artifact) => { + let match: RegExpMatchArray = path.basename(artifact).match(pattern); + let version = match?.groups.version; + + if (version) return version; + else throw new Error('Corrupted artifact detected with no version number'); + }); + + // Pick artifact with latest semantic version + let sortedVersions: string[] = semver.sort(versions); + let latestVersion: string = sortedVersions.pop(); + + return artifacts.find((artifact) => artifact.includes(latestVersion)); + } + + /** + * Verify that artifact filepaths exist on the file system + * @param artifactFilePaths + */ + private static existsArtifactFilepaths(artifactFilePaths: Artifact): void { + Object.values(artifactFilePaths).forEach((filepath) => { + if (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`); + }); + } + + /** + * Decider for task outcome if the artifact cannot be found + * @param artifacts_filepaths + * @param isToSkipOnMissingArtifact + */ + public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean { + if (artifacts.length === 0 && !isToSkipOnMissingArtifact) { + throw new Error(`Artifact not found, Please check the inputs`); + } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) { + SFPLogger.log( + `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}` + ); + return true; + } + } + + private static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} + +export interface Artifact { + packageMetadataFilePath: string; + sourceDirectoryPath?: string; + changelogFilePath?: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts b/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts new file mode 100644 index 000000000..6ce94ec2d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts @@ -0,0 +1,105 @@ +import path = require('path'); +import * as fs from 'fs-extra'; +import GeneratePackageChangelog from '../../changelog/GeneratePackageChangelog'; +import { Changelog } from '../../changelog/interfaces/GenericChangelogInterfaces'; +import * as rimraf from 'rimraf'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import AdmZip = require('adm-zip'); +import SfpPackage from '../../package/SfpPackage'; + +export default class ArtifactGenerator { + //Generates the universal artifact used by the CLI and AZP + public static async generateArtifact( + sfpPackage: SfpPackage, + project_directory: string, + artifact_directory: string + ): Promise { + try { + // Artifact folder consisting of artifact metadata, changelog & source + let artifactFolder: string = `${sfpPackage.packageName}_sfp_artifact`; + + // Absolute filepath of artifact + let artifactFilepath: string; + + if (artifact_directory != null) { + artifactFilepath = path.resolve(artifact_directory, artifactFolder); + } else { + artifactFilepath = path.resolve(artifactFolder); + } + + fs.mkdirpSync(artifactFilepath); + + let sourcePackage: string = path.join(artifactFilepath, `source`); + fs.mkdirpSync(sourcePackage); + + //Clean up temp directory + if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfp'))) + rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfp')); + if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfdx'))) + rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfdx')); + + fs.copySync(sfpPackage.workingDirectory, sourcePackage); + rimraf.sync(sfpPackage.workingDirectory); + + //Modify Source Directory to the new source directory inside the artifact + sfpPackage.sourceDir = `source`; + + let artifactMetadataFilePath: string = path.join(artifactFilepath, `artifact_metadata.json`); + + fs.writeFileSync(artifactMetadataFilePath, JSON.stringify(sfpPackage, null, 4)); + + // Generate package changelog + // Doesnt need a from version number, as it always generate from start + let generatePackageChangelog: GeneratePackageChangelog = new GeneratePackageChangelog( + sfpPackage.packageName, + undefined, + sfpPackage.sourceVersion, + project_directory + ); + + let packageChangelog: Changelog = await generatePackageChangelog.exec(); + + let changelogFilepath: string = path.join(artifactFilepath, `changelog.json`); + + fs.writeFileSync(changelogFilepath, JSON.stringify(packageChangelog, null, 4)); + + SFPLogger.log('Artifact Copy Completed', LoggerLevel.DEBUG); + + let zip = new AdmZip(); + zip.addLocalFolder(artifactFilepath, artifactFolder); + SFPLogger.log(`Zipping ${artifactFolder}`, LoggerLevel.DEBUG); + + let packageVersionNumber: string = ArtifactGenerator.substituteBuildNumberWithPreRelease( + sfpPackage.versionNumber + ); + + let zipArtifactFilepath: string = artifactFilepath + `_` + packageVersionNumber + `.zip`; + zip.writeZip(zipArtifactFilepath); + + SFPLogger.log( + `Artifact Generation Completed for ${sfpPackage.packageType} to ${zipArtifactFilepath}`, + LoggerLevel.INFO + ); + + // Cleanup unzipped artifact + rimraf.sync(artifactFilepath); + + return zipArtifactFilepath; + } catch (error) { + throw new Error('Unable to create artifact' + error); + } + } + + private static substituteBuildNumberWithPreRelease(packageVersionNumber: string) { + let segments = packageVersionNumber.split('.'); + + if (segments.length === 4) { + packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { + if (segmentsIdx === 3) return version + '-' + segment; + else return version + '.' + segment; + }); + } + + return packageVersionNumber; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts b/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts new file mode 100644 index 000000000..d4c04424d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts @@ -0,0 +1,76 @@ +import ProjectConfig from '../project/ProjectConfig'; +import simplegit, { SimpleGit, LogOptions } from 'simple-git'; +import { Changelog } from './interfaces/GenericChangelogInterfaces'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +/** + * A class for generating a changelog between two commits + * for a single package + */ +export default class GeneratePackageChangelog { + constructor( + private readonly sfdx_package: string, + private readonly revFrom: string, + private readonly revTo: string, + private readonly project_directory: string + ) {} + + public async exec(): Promise { + let git: SimpleGit; + if (this.project_directory != null) { + git = simplegit(this.project_directory); + } else { + git = simplegit(); + } + + let packageDescriptor; + try { + packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(this.project_directory, this.sfdx_package); + } catch (err) { + SFPLogger.log(`Unable to find descriptor for package ${this.sfdx_package}`, LoggerLevel.WARN); + SFPLogger.log(err.message, LoggerLevel.WARN); + } + + let revFrom: string; + if (this.revFrom) { + revFrom = await git.revparse(['--short', `${this.revFrom}^{}`]); + } + + + let revTo: string = await git.revparse(['--short', `${this.revTo}^{}`]); + + let options: LogOptions = { + file: packageDescriptor ? `${packageDescriptor['path']}*` : packageDescriptor, + }; + if(revFrom) + { + options.from = revFrom; + options.to = revTo; + } + + const gitLogResult = await git.log(options); + + let changelog: Changelog = { + name: undefined, + from: undefined, + to: undefined, + commits: [], + }; + + changelog['name'] = this.sfdx_package; + changelog['from'] = revFrom; + changelog['to'] = revTo; + + for (let commit of gitLogResult.all) { + changelog['commits'].push({ + commitId: commit.hash.slice(0, 8), + date: commit.date, + author: commit.author_name, + message: commit.message, + body: commit.body, + }); + } + + return changelog; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts b/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts new file mode 100644 index 000000000..d9929d0ad --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts @@ -0,0 +1,30 @@ +export interface Changelog { + /** + * Name of the package + */ + name: string; + + /** + * Backwards-compatibility for delta package + */ + from: string; + + /** + * Commit Id from which package was created + * May not necessarily be the first element in commits + */ + to: string; + + /** + * Commits that modified the package + */ + commits: Commit[]; +} + +export interface Commit { + commitId: string; + date: string; + author: string; + message: string; + body: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts b/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts new file mode 100644 index 000000000..253b64313 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts @@ -0,0 +1,93 @@ +import Git from '../git/Git'; +import IgnoreFiles from '../ignore/IgnoreFiles'; +import ProjectConfig from '../project/ProjectConfig'; +import MetadataFiles from '../metadata/MetadataFiles'; +import Component from './Component'; +import * as fs from 'fs-extra'; +import path = require('path'); +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +export default class ChangedComponentsFetcher { + constructor(private baseBranch: string) {} + + async fetch(): Promise { + const components: Component[] = []; + + let git: Git = await Git.initiateRepo(); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(null); + + if (!this.baseBranch.includes('origin')) { + // for user convenience, use full ref name to avoid errors involving missing local refs + this.baseBranch = `remotes/origin/${this.baseBranch}`; + } + + let diff: string[] = await git.diff([this.baseBranch, `HEAD`, `--no-renames`, `--name-only`]); + + // Filter diff to package directories + diff = diff.filter((filepath) => + projectConfig.packageDirectories.find((pkg) => + // TODO: make comparison more robust + filepath.includes(pkg.path) + ) + ); + + // Apply root forceignore to the diff + let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync('.forceignore', 'utf8')); + diff = ignoreFiles.filter(diff); + + let componentSuccesses = this.getComponentSuccessesFromReports(); + + if (diff.length > 0) { + for (const filepath of diff) { + const fullApiName = MetadataFiles.getFullApiName(filepath); + + // find package that file belongs to + const indexOfPackage = projectConfig.packageDirectories.findIndex((pkg) => filepath.includes(pkg.path)); + + const packageName = projectConfig.packageDirectories[indexOfPackage].package; + + const componentSuccess = componentSuccesses.find( + (component) => component.fullName === fullApiName && component.id + ); + + if (componentSuccess) { + const component: Component = { + id: componentSuccess.id, + fullName: componentSuccess.fullName, + type: componentSuccess.componentType, + files: [filepath], + package: packageName, + packageType: ProjectConfig.getPackageType(projectConfig, packageName), + indexOfPackage: indexOfPackage, + }; + + components.push(component); + } else { + SFPLogger.log(`Unable to find ID for ${fullApiName} in deployment reports`, LoggerLevel.DEBUG); + // Ignore file if it's not an identifiable component + continue; + } + } + } + + return components; + } + + /** + * Aggregates component successes from MDAPI deploy reports + */ + private getComponentSuccessesFromReports(): any[] { + let componentSuccesses: any[] = []; + + const reportsDir: string = '.sfp/mdapiDeployReports'; + if (fs.existsSync(reportsDir)) { + let reports = fs.readdirSync(reportsDir); + reports.forEach((report) => { + let data = JSON.parse(fs.readFileSync(path.join(reportsDir, report), 'utf8')); + componentSuccesses = componentSuccesses.concat(data.result.details.componentSuccesses); + }); + } + return componentSuccesses; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/Component.ts b/packages/sfpowerscripts-cli/src/core/dependency/Component.ts new file mode 100644 index 000000000..7fe64298b --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/dependency/Component.ts @@ -0,0 +1,16 @@ +import { PackageType } from "../package/SfpPackage"; + +/** + * Component details and package it belongs to + */ +export default interface Component { + id: string; + fullName: string; + type: string; + files?: string[]; + package?: string; + packageType?: PackageType; + indexOfPackage?: number; + namespace?: string; + dependencies?: Component[]; +} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts b/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts new file mode 100644 index 000000000..80493b56e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts @@ -0,0 +1,7 @@ +import Component from './Component'; + +export default interface DependencyViolation { + component: Component; + dependency: any; + description: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts b/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts new file mode 100644 index 000000000..008ec7b59 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts @@ -0,0 +1,20 @@ +import Component from './Component'; + +/** + * Used by sfdc-soup API calls + */ +export default interface Entrypoint { + name: string; + type: string; + id: string; +} + +export function component2entrypoint(components: Component[]): Entrypoint[] { + return components.map((component) => { + return { + name: component.fullName, + type: component.type, + id: component.id, + } as Entrypoint; + }); +} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts new file mode 100644 index 000000000..ea9f2c3d4 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts @@ -0,0 +1,230 @@ +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_KEY_MESSAGE, + COLOR_SUCCESS, + Logger, + LoggerLevel, +} from '@flxblio/sfp-logger'; + +import { Duration } from '@salesforce/kit'; +import DeploymentExecutor, { DeploySourceResult } from './DeploymentExecutor'; +import { + ComponentSet, + DeployMessage, + DeployResult, + MetadataApiDeployOptions, + RequestStatus, +} from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import path from 'path'; +import SFPOrg from '../org/SFPOrg'; +import getFormattedTime from '../utils/GetFormattedTime'; +import { TestLevel } from '../apextest/TestOptions'; +import { SfProject } from '@salesforce/core'; +import { SourceTracking } from '@salesforce/source-tracking'; + +export default class DeploySourceToOrgImpl implements DeploymentExecutor { + public constructor( + private org: SFPOrg, + private projectDir: string, + private componentSet: ComponentSet, + private deploymentOptions: DeploymentOptions, + private logger?: Logger + ) {} + + public async exec(): Promise { + let deploySourceResult = {} as DeploySourceResult; + + if (this.deploymentOptions.apiVersion) this.componentSet.sourceApiVersion = this.deploymentOptions.apiVersion; + + //Get Deploy ID + let result = await this.deploy(this.componentSet); + + this.writeResultToReport(result); + + if (this.deploymentOptions.sourceTracking) { + await this.handleSourceTracking(this.org, this.logger, this.projectDir, result); + } + + //Handle Responses + if (result.response.status == RequestStatus.Succeeded) { + deploySourceResult.message = `Successfully deployed`; + deploySourceResult.result = result.response.success; + deploySourceResult.deploy_id = result.response.id; + } else { + if (result.response.status == RequestStatus.Canceled) { + deploySourceResult.message = `The deployment request ${result.response.id} was cancelled by ${result.response.canceledByName}`; + } else { + deploySourceResult.message = this.handlErrorMesasge(result); + } + deploySourceResult.response = result.response; + deploySourceResult.result = false; + deploySourceResult.deploy_id = result.response.id; + } + return deploySourceResult; + } + + private handlErrorMesasge(result: DeployResult): string { + if (result.response.numberComponentErrors == 0) { + return 'Unable to fetch report, Check your org for details'; + } else if (result.response.numberComponentErrors > 0) { + return this.constructComponentErrorMessage(result.response.details.componentFailures, this.logger); + } else if (result.response.details.runTestResult) { + return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; + } else { + return 'Unable to fetch report, Check your org for details'; + } + } + + private constructComponentErrorMessage(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { + let errorMessage = `Unable to deploy due to failure in some components, check log for details`; + + if (componentFailures === null || componentFailures === undefined) return; + + if (componentFailures instanceof Array) { + //Search for other scenarios and if background Job is being executed, override the error message + for (let failure of componentFailures) { + let scenario = classifyErrorScenarios(failure); + if (scenario == `BackgroundJob`) { + errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; + break; + } + } + } else { + let failure = componentFailures; + let scenario = classifyErrorScenarios(failure); + if (scenario == `BackgroundJob`) { + errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; + } + } + + function classifyErrorScenarios(failure: DeployMessage) { + let scenario = `Component Error`; + //Override if background job is being executed + if (failure.problem.includes(`background job is being executed`)) { + scenario = `BackgroundJob`; + } + return scenario; + } + return errorMessage; + } + + private writeResultToReport(result: DeployResult) { + let deploymentReports = `.sfp/mdapiDeployReports`; + fs.mkdirpSync(deploymentReports); + fs.writeFileSync( + path.join(deploymentReports, `${result.response.id}.json`), + JSON.stringify(this.formatResultAsJSON(result)) + ); + } + + private async buildDeploymentOptions(org: SFPOrg): Promise { + let metdataDeployOptions: MetadataApiDeployOptions = { + usernameOrConnection: org.getConnection(), + apiOptions: {}, + }; + + if (this.deploymentOptions.apiVersion) metdataDeployOptions.apiVersion = this.deploymentOptions.apiVersion; + + if (this.deploymentOptions.testLevel == TestLevel.RunLocalTests) { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunLocalTests; + } else if (this.deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunSpecifiedTests; + metdataDeployOptions.apiOptions.runTests = this.deploymentOptions.specifiedTests.split(`,`); + } else { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunNoTests; + } + + if (this.deploymentOptions.ignoreWarnings) { + metdataDeployOptions.apiOptions.ignoreWarnings = true; + } + + metdataDeployOptions.apiOptions.rollbackOnError = this.deploymentOptions.rollBackOnError; + + return metdataDeployOptions; + } + + private async deploy(componentSet: ComponentSet) { + let deploymentOptions = await this.buildDeploymentOptions(this.org); + const deploy = await componentSet.deploy(deploymentOptions); + + let startTime = Date.now(); + SFPLogger.log(`Deploying to ${this.org.getUsername()} with id:${deploy.id}`, LoggerLevel.INFO, this.logger); + // Attach a listener to check the deploy status on each poll + deploy.onUpdate((response) => { + const { status, numberComponentsDeployed, numberComponentsTotal } = response; + const progress = `${numberComponentsDeployed}/${numberComponentsTotal}`; + const message = `Status: ${COLOR_KEY_MESSAGE(status)} Progress: ${COLOR_KEY_MESSAGE(progress)}`; + SFPLogger.log(message, LoggerLevel.INFO, this.logger); + }); + + deploy.onFinish((response) => { + let deploymentDuration = Date.now() - startTime; + if (response.response.success) { + SFPLogger.log( + COLOR_SUCCESS( + `Succesfully Deployed ${COLOR_HEADER( + response.response.numberComponentsDeployed + )} components in ${getFormattedTime(deploymentDuration)}` + ), + LoggerLevel.INFO, + this.logger + ); + } else + SFPLogger.log( + COLOR_ERROR(`Failed to deploy after ${getFormattedTime(deploymentDuration)}`), + LoggerLevel.INFO, + this.logger + ); + }); + + // Wait for polling to finish and get the DeployResult object + const hoursInWaitTime = Number(this.deploymentOptions.waitTime) / 60; + const result = await deploy.pollStatus({ frequency: Duration.seconds(30), timeout: Duration.hours(hoursInWaitTime) }); + return result; + } + + //For compatibility with cli output + private formatResultAsJSON(result) { + const response = result?.response ? result.response : {}; + return { + result: { + ...response, + details: { + componentSuccesses: response?.details?.componentSuccesses, + componentFailures: response?.details?.componentFailures, + runTestResult: response?.details?.runTestResult, + }, + }, + }; + } + + private async handleSourceTracking(org: SFPOrg, logger: Logger, projectDir: string, result: DeployResult) { + if (result.response.success) { + try { + const project = await SfProject.resolve(this.projectDir); + const tracking = await SourceTracking.create({ + org: org, + project: project, + }); + await tracking.ensureRemoteTracking(); + tracking.updateTrackingFromDeploy(result); + } catch (error) { + SFPLogger.log(`Unable to update source tracking due to \n ${error}`, LoggerLevel.WARN, logger); + } + } + } +} + +export class DeploymentOptions { + ignoreWarnings: boolean; + waitTime: string; + checkOnly?: boolean; + apiVersion?: string; + testLevel?: TestLevel; + apexTestSuite?: string; + specifiedTests?: string; + sourceTracking?: boolean; + rollBackOnError?: boolean; +} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts new file mode 100644 index 000000000..1e1165abf --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts @@ -0,0 +1,17 @@ +import { MetadataApiDeployStatus } from "@salesforce/source-deploy-retrieve"; + +export default interface DeploymentExecutor { + exec(): Promise; +} + +export interface DeploySourceResult { + deploy_id: string; + result: boolean; + message: string; + response?:MetadataApiDeployStatus +} + +export enum DeploymentType { + SOURCE_PUSH, + MDAPI_DEPLOY, +} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts new file mode 100644 index 000000000..2f8c0b0f6 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts @@ -0,0 +1,64 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Connection } from '@salesforce/core'; +import { IpRange, SecuritySettings } from 'jsforce/lib/api/metadata'; + +export default class DeploymentSettingsService { + constructor(private conn: Connection) {} + + //Enable Synchronus Compile on Deploy + public async enableSynchronousCompileOnDeploy(logger: Logger) { + try { + let apexSettingMetadata = { fullName: 'ApexSettings', enableCompileOnDeploy: true }; + let result = await this.conn.metadata.upsert('ApexSettings', apexSettingMetadata); + if (result.success) { + SFPLogger.log( + `${COLOR_KEY_MESSAGE( + 'Enabled Synchronous Compile on Org succesfully as this is the last package in queue' + )}`, + LoggerLevel.INFO, + logger + ); + } + } catch (error) { + SFPLogger.log( + `Skipping Synchronous Compile on Org succesfully due to ${error}..`, + LoggerLevel.INFO, + logger + ); + } + } + + public async relaxAllIPRanges(logger: Logger, ipRangesAsStringArray?: string[]) { + let ipRanges: IpRange[] = []; + if (!ipRangesAsStringArray) { + ipRanges = this.getFullRange(); + } else { + ipRanges = []; + //transform to ipRange Array + for (const ipRange of ipRangesAsStringArray) { + ipRanges.push({ start: ipRange, end: ipRange }); + } + } + let securitySettingsMetadata: SecuritySettings = { + fullName: 'SecuritySettings', + networkAccess: { ipRanges: ipRanges }, + }; + try { + let result = await this.conn.metadata.upsert('SecuritySettings', securitySettingsMetadata); + if (result.success) { + SFPLogger.log(`${COLOR_KEY_MESSAGE('Relaxed all ipRanges in the org')}`, LoggerLevel.INFO, logger); + } + } catch (error) { + SFPLogger.log(`Unable to relax IP range in org due to ${error.message}`, LoggerLevel.ERROR, logger); + throw error; + } + } + + private getFullRange(): IpRange[] { + let ipRanges = []; + for (let i = 0; i < 255; i += 2) { + ipRanges.push({ start: `${i}.0.0.0`, end: `${i + 1}.255.255.255` }); + } + return ipRanges; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts new file mode 100644 index 000000000..09c6e54ca --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts @@ -0,0 +1,31 @@ +const Table = require('cli-table'); +import DependencyViolation from '../dependency/DependencyViolation'; +import SFPLogger from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class DependencyViolationDisplayer { + public static printDependencyViolations(dependencyViolations: DependencyViolation[]) { + if (!dependencyViolations || dependencyViolations.length === 0) return; + + const table = new Table({ + head: ['API Name', 'Type', 'Package', 'Dependency', 'Dependency Type', 'Dependency Package', 'Problem'], + chars: ZERO_BORDER_TABLE + }); + + SFPLogger.log('The following components resulted in failures:'); + + dependencyViolations.forEach((violation) => { + table.push([ + violation.component.fullName, + violation.component.type, + violation.component.package, + violation.dependency.fullName, + violation.dependency.type, + violation.dependency.package, + violation.description, + ]); + }); + + SFPLogger.log(table.toString()); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts new file mode 100644 index 000000000..8a0ea62d3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts @@ -0,0 +1,103 @@ +const Table = require('cli-table'); +import { CodeCoverageWarnings, DeployMessage, Failures, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class DeployErrorDisplayer { + private static printMetadataFailedToDeploy(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { + if (componentFailures === null || componentFailures === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name', 'Problem Type', 'Problem'], + chars: ZERO_BORDER_TABLE + }); + + let pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.componentType, + componentFailure.fullName, + componentFailure.problemType, + componentFailure.problem, + ]; + table.push(item); + }; + + if (componentFailures instanceof Array) { + for (let failure of componentFailures) { + pushComponentFailureIntoTable(failure); + } + } else { + let failure = componentFailures; + pushComponentFailureIntoTable(failure); + } + SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, logger); + SFPLogger.log(table.toString(), LoggerLevel.ERROR, logger); + } + + public static displayErrors(response: MetadataApiDeployStatus, logger: Logger) { + SFPLogger.log(`Gathering Final Deployment Status`, null, logger); + + if (response.numberComponentErrors == 0) { + return 'Unable to fetch report, Check your org for details'; + } else if (response.numberComponentErrors > 0) { + this.printMetadataFailedToDeploy(response.details.componentFailures, logger); + return response.errorMessage; + } else if (response.details.runTestResult) { + if (response.details.runTestResult.codeCoverageWarnings) { + this.displayCodeCoverageWarnings(response.details.runTestResult.codeCoverageWarnings, logger); + } + + if (response.details.runTestResult.failures) { + this.displayTestFailures(response.details.runTestResult.failures, logger); + } + return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; + } else { + return 'Unable to fetch report, Check your org for details'; + } + } + + private static displayCodeCoverageWarnings( + codeCoverageWarnings: CodeCoverageWarnings | CodeCoverageWarnings[], + logger: Logger + ) { + let table = new Table({ + head: ['Name', 'Message'], + }); + + if (Array.isArray(codeCoverageWarnings)) { + codeCoverageWarnings.forEach((coverageWarningElement) => { + table.push([coverageWarningElement['name'], coverageWarningElement.message]); + }); + } else { + table.push([codeCoverageWarnings['name'], codeCoverageWarnings.message]); + } + + if (table.length > 1) { + SFPLogger.log( + 'Unable to deploy due to unsatisfactory code coverage, Check the following classes:', + LoggerLevel.WARN, + logger + ); + SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); + } + } + + private static displayTestFailures(testFailures: Failures | Failures[], logger: Logger) { + let table = new Table({ + head: ['Test Name', 'Method Name', 'Message'], + chars: ZERO_BORDER_TABLE + }); + + if (Array.isArray(testFailures)) { + testFailures.forEach((elem) => { + table.push([elem.name, elem.methodName, elem.message]); + }); + } else { + table.push([testFailures.name, testFailures.methodName, testFailures.message]); + } + if (table.length > 1) { + SFPLogger.log('Unable to deploy due to test failures:', LoggerLevel.WARN, logger); + SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts new file mode 100644 index 000000000..e484e0724 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts @@ -0,0 +1,51 @@ +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { TestLevel } from '../apextest/TestOptions'; +import { DeploymentOptions } from '../deployers/DeploySourceToOrgImpl'; + +export default class DeploymentOptionDisplayer { + public static printDeploymentOptions(deploymentOptions: DeploymentOptions, logger?: Logger) { + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + SFPLogger.log(`${COLOR_HEADER(`Deployment Options`)}`, LoggerLevel.INFO, logger); + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + SFPLogger.log(`TestLevel: ${COLOR_KEY_MESSAGE(deploymentOptions.testLevel)}`, LoggerLevel.INFO, logger); + if (deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) + SFPLogger.log( + `Tests to be triggered: ${COLOR_KEY_MESSAGE(deploymentOptions.specifiedTests)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log( + `Ignore Warnings: ${COLOR_KEY_MESSAGE(deploymentOptions.ignoreWarnings)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log( + `Roll Back on Error: ${COLOR_KEY_MESSAGE(deploymentOptions.rollBackOnError)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log(`API Version: ${COLOR_KEY_MESSAGE(deploymentOptions.apiVersion)}`, LoggerLevel.INFO, logger); + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts new file mode 100644 index 000000000..3227b8695 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts @@ -0,0 +1,30 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import Package2Detail from '../package/Package2Detail'; +import { ZERO_BORDER_TABLE } from './TableConstants'; +const Table = require('cli-table'); + +export default class ExternalDependencyDisplayer { + public constructor(private externalPackage2s: Package2Detail[], private logger: Logger) {} + + public display() { + if (this.externalPackage2s.length > 0) { + let table = new Table({ + head: ['Order', 'Package', 'Version', 'Subscriber Version Id'], + chars: ZERO_BORDER_TABLE + }); + let i = 0; + for (const externalPackage of this.externalPackage2s) { + table.push([ + i++, + externalPackage.name, + externalPackage.versionNumber ? externalPackage.versionNumber : 'N/A', + externalPackage.subscriberPackageVersionId ? externalPackage.subscriberPackageVersionId:'N/A, Could be part of current operation', + ]); + } + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log(COLOR_KEY_MESSAGE(`Resolved external package dependencies:`), LoggerLevel.INFO, this.logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); + } + } +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts new file mode 100644 index 000000000..d0ef5f96f --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts @@ -0,0 +1,22 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class InstalledArtifactsDisplayer { + public static printInstalledArtifacts(artifacts: any, logger: Logger) { + if (!artifacts) return; + else if(artifacts.length==0) return; + + let table = new Table({ + head: ['Artifact', 'Version', 'Commit Id'], + chars: ZERO_BORDER_TABLE + }); + + artifacts.forEach((artifact) => { + table.push([artifact.Name, artifact.Version__c, artifact.CommitId__c?artifact.CommitId__c:""]); + }); + + SFPLogger.log(COLOR_KEY_MESSAGE('Artifacts installed in org:'), LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts new file mode 100644 index 000000000..32460d356 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts @@ -0,0 +1,22 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import Package2Detail from '../package/Package2Detail'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class InstalledPackagesDisplayer { + public static printInstalledPackages(packages: Package2Detail[], logger: Logger) { + if (packages == null) return; + + let table = new Table({ + head: ['Package', 'Version', 'Type', 'isOrgDependent'], + chars: ZERO_BORDER_TABLE + }); + + packages.forEach((pkg) => { + table.push([pkg.name, pkg.versionNumber, pkg.type, pkg.isOrgDependent]); + }); + + SFPLogger.log(COLOR_KEY_MESSAGE('Packages installed in org:'), LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts b/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts new file mode 100644 index 000000000..ca2806cc4 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts @@ -0,0 +1,27 @@ +const Table = require('cli-table'); +import { LazyCollection, SourceComponent } from '@salesforce/source-deploy-retrieve'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PackageComponentPrinter { + public static printComponentTable(components: LazyCollection, logger: Logger) { + //If Manifest is null, just return + if (components === null || components === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name'], + chars: ZERO_BORDER_TABLE + }); + + let componentArray = components.toArray(); + componentArray.sort((a, b) => a.type.name.localeCompare(b.type.name)); + + for (const component of componentArray) { + let item = [component.type.name, component.fullName]; + table.push(item); + } + + SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts new file mode 100644 index 000000000..e2540aeb9 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts @@ -0,0 +1,35 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; +const Table = require('cli-table'); + +export default class PackageDependencyDisplayer { + public static printPackageDependencies( + dependencies: { package: string; versionNumber?: string }[], + projectConfig: any, + logger: Logger + ) { + if (Array.isArray(dependencies)) { + SFPLogger.log('Package Dependencies:', LoggerLevel.INFO, logger); + const table = new Table({ + head: ['Order','Package', 'Version'], + chars: ZERO_BORDER_TABLE, + style: { 'padding-left': 3 }, + }); + let order=1; + for (const dependency of dependencies) { + let versionNumber = 'N/A'; + + if (!dependency.versionNumber) + versionNumber = projectConfig.packageAliases[dependency.package] + ? projectConfig.packageAliases[dependency.package] + : 'N/A'; + else versionNumber = dependency.versionNumber; + + const row = [order,dependency.package, versionNumber]; + table.push(row); + order++; + } + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts b/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts new file mode 100644 index 000000000..7703c9cc2 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts @@ -0,0 +1,38 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PackageMetadataPrinter { + public static printMetadataToDeploy(payload: any, logger: Logger) { + //If Manifest is null, just return + if (payload === null || payload === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name'], + chars: ZERO_BORDER_TABLE + }); + + let pushTypeMembersIntoTable = (type) => { + if (type['members'] instanceof Array) { + for (let member of type['members']) { + let item = [type.name, member]; + table.push(item); + } + } else { + let item = [type.name, type.members]; + table.push(item); + } + }; + + if (payload['Package']['types'] instanceof Array) { + for (let type of payload['Package']['types']) { + pushTypeMembersIntoTable(type); + } + } else { + let type = payload['Package']['types']; + pushTypeMembersIntoTable(type); + } + SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts new file mode 100644 index 000000000..3cfc6cf16 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts @@ -0,0 +1,75 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PushErrorDisplayer { + public static printMetadataFailedToPush(error: any, packageLogger: Logger) { + if (error == null) return; + + let table; + let pushComponentFailureIntoTable; + if (error.name === 'sourceConflictDetected') { + table = new Table({ + head: ['State', 'API Name', 'Metadata Type', 'File Path'], + chars: ZERO_BORDER_TABLE + }); + + pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.state, + componentFailure.fullName, + componentFailure.type, + componentFailure.filePath, + ]; + + // Replace "undefined" values with "NA". cli-table breaks for undefined cells + item.forEach((elem, idx, item) => { + if (elem === undefined) { + item[idx] = 'NA'; + } + }); + + table.push(item); + }; + } else if (error.name === 'DeployFailed') { + table = new Table({ + head: ['Metadata Type', 'API Name', 'Problem Type', 'FilePath','Problem'], + }); + + pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.type, + componentFailure.fullName, + componentFailure.problemType, + componentFailure.error, + componentFailure.filePath, + ]; + + // Replace "undefined" values with "NA". cli-table breaks for undefined cells + item.forEach((elem, idx, item) => { + if (elem === undefined) { + item[idx] = 'NA'; + } + }); + + table.push(item); + }; + } else { + SFPLogger.log('Unknown error type. Failed to print table.', LoggerLevel.ERROR, packageLogger); + return; + } + + if (error.data instanceof Array) { + for (let componentFailure of error.data) { + pushComponentFailureIntoTable(componentFailure); + } + } else { + let failure = error.data; + pushComponentFailureIntoTable(failure); + } + + SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, packageLogger); + + SFPLogger.log(table.toString(), LoggerLevel.ERROR, packageLogger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts b/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts new file mode 100644 index 000000000..4caeefcdc --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts @@ -0,0 +1,38 @@ + +export const ZERO_BORDER_TABLE = { + top: ' ', + 'top-mid': ' ', + 'top-left': ' ', + 'top-right': ' ', + bottom: ' ', + 'bottom-mid': ' ', + 'bottom-left': ' ', + 'bottom-right': ' ', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ' ', +}; + + + +export const COLON_MIDDLE_BORDER_TABLE = { + top: '', + 'top-mid': '', + 'top-left': '', + 'top-right': '', + bottom: '', + 'bottom-mid': '', + 'bottom-left': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ':', +}; diff --git a/packages/sfpowerscripts-cli/src/core/git/Git.ts b/packages/sfpowerscripts-cli/src/core/git/Git.ts new file mode 100644 index 000000000..97089b71f --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/git/Git.ts @@ -0,0 +1,246 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import simplegit, { SimpleGit } from 'simple-git'; +import fs = require('fs-extra'); +import GitIdentity from './GitIdentity'; +const tmp = require('tmp'); + +//Git Abstraction +export default class Git { + private _git: SimpleGit; + private repositoryLocation: string; + private tempRepoLocation: any; + private _isATemporaryRepo: boolean = false; + + private constructor(private projectDir?: string, private logger?: Logger) { + if (this.projectDir) { + this._git = simplegit(this.projectDir); + this.repositoryLocation = this.projectDir; + } else { + this._git = simplegit(); + this.repositoryLocation = process.cwd(); + } + } + + async fetch() { + return this._git.fetch('origin'); + } + + async getHeadCommit(): Promise { + return this._git.revparse(['HEAD']); + } + + async show(options: string[]): Promise { + return this._git.show(options); + } + + async tag(options: string[]): Promise { + let tagResult = await this._git.tag(options); + + let temp: string[] = tagResult.split('\n'); + temp.pop(); + + return temp; + } + + async diff(options: string[]): Promise { + let diffResult = await this._git.diff(options); + + let temp: string[] = diffResult.split('\n'); + temp.pop(); + + return temp; + } + + async log(options: string[]): Promise { + let gitLogResult = await this._git.log(options); + + return gitLogResult['all'][0]['hash'].split('\n'); + } + + public async getRemoteOriginUrl(overrideOriginURL?: string): Promise { + let remoteOriginURL; + if (!overrideOriginURL) { + remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; + if (!remoteOriginURL) { + remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; + } + SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG); + } else remoteOriginURL = overrideOriginURL; + + if (!remoteOriginURL) throw new Error('Remote origin must be set in repository'); + + return remoteOriginURL; + } + + public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) { + try { + await new GitIdentity(this._git).setUsernameAndEmail(); + await this._git.add(pathToFiles); + await this._git.commit(message); + SFPLogger.log(`Committed File ${pathToFiles}`); + } catch (error) { + SFPLogger.log( + `Unable to commit file, probably due to no change or something else,Please try manually`, + LoggerLevel.ERROR + ); + throw error; + } + } + + async pushTags(tags?: string[]) { + if (!tags) await this._git.pushTags(); + else { + for (let tag of tags) { + await this._git.push('origin', tag); + } + } + } + + async deleteTags(tags?: string[]) { + if (tags) await this._git.push('origin', '--delete', tags); + } + + async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) { + try { + await new GitIdentity(this._git).setUsernameAndEmail(); + if (!commitId) { + await this._git.addAnnotatedTag(tagName, annotation); + } else { + const commands = ['tag', tagName, commitId, '-m', annotation]; + await this._git.raw(commands); + } + } catch (error) { + SFPLogger.log( + `Unable to commit file, probably due to no change or something else,Please try manually`, + LoggerLevel.ERROR + ); + throw error; + } + } + + public async isBranchExists(branch: string): Promise { + const listOfBranches = await this._git.branch(['-la']); + + return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false; + } + + static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise { + let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true }); + + SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger); + let repoDir = locationOfCopiedDirectory.name; + + // Copy source directory to temp dir + fs.copySync(process.cwd(), repoDir); + + //Initiate git on new repo on using the abstracted object + let git = new Git(repoDir, logger); + git._isATemporaryRepo = true; + git.tempRepoLocation = locationOfCopiedDirectory; + + await git.addSafeConfig(repoDir); + await git.getRemoteOriginUrl(); + await git.fetch(); + if (branch) { + await git.createBranch(branch); + } + if (commitRef) { + await git.checkout(commitRef, true); + } + + SFPLogger.log( + `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`, + LoggerLevel.INFO, + logger + ); + return git; + } + + static async initiateRepo(logger?: Logger, projectDir?: string) { + let git = new Git(projectDir, logger); + if (projectDir) await git.addSafeConfig(projectDir); + else { + await git.addSafeConfig(process.cwd()); + } + await git.getRemoteOriginUrl(); + return git; + } + + public getRepositoryPath() { + return this.repositoryLocation; + } + + async deleteTempoRepoIfAny() { + if (this.tempRepoLocation) this.tempRepoLocation.removeCallback(); + } + + async addSafeConfig(repoDir: string) { + try + { + //add workaround for safe directory (https://github.com/actions/runner/issues/2033) + await this._git.addConfig('safe.directory', repoDir, false, 'global'); + }catch(error) + { + //ignore error + SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE) + } + } + + async pushToRemote(branch: string, isForce: boolean) { + if (!branch) branch = (await this._git.branch()).current; + SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger); + if (process.env.sfp_OVERRIDE_ORIGIN_URL) { + await this._git.removeRemote('origin'); + await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL); + } + + if (isForce) { + await this._git.push('origin', branch, [`--force`]); + } else { + await this._git.push('origin', branch); + } + } + + isATemporaryRepo(): boolean { + return this._isATemporaryRepo; + } + + async getCurrentCommitId() { + return this._git.revparse(['HEAD']); + } + + async checkout(commitRef: string, isForce?: boolean) { + if (isForce) { + return this._git.checkout(commitRef, [`--force`]); + } else return this._git.checkout(commitRef, {}); + } + + async checkoutPath(commitRef: string, path: string, isForce?: boolean) { + if (isForce) { + return this._git.checkout(commitRef, [path, `--force`]); + } else return this._git.checkout(commitRef, [path]); + } + + async stageChangedFiles(path: string): Promise { + try { + await this._git.add(path); + return true; + } catch (error) { + SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger); + return false; + } + } + async createBranch(branch: string) { + if (await this.isBranchExists(branch)) { + await this._git.checkout(branch, ['-f']); + try { + // For ease-of-use when running locally and local branch exists + await this._git.merge([`refs/remotes/origin/${branch}`]); + } catch (error) { + SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger); + } + } else { + await this._git.checkout(['-b', branch]); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts b/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts new file mode 100644 index 000000000..ce904bf9b --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts @@ -0,0 +1,175 @@ +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as _ from 'lodash'; + +import { LoggerLevel } from '@salesforce/core'; +import simplegit, { SimpleGit } from 'simple-git'; +import SFPLogger, { Logger } from '@flxblio/sfp-logger'; +const SEP = /\/|\\/; + +export interface DiffFileStatus { + revisionFrom: string; + revisionTo: string; + path: string; + renamedPath?: string; +} + +export interface DiffFile { + deleted: DiffFileStatus[]; + addedEdited: DiffFileStatus[]; +} + +const git: SimpleGit = simplegit(); + +export default class GitDiffUtils { + private gitTreeRevisionTo: { + revision: string; + path: string; + }[]; + + public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise { + let fileAsString = await git.show(['--raw', diffFile.revisionFrom]); + let result = fileAsString.includes(content); + return result; + } + + public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) { + SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger); + this.gitTreeRevisionTo = []; + let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]); + const sepRegex = /\n|\r/; + let lines = revisionTree.split(sepRegex); + for (let i = 0; i < lines.length; i++) { + if (lines[i] === '') continue; + let fields = lines[i].split(/\t/); + let pathStr = fields[1]; + let revisionSha = fields[0].split(/\s/)[2]; + let fileMetadata = { + revision: revisionSha, + path: path.join('.', pathStr), + }; + this.gitTreeRevisionTo.push(fileMetadata); + } + return this.gitTreeRevisionTo; + } + + public async copyFile(filePath: string, outputFolder: string, logger: Logger) { + SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); + if (fs.existsSync(path.join(outputFolder, filePath))) { + SFPLogger.log(`File ${filePath} already in output folder. `, LoggerLevel.TRACE, logger); + return; + } + + let gitFiles: { + revision: string; + path: string; + }[] = []; + this.gitTreeRevisionTo.forEach((file) => { + if (file.path === filePath) { + gitFiles.push(file); + } + }); + + if(gitFiles.length==0) + throw new Error(`Unable to find the required file ${filePath} in Git.., Did you really commit the file?`) + + let copyOutputFolder = outputFolder; + for (let i = 0; i < gitFiles.length; i++) { + outputFolder = copyOutputFolder; + let gitFile = gitFiles[i]; + + SFPLogger.log( + `Associated file ${i}: ${gitFile.path} Revision: ${gitFile.revision}`, + LoggerLevel.TRACE, + logger + ); + + let outputPath = path.join(outputFolder, gitFile.path); + + let filePathParts = gitFile.path.split(SEP); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + // Create folder structure + for (let i = 0; i < filePathParts.length - 1; i++) { + let folder = filePathParts[i].replace('"', ''); + outputFolder = path.join(outputFolder, folder); + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + let fileContent = await git.binaryCatFile(['-p', gitFile.revision]); + fs.writeFileSync(outputPath, fileContent); + } + } + + public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) { + SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); + if (fs.existsSync(path.join(outputFolder, folderPath))) { + SFPLogger.log(`Folder ${folderPath} already in output folder. `, LoggerLevel.TRACE, logger); + return; + } + + this.gitTreeRevisionTo.forEach((file) => { + let fileToCompare = file.path; + if (fileToCompare.startsWith(folderPath)) { + this.copyFile(fileToCompare, outputFolder, logger); + } + }); + } + + public getChangedOrAdded(list1: any[], list2: any[], key: string) { + let result: any = { + addedEdited: [], + deleted: [], + }; + + //Ensure array + if (!_.isNil(list1) && !Array.isArray(list1)) { + list1 = [list1]; + } + if (!_.isNil(list2) && !Array.isArray(list2)) { + list2 = [list2]; + } + + if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) { + result.addedEdited.push(...list2); + } + + if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) { + result.deleted.push(...list1); + } + + if (!_.isNil(list1) && !_.isNil(list2)) { + list1.forEach((elem1) => { + let found = false; + for (let i = 0; i < list2.length; i++) { + let elem2 = list2[i]; + if (elem1[key] === elem2[key]) { + //check if edited + if (!_.isEqual(elem1, elem2)) { + result.addedEdited.push(elem2); + } + found = true; + break; + } + } + if (!found) { + result.deleted.push(elem1); + } + }); + + //Check for added elements + + let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) { + return element1[key] === element2[key]; + }); + + if (!_.isNil(addedElement)) { + result.addedEdited.push(...addedElement); + } + } + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts b/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts new file mode 100644 index 000000000..ecc806d82 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts @@ -0,0 +1,34 @@ +import { SimpleGit } from 'simple-git/promise'; + +export default class GitIdentity { + constructor(private git: SimpleGit) {} + + async setUsernameAndEmail(): Promise { + await this.setUsername(); + await this.setEmail(); + } + + private async setUsername(): Promise { + let username: string; + + if (process.env.sfp_GIT_USERNAME) { + username = process.env.sfp_GIT_USERNAME; + } else { + username = 'sfp'; + } + + await this.git.addConfig('user.name', username); + } + + private async setEmail(): Promise { + let email: string; + + if (process.env.sfp_GIT_EMAIL) { + email = process.env.sfp_GIT_EMAIL; + } else { + email = 'sfp@flxblio.io'; + } + + await this.git.addConfig('user.email', email); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitTags.ts b/packages/sfpowerscripts-cli/src/core/git/GitTags.ts new file mode 100644 index 000000000..846585451 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/git/GitTags.ts @@ -0,0 +1,151 @@ +import Git from './Git'; +import child_process = require('child_process'); + +export default class GitTags { + constructor(private git: Git, private sfdx_package: string) {} + + /*** + * Returns list of sorted tags, belonging to package, that are reachable from HEAD and + * follow the first parent on merge commits. + * If there are no tags, returns empty array + * @param sfdx_package + */ + async listTagsOnBranch(): Promise { + let tags: string[] = await this.git.tag([ + `-l`, + `${this.sfdx_package}_v*`, + `--sort=creatordate`, + `--merged`, + ]); + + if (tags.length > 0) return this.filterTagsAgainstBranch(tags); + else return tags; + } + + private async filterTagsAgainstBranch(tags: string[]): Promise { + // Get full-length commit ID's on the current branch, following the first parent on merge commits + let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]); + + // Get the tags' associated commit ID + // Dereference (-d) tags into object IDs + //TODO: Remove this direct usage + let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, { + maxBuffer: 5 * 1024 * 1024, + stdio: 'pipe', + cwd: this.git.getRepositoryPath() + }); + + let gitShowRefTags = gitShowRefTagsBuffer.toString(); + + let refTags: string[] = gitShowRefTags.split('\n'); + refTags.pop(); // Remove last empty element + + // Filter ref tags, only including tags that point to the branch + // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log + let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40))); + + // Only match the name of the tags pointing to the branch + refTagsPointingToBranch = refTagsPointingToBranch.map( + (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1] + ); + + // Filter the sorted tags - only including tags that point to the branch + let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag)); + + return tagsPointingToBranch; + } + + public async getVersionFromLatestTag(): Promise { + let version: string; + + let tags = await this.listTagsOnBranch(); + let latestTag = tags.pop(); + if (latestTag) { + let match: RegExpMatchArray = latestTag.match( + /^.*_v(?[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/ + ); + if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version); + else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`); + } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`); + + return version; + } + + private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { + let segments = packageVersionNumber.split('.'); + //Strip ALIGN + if (segments.length == 4 && segments[3].includes('ALIGN')) { + segments[3] = segments[3].substring(0, segments[3].indexOf('-')); + } + + if (segments.length === 4) { + packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { + if (segmentsIdx === 3) return version + '-' + segment; + else return version + '.' + segment; + }); + } + + return packageVersionNumber; + } + + + public async limitTags(limit: number): Promise{ + let rawTags = await this.listTagsOnBranch(); + + if (rawTags.length <= limit) { + return []; + } + + const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1); + return tags; + } + + + public async filteredOldTags(daysToKeep: number, limit?: number): Promise { + const currentTimestamp = Math.floor(Date.now() / 1000); + + let rawTags: string[]; + if (limit) { + rawTags = await this.limitTags(limit); + } else { + rawTags = await this.listTagsOnBranch(); + } + + if (rawTags.length < 0) { + return []; + } + + let tags: string[] = await this.getTagsWithTimestamps(rawTags); + + const filteredTags = tags + .map(tagStr => { + const [name, timestampStr] = tagStr.split(' '); + const timestamp = parseInt(timestampStr, 10); + return { name, timestamp }; + }) + .filter(tag => { + const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400; + return tag.name && daysSinceTag > daysToKeep; + }); + + return filteredTags.map(tag => tag.name); + } + + private async getTagsWithTimestamps(tags: string[]): Promise { + const timestampPromises: Promise[] = []; + + // Create an array of promises that will get the tagger date for each tag + tags.forEach((tag: string) => { + timestampPromises.push( + this.git.log(['--format=%at', `refs/tags/${tag}`]) + .then((output: string[]) => parseInt(output[0].trim(), 10)) + ); + }); + + // Wait for all promises to resolve and format the output + const timestamps: number[] = await Promise.all(timestampPromises); + const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`); + return tagsWithTimestamp + } + +} diff --git a/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts b/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts new file mode 100644 index 000000000..9a48420f9 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts @@ -0,0 +1,13 @@ +import ignore, { Ignore } from 'ignore'; + +export default class IgnoreFiles { + private _ignore: Ignore; + + constructor(pattern: string) { + this._ignore = ignore().add(pattern); + } + + filter(pathnames: string[]): string[] { + return this._ignore.filter(pathnames); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts b/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts new file mode 100644 index 000000000..da4e69186 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts @@ -0,0 +1,30 @@ +import { Connection } from '@salesforce/core'; +const retry = require('async-retry'); + +export default class LimitsFetcher { + constructor(private conn: Connection) {} + + public async getApiLimits() { + const limits: { name: string; max: number; remaining: number }[] = []; + const endpoint = `${this.conn.instanceUrl}/services/data/v${this.conn.version}/limits`; + + const result = await retry( + async (bail) => { + return this.conn.request<{ + [p: string]: { Max: number; Remaining: number }; + }>(endpoint); + }, + { retries: 3, minTimeout: 2000 } + ); + + Object.keys(result).forEach((limitName) => { + limits.push({ + name: limitName, + max: result[limitName].Max, + remaining: result[limitName].Remaining, + }); + }); + + return limits; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts new file mode 100644 index 000000000..063dbbbd3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts @@ -0,0 +1,45 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +const fs = require('fs-extra'); +import { XMLParser } from 'fast-xml-parser'; +import MetadataFetcher from './MetadataFetcher'; +import { + ComponentSet, + MetadataConverter, + MetadataResolver, + ZipTreeContainer, +} from '@salesforce/source-deploy-retrieve'; +import path from 'path'; +import { makeRandomId } from '../utils/RandomId'; + +export default class CustomFieldFetcher extends MetadataFetcher { + constructor(logger: Logger) { + super(logger); + } + + public async getCustomFields(org: SFPOrg, fields: string[]) { + SFPLogger.log(`Fetching Custom Fields from Org`, LoggerLevel.INFO, this.logger); + let retriveLocation = await this.fetchPackageFromOrg(org, { + types: { name: 'CustomField', members: fields.length > 1 ? fields : fields[0] }, + }); + + const zipTree = await ZipTreeContainer.create(fs.readFileSync(retriveLocation.zipLocation)); + const zipResolver = new MetadataResolver(undefined, zipTree); + const zipComponents = zipResolver.getComponentsFromPath('.'); + let packageName = makeRandomId(6); + await new MetadataConverter().convert(zipComponents, 'source', { + type: 'directory', + outputDirectory: path.join(retriveLocation.unzippedLocation, 'source'), + packageName: packageName + }); + + //Write a force ignore file as its required for component set resolution + fs.writeFileSync(path.resolve(retriveLocation.unzippedLocation, 'source', '.forceignore'), '# .forceignore v2'); + + let sourceBackedComponents = ComponentSet.fromSource(path.resolve(retriveLocation.unzippedLocation, 'source')); + + return {components:sourceBackedComponents,location:path.join(retriveLocation.unzippedLocation, 'source',packageName)} + } + + +} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts new file mode 100644 index 000000000..ef41f6061 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts @@ -0,0 +1,71 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +import { delay } from '../utils/Delay'; +const fs = require('fs-extra'); +import AdmZip = require('adm-zip'); +import { Connection } from '@salesforce/core'; +import { RetrieveResult } from 'jsforce/lib/api/metadata'; +import { makeRandomId } from '../utils/RandomId'; + +export default class MetadataFetcher { + constructor(protected logger: Logger) {} + + + protected async fetchPackageFromOrg(org: SFPOrg, members: any) { + let connection = org.getConnection(); + const apiversion = await org.getConnection().retrieveMaxApiVersion(); + + let retrieveRequest = { + apiVersion: Number(apiversion), + }; + + retrieveRequest['singlePackage'] = true; + retrieveRequest['unpackaged'] = members; + connection.metadata.pollTimeout = 60; + let retrievedId = await connection.metadata.retrieve(retrieveRequest); + SFPLogger.log(`Fetching metadata from ${connection.getUsername()}`, LoggerLevel.DEBUG, this.logger); + + let metadata_retrieve_result = await this.checkRetrievalStatus(connection, retrievedId.id); + if (!metadata_retrieve_result.zipFile) + SFPLogger.log('Unable to find the requested metadata', LoggerLevel.ERROR, this.logger); + + let retriveLocation = `.sfp/retrieved/${retrievedId.id}`; + //Extract Security + let zipFileName = `${retriveLocation}/unpackaged_${makeRandomId(8)}.zip`; + fs.mkdirpSync(retriveLocation); + fs.writeFileSync(zipFileName, metadata_retrieve_result.zipFile, { + encoding: 'base64', + }); + this.extract(retriveLocation, zipFileName); + // fs.unlinkSync(zipFileName); + return {zipLocation:zipFileName,unzippedLocation:retriveLocation}; + } + + private async checkRetrievalStatus( + conn: Connection, + retrievedId: string, + isToBeLoggedToConsole: boolean = true + ): Promise { + let metadata_result:RetrieveResult; + + while (true) { + metadata_result = await conn.metadata.checkRetrieveStatus(retrievedId); + + if (metadata_result.done === false) { + if (isToBeLoggedToConsole) SFPLogger.log(`Polling for Retrieval Status`, LoggerLevel.INFO, this.logger); + await delay(5000); + } else { + //this.ux.logJson(metadata_result); + break; + } + } + return metadata_result; + } + + + private extract(unzippedDirectory: string, zipFile: string) { + let zip = new AdmZip(zipFile); + // Overwrite existing files + zip.extractAllTo(unzippedDirectory, true); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts new file mode 100644 index 000000000..cffbea0d6 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts @@ -0,0 +1,343 @@ +//TODO: Replace with SDR +import * as path from 'path'; +import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo'; +import FileUtils from '../utils/Fileutils'; +import * as _ from 'lodash'; +import ignore from 'ignore'; +import * as fs from 'fs-extra'; +import ProjectConfig from '../project/ProjectConfig'; +import { globSync } from 'glob'; + +const SEP = /\/|\\/; + +export default class MetadataFiles { + public static sourceOnly: boolean = false; + forceignore: any; + public constructor() { + if (fs.existsSync('.forceignore')) { + this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString()); + } else { + this.forceignore = ignore(); + } + } + static getFullApiName(fileName: string): string { + let fullName = ''; + let metadateType = MetadataInfo.getMetadataName(fileName); + let splitFilepath = fileName.split(SEP); + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); + if (isObjectChild) { + let objectName = splitFilepath[splitFilepath.length - 3]; + let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0]; + fullName = objectName.concat('.' + fieldName); + } else { + fullName = splitFilepath[splitFilepath.length - 1].split('.')[0]; + } + return fullName; + } + static getFullApiNameWithExtension(fileName: string): string { + let fullName = ''; + let metadateType = MetadataInfo.getMetadataName(fileName); + let splitFilepath = fileName.split(SEP); + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); + if (isObjectChild) { + let objectName = splitFilepath[splitFilepath.length - 3]; + let fieldName = splitFilepath[splitFilepath.length - 1]; + fullName = objectName.concat('.' + fieldName); + } else { + fullName = splitFilepath[splitFilepath.length - 1]; + } + return fullName; + } + + public static isCustomMetadata(filepath: string, name: string): boolean { + let result = true; + let splitFilepath = filepath.split(SEP); + let componentName = splitFilepath[splitFilepath.length - 1]; + componentName = componentName.substring(0, componentName.indexOf('.')); + if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) { + //Custom Field or Custom Object + result = componentName.endsWith('__c') || componentName.endsWith('__mdt'); + } + return result; + } + public static getMemberNameFromFilepath(filepath: string, name: string): string { + let member: string; + let splitFilepath = filepath.split(SEP); + let lastIndex = splitFilepath.length - 1; + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name); + let metadataDescribe: MetadataDescribe = METADATA_INFO[name]; + if (isObjectChild) { + let objectName = splitFilepath[lastIndex - 2]; + let fieldName = splitFilepath[lastIndex].split('.')[0]; + member = objectName.concat('.' + fieldName); + } else if (metadataDescribe.inFolder) { + let baseName = metadataDescribe.directoryName; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + cmpPath = cmpPath.substring(0, cmpPath.indexOf('.')); + member = cmpPath.replace(SEP, '/'); + } else { + if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) { + member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, ''); + } else { + const auraRegExp = new RegExp('aura'); + const lwcRegExp = new RegExp('lwc'); + const staticResourceRegExp = new RegExp('staticresources'); + const experienceBundleRegExp = new RegExp('experiences'); + if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) { + member = splitFilepath[lastIndex - 1]; + } else if (staticResourceRegExp.test(filepath)) { + //Return the fileName + let baseName = 'staticresources'; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + member = cmpPath.split(SEP)[0]; + let extension = path.parse(member).ext; + + member = member.replace(new RegExp(extension + '$'), ''); + } else if (experienceBundleRegExp.test(filepath)) { + //Return the fileName + let baseName = 'experiences'; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + member = cmpPath.split(SEP)[0]; + let extension = path.parse(member).ext; + + member = member.replace(new RegExp(extension + '$'), ''); + } else { + let extension = path.parse(splitFilepath[lastIndex]).ext; + member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), ''); + } + } + } + return member; + } + + public loadComponents(srcFolder: string, checkIgnore = true): void { + var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder); + let keys = Object.keys(METADATA_INFO); + if (Array.isArray(metadataFiles) && metadataFiles.length > 0) { + metadataFiles.forEach((metadataFile) => { + let found = false; + + for (let i = 0; i < keys.length; i++) { + let match = false; + if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) { + match = true; + } else if ( + METADATA_INFO[keys[i]].inFolder && + metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension) + ) { + match = true; + } + if (match) { + if (_.isNil(METADATA_INFO[keys[i]].files)) { + METADATA_INFO[keys[i]].files = []; + METADATA_INFO[keys[i]].components = []; + } + if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { + METADATA_INFO[keys[i]].files.push(metadataFile); + + let name = FileUtils.getFileNameWithoutExtension( + metadataFile, + METADATA_INFO[keys[i]].sourceExtension + ); + + if (METADATA_INFO[keys[i]].isChildComponent) { + let fileParts = metadataFile.split(SEP); + let parentName = fileParts[fileParts.length - 3]; + name = parentName + '.' + name; + } + + METADATA_INFO[keys[i]].components.push(name); + } + found = true; + break; + } + } + + if (!found) { + const auraRegExp = new RegExp('aura'); + if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) { + if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) { + METADATA_INFO.AuraDefinitionBundle.files = []; + METADATA_INFO.AuraDefinitionBundle.components = []; + } + if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { + METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile); + + let name = FileUtils.getFileNameWithoutExtension(metadataFile); + METADATA_INFO.AuraDefinitionBundle.components.push(name); + } + } + } + }); + } else { + keys.forEach((key) => { + if (_.isNil(METADATA_INFO[key].files)) { + METADATA_INFO[key].files = []; + METADATA_INFO[key].components = []; + } + }); + } + } + //Check if a component is accepted by forceignore. + public accepts(filePath: string) { + return !this.forceignore.ignores(path.relative(process.cwd(), filePath)); + } + + public async isInModuleFolder(filePath: string) { + const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path); + if (!packageDirectories || packageDirectories.length == 0) { + return false; + } + const moduleFolder = packageDirectories.find((packageFolder) => { + let packageFolderNormalized = path.relative('', packageFolder); + return filePath.startsWith(packageFolderNormalized); + }); + return moduleFolder !== undefined; + } + + /** + * Copy a file to an outpu directory. If the filePath is a Metadata file Path, + * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls. + * Enforcing the .forceignore to ignire file ignored in the project. + * @param filePath + * @param outputFolder + */ + public static copyFile(filePath: string, outputFolder: string) { + console.log(`Copying file ${filePath} from file system to ${outputFolder}`); + const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json']; + const pairStatResources = METADATA_INFO.StaticResource.directoryName; + const pairStatResourcesRegExp = new RegExp(pairStatResources); + const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName); + + let copyOutputFolder = outputFolder; + + if (!fs.existsSync(filePath)) { + return; + } + + let exists = fs.existsSync(path.join(outputFolder, filePath)); + if (exists) { + return; + } + + if (filePath.startsWith('.')) { + let parts = path.parse(filePath); + if (parts.dir === '') { + fs.copyFileSync(filePath, path.join(outputFolder, filePath)); + return; + } + } + + let fileName = path.parse(filePath).base; + //exclude lwc ignored files + if (LWC_IGNORE_FILES.includes(fileName)) { + return; + } + + let filePathParts = filePath.split(SEP); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + // Create folder structure + for (let i = 0; i < filePathParts.length - 1; i++) { + let folder = filePathParts[i].replace('"', ''); + outputFolder = path.join(outputFolder, folder); + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + + // Copy all file with same base name + let associatedFilePattern = ''; + if (SOURCE_EXTENSION_REGEX.test(filePath)) { + associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*'); + } else { + let extension = path.parse(filePath).ext; + associatedFilePattern = filePath.replace(extension, '.*'); + } + let files = globSync(associatedFilePattern); + for (let i = 0; i < files.length; i++) { + if (fs.lstatSync(files[i]).isDirectory() == false) { + let oneFilePath = path.join('.', files[i]); + let oneFilePathParts = oneFilePath.split(SEP); + fileName = oneFilePathParts[oneFilePathParts.length - 1]; + let outputPath = path.join(outputFolder, fileName); + fs.copyFileSync(files[i], outputPath); + } + } + + // Hadle ObjectTranslations + // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied + if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) { + let parentFolder = filePathParts[filePathParts.length - 2]; + let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension; + let outputPath = path.join(outputFolder, objectTranslation); + let sourceFile = filePath.replace(fileName, objectTranslation); + if (fs.existsSync(sourceFile) == true) { + fs.copyFileSync(sourceFile, outputPath); + } + } + + //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED + if (pairStatResourcesRegExp.test(filePath)) { + outputFolder = path.join('.', copyOutputFolder); + let srcFolder = '.'; + let staticRecourceRoot = ''; + let resourceFile = ''; + for (let i = 0; i < filePathParts.length; i++) { + outputFolder = path.join(outputFolder, filePathParts[i]); + srcFolder = path.join(srcFolder, filePathParts[i]); + if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) { + let fileOrDirname = filePathParts[i + 1]; + let fileOrDirnameParts = fileOrDirname.split('.'); + srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); + outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); + resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension; + METADATA_INFO.StaticResource.sourceExtension; + staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension; + if (fs.existsSync(srcFolder)) { + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + break; + } + } + if (fs.existsSync(srcFolder)) { + FileUtils.copyRecursiveSync(srcFolder, outputFolder); + } + if (fs.existsSync(resourceFile)) { + fs.copyFileSync(resourceFile, staticRecourceRoot); + } + } + //FOR AURA components and LWC components + if (pairAuaraRegExp.test(filePath)) { + outputFolder = path.join('.', copyOutputFolder); + let srcFolder = '.'; + for (let i = 0; i < filePathParts.length; i++) { + outputFolder = path.join(outputFolder, filePathParts[i]); + srcFolder = path.join(srcFolder, filePathParts[i]); + if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') { + let fileOrDirname = filePathParts[i + 1]; + let fileOrDirnameParts = fileOrDirname.split('.'); + srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); + outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); + + if (fs.existsSync(srcFolder)) { + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + break; + } + } + if (fs.existsSync(srcFolder)) { + FileUtils.copyRecursiveSync(srcFolder, outputFolder); + } + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts new file mode 100644 index 000000000..b3a888cce --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts @@ -0,0 +1,214 @@ +//TODO: Replace with SDR +import * as _ from 'lodash'; +import * as path from 'path'; +import * as fs from 'fs-extra'; + +export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/; +const SPLITED_TYPES = { + CustomField: { + suffix: 'field', + folder: 'fields', + }, + BusinessProcess: { + suffix: 'businessProcess', + folder: 'businessProcesses', + }, + CompactLayout: { + suffix: 'compactLayout', + folder: 'compactLayouts', + }, + FieldSet: { + suffix: 'fieldSet', + folder: 'fieldSets', + }, + RecordType: { + suffix: 'recordType', + folder: 'recordTypes', + }, + ListView: { + suffix: 'listView', + folder: 'listViews', + }, + SharingReason: { + suffix: 'sharingReason', + folder: 'sharingReasons', + }, + ValidationRule: { + suffix: 'validationRule', + folder: 'validationRules', + }, + WebLink: { + suffix: 'webLink', + folder: 'webLinks', + }, +}; + +export interface MetadataDescribe { + directoryName?: string; + inFolder?: boolean; + metaFile?: boolean; + suffix?: string; + xmlName?: string; + sourceExtension?: string; + childXmlNames?: string[]; + folderExtension?: string; + files?: string[]; + components?: string[]; + isChildComponent?: boolean; +} + +export interface MetadataInfo { + CustomApplication?: MetadataDescribe; + ApexClass?: MetadataDescribe; + ApexPage?: MetadataDescribe; + CustomField?: MetadataDescribe; + CustomObject?: MetadataDescribe; + CustomPermission?: MetadataDescribe; + ExternalDataSource?: MetadataDescribe; + ExperienceBundle?: MetadataDescribe; + Flow?: MetadataDescribe; + RecordType?: MetadataDescribe; + ListView?: MetadataDescribe; + WebLink?: MetadataDescribe; + ValidationRule?: MetadataDescribe; + CompactLayout?: MetadataDescribe; + BujsinessProcess?: MetadataDescribe; + CustomTab?: MetadataDescribe; + Layout?: MetadataDescribe; + Profile?: MetadataDescribe; + Translations?: MetadataDescribe; + CustomLabel?: MetadataDescribe; + CustomLabels?: MetadataDescribe; + GlobalValueSet?: MetadataDescribe; + CustomMetadata?: MetadataDescribe; + Document?: MetadataDescribe; + Queue?: MetadataDescribe; + Group?: MetadataDescribe; + Role?: MetadataDescribe; + Report?: MetadataDescribe; + Dashboard?: MetadataDescribe; + EmailTemplate?: MetadataDescribe; + CustomSite?: MetadataDescribe; + PermissionSet?: MetadataDescribe; + StaticResource?: MetadataDescribe; + CustomObjectTranslation?: MetadataDescribe; + AuraDefinitionBundle?: MetadataDescribe; + Workflow?: MetadataDescribe; + SharingRules?: MetadataDescribe; + LightningComponentBundle?: MetadataDescribe; +} + +export class MetadataInfo { + static loadMetadataInfo(): MetadataInfo { + let metadataInfo: MetadataInfo = {}; + let resourcePath = path.join(__dirname, '..', '..', '..', 'resources', 'metadatainfo.json'); + const fileData = fs.readFileSync(resourcePath, 'utf8'); + let metadataInfoJSON = JSON.parse(fileData); + metadataInfoJSON.metadataObjects.forEach((metadata) => { + let metadataDescribe = metadata as MetadataDescribe; + if (_.isNil(metadata.suffix)) { + if (metadata.xmlName === 'AuraDefinitionBundle') { + metadata.suffix = 'cmp'; + metadataDescribe.suffix = 'cmp'; + } else if (metadata.xmlName == 'LightningComponentBundle') { + metadata.suffix = 'js'; + metadataDescribe.suffix = 'js'; + } + } + metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`; + if (metadata.inFolder) { + let folderExtensionPrefix = metadata.suffix; + if (_.isNil(metadata.suffix)) { + folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1); + } + metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`; + } + + //Generate Describe of cheildItems if exists + if (!_.isNil(metadata.childXmlNames)) { + metadata.childXmlNames.forEach((element) => { + let splitedElement = SPLITED_TYPES[element]; + if (!_.isNil(splitedElement)) { + let childDescribe: MetadataDescribe = {}; + childDescribe.directoryName = SPLITED_TYPES[element].folder; + childDescribe.suffix = SPLITED_TYPES[element].suffix; + childDescribe.xmlName = element; + childDescribe.inFolder = false; + childDescribe.metaFile = false; + childDescribe.isChildComponent = true; + childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`; + metadataInfo[childDescribe.xmlName] = childDescribe; + } + }); + } + metadataInfo[metadataDescribe.xmlName] = metadataDescribe; + }); + return metadataInfo; + } + + static getMetadataName(metadataFile: string, validateSourceExtension = true): string { + let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX); + let extension = ''; + if (matcher) { + extension = matcher[0]; + } else { + extension = path.parse(metadataFile).ext; + } + //SfPowerKit.ux.log(extension); + let metadataName = ''; + + const auraRegExp = new RegExp('aura'); + const lwcRegExp = new RegExp('lwc'); + const staticResourceRegExp = new RegExp('staticresources'); + const experienceBundleRegExp = new RegExp('experiences'); + const documentRegExp = new RegExp('documents'); + if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) { + metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName; + } else if ( + lwcRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.LightningComponentBundle.xmlName; + } else if ( + staticResourceRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.StaticResource.xmlName; + } else if ( + experienceBundleRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.ExperienceBundle.xmlName; + } else if ( + documentRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.Document.xmlName; + } else { + let keys = Object.keys(METADATA_INFO); + for (let i = 0; i < keys.length; i++) { + let metaDescribe = METADATA_INFO[keys[i]]; + if ( + metaDescribe.sourceExtension === extension || + ('.' + metaDescribe.suffix === extension && !validateSourceExtension) || + metaDescribe.folderExtension === extension + ) { + metadataName = metaDescribe.xmlName; + break; + } + } + } + return metadataName; + } +} + +export const METADATA_INFO = MetadataInfo.loadMetadataInfo(); +export const UNSPLITED_METADATA = [ + METADATA_INFO.Workflow, + METADATA_INFO.SharingRules, + METADATA_INFO.CustomLabels, + METADATA_INFO.Profile, + METADATA_INFO.PermissionSet, +]; + +export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet]; diff --git a/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts new file mode 100644 index 000000000..971717dbe --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts @@ -0,0 +1,22 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +const fs = require('fs-extra'); +import { XMLParser } from 'fast-xml-parser'; +import MetadataFetcher from './MetadataFetcher'; + +export default class SettingsFetcher extends MetadataFetcher { + constructor(logger: Logger) { + super(logger); + } + + public async getSetttingMetadata(org: SFPOrg, setting: string) { + SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger); + let retriveLocation = (await this.fetchPackageFromOrg(org, { + types: { name: 'Settings', members: setting }, + })).unzippedLocation; + let resultFile = `${retriveLocation}/settings/${setting}.settings`; + const parser = new XMLParser(); + let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`]; + return parsedSettings; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts new file mode 100644 index 000000000..7ded33399 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts @@ -0,0 +1,120 @@ +import extractDomainFromUrl from '../utils/extractDomainFromUrl'; +import { convertAliasToUsername } from '../utils/AliasList'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import ScratchOrgInfoFetcher from './ScratchOrgInfoFetcher'; +import OrganizationFetcher from './OrganizationFetcher'; +import { AuthInfo, Connection, Org, trimTo15 } from '@salesforce/core'; + +export default class OrgDetailsFetcher { + private static usernamesToOrgDetails: { [P: string]: OrgDetails } = {}; + + constructor(private username: string) {} + + public async getOrgDetails(): Promise { + //Convert alias to username + this.username = await convertAliasToUsername(this.username); + + if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) + return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; + + const authInfo = await AuthInfo.create({ username: this.username }); + + let authInfoFields = authInfo.getFields(); + + + let sfdxAuthUrl: string; + try { + sfdxAuthUrl = authInfo.getSfdxAuthUrl(); + } catch (error) { + SFPLogger.log(`Unable to get SFDX Auth URL: ${error.message}`, LoggerLevel.TRACE, null); + } + + const isScratchOrg = authInfoFields.devHubUsername; + let scratchOrgInfo = isScratchOrg + ? await this.getScratchOrgDetails(authInfoFields.orgId, authInfo) + : ({} as ScratchOrgDetails); + + const organization = await this.getOrganization(authInfo); + + OrgDetailsFetcher.usernamesToOrgDetails[this.username] = { + sfdxAuthUrl: sfdxAuthUrl, + instanceUrl: authInfoFields.instanceUrl, + ...authInfoFields, + ...scratchOrgInfo, + ...organization, + }; + + return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; + } + + public async getOrgDomainUrl(): Promise { + await this.getOrgDetails(); + + if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) { + let domain = extractDomainFromUrl(OrgDetailsFetcher.usernamesToOrgDetails[this.username].instanceUrl); + if (domain) return domain; + else return ''; + } else { + return ''; + } + } + + private async getScratchOrgDetails(orgId: string, authInfo: AuthInfo): Promise { + const hubOrg: Org = await ( + await Org.create({ + connection: await Connection.create({ + authInfo: authInfo, + }), + }) + ).getDevHubOrg(); + + let scratchOrgInfo = ( + await new ScratchOrgInfoFetcher(hubOrg).getScratchOrgInfoByOrgId([trimTo15(orgId)]) + )[0]; + + if (scratchOrgInfo) { + return { + isScratchOrg:true, + status: scratchOrgInfo.Status, + }; + } else { + throw new Error( + `No information for scratch org with ID ${trimTo15( + orgId + )} found in Dev Hub ${hubOrg.getUsername()}` + ); + } + } + + private async getOrganization(authInfo: AuthInfo) { + const connection = await Connection.create({ + authInfo: authInfo, + }); + + const results = await new OrganizationFetcher(connection).fetch(); + + if (results[0]) { + return { + isSandbox: results[0].IsSandbox, + organizationType: results[0].OrganizationType, + }; + } else { + throw new Error(`No Organization records found for ${connection.getUsername()}`); + } + } +} + +export interface OrgDetails extends ScratchOrgDetails, Organization { + sfdxAuthUrl: string; + instanceUrl:string; +} + +export interface ScratchOrgDetails { + isScratchOrg:boolean; + status: string; +} + +export interface Organization { + isSandbox: boolean; + organizationType: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts new file mode 100644 index 000000000..b453b9851 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts @@ -0,0 +1,12 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class OrganizationFetcher { + constructor(private conn: Connection) {} + + public fetch() { + const query = 'SELECT OrganizationType, IsSandbox FROM Organization LIMIT 1'; + + return QueryHelper.query<{ OrganizationType: string; IsSandbox: boolean }>(query, this.conn, false); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts b/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts new file mode 100644 index 000000000..d1fc38c18 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts @@ -0,0 +1,271 @@ +import { Org } from '@salesforce/core'; +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2Detail from '../package/Package2Detail'; +import SfpPackage from '../package/SfpPackage'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { convertUsernameToAlias } from '../utils/AliasList'; +import ObjectCRUDHelper from '../utils/ObjectCRUDHelper'; +import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor'; + +export default class SFPOrg extends Org { + /** + * Get list of all artifacts in an org + */ + public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) { + let records=[] + try { + records = await QueryHelper.query( + `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`, + this.getConnection(), + false + ); + return records; + } catch (error) { + SFPLogger.log( + 'Unable to fetch any sfp artifacts in the org\n' + + '1. sfp package is not installed in the org\n' + + '2. The required prerequisite object is not deployed to this org\n', + LoggerLevel.WARN, + logger + ); + } + return records; + } + /** + * Check whether an artifact is installed in a Org + * @param {Logger} logger + * @param {SfpPackage} sfpPackage + */ + public async isArtifactInstalledInOrg( + logger: Logger, + sfpPackage: SfpPackage + ): Promise<{ isInstalled: boolean; versionNumber?: string }> { + let result: { isInstalled: boolean; versionNumber?: string } = { + isInstalled: false, + }; + try { + SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger); + result.isInstalled = false; + let installedArtifacts = await this.getInstalledArtifacts(); + let packageName = sfpPackage.packageName; + for (const artifact of installedArtifacts) { + if (artifact.Name === packageName) { + result.versionNumber = artifact.Version__c; + if (artifact.Version__c === sfpPackage.package_version_number) { + result.isInstalled = true; + return result; + } + } + } + } catch (error) { + SFPLogger.log( + 'Unable to fetch any sfp artifacts in the org\n' + + '1. sfp package is not installed in the org\n' + + '2. The required prerequisite object is not deployed to this org\n', + LoggerLevel.WARN, + logger + ); + } + return result; + } + /** + * Updates or Create information about an artifact in the org + * @param {Logger} logger + * @param {SfpPackage} sfpPackage + */ + public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise { + let artifactId = await this.getArtifactRecordId(sfpPackage); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Existing artifact record id for ${sfpPackage.packageName} in Org for ${ + sfpPackage.package_version_number + }: ${artifactId ? artifactId : 'N/A'}` + ), + LoggerLevel.INFO, + logger + ); + + let packageName = sfpPackage.package_name; + + if (artifactId == null) { + artifactId = await ObjectCRUDHelper.createRecord( + this.getConnection(), + 'sfpArtifact2__c', + { + Name: packageName, + Tag__c: sfpPackage.tag, + Version__c: sfpPackage.package_version_number, + CommitId__c: sfpPackage.sourceVersion, + } + ); + } else { + artifactId = await ObjectCRUDHelper.updateRecord( + this.getConnection(), + 'sfpArtifact2__c', + { + Id: artifactId, + Name: packageName, + Tag__c: sfpPackage.tag, + Version__c: sfpPackage.package_version_number, + CommitId__c: sfpPackage.sourceVersion, + } + ); + } + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${ + artifactId ? artifactId : '' + }` + ), + LoggerLevel.INFO, + logger + ); + return artifactId; + } + + private async getArtifactRecordId(sfpPackage: SfpPackage): Promise { + let installedArtifacts = await this.getInstalledArtifacts(); + + let packageName = sfpPackage.packageName; + for (const artifact of installedArtifacts) { + if (artifact.Name === packageName) { + return artifact.Id; + } + } + return null; + } + /** + * Retrieves all packages(recognized by Salesforce) installed in the org + */ + public async getAllInstalled2GPPackages(): Promise { + const installedPackages: Package2Detail[] = []; + + let records = await InstalledPackagesQueryExecutor.exec(this.getConnection()); + + records.forEach((record) => { + let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`; + + let packageDetails: Package2Detail = { + name: record.SubscriberPackage.Name, + package2Id: record.SubscriberPackageId, + namespacePrefix: record.SubscriberPackage.NamespacePrefix, + subscriberPackageVersionId: record.SubscriberPackageVersion.Id, + versionNumber: packageVersionNumber, + type: record.SubscriberPackageVersion.Package2ContainerOptions, + isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent, + }; + + installedPackages.push(packageDetails); + }); + + return installedPackages; + } + + /** + * Retrives all managed packages in the org + */ + public async getAllInstalledManagedPackages(): Promise { + const installedPackages = await this.getAllInstalled2GPPackages(); + return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed'); + } + /** + * List all the packages created in DevHub, will throw an error, if its not a DevHub + */ + public async listAllPackages() { + if (await this.determineIfDevHubOrg(true)) { + let records = await QueryHelper.query(packageQuery, this.getConnection(), true); + records.forEach((record) => { + record.IsOrgDependent = + record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No'; + }); + + return records; + } else throw new Error('Package Type Information can only be fetched from a DevHub'); + } + + public async getAlias(): Promise { + return await convertUsernameToAlias(this.getUsername()); + } + + /** + * Return all artifacts including sfp as well as external unlocked/managed + */ + public async getAllInstalledArtifacts():Promise { + let artifacts = await this.getInstalledArtifacts(`Name`); + let installedArtifacts: InstalledArtifact[]=[]; + let installed2GPPackages = await this.getAllInstalled2GPPackages(); + + artifacts.forEach((artifact) => { + let installedArtifact: InstalledArtifact = { + name: artifact.Name, + version: artifact.Version__c, + commitId:artifact.CommitId__c, + isInstalledBysfp: true, + }; + let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name); + if (packageFound) { + installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId; + if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`; + else installedArtifact.type = `Unlocked`; + } else { + installedArtifact.subscriberVersion = `N/A`; + installedArtifact.type = `Source/Data`; + } + installedArtifacts.push(installedArtifact); + }); + + installed2GPPackages.forEach((installed2GPPackage) => { + let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name); + if (!packageFound) { + let installedArtifact: InstalledArtifact = { + name: installed2GPPackage.name, + version: installed2GPPackage.versionNumber, + commitId: `N/A`, + }; + if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`; + else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`; + else installedArtifact.type = `Unlocked`; + + installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId; + installedArtifact.isInstalledBysfp = false; + installedArtifacts.push(installedArtifact); + } + }); + return installedArtifacts; + } +} + +const packageQuery = + 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' + + 'FROM Package2 ' + + 'WHERE IsDeprecated != true ' + + 'ORDER BY NamespacePrefix, Name'; + + +export interface InstalledArtifact { + name: string; + version: string; + commitId?: string; + subscriberVersion?: string; + type?: string; + isInstalledBysfp?: boolean; +} + +export interface sfpArtifact2__c { + Id?: string; + Name: string; + Tag__c: string; + Version__c: string; + CommitId__c: string; +} + +export interface PackageTypeInfo { + Id: string; + Name: string; + Description: string; + NamespacePrefix: string; + ContainerOptions: string; + IsOrgDependent: boolean | string; +} diff --git a/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts new file mode 100644 index 000000000..c238af473 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts @@ -0,0 +1,30 @@ +import { Org, trimTo15 } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ScratchOrgInfoFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgInfoByOrgId(orgId: string[]) { + const conn = this.hubOrg.getConnection(); + + let collection = orgId + .map((id) => { + return `'${trimTo15(id)}'`; + }) + .toString(); + + let query = ` + SELECT Id, ScratchOrg, Status + FROM ScratchOrgInfo + WHERE ScratchOrg IN (${collection}) + `; + + return QueryHelper.query(query, conn, false); + } +} + +export interface ScratchOrgInfo { + Id: string; + ScratchOrg: string; + Status: 'New' | 'Deleted' | 'Active' | 'Error'; +} diff --git a/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts b/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts new file mode 100644 index 000000000..2d124718c --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts @@ -0,0 +1,14 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; + +export default class InstalledPackagesQueryExecutor { + static async exec(conn: Connection) { + const installedPackagesQuery = + 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' + + 'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' + + 'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' + + 'ORDER BY SubscriberPackageId'; + + return QueryHelper.query(installedPackagesQuery, conn, true); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts b/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts new file mode 100644 index 000000000..55c55deed --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts @@ -0,0 +1,10 @@ +export default interface Package2Detail { + name: string; + package2Id?: string; + namespacePrefix?: string; + subscriberPackageVersionId?: string; + versionNumber?: string; + type?: string; + isOrgDependent?: boolean; + key?: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts new file mode 100644 index 000000000..9c4833062 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts @@ -0,0 +1,143 @@ +import _ from 'lodash'; +import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; + +export type ApexClasses = Array; + +class PackageInfo { + id?: string; + package_name: string; + package_version_number?: string; + package_version_id?: string; + package_type?: string; + test_coverage?: number; + has_passed_coverage_check?: boolean; + repository_url?: string; + sourceVersion?: string; + branch?: string; + apextestsuite?: string; + isApexFound?: boolean; + assignPermSetsPreDeployment?: string[]; + assignPermSetsPostDeployment?: string[]; + apexTestClassses?: string[]; + isPickListsFound?: boolean; + isTriggerAllTests?: boolean; + isProfilesFound?: boolean; + isPermissionSetGroupFound?: boolean; + isPromoted?: boolean; + tag?: string; + isDependencyValidated?: boolean; + destructiveChanges?: any; + destructiveChangesPath?: string; + payload?: any; + metadataCount?: number; + sourceDir?: string; + dependencies?: any; + reconcileProfiles?: boolean; + isPayLoadContainTypesSupportedByProfiles?: boolean; + creation_details?: { creation_time?: number; timestamp?: number }; + deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[]; + apiVersion?: string; + postDeploymentScript?: string; + preDeploymentScript?: string; + apexClassWithOutTestClasses?: ApexClasses; + triggers?: ApexClasses; + configFilePath?: string; + packageDescriptor?: any; + commitSHAFrom?:string; + commitSHATo?:string; + packageDirectory?: string; + apexClassesSortedByTypes?: ApexSortedByType; + projectConfig?: any; + changelogFilePath?: string; +} + +export default class SfpPackage extends PackageInfo { + public projectDirectory: string; + public workingDirectory: string; + public mdapiDir: string; + public destructiveChangesPath: string; + public resolvedPackageDirectory: string; + + public version: string = '5'; + + //Just a few helpers to resolve api differene + public get packageName(): string { + return this.package_name; + } + + public get versionNumber(): string { + return this.package_version_number; + } + + public set versionNumber(versionNumber:string) + { + this.package_version_number = versionNumber; + } + + public get packageType(): string { + return this.package_type.toLocaleLowerCase(); + } + + public set packageType(packageType: string) { + this.package_type = packageType; + } + /** + * Do not use this constructor directly, use SfPPackageBuilder + * to build a package + * + */ + public constructor() { + super(); + } + + toJSON(): PackageInfo { + let castToPackageMetadata = _.cloneDeep(this); + delete castToPackageMetadata.workingDirectory; + delete castToPackageMetadata.mdapiDir; + delete castToPackageMetadata.projectConfig; + delete castToPackageMetadata.packageDescriptor; + delete castToPackageMetadata.projectDirectory; + delete castToPackageMetadata.resolvedPackageDirectory; + delete castToPackageMetadata.isTriggerAllTests; + return castToPackageMetadata; + } +} + + +export enum PackageType { + Unlocked = "unlocked", + Source = "source", + Data = "data", + Diff = "diff" +} + +export interface DiffPackageMetadata { + + + sourceVersionFrom?: string; + sourceVersionTo?: string; + isProfilesFound?: boolean; + apexTestClassses?: string[]; + isApexFound?: boolean; + isPicklistFound?: boolean; + isPermissionSetGroupFound?: boolean; + isPermissionSetFound?: boolean; + payload?: any; + metadataCount?: number; + profilesToReconcile?: number; + destructiveChanges?: any; + sourceDir?: string; + invalidatedTestClasses?: ApexClasses; + isPayLoadContainTypesSupportedByProfiles?:boolean; +} +export interface SfpPackageParams { + overridePackageTypeWith?: string; + branch?: string; + packageVersionNumber?: string; + repositoryUrl?: string; + sourceVersion?: string; + configFilePath?: string; + pathToReplacementForceIgnore?: string; + revisionFrom?: string; + revisionTo?: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts new file mode 100644 index 000000000..e394099a1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts @@ -0,0 +1,278 @@ +import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; +import ProjectConfig from '../project/ProjectConfig'; +import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator'; +import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor'; +import PackageManifest from './components/PackageManifest'; +import MetadataCount from './components/MetadataCount'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import path from 'path'; +import { Artifact } from '../artifacts/ArtifactFetcher'; +import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage'; +import PropertyFetcher from './propertyFetchers/PropertyFetcher'; +import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher'; +import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher'; +import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher'; +import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl'; +import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl'; +import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl'; +import lodash = require('lodash'); +import { EOL } from 'os'; +import PackageVersionUpdater from './version/PackageVersionUpdater'; +import { AnalyzerRegistry } from './analyser/AnalyzerRegistry'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; + +export default class SfpPackageBuilder { + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string, + params?: SfpPackageParams, + packageCreationParams?: PackageCreationParams, + projectConfig?: any + ) { + if (!projectConfig) { + projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + } else { + // Clone the projectConfig to prevent mutation + projectConfig = lodash.cloneDeep(projectConfig); + } + + let propertyFetchers: PropertyFetcher[] = [ + new AssignPermissionSetFetcher(), + new DestructiveManifestPathFetcher(), + new ReconcilePropertyFetcher(), + ]; + + let startTime = Date.now; + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.package_name = sfdx_package; + sfpPackage.projectConfig = projectConfig; + sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion; + sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig( + sfdx_package, + sfpPackage.projectConfig + ); + sfpPackage.projectDirectory = projectDirectory?projectDirectory:''; + sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; + //Set Default Version Number + sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; + + //set additional options + sfpPackage.sourceVersion = params?.sourceVersion; + sfpPackage.branch = params?.branch; + sfpPackage.repository_url = params?.repositoryUrl; + if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json'; + else sfpPackage.configFilePath = params?.configFilePath; + + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + //Get Package Type + sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package); + + sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams); + + // Requires destructiveChangesPath which is set by the property fetcher + sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory( + logger, + sfpPackage.projectDirectory, + sfpPackage.projectConfig, + sfpPackage.packageName, + sfpPackage.packageDescriptor.path, + sfpPackage.versionNumber, + sfpPackage.destructiveChangesPath, + sfpPackage.configFilePath, + params?.pathToReplacementForceIgnore + ); + + sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path); + + //Don't proceed further if packageType is Data + if (sfpPackage.package_type != PackageType.Data) { + let sourceToMdapiConvertor = new SourceToMDAPIConvertor( + sfpPackage.workingDirectory, + sfpPackage.packageDescriptor.path, + ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion, + logger + ); + sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath; + const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir); + + sfpPackage.payload = packageManifest.manifestJson; + sfpPackage.triggers = packageManifest.fetchTriggers(); + sfpPackage.isApexFound = packageManifest.isApexInPackage(); + sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); + sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); + sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); + + let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir); + sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType(); + sfpPackage.apexTestClassses = apexFetcher.getTestClasses(); + sfpPackage.metadataCount = await MetadataCount.getMetadataCount( + sfpPackage.workingDirectory, + sfpPackage.packageDescriptor.path + ); + sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces(); + + sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); + + //Load component Set + let componentSet = ComponentSet.fromSource( + path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory) + ); + + //Run through all analyzers + let analyzers = AnalyzerRegistry.getAnalyzers(); + for (const analyzer of analyzers) { + if (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger); + } + } + + //Create the actual package + let createPackage; + + if (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true }; + + let packageType = sfpPackage.package_type; + if (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase(); + + //Get Implementors + switch (packageType) { + case PackageType.Unlocked: + createPackage = new CreateUnlockedPackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Source: + createPackage = new CreateSourcePackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Data: + createPackage = new CreateDataPackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Diff: + packageCreationParams.revisionFrom = params.revisionFrom; + packageCreationParams.revisionTo = params.revisionTo; + createPackage = new CreateDiffPackageImp( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + } + + return createPackage.exec(); + } + + /* + * Handle version Numbers of package + * If VersionNumber is explcitly passed, use that + * else allow autosubstitute using buildNumber for Source and Data if available + */ + private static handleVersionNumber( + params: SfpPackageParams, + sfpPackage: SfpPackage, + packageCreationParams: PackageCreationParams + ) { + if (params?.packageVersionNumber) { + sfpPackage.versionNumber = params.packageVersionNumber; + } else if (packageCreationParams?.buildNumber) { + if (sfpPackage.packageType != PackageType.Unlocked) { + let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater(); + sfpPackage.versionNumber = versionUpdater.substituteBuildNumber( + sfpPackage, + packageCreationParams.buildNumber + ); + } + } else { + sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; + } + return sfpPackage; + } + + public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise { + //Read artifact metadata + let sfpPackage = new SfpPackage(); + Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' })); + sfpPackage.sourceDir = artifact.sourceDirectoryPath; + sfpPackage.changelogFilePath = artifact.changelogFilePath; + + sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath); + sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + artifact.sourceDirectoryPath, + sfpPackage.package_name + ); + sfpPackage.projectDirectory = artifact.sourceDirectoryPath; + sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; + sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); + + return sfpPackage; + } + + + + private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) { + if ( + this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false || + (sfpPackage.packageType == PackageType.Source && + sfpPackage.isApexFound == true && + sfpPackage.apexTestClassses == null) + ) { + SFPLogger.printHeaderLine('WARNING! NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger); + SFPLogger.log( + `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` + + `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` + + `via triggering all local tests,This definitely is not optimal approach on large orgs` + + `Please consider adding test classes for the classes in the package`, + LoggerLevel.INFO, + logger + ); + SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger); + return true; + } else return false; + } + + // Allow individual packages to use non optimized path + private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { + if (pkgDescriptor['isOptimizedDeployment'] == null) return true; + else return pkgDescriptor['isOptimizedDeployment']; + } +} + +// Options while creating package +export class PackageCreationParams { + breakBuildIfEmpty: boolean = true; + devHub?: string; + installationkeybypass?: boolean; + installationkey?: string; + waitTime?: string; + isCoverageEnabled?: boolean; + isSkipValidation?: boolean; + isComputeDiffPackage?: boolean; + baseBranch?: string; + buildNumber?: string; + useSelectiveBuildOnly?: boolean; + revisionFrom?:string; + revisionTo?:string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts new file mode 100644 index 000000000..ba0e6a4d3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts @@ -0,0 +1,178 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import path = require('path'); +import lodash = require('lodash'); +import { URL } from 'url'; +import SfpPackage from './SfpPackage'; + +/** + * Methods for getting information about artifacts + */ +export default class SfpPackageInquirer { + private _latestPackageManifestFromArtifacts: any; + private _pathToLatestPackageManifestFromArtifacts: string; + private _prunedLatestPackageManifestFromArtifacts: any; + + get pathToLatestPackageManifestFromArtifacts() { + return this._pathToLatestPackageManifestFromArtifacts; + } + get prunedLatestPackageManifestFromArtifacts() { + return this._prunedLatestPackageManifestFromArtifacts; + } + + constructor(private readonly sfpPackages: SfpPackage[], private packageLogger?: Logger) {} + + public getLatestProjectConfig() { + let latestPackageManifest = this.getLatestPackageManifestFromArtifacts(this.sfpPackages); + + if (latestPackageManifest) { + this._latestPackageManifestFromArtifacts = latestPackageManifest.latestPackageManifest; + this._pathToLatestPackageManifestFromArtifacts = latestPackageManifest.pathToLatestPackageManifest; + + this._prunedLatestPackageManifestFromArtifacts = this.pruneLatestPackageManifest( + latestPackageManifest.latestPackageManifest, + this.sfpPackages + ); + } + return this._latestPackageManifestFromArtifacts; + } + + /** + * Gets latest package manifest from artifacts + * Returns null if unable to find latest package manifest + */ + private getLatestPackageManifestFromArtifacts( + sfpPackages: SfpPackage[] + ): { + latestPackageManifest: any; + pathToLatestPackageManifest: string; + } { + let latestPackageManifest: any; + let pathToLatestPackageManifest: string; + + this.validateArtifactsSourceRepository(); + + let latestSfpPackage: SfpPackage; + for (let sfpPackage of sfpPackages) { + if ( + latestSfpPackage == null || + latestSfpPackage.creation_details.timestamp < sfpPackage.creation_details.timestamp + ) { + latestSfpPackage = sfpPackage; + + let pathToPackageManifest = path.join(sfpPackage.sourceDir, 'manifests', 'sfdx-project.json.ori'); + if (fs.existsSync(pathToPackageManifest)) { + latestPackageManifest = JSON.parse(fs.readFileSync(pathToPackageManifest, 'utf8')); + + pathToLatestPackageManifest = pathToPackageManifest; + } + } + } + + if (latestPackageManifest) { + SFPLogger.log( + `Found latest package manifest in ${latestSfpPackage.packageName} artifact`, + LoggerLevel.INFO, + this.packageLogger + ); + + return { latestPackageManifest, pathToLatestPackageManifest }; + } else return null; + } + + /** + * Verify that artifacts are from the same source repository + */ + public validateArtifactsSourceRepository(): void { + let remoteURL: RemoteURL; + + for (let sfpPackage of this.sfpPackages) { + let currentRemoteURL: RemoteURL; + + let isHttp: boolean = sfpPackage.repository_url.match(/^https?:\/\//) ? true : false; + if (isHttp) { + const url = new URL(sfpPackage.repository_url); + currentRemoteURL = { + ref: url.toString(), + hostName: url.hostname, + pathName: url.pathname, + }; + } else { + // Handle SSH URL separately, as it is not supported by URL module + currentRemoteURL = { + ref: sfpPackage.repository_url, + hostName: null, + pathName: null, + }; + } + + if (remoteURL == null) { + remoteURL = currentRemoteURL; + continue; + } + + let isValid: boolean; + if (isHttp) { + if ( + currentRemoteURL.hostName === remoteURL.hostName && + currentRemoteURL.pathName === remoteURL.pathName + ) + isValid = true; + else isValid = false; + } else { + if (currentRemoteURL.ref === remoteURL.ref) isValid = true; + else isValid = false; + } + + if (!isValid) { + SFPLogger.log(`remoteURL: ${JSON.stringify(remoteURL)}`, LoggerLevel.DEBUG, this.packageLogger); + SFPLogger.log( + `currentRemoteURL: ${JSON.stringify(currentRemoteURL)}`, + LoggerLevel.DEBUG, + this.packageLogger + ); + throw new Error( + `Artifacts must originate from the same source repository, for deployment to work. The artifact ${sfpPackage.packageName} has repository URL that doesn't meet the current repository URL ${JSON.stringify(currentRemoteURL)} not equal ${JSON.stringify(remoteURL)}` + ); + } + } + } + + /** + * Remove packages that do not have an artifact from the package manifest + * @param latestPackageManifest + * @param artifacts + */ + private pruneLatestPackageManifest(latestPackageManifest: any, sfpPackages: SfpPackage[]) { + let prunedLatestPackageManifest = lodash.cloneDeep(latestPackageManifest); + + let packagesWithArtifacts: string[] = []; + sfpPackages.forEach((sfpPackage) => { + packagesWithArtifacts.push(sfpPackage.packageName); + }); + + let i = prunedLatestPackageManifest.packageDirectories.length; + while (i--) { + if (!packagesWithArtifacts.includes(prunedLatestPackageManifest.packageDirectories[i].package)) { + let removedPackageDirectory = prunedLatestPackageManifest.packageDirectories.splice(i, 1); + + // Also remove references to the package as a dependency + prunedLatestPackageManifest.packageDirectories.forEach((pkg) => { + let indexOfDependency = pkg.dependencies?.findIndex( + (dependency) => dependency.package === removedPackageDirectory[0].package + ); + + if (indexOfDependency >= 0) pkg.dependencies.splice(indexOfDependency, 1); + }); + } + } + + return prunedLatestPackageManifest; + } +} + +interface RemoteURL { + ref: string; + hostName: string; + pathName: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts new file mode 100644 index 000000000..711db5442 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts @@ -0,0 +1,63 @@ +import path from 'path'; +import { Logger } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +import InstallDataPackageImpl from './packageInstallers/InstallDataPackageImpl'; +import { SfpPackageInstallationOptions } from './packageInstallers/InstallPackage'; +import InstallSourcePackageImpl from './packageInstallers/InstallSourcePackageImpl'; +import InstallUnlockedPackage from './packageInstallers/InstallUnlockedPackage'; +import { PackageInstallationResult } from './packageInstallers/PackageInstallationResult'; +import SfpPackage, { PackageType } from './SfpPackage'; + +export default class SfpPackageInstaller { + public static async installPackage( + logger: Logger, + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + installationOptions: SfpPackageInstallationOptions, + installationContext?: SfPPackageInstallationContext, + overridePackageTypeWith?: string + ): Promise { + let packageType = sfpPackage.packageType; + if (overridePackageTypeWith) packageType = overridePackageTypeWith; + + switch (packageType) { + case PackageType.Unlocked: + let installUnlockedPackageImpl: InstallUnlockedPackage = new InstallUnlockedPackage( + sfpPackage, + targetOrg, + installationOptions, + logger + ); + installUnlockedPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installUnlockedPackageImpl.exec(); + case PackageType.Diff: + case PackageType.Source: + installationOptions.pathToReplacementForceIgnore = installationContext?.currentStage == 'prepare' + ? path.join(sfpPackage.sourceDir, 'forceignores', '.prepareignore') + : null; + let installSourcePackageImpl: InstallSourcePackageImpl = new InstallSourcePackageImpl( + sfpPackage, + targetOrg, + installationOptions, + logger + ); + installSourcePackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installSourcePackageImpl.exec(); + case PackageType.Data: + let installDataPackageImpl: InstallDataPackageImpl = new InstallDataPackageImpl( + sfpPackage, + targetOrg, + logger, + installationOptions + ); + installDataPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installDataPackageImpl.exec(); + default: + throw new Error('Unknown Package Type'); + } + } +} + +export class SfPPackageInstallationContext { + currentStage: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts new file mode 100644 index 000000000..0e4abe323 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts @@ -0,0 +1,20 @@ +import FHTAnalyser from './FHTAnalyzer'; +import FTAnalyser from './FTAnalyzer'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import PicklistAnalyzer from './PicklistAnalyzer'; + +export class AnalyzerRegistry { + static getAnalyzers(): PackageAnalyzer[] { + let packageAnalyzers: PackageAnalyzer[] = []; + + //TODO: Make dynamic + let fhtAnalyzer = new FHTAnalyser(); + let ftAnalyser = new FTAnalyser(); + let picklistAnalyzer = new PicklistAnalyzer(); + packageAnalyzers.push(fhtAnalyzer); + packageAnalyzers.push(ftAnalyser); + packageAnalyzers.push(picklistAnalyzer); + + return packageAnalyzers; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts new file mode 100644 index 000000000..3d71504e6 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts @@ -0,0 +1,76 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import * as yaml from 'js-yaml'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class FHTAnalyser implements PackageAnalyzer { + + public getName() { + return "Field History Tracking Analyzer" + } + + + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + + let fhtFields: { [key: string]: Array } = {}; + + //read the yaml + let fhtYamlPath = path.join( + sfpPackage.workingDirectory, + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + '/postDeploy/history-tracking.yml' + ); + + //read components mentioned in yaml + if (fs.existsSync(fhtYamlPath)) { + //convert yaml to json + fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; + } + + + //filter the components in the package + fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet); + + if (Object.keys(fhtFields).length>0) { + sfpPackage['isFHTFieldFound'] = true; + sfpPackage['fhtFields'] = fhtFields; + } + } catch (error) { + //Ignore error for now + SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + private async addFieldsFromComponentSet( + fhtFields: { [key: string]: Array }, + componentSet: ComponentSet + ): Promise>> { + let sourceComponents = componentSet.getSourceComponents().toArray(); + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { + continue; + } + + let customField = sourceComponent.parseXmlSync().CustomField; + if (customField['trackHistory'] == 'true') { + let objName = sourceComponent.parent.fullName; + if (!fhtFields[objName]) fhtFields[objName] = []; + fhtFields[objName].push(sourceComponent.name); + } + } + return fhtFields; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts new file mode 100644 index 000000000..911e1e356 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts @@ -0,0 +1,74 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import * as yaml from 'js-yaml'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class FTAnalyser implements PackageAnalyzer { + + public getName(): string { + return "Feed Tracking Analyzer"; + }; + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + + let ftFields: { [key: string]: Array } = {}; + + //read the yaml + let ftYamlPath = path.join( + sfpPackage.workingDirectory, + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + '/postDeploy/feed-tracking.yml' + ); + + //read components mentioned in yaml + if (fs.existsSync(ftYamlPath)) { + //convert yaml to json + ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; + } + + + //filter the components in the package + ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet); + + if (Object.keys(ftFields).length>0) { + sfpPackage['isFTFieldFound'] = true; + sfpPackage['ftFields'] = ftFields; + } + } catch (error) { + //Ignore error for now + SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + private async addFieldsFromComponentSet( + ftFields: { [key: string]: Array }, + componentSet: ComponentSet + ): Promise>> { + let sourceComponents = componentSet.getSourceComponents().toArray(); + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { + continue; + } + + let customField = sourceComponent.parseXmlSync().CustomField; + if (customField['trackFeedHistory'] == 'true') { + let objName = sourceComponent.parent.fullName; + if (!ftFields[objName]) ftFields[objName] = []; + ftFields[objName].push(sourceComponent.name); + } + } + return ftFields; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts new file mode 100644 index 000000000..3072da027 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts @@ -0,0 +1,12 @@ +import { Logger } from "@flxblio/sfp-logger"; +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import SfpPackage from "../SfpPackage"; + +export interface PackageAnalyzer +{ + getName(); + analyze(sfpPackage: SfpPackage,componentSet:ComponentSet,logger:Logger): Promise + isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise + + +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts new file mode 100644 index 000000000..35f24476c --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts @@ -0,0 +1,52 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class PicklistAnalyzer implements PackageAnalyzer { + + public getName() { + return "Picklist Analyzer" + } + + + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let components = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name == registry.types.customobject.name) { + //issues/1367 + //this can add child elements that are not custom fields.. + components.push(...sourceComponent.getChildren()); + } + + if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { + components.push(sourceComponent); + } + } + + if (components) { + for (const fieldComponent of components) { + let customField = fieldComponent.parseXmlSync().CustomField; + //issues/1367 + //if the component isn't a field customField will be undefined..so check + if (customField && customField['type'] == 'Picklist') { + sfpPackage.isPickListsFound= true; + break; + } + } + } + } catch (error) { + SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts new file mode 100644 index 000000000..5edac57a7 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts @@ -0,0 +1,129 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Connection } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import { delay } from '../../utils/Delay'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../../org/SFPOrg'; +import AdmZip from "adm-zip" +import path from 'path'; +import tmp from "tmp"; +import { XMLParser } from 'fast-xml-parser'; +import { isEmpty } from 'lodash'; + +export default class DeployDestructiveManifestToOrgImpl { + public constructor(private sfpOrg: SFPOrg, private destructiveManifestPath: string) { } + + + + + public async exec(): Promise { + //Connect to the org + const conn = this.sfpOrg.getConnection(); + const apiversion = await conn.retrieveMaxApiVersion(); + let workingDirectory = this.generateCacheDirectory(); + await this.copyAndValidateDestructiveManifest(this.destructiveManifestPath, workingDirectory); + this.generateEmptyPackageXml(workingDirectory, apiversion); + let zipFile = await this.generateDeploymentZipFile(workingDirectory); + await this.deployDestructiveManifest(zipFile, conn); + } + + private generateCacheDirectory() { + + let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); + let tempDir = tmpDirObj.name; + let destructCacheDirectory = path.join(tempDir, 'destruct'); + fs.mkdirSync(destructCacheDirectory); + return destructCacheDirectory; + } + + private async copyAndValidateDestructiveManifest(existingManifestPath: string, workingDirectory: string) { + let destructiveManifestFile = path.join(workingDirectory, 'destructiveChanges.xml'); + + //Copy Destructive Manifest File to Temporary Directory + fs.copyFileSync(existingManifestPath, destructiveManifestFile); + const parser = new XMLParser(); + let destructiveChanges = await parser.parse(fs.readFileSync(path.resolve(destructiveManifestFile))); + + if (isEmpty(destructiveChanges['Package']['types'])) { + throw new Error('Invalid Destructive Change Definition encountered, please check'); + } + + SFPLogger.log(destructiveChanges['Package']['types'], LoggerLevel.TRACE); + } + + + private generateEmptyPackageXml(workingDirectory: string, apiversion: string) { + let packageXml = ` + + + * + CustomLabel + + ${apiversion} + `; + + let packageXmlPath = path.join(workingDirectory, 'package.xml'); + fs.outputFileSync(packageXmlPath, packageXml); + + SFPLogger.log(`Empty Package.xml with ${apiversion} created at ${workingDirectory}`, LoggerLevel.DEBUG); + } + + private async generateDeploymentZipFile(workingDirectory: string) { + let zip = new AdmZip(); + zip.addLocalFolder(workingDirectory); + zip.writeZip(path.join(workingDirectory, 'package.zip')); + return path.join(workingDirectory, 'package.zip'); + } + + + + private async deployDestructiveManifest(zipFile: string, conn: Connection) { + //Deploy Package + conn.metadata.pollTimeout = 300; + + const zipStream = fs.createReadStream(zipFile); + let deployResult = await conn.metadata.deploy(zipStream, { rollbackOnError: true, singlePackage: true }); + + + SFPLogger.log( + `Deploying Destructive Changes with ID ${deployResult.id} to ${conn.getUsername()}`, + LoggerLevel.INFO + ); + let deploymentStatus = await this.checkDeploymentStatus(conn, deployResult.id); + + if (deploymentStatus.success) { + if (deploymentStatus.success) + SFPLogger.log( + `Deployed Destructive Changes in target org ${conn.getUsername()} succesfully`, + LoggerLevel.INFO + ); + } else { + let componentFailures = deploymentStatus.details.componentFailures; + let errorResult = []; + componentFailures.forEach((failure) => { + errorResult.push({ + componentType: failure.componentType, + fullName: failure.fullName, + problem: failure.problem, + }); + }); + + console + throw new Error('Unable to deploy the Destructive Changes: ' + JSON.stringify(errorResult)); + } + } + + private async checkDeploymentStatus(conn: Connection, retrievedId: string) { + + while (true) { + let result = await conn.metadata.checkDeployStatus(retrievedId, true); + + if (!result.done) { + SFPLogger.log('Polling for Deployment Status', LoggerLevel.INFO); + await delay(5000); + } else { + return result; + } + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts b/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts new file mode 100644 index 000000000..23454e15d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts @@ -0,0 +1,18 @@ +import { globSync } from 'glob'; +import path from 'path'; + +export default class MetadataCount { + public static async getMetadataCount(projectDirectory: string, sourceDirectory: string): Promise { + let metadataCount; + try { + let metadataFiles: string[] = globSync(`**/*-meta.xml`, { + cwd: projectDirectory ? path.join(projectDirectory, sourceDirectory) : sourceDirectory, + absolute: true, + }); + metadataCount = metadataFiles.length; + } catch (error) { + metadataCount = -1; + } + return metadataCount; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts b/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts new file mode 100644 index 000000000..9d0be4521 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts @@ -0,0 +1,271 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import { ApexClasses } from '../SfpPackage'; +import xml2json from '../../utils/xml2json'; +const xml2js = require('xml2js'); + +export default class PackageManifest { + private _manifestJson; + private _manifestXml: string; + + /** + * Getter for package manifest JSON + */ + get manifestJson() { + return this._manifestJson; + } + + /** + * Getter for package manifest XML + */ + get manifestXml(): string { + return this._manifestXml; + } + + private constructor() {} + + /** + * Factory method + * @param mdapiDir directory containing package.xml + * @returns instance of PackageManifest + */ + static async create(mdapiDir: string): Promise { + const packageManifest = new PackageManifest(); + + const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8'); + + packageManifest._manifestXml = packageXml; + packageManifest._manifestJson = await xml2json(packageXml); + + return packageManifest; + } + + /** + * Factory method + * @param components + * @param apiVersion + * @returns intance of PackageManifest + */ + static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest { + const packageManifest = new PackageManifest(); + + const packageJson = { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [], + version: apiVersion, + }; + + components.forEach((component) => { + const type = packageJson.types.find((type) => type.name === component.type); + if (type) { + // Add member to existing type + type.members.push(component.fullName); + } else { + // create new type + const newType = { + name: component.type, + members: [component.fullName], + }; + packageJson.types.push(newType); + } + }); + + const builder = new xml2js.Builder({ + xmldec: { version: '1.0', encoding: 'UTF-8' }, + }); + + let packageObj = { + Package: packageJson, + }; + + packageManifest._manifestXml = builder.buildObject(packageObj); + packageManifest._manifestJson = packageObj; + + return packageManifest; + } + + /** + * Factory method + * @param manifest package JSON + * @returns instance of PackageManifest + */ + static async createWithJSONManifest(manifest: any): Promise { + const packageManifest = new PackageManifest(); + packageManifest._manifestJson = manifest; + + const builder = new xml2js.Builder({ + xmldec: { version: '1.0', encoding: 'UTF-8' }, + }); + + packageManifest._manifestXml = builder.buildObject(manifest); + + return packageManifest; + } + + /** + * + * @returns true or false, for whether there are profiles + */ + public isProfilesInPackage(): boolean { + let isProfilesFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'Profile') { + isProfilesFound = true; + break; + } + } + } else if (this.manifestJson.Package.types.name === 'Profile') { + isProfilesFound = true; + } + } + + return isProfilesFound; + } + + /** + * + * @returns true or false, for whether there are profiles + */ + public isPermissionSetsInPackage(): boolean { + let isPermissionSetFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'PermissionSet') { + isPermissionSetFound = true; + break; + } + } + } else if (this.manifestJson.Package.types.name === 'PermissionSet') { + isPermissionSetFound = true; + } + } + + return isPermissionSetFound; + } + + public isPermissionSetGroupsFoundInPackage(): boolean { + let isPermissionSetGroupFound = false; + if (Array.isArray(this._manifestJson?.Package?.types)) { + for (let type of this._manifestJson.Package.types) { + if (type.name === 'PermissionSetGroup') { + isPermissionSetGroupFound = true; + break; + } + } + } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') { + isPermissionSetGroupFound = true; + } + return isPermissionSetGroupFound; + } + + /** + * + * @returns true or false, for whether there are Apex classes and/or triggers + */ + public isApexInPackage(): boolean { + let isApexFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'ApexClass' || type.name === 'ApexTrigger') { + isApexFound = true; + break; + } + } + } else if ( + this._manifestJson.Package.types.name === 'ApexClass' || + this._manifestJson.Package.types.name === 'ApexTrigger' + ) { + isApexFound = true; + } + } + + return isApexFound; + } + + /** + * + * @returns Apex triggers if there are any, otherwise returns undefined + */ + public fetchTriggers(): ApexClasses { + let triggers: string[]; + + let types; + if (this._manifestJson.Package.types) { + if (this._manifestJson.Package.types instanceof Array) { + types = this._manifestJson.Package.types; + } else { + // Create array with single type + types = [this._manifestJson.Package.types]; + } + } + + if (types) { + for (const type of types) { + if (type.name === 'ApexTrigger') { + if (type.members instanceof Array) { + triggers = type.members; + } else { + // Create array with single member + triggers = [type.members]; + } + break; + } + } + } + + return triggers; + } + + public isPayloadContainTypesOtherThan(providedType: string): boolean { + let anyOtherType = false; + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name !== providedType) { + anyOtherType = true; + break; + } + } + } else if (this._manifestJson.Package.types.name !== providedType) { + anyOtherType = true; + } + } + return anyOtherType; + } + + public isPayLoadContainTypesSupportedByProfiles(): boolean { + const profileSupportedMetadataTypes = [ + 'ApexClass', + 'CustomApplication', + 'CustomObject', + 'CustomField', + 'Layout', + 'ApexPage', + 'CustomTab', + 'RecordType', + 'SystemPermissions', + ]; + + let containsProfileSupportedType = false; + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (profileSupportedMetadataTypes.includes(type.name)) { + containsProfileSupportedType = true; + break; + } + } + } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) { + containsProfileSupportedType = true; + } + } + return containsProfileSupportedType; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts b/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts new file mode 100644 index 000000000..7f6a6eef1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts @@ -0,0 +1,28 @@ +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import Component from '../../dependency/Component'; + + +export default class PackageToComponent { + public constructor(private packageName:string,private packageDirectory:string) {} + + public generateComponents() { + const components: Component[] = []; + + let componentSet = ComponentSet.fromSource(this.packageDirectory); + + let componentSetArray = componentSet.getSourceComponents().toArray(); + + for (const individualComponentFromComponentSet of componentSetArray) { + const component: Component = { + id: undefined, + fullName: individualComponentFromComponentSet.fullName, + type: individualComponentFromComponentSet.type.name, + files: [individualComponentFromComponentSet.xml], + package: this.packageName, + }; + components.push(component); + } + + return components; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts new file mode 100644 index 000000000..209c95b29 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts @@ -0,0 +1,53 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; +const Table = require('cli-table'); +import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import { METADATA_INFO } from '../../metadata/MetadataInfo'; + +export default class ReconcileProfileAgainstOrgImpl { + public constructor(private sfpOrg:SFPOrg, private project_directory: string, private logger: Logger) {} + + public async exec() { + + let result=[]; + try { + let profileReconciler = new ProfileReconcile(this.sfpOrg); + let reconcileProfiles = await profileReconciler.reconcile( + [ this.project_directory], + [], + undefined + ); + + // Return an object to be displayed with --json + + reconcileProfiles.forEach((file) => { + result.push({ + state: 'Cleaned', + fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), + type: 'Profile', + path: path.relative(this.project_directory, file), + }); + }); + } catch (err) { + SFPLogger.log(err, LoggerLevel.ERROR); + + SFPLogger.log( + 'An error occured during profile reconcile. You can rerun the command after a moment.', + LoggerLevel.ERROR + ); + } + const table = new Table({ + head: ['State', 'Full Name', 'Type', 'Path'], + chars: ZERO_BORDER_TABLE, + }); + for (let res of result) { + table.push([res.state, res.fullName, res.type, res.path]); + } + SFPLogger.log(table.toString(), LoggerLevel.INFO); + return result; + } + + +} diff --git a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts new file mode 100644 index 000000000..b2d37496e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts @@ -0,0 +1,273 @@ +import SFPLogger, { COLOR_WARNING, Logger } from '@flxblio/sfp-logger'; +import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import ApexClassFetcher from '../../apex/ApexClassFetcher'; +import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher'; +import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher'; + +export default class PackageTestCoverage { + private individualClassCoverage: IndividualClassCoverage; + private packageTestCoverage: number = -1; // Set inital value + + public constructor( + private pkg: SfpPackage, + private codeCoverage: any, + private logger: Logger, + private readonly conn: Connection + ) { + this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger); + } + + public async getCurrentPackageTestCoverage(): Promise { + let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; + let triggers: string[] = this.pkg.triggers; + + let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers( + this.codeCoverage, + packageClasses, + triggers + ); + + let totalLines: number = 0; + let totalCovered: number = 0; + for (let classCoverage of filteredCodeCoverage) { + if (classCoverage.coveredPercent !== null) { + totalLines += classCoverage.totalLines; + totalCovered += classCoverage.totalCovered; + } + } + + let listOfApexClassOrTriggerId: string[] = []; + + let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage); + if (classesNotTouchedByTestClass.length > 0) { + let apexClassIds = ( + await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass) + ).map((apexClass) => apexClass.Id); + listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds); + } + + let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage); + if (triggersNotTouchedByTestClass.length > 0) { + let triggerIds = ( + await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass) + ).map((trigger) => trigger.Id); + listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds); + } + + if (listOfApexClassOrTriggerId.length > 0) { + let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher( + this.conn + ).fetchACCAById(listOfApexClassOrTriggerId); + + if (recordsOfApexCodeCoverageAggregate.length > 0) { + let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes + recordsOfApexCodeCoverageAggregate.forEach((record) => { + numLinesUncovered += record.NumLinesUncovered; + }); + totalLines += numLinesUncovered; + } + } + + let testCoverage = Math.floor((totalCovered / totalLines) * 100); + this.packageTestCoverage = testCoverage; + return testCoverage; + } + + public async validateTestCoverage( + coverageThreshold?: number + ): Promise<{ + result: boolean; + message?: string; + packageTestCoverage: number; + classesCovered?: { name: string; coveredPercent: number }[]; + classesWithInvalidCoverage?: { name: string; coveredPercent: number }[]; + }> { + if (this.packageTestCoverage == -1) + //No Value available + await this.getCurrentPackageTestCoverage(); + + let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage); + + if (coverageThreshold == undefined || coverageThreshold < 75) { + SFPLogger.log('Setting minimum coverage percentage to 75%.'); + coverageThreshold = 75; + } + + + + if (this.pkg.packageType === PackageType.Unlocked) { + if (this.packageTestCoverage < coverageThreshold) { + // Coverage inadequate, set result to false + return { + result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + message: `${COLOR_WARNING( + `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%` + )}`, + }; + } else { + return { + result: true, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + message: `Package overall coverage is greater than ${coverageThreshold}%`, + }; + } + } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) { + SFPLogger.log("Package type is Source. Validating individual class coverage"); + + let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage( + this.getIndividualClassCoverageByPackage(this.codeCoverage), + coverageThreshold + ); + + if (individualClassValidationResults.result) { + return { + result: true, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, + message: `Individidual coverage of classes is greater than ${coverageThreshold}%`, + }; + } else { + return { + result: false, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, + message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`, + }; + } + } else { + throw new Error('Unhandled package type'); + } + } + + private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] { + let individualClassCoverage: { + name: string; + coveredPercent: number; + }[] = []; + + let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; + let triggers: string[] = this.pkg.triggers; + + codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers( + codeCoverageReport, + packageClasses, + triggers + ); + + for (let classCoverage of codeCoverageReport) { + if (classCoverage['coveredPercent'] !== null) { + individualClassCoverage.push({ + name: classCoverage['name'], + coveredPercent: classCoverage['coveredPercent'], + }); + } + } + + let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass( + packageClasses, + codeCoverageReport + ); + + if (namesOfClassesWithoutTest.length > 0) { + let classesWithoutTest: { + name: string; + coveredPercent: number; + }[] = namesOfClassesWithoutTest.map((className) => { + return { name: className, coveredPercent: 0 }; + }); + individualClassCoverage = individualClassCoverage.concat(classesWithoutTest); + } + + // Check for triggers with no test class + let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport); + + if (namesOfTriggersWithoutTest.length > 0) { + let triggersWithoutTest: { + name: string; + coveredPercent: number; + }[] = namesOfTriggersWithoutTest.map((triggerName) => { + return { name: triggerName, coveredPercent: 0 }; + }); + individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest); + } + + return individualClassCoverage; + } + + /** + * Returns names of triggers in the package that are not triggered by the execution of any test classes + * Returns empty array if triggers is null or undefined + * @param triggers + * @param codeCoverageReport + * @returns + */ + private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] { + if (triggers != null) { + return triggers.filter((trigger) => { + for (let classCoverage of codeCoverageReport) { + if (classCoverage['name'] === trigger) { + // Filter out triggers if accounted for in coverage json + return false; + } + } + return true; + }); + } else return []; + } + + /** + * Returns name of classes in the package that are not touched by the execution of any test classes + * Returns empty array if packageClasses is null or undefined + * @param packageClasses + * @param codeCoverageReport + * @returns + */ + private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] { + if (packageClasses != null) { + return packageClasses.filter((packageClass) => { + for (let classCoverage of codeCoverageReport) { + if (classCoverage['name'] === packageClass) { + // Filter out package class if accounted for in coverage json + return false; + } + } + return true; + }); + } else return []; + } + + /** + * Filter code coverage to classes and triggers in the package + * @param codeCoverage + * @param packageClasses + * @param triggers + */ + private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) { + let filteredCodeCoverage = codeCoverage.filter((classCoverage) => { + if (packageClasses != null) { + for (let packageClass of packageClasses) { + if (packageClass === classCoverage['name']) return true; + } + } + + if (triggers != null) { + for (let trigger of triggers) { + if (trigger === classCoverage['name']) { + return true; + } + } + } + + return false; + }); + + return filteredCodeCoverage; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts new file mode 100644 index 000000000..bee874e13 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts @@ -0,0 +1,39 @@ +import { Connection } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2VersionFetcher from '../version/Package2VersionFetcher'; + +export default class PackageVersionCoverage { + public constructor(private connection: Connection, private logger: Logger) {} + + public async getCoverage(versionId: string): Promise { + const package2VersionFetcher = new Package2VersionFetcher(this.connection); + const package2Version = await package2VersionFetcher.fetchBySubscriberPackageVersionId(versionId); + SFPLogger.log(`Fetched Record ${JSON.stringify(package2Version)}`, LoggerLevel.TRACE, this.logger); + if (package2Version) { + var packageCoverage = {}; + packageCoverage.HasPassedCodeCoverageCheck = package2Version.HasPassedCodeCoverageCheck; + packageCoverage.coverage = package2Version.CodeCoverage ? package2Version.CodeCoverage.apexCodeCoveragePercentage : 0; + packageCoverage.packageId = package2Version.Package2Id; + packageCoverage.packageName = package2Version.Package2.Name; + packageCoverage.packageVersionId = package2Version.SubscriberPackageVersionId; + packageCoverage.packageVersionNumber = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; + + SFPLogger.log( + `Successfully Retrieved the Apex Test Coverage of the package version`, + LoggerLevel.INFO, + this.logger + ); + } else { + throw new Error(`Package version doesnot exist, Please check the version details`); + } + return packageCoverage; + } +} +interface PackageCoverage { + coverage: number; + packageName: string; + packageId: string; + packageVersionNumber: string; + packageVersionId: string; + HasPassedCodeCoverageCheck: boolean; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts new file mode 100644 index 000000000..a91dc95e0 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts @@ -0,0 +1,103 @@ +import { Connection } from '@salesforce/core'; +import PackageDependencyResolver from './PackageDependencyResolver'; +import _ from 'lodash'; +import Package2VersionFetcher from '../version/Package2VersionFetcher'; +import Package2Detail from '../Package2Detail'; + +/** + * Resolves external package dependency versions to their subscriber version + */ +export default class ExternalPackage2DependencyResolver { + //TOOD: Finalize Keys + constructor(private conn: Connection, private projectConfig, private keys) {} + + public async resolveExternalPackage2DependenciesToVersions( + packagesToBeResolved?: string[], + packagesToBeSkipped?: string[], + isDependencyValidated?: boolean + ): Promise { + if (isDependencyValidated == undefined) isDependencyValidated = true; + //Do a dependency resolution first only for external dependencies + //Resolve .LATEST to exact version numbers + let revisedProjectConfig = await new PackageDependencyResolver( + this.conn, + this.projectConfig, + packagesToBeSkipped, + null, + isDependencyValidated + ).resolvePackageDependencyVersions(); + + let packageVersions: Package2Detail[] = []; + let packageVersionFetcher = new Package2VersionFetcher(this.conn); + + let packagesToKeys: { [p: string]: string }; + if (this.keys) { + packagesToKeys = this.parseKeys(this.keys); + } + + //Resolve provided version Number to SubscriberVersionId + for (const sfdxPackage of revisedProjectConfig.packageDirectories) { + + if(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package)) + continue; + + if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) { + for (let i = 0; i < sfdxPackage.dependencies.length; i++) { + let dependency = sfdxPackage.dependencies[i]; + + if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) + { + let dependendentPackage: Package2Detail = { name: dependency.package }; + packageVersions.push(dependendentPackage); + continue; + } + + if (!packageVersions.find((elem) => elem.name == dependency.package)) { + let dependendentPackage: Package2Detail = { name: dependency.package }; + if (dependency.versionNumber) { + dependendentPackage.versionNumber = dependency.versionNumber; + let packageVersion = await packageVersionFetcher.fetchByPackage2Id( + revisedProjectConfig.packageAliases[dependendentPackage.name], + dependendentPackage.versionNumber, + true + ); + dependendentPackage.subscriberPackageVersionId = + packageVersion[0].SubscriberPackageVersionId; + } else { + dependendentPackage.subscriberPackageVersionId = + revisedProjectConfig.packageAliases[dependendentPackage.name]; + } + if (packagesToKeys?.[dependendentPackage.name]) { + dependendentPackage.key = packagesToKeys[dependency.package]; + } + packageVersions.push(dependendentPackage); + } + } + } + } + return packageVersions; + } + + /** + * Parse keys in string format "packageA:key packageB:key packageC:key" + * Returns map of packages to keys + * @param keys + */ + private parseKeys(keys: string) { + let output: { [p: string]: string } = {}; + + keys = keys.trim(); + let listOfKeys = keys.split(' '); + + for (let key of listOfKeys) { + let packageKeyPair = key.split(':'); + if (packageKeyPair.length === 2) { + output[packageKeyPair[0]] = packageKeyPair[1]; + } else { + // Format is incorrect, throw an error + throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); + } + } + return output; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts new file mode 100644 index 000000000..43babb444 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts @@ -0,0 +1,269 @@ +import { Connection } from '@salesforce/core'; +import lodash = require('lodash'); +import Git from '../../git/Git'; +import GitTags from '../../git/GitTags'; +import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + + +/** + * Resolves package dependency versions to their exact versions + */ +export default class PackageDependencyResolver { + private package2VersionCache: Package2VersionCache = new Package2VersionCache(); + + constructor( + private conn: Connection, + private projectConfig, + private packagesToBeSkipped?: string[], + private packagesToBeResolved?: string[], + private resolveExternalDepenciesOnly?: boolean + ) { + // prevent mutation of original config + this.projectConfig = lodash.cloneDeep(this.projectConfig); + } + + /** + * Resolves package dependency versions in project config + * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped) + * @returns new project config JSON, does not change original JSON + */ + public async resolvePackageDependencyVersions() { + for (const packageDirectory of this.projectConfig.packageDirectories) { + if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) { + throw Error(`Unsupported path.. Use only one of the options at any given time`); + } + + if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) { + continue; + } + + if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) { + continue; + } + if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) { + for (let i = 0; i < packageDirectory.dependencies.length; i++) { + let dependency = packageDirectory.dependencies[i]; + if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) { + + throw new Error(`Can't find package id for dependency: ` + dependency.package); + } + + let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package] + + if (this.isSubscriberPackageVersionId(packageVersionId)) { + // Already resolved + continue; + } + + if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) { + // Dependency is part of the same build, will be resolved when new version is created + continue; + } + let package2VersionForDependency: any = ''; + if ( dependency.branch && dependency.branch !== '' ) { + SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO); + package2VersionForDependency = await this.getPackage2VersionForDependency( + this.conn, + dependency, + packageVersionId, + dependency.branch + ); + SFPLogger.log(`Fetched latest branched package of ${dependency.package},` + +`version: ${package2VersionForDependency.MajorVersion}.` + +`${package2VersionForDependency.MinorVersion}.` + +`${package2VersionForDependency.PatchVersion}.` + +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO); + + let branchedPackageAlias = `${dependency.package}@` + +`${package2VersionForDependency.MajorVersion}.` + +`${package2VersionForDependency.MinorVersion}.` + +`${package2VersionForDependency.PatchVersion}.` + +`${package2VersionForDependency.BuildNumber}-` + +`${dependency.branch}`; + dependency.package = branchedPackageAlias; + this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId; + delete dependency.versionNumber; + delete dependency.branch; + continue; + + }else { + package2VersionForDependency = await this.getPackage2VersionForDependency( + this.conn, + dependency, + packageVersionId + ); + } + + + if (package2VersionForDependency == null) { + packageDirectory.dependencies.splice(i, 1); + i--; + } else + dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`; + } + } + } + return this.projectConfig; + } + + /** + * Get last validated Package2 version for package dependency + * @param conn + * @param dependency + * @returns Package2Version + */ + private async getPackage2VersionForDependency( + conn: Connection, + dependency: { package: string; versionNumber: string }, + packageVersionId: string, + branch?: string, + ): Promise { + + //Dont hit api's if its only for external dependencies + if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) { + if (this.resolveExternalDepenciesOnly) return null; + } + + let package2Version: Package2Version; + + let versionNumber: string = dependency.versionNumber; + let vers: string[] = versionNumber.split('.'); + if (vers.length === 4 && vers[3] === 'LATEST') { + versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`; + } + + let package2Versions: Package2Version[]; + if (this.package2VersionCache.has(packageVersionId, versionNumber)) { + package2Versions = this.package2VersionCache.get( + packageVersionId, + versionNumber + ); + } else { + const package2VersionFetcher = new Package2VersionFetcher(conn); + let records; + if( branch ){ + records = await package2VersionFetcher.fetchByPackageBranchAndName( + branch, + dependency.package, + versionNumber + ); + }else{ + records = await package2VersionFetcher.fetchByPackage2Id( + packageVersionId, + versionNumber, + true + ); + } + + this.package2VersionCache.set( + packageVersionId, + versionNumber, + records + ); + package2Versions = this.package2VersionCache.get( + packageVersionId, + versionNumber + ); + } + + if (package2Versions.length === 0) { + throw new Error( + `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}` + ); + } + + if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) { + package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency); + } else { + // Take last validated package for external packages + package2Version = package2Versions[0]; + } + return package2Version; + } + + /** + * Get Package2 version created from the current branch + * @param package2Versions + * @param dependency + * @returns Package2Version + */ + private async getPackage2VersionFromCurrentBranch( + package2Versions: Package2Version[], + dependency: { package: string; versionNumber: string } + ) { + let package2VersionOnCurrentBranch: Package2Version; + + const git = await Git.initiateRepo(); + const gitTags = new GitTags(git, dependency.package); + const tags = await gitTags.listTagsOnBranch(); + + for (const package2Version of package2Versions) { + const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; + for (const tag of tags) { + if (tag.endsWith(version)) { + package2VersionOnCurrentBranch = package2Version; + break; + } + } + if (package2VersionOnCurrentBranch) break; + } + + if (!package2VersionOnCurrentBranch) { + throw new Error( + `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch` + ); + } + + return package2VersionOnCurrentBranch; + } + + private isSubscriberPackageVersionId(packageAlias: string): boolean { + const subscriberPackageVersionIdPrefix = '04t'; + return packageAlias.startsWith(subscriberPackageVersionIdPrefix); + } +} + +class Package2VersionCache { + private cache: { [p: string]: Package2Version[] } = {}; + + /** + * Checks whether cache contains key for package ID and version number + * @param packageId + * @param versionNumberstartw + * @returns true or false + */ + has(packageId: string, versionNumber: string): boolean { + const key = `${packageId}-${versionNumber}`; + if (this.cache[key]) return true; + else return false; + } + + /** + * Set the cache value, Package2 versions, for package ID and version number + * @param packageId + * @param versionNumber + * @param package2Versions + * @returns cache + */ + set( + packageId: string, + versionNumber: string, + package2Versions: Package2Version[] + ): { [p: string]: Package2Version[] } { + const key = `${packageId}-${versionNumber}`; + this.cache[key] = package2Versions; + return this.cache; + } + + /** + * + * @param packageId + * @param versionNumber + * @returns Package2 versions for package ID and version number + */ + get(packageId: string, versionNumber: string): Package2Version[] { + const key = `${packageId}-${versionNumber}`; + return this.cache[key]; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts new file mode 100644 index 000000000..d91c91f27 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts @@ -0,0 +1,109 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import _, { uniq } from 'lodash'; +import semver = require('semver'); +import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter'; +import { Connection } from '@salesforce/core'; +import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency'; + +export default class TransitiveDependencyResolver { + constructor(private sfdxProjectConfig: any, private logger?: Logger) {} + + public async resolveTransitiveDependencies(): Promise> { + SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger); + + let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig); + clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig); + let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig); + pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap( + pkgWithDependencies, + new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig) + ); + pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies); + + return pkgWithDependencies; + } + + private fillDepsWithUserDefinedExternalDependencyMap( + pkgWithDependencies: Map, + externalDependencyMap: any + ): Map { + if (externalDependencyMap) { + for (let pkg of Object.keys(externalDependencyMap)) { + pkgWithDependencies.set(pkg, externalDependencyMap[pkg]); + } + } + return pkgWithDependencies; + } + + private fillDepsTransitively( + dependencyMap: Map + ): Map { + let pkgs = Array.from(dependencyMap.keys()); + for (let pkg of pkgs) { + SFPLogger.log( + COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), + LoggerLevel.TRACE, + this.logger + ); + let dependenencies: { package: string; versionNumber?: string }[] = []; + for (let dependency of dependencyMap.get(pkg)) { + if (dependencyMap.get(dependency.package)) { + //push parents first + dependenencies = dependenencies.concat(dependencyMap.get(dependency.package)); + SFPLogger.log( + `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${ + dependency.package + }`, + LoggerLevel.TRACE, + this.logger + ); + } + //push itself + dependenencies.push(dependency); + } + //deduplicate dependency list + let uniqueDependencies = [ + ...new Set(dependenencies.map((objects) => JSON.stringify(objects))), + ].map((tmpString) => JSON.parse(tmpString)); + for (let j = 0; j < uniqueDependencies.length; j++) { + if (uniqueDependencies[j].versionNumber) { + let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber); + + for (let i = j + 1; i < uniqueDependencies.length; i++) { + if (uniqueDependencies[j].package == uniqueDependencies[i].package) { + let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber); + // replace existing packageInfo if package version number is newer + if (semver.lt(version, versionToCompare)) { + uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i); + + } else { + uniqueDependencies.splice(i, 1); + i--; + } + } + } + } + //do a dedup again + uniqueDependencies = [ + ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))), + ].map((tmpString) => JSON.parse(tmpString)); + } + dependencyMap.set(pkg, uniqueDependencies); + } + return dependencyMap; + } + + private swapAndDropArrayElement(arr: T[], i: number, j: number): T[] { + if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) { + return arr; + } + + let newArr = [...arr]; + [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; + return [...newArr.slice(0, j), ...newArr.slice(j + 1)]; + } + + +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts new file mode 100644 index 000000000..c7a74f82e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts @@ -0,0 +1,27 @@ +import { Logger } from "@flxblio/sfp-logger"; +import { Connection } from "@salesforce/core"; +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; +import SfpPackage from "../SfpPackage"; +import SFPOrg from "../../org/SFPOrg"; +import { DeploySourceResult } from "../../deployers/DeploymentExecutor"; + +export interface DeploymentContext +{ + apiVersion: string; + waitTime: string; +} + +export interface DeploymentCustomizer +{ + gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet:ComponentSet, conn: Connection, logger: Logger):Promise<{location:string, componentSet:ComponentSet}>; + isEnabled(sfpPackage:SfpPackage, conn:Connection,logger:Logger):Promise; + getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + getName():string + execute(sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg:SFPOrg, + logger: Logger, + deploymentContext:DeploymentContext + ):Promise +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts new file mode 100644 index 000000000..709ce227f --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts @@ -0,0 +1,121 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SfpPackage from '../SfpPackage'; +import { Connection } from '@salesforce/core'; + +import { Schema } from 'jsforce'; +import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import { TestLevel } from '../../apextest/TestOptions'; +import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; + +const QUERY_BODY = + 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFieldHistoryTracked = true AND EntityDefinitionId IN '; + +export default class FHTEnabler extends MetdataDeploymentCustomizer { + + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg) return false; + + if ( + sfpPackage['isFHTFieldFound'] && + (sfpPackage.packageDescriptor.enableFHT == undefined || sfpPackage.packageDescriptor.enableFHT == true) + ) { + return true; + } + } + + + + public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + { + return { + ignoreWarnings:true, + waitTime:waitTime, + apiVersion:apiVersion, + testLevel : TestLevel.RunSpecifiedTests, + specifiedTests :'skip', + rollBackOnError:true + } + } + + public async gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + //First retrieve all objects/fields of interest from the package + let objList = []; + let fieldList = []; + Object.keys(sfpPackage['fhtFields']).forEach((key) => { + objList.push(`'${key}'`); + sfpPackage['fhtFields'][key].forEach((field) => fieldList.push(key + '.' + field)); + }); + //Now query all the fields for this object where FHT is already enabled + SFPLogger.log( + `Gathering fields which are already enabled with trackHistory on target org....`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log('FHT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) + let fhtFieldsInOrg = await QueryHelper.query<{ + QualifiedApiName: string; + EntityDefinition: any; + IsFieldHistoryTracked: boolean; + }>(QUERY_BODY + '(' + objList + ')', conn, true); + + //Clear of the fields that alread has FHT applied and keep a reduced filter + fhtFieldsInOrg.map((record) => { + let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; + const index = fieldList.indexOf(field); + if (index > -1) { + fieldList.splice(index, 1); + } + }); + + if (fieldList.length > 0) { + //Now retrieve the fields from the org + let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); + let sfpOrg = await SFPOrg.create({ connection: conn }); + let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); + + + + //Modify the component set + //Parsing is risky due to various encoding, so do an inplace replacement + for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { + let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); + + metadataOfComponent = metadataOfComponent.replace( + 'false', + 'true' + ); + + + + fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); + } + + return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; + } else SFPLogger.log(`No fields are required to be updated, skipping update of Field History Tracking`, LoggerLevel.INFO, logger); + } + + public getName(): string { + return 'Field History Tracking Enabler'; + } +} + +interface CustomField { + QualifiedApiName: string; + IsFieldHistoryTracked: boolean; + EntityDefinitionId: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts new file mode 100644 index 000000000..3daa6708b --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts @@ -0,0 +1,107 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SfpPackage from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import { Schema } from 'jsforce'; +import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import { TestLevel } from '../../apextest/TestOptions'; +import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; + +const QUERY_BODY = + 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFeedEnabled = true AND EntityDefinitionId IN '; + +export default class FTEnabler extends MetdataDeploymentCustomizer { + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg) return false; + + if ( + sfpPackage['isFTFieldFound'] && + (sfpPackage.packageDescriptor.enableFT == undefined || sfpPackage.packageDescriptor.enableFT == true) + ) { + return true; + } + } + + public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + { + return { + ignoreWarnings:true, + waitTime:waitTime, + apiVersion:apiVersion, + testLevel : TestLevel.RunSpecifiedTests, + specifiedTests :'skip', + rollBackOnError:true + } + } + + public async gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + //First retrieve all objects/fields of interest from the package + let objList = []; + let fieldList = []; + Object.keys(sfpPackage['ftFields']).forEach((key) => { + objList.push(`'${key}'`); + sfpPackage['ftFields'][key].forEach((field) => fieldList.push(key + '.' + field)); + }); + //Now query all the fields for this object where FT is already enabled + SFPLogger.log( + `Gathering fields which are already enabled with feed traking in the target org....`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log('FT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) + let ftFieldsInOrg = await QueryHelper.query<{ + QualifiedApiName: string; + EntityDefinition: any; + IsFeedEnabled: boolean; + }>(QUERY_BODY + '(' + objList + ')', conn, true); + + //Clear of the fields that alread has FT applied and keep a reduced filter + ftFieldsInOrg.map((record) => { + let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; + const index = fieldList.indexOf(field); + if (index > -1) { + fieldList.splice(index, 1); + } + }); + + if (fieldList.length > 0) { + //Now retrieve the fields from the org + let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); + let sfpOrg = await SFPOrg.create({ connection: conn }); + let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); + + //Modify the component set + //Parsing is risky due to various encoding, so do an inplace replacement + for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { + let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); + + metadataOfComponent = metadataOfComponent.replace( + 'false', + 'true' + ); + + fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); + } + + return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; + } else SFPLogger.log(`No fields are required to be updated,skipping updates to Feed History tracking`, LoggerLevel.INFO, logger); + } + + public getName(): string { + return 'Feed Tracking Enabler'; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts new file mode 100644 index 000000000..1c524e287 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts @@ -0,0 +1,83 @@ +import { Connection } from "@salesforce/core"; +import DeploySourceToOrgImpl, { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; +import SfpPackage from "../SfpPackage"; +import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; +import SFPLogger,{COLOR_KEY_MESSAGE,Logger,LoggerLevel} from "@flxblio/sfp-logger" +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import SFPOrg from "../../org/SFPOrg"; +import DeploymentExecutor, { DeploySourceResult } from "../../deployers/DeploymentExecutor"; +import PackageComponentPrinter from "../../display/PackageComponentPrinter"; +import DeployErrorDisplayer from "../../display/DeployErrorDisplayer"; + +export abstract class MetdataDeploymentCustomizer implements DeploymentCustomizer +{ + abstract gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet: ComponentSet, conn: Connection, logger: Logger): Promise<{ location: string; componentSet: ComponentSet; }>; + abstract isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise; + abstract getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise; + abstract getName(): string; + + + async execute(sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg:SFPOrg, + logger: Logger, + deploymentContext:DeploymentContext + ):Promise + { + if (await this.isEnabled(sfpPackage, sfpOrg.getConnection(), logger)) { + SFPLogger.log( + `Executing Post Deployer ${COLOR_KEY_MESSAGE(this.getName())}`, + LoggerLevel.INFO, + logger + ); + let modifiedPackage = await this.gatherComponentsToBeDeployed( + sfpPackage, + componentSet, + sfpOrg.getConnection(), + logger + ); + + //Check if there are components to be deployed + //Asssume its sucessfully deployed + if (!modifiedPackage || modifiedPackage.componentSet.getSourceComponents().toArray().length == 0) { + return { + deploy_id: `000000`, + result: true, + message: `No deployment required`, + }; + } + + + //deploy the fht enabled components to the org + let deploymentOptions = await this.getDeploymentOptions( + sfpOrg.getUsername(), + deploymentContext.waitTime, + deploymentContext.apiVersion + ); + + //Print components inside Component Set + let components = modifiedPackage.componentSet.getSourceComponents(); + PackageComponentPrinter.printComponentTable(components, logger); + + let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( + sfpOrg, + modifiedPackage.location, + modifiedPackage.componentSet, + deploymentOptions, + logger + ); + + let result = await deploySourceToOrgImpl.exec(); + if (!result.result) { + DeployErrorDisplayer.displayErrors(result.response, logger); + } + return result; + } else { + SFPLogger.log( + `Post Deployer ${COLOR_KEY_MESSAGE(this.getName())} skipped or not enabled`, + LoggerLevel.INFO, + logger + ); + } + } +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts new file mode 100644 index 000000000..b17b48be5 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts @@ -0,0 +1,218 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import { DeploymentContext, DeploymentCustomizer } from './DeploymentCustomizer'; +import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; +import SFPOrg from '../../org/SFPOrg'; +import { Schema } from 'jsforce'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; + +const QUERY_BODY = 'SELECT Id FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '; + +export default class PicklistEnabler implements DeploymentCustomizer { + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + if (sfpPackage.packageType === PackageType.Unlocked) { + if ( + sfpPackage.isPickListsFound && + (sfpPackage.packageDescriptor.enablePicklist == undefined || + sfpPackage.packageDescriptor.enablePicklist == true) + ) { + return true; + } + } else return false; + } + + async execute( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg: SFPOrg, + logger: Logger, + deploymentContext: DeploymentContext + ): Promise { + try { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let components = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name == registry.types.customobject.name) { + components.push(...sourceComponent.getChildren()); + } + + if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { + components.push(sourceComponent); + } + } + + if (components) { + for (const fieldComponent of components) { + let customField = fieldComponent.parseXmlSync().CustomField; + //check for empty picklists + if ( + !customField || + customField['type'] !== 'Picklist' || + !customField.valueSet?.valueSetDefinition + ) { + continue; + } + //no updates for custom metadata picklists + if (customField['fieldManageability']) continue; + + let objName = fieldComponent.parent.fullName; + let picklistName = fieldComponent.name; + let urlId = + QUERY_BODY + "'" + objName + "'" + ' AND QualifiedApiName = ' + "'" + picklistName + "'"; + + let picklistValueSource = await this.getPicklistSource(customField); + + SFPLogger.log( + `Fetching picklist for custom field ${picklistName} on object ${objName}`, + LoggerLevel.INFO, + logger + ); + + let picklistInOrg = await this.getPicklistInOrg(urlId, sfpOrg.getConnection()); + + //check for empty picklists on org and fix first deployment issue + if (!picklistInOrg?.Metadata?.valueSet?.valueSetDefinition) { + SFPLogger.log( + `Picklist field ${objName}.${picklistName} not in target Org. Skipping`, + LoggerLevel.TRACE, + logger + ); + continue; + } + + + let picklistValueInOrg = []; + + for (const value of picklistInOrg.Metadata.valueSet.valueSetDefinition.value) { + //ignore inactive values from org + if (value.isActive == false) { + continue; + } + + let valueInfo: { [key: string]: string } = {}; + valueInfo.fullName = value['valueName']; + decodeURIComponent(valueInfo.fullName); + valueInfo.label = value['label']; + decodeURIComponent(valueInfo.label); + valueInfo.default = value['default'] && value['default'] === true ? 'true' : 'false'; + picklistValueInOrg.push(valueInfo); + } + + let isPickListIdentical = this.arePicklistsIdentical(picklistValueInOrg, picklistValueSource); + + if (!isPickListIdentical) { + this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger); + } else { + SFPLogger.log( + `Picklist for custom field ${objName}.${picklistName} is identical to the source.No deployment`, + LoggerLevel.INFO, + logger + ); + } + } + + return { + deploy_id: `000000`, + result: true, + message: `Patched Picklists`, + }; + } + } catch (error) { + SFPLogger.log(`Unable to process Picklist update due to ${error.message}`, LoggerLevel.WARN, logger); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + } + + private async getPicklistInOrg(urlId: string, conn: Connection): Promise { + let response = await QueryHelper.query(urlId, conn, true); + + if (response && Array.isArray(response) && response.length > 0 && response[0].attributes) { + let responseUrl = response[0].attributes.url; + let fieldId = responseUrl.slice(responseUrl.lastIndexOf('.') + 1); + let responsePicklist = await conn.tooling.sobject('CustomField').find({ Id: fieldId }); + + if (responsePicklist) { + return responsePicklist[0]; + } + } + } + + gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + throw new Error('Method not implemented.'); + } + getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise { + throw new Error('Method not implemented.'); + } + + private async getPicklistSource(customField: any): Promise { + let picklistValueSet = []; + let values = customField.valueSet?.valueSetDefinition?.value; + //only push values when picklist > 1 or exactly 1 value + if (Array.isArray(values)) { + for (const value of values) { + //ignore inactive values from source + if(!value?.isActive || value?.isActive == 'true'){ + picklistValueSet.push({fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'] , default: value.default, label: value['label'] ? decodeURI(value['label']) : value['label']}); + } + } + } else if (typeof values === 'object' && 'fullName' in values) { + //ignore inactive values from source + if(!values?.isActive || values?.isActive == 'true'){ + picklistValueSet.push({fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'] , default: values.default, label: values['label'] ? decodeURI(values['label']) : values['label']}); + } + } + return picklistValueSet; + } + + private arePicklistsIdentical(picklistValueInOrg: any[], picklistValueSource: any[]): boolean { + return ( + picklistValueInOrg.length === picklistValueSource.length && + picklistValueInOrg.every((element_1) => + picklistValueSource.some( + (element_2) => + element_1.fullName === element_2.fullName && + element_1.label === element_2.label && + element_1.default === element_2.default + ) + ) + ); + } + + private async deployPicklist(picklistInOrg: any, picklistValueSource: any, conn: Connection, logger: Logger) { + //empty the the old value set + picklistInOrg.Metadata.valueSet.valueSetDefinition.value = []; + picklistValueSource.map((value) => { + picklistInOrg.Metadata.valueSet.valueSetDefinition.value.push(value); + }); + picklistInOrg.Metadata.valueSet.valueSettings = []; + + let picklistToDeploy: any; + picklistToDeploy = { + attributes: picklistInOrg.attributes, + Id: picklistInOrg.Id, + Metadata: picklistInOrg.Metadata, + FullName: picklistInOrg.FullName, + }; + SFPLogger.log(`Update picklist for custom field ${picklistToDeploy.FullName}`, LoggerLevel.INFO, logger); + try { + await conn.tooling.sobject('CustomField').update(picklistToDeploy); + } catch (error) { + throw new Error( + `Unable to update picklist for custom field ${picklistToDeploy.FullName} due to ${error.message}` + ); + } + } + + public getName(): string { + return 'Picklist Enabler'; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts new file mode 100644 index 000000000..d2ac675f6 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts @@ -0,0 +1,18 @@ +import { DeploymentCustomizer } from './DeploymentCustomizer'; +import FHTEnabler from './FHTEnabler'; +import FTEnabler from './FTEnabler'; + + +export class PostDeployersRegistry { + static getPostDeployers(): DeploymentCustomizer[] { + let postDeployers: DeploymentCustomizer[] = []; + + //TODO: Make dynamic + let fhtEnabler = new FHTEnabler(); + let ftEnabler = new FTEnabler(); + postDeployers.push(fhtEnabler); + postDeployers.push(ftEnabler); + + return postDeployers; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts new file mode 100644 index 000000000..2e423cbc9 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts @@ -0,0 +1,14 @@ +import { DeploymentCustomizer } from './DeploymentCustomizer'; +import PicklistEnabler from './PicklistEnabler'; + + +export class PreDeployersRegistry { + static getPreDeployers(): DeploymentCustomizer[] { + let preDeployers: DeploymentCustomizer[] = []; + + let picklistEnabler = new PicklistEnabler(); + preDeployers.push(picklistEnabler); + + return preDeployers; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts new file mode 100644 index 000000000..47290e189 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts @@ -0,0 +1,13 @@ +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import { Logger } from "@flxblio/sfp-logger"; +import SFPOrg from "../../org/SFPOrg"; +import { PackageType } from "../SfpPackage"; + +export interface DeploymentFilter +{ + apply(org: SFPOrg, componentSet: ComponentSet,logger:Logger):Promise; + isToApply(projectConfig: any,packageType:string): boolean; + +} + + diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts new file mode 100644 index 000000000..4e5721e2f --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts @@ -0,0 +1,18 @@ +import { DeploymentFilter } from './DeploymentFilter'; +import EntitlementVersionFilter from './EntitlementVersionFilter'; + + + + +export class DeploymentFilterRegistry { + static getImplementations(): DeploymentFilter[] { + let deploymentFilterImpls: DeploymentFilter[] = []; + + //TODO: Make dynamic + let entitlementVersionFilter = new EntitlementVersionFilter(); + deploymentFilterImpls.push(entitlementVersionFilter); + + + return deploymentFilterImpls; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts new file mode 100644 index 000000000..47d9399c8 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts @@ -0,0 +1,110 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SFPOrg from '../../org/SFPOrg'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { DeploymentFilter } from './DeploymentFilter'; +import * as fs from 'fs-extra'; +import SettingsFetcher from '../../metadata/SettingsFetcher'; +import { PackageType } from '../SfpPackage'; +const { XMLBuilder } = require('fast-xml-parser'); + +const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`; +const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`; + +export default class EntitlementVersionFilter implements DeploymentFilter { + + public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { + //Only do if entitlment exits in the package + let sourceComponents = componentSet.getSourceComponents().toArray(); + let isEntitlementFound: boolean = false; + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.entitlementprocess.name) { + isEntitlementFound = true; + break; + } + } + if (!isEntitlementFound) return componentSet; + + try { + let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`); + + let query; + if (entitlementSettings.enableEntitlementVersioning == true) { + SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger); + query = EXISTING_SLAPPROCESS_QUERY; + } else { + SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger); + query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING; + } + + SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger); + //Fetch Entitlements currently in the org + let slaProcessesInOrg = await QueryHelper.query(query, org.getConnection(), false); + let modifiedComponentSet = new ComponentSet(); + //Compare version numbers in the org vs version in the component set + //Remove if the version numbers match + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.entitlementprocess.name) { + let slaProcessLocal = sourceComponent.parseXmlSync(); + + let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find( + (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name'] + ); + + if ( + slaProcessMatchedByName && + entitlementSettings.enableEntitlementVersioning && + slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber + ) { + //This is a deployment candidate + //Modify versionMaster tag to match in the org + slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster; + let builder = new XMLBuilder({ + format: true, + ignoreAttributes: false, + attributeNamePrefix: '@_', + }); + let xmlContent = builder.build(slaProcessLocal); + fs.writeFileSync(sourceComponent.xml, xmlContent); + modifiedComponentSet.add(sourceComponent); + } else if (slaProcessMatchedByName) { + SFPLogger.log( + `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`, + LoggerLevel.INFO, + logger + ); + } else { + //Doesnt exist, deploy + modifiedComponentSet.add(sourceComponent); + } + } else { + modifiedComponentSet.add(sourceComponent); + } + } + + SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger); + return modifiedComponentSet; + } catch (error) { + SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger); + return componentSet; + } + } + + public isToApply(projectConfig: any, packageType: string): boolean { + if (packageType != PackageType.Source) return false; + + if (projectConfig?.plugins?.sfp?.disableEntitlementFilter) return false; + else return true; + } + + + + +} + +interface SlaProcess { + Name: string; + NameNorm: string; + VersionNumber: string; + VersionMaster: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts b/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts new file mode 100644 index 000000000..10bd597bd --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts @@ -0,0 +1,424 @@ +import * as xml2js from 'xml2js'; +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as rimraf from 'rimraf'; +import * as _ from 'lodash'; +import simplegit from 'simple-git'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ProjectConfig from '../../project/ProjectConfig'; +import MetadataFiles from '../../metadata/MetadataFiles'; +import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo'; +import { MetadataResolver } from '@salesforce/source-deploy-retrieve'; +import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil'; + +const deleteNotSupported = ['RecordType']; +const git = simplegit(); +let sfdxManifest; + +export default class PackageComponentDiff { + private gitDiffUtils: GitDiffUtils; + + destructivePackageObjPre: any[]; + destructivePackageObjPost: any[]; + resultOutput: { + action: string; + metadataType: string; + componentName: string; + message: string; + path: string; + }[]; + public constructor( + private logger: Logger, + private sfdxPackage: string, + private revisionFrom?: string, + private revisionTo?: string, + private isDestructive?: boolean + ) { + if (this.revisionTo == null || this.revisionTo.trim() === '') { + this.revisionTo = 'HEAD'; + } + if (this.revisionFrom == null) { + this.revisionFrom = ''; + } + this.destructivePackageObjPost = []; + this.destructivePackageObjPre = []; + this.resultOutput = []; + + sfdxManifest = ProjectConfig.getSFDXProjectConfig(null); + this.gitDiffUtils = new GitDiffUtils(); + } + + public async build(outputFolder: string) { + rimraf.sync(outputFolder); + + const sepRegex = /\n|\r/; + let data = ''; + + //check if same commit + const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]); + const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]); + if (commitFrom === commitTo) { + throw new Error(`Unable to compute diff, as both commits are same`); + } + //Make it relative to make the command works from a project created as a subfolder in a repository + data = await git.diff([ + '--raw', + this.revisionFrom, + this.revisionTo, + '--relative', + ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path, + ]); + + let content = data.split(sepRegex); + let diffFile: DiffFile = await this.parseContent(content); + await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger); + + let filesToCopy = diffFile.addedEdited; + let deletedFiles = diffFile.deleted; + + deletedFiles = deletedFiles.filter((deleted) => { + let found = false; + let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path); + for (let i = 0; i < filesToCopy.length; i++) { + let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path); + if (deletedMetadata === addedOrEdited) { + found = true; + break; + } + } + return !found; + }); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + + const resolver = new MetadataResolver(); + + if (filesToCopy && filesToCopy.length > 0) { + for (let i = 0; i < filesToCopy.length; i++) { + + try { + let filePath = filesToCopy[i].path; + + let sourceComponents = resolver.getComponentsFromPath(filePath); + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + if(path.extname(sourceComponent.content)) + await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); + else + await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) { + await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); + } else { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + } + } + } catch (error) { + + if(error.message.includes(`Unable to find the required file`)) + throw error; + + //Metadata resolver is not respecting forceignores at this stage + // So it fails on diff packages with post deploy, so lets ignore and move on + SFPLogger.log( + `Error while inferencing type of ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`, + LoggerLevel.TRACE, + this.logger + ); + } + } + } + + if (this.isDestructive) { + SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger); + await this.createDestructiveChanges(deletedFiles, outputFolder); + } + + //Folder is empty after all this operations, return without copying additional files + if (fs.readdirSync(outputFolder).length === 0) { + rimraf.sync(outputFolder); + return null; + } + + SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger); + + return this.resultOutput; + } + + //TODO: Refactor using proper ignore + private checkForIngore(pathToIgnore: any[], filePath: string) { + pathToIgnore = pathToIgnore || []; + if (pathToIgnore.length === 0) { + return true; + } + + let returnVal = true; + pathToIgnore.forEach((ignore) => { + if ( + path.resolve(ignore) === path.resolve(filePath) || + path.resolve(filePath).includes(path.resolve(ignore)) + ) { + returnVal = false; + } + }); + return returnVal; + } + + private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) { + if (_.isNil(this.destructivePackageObjPost)) { + this.destructivePackageObjPost = []; + } else { + this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => { + return !_.isNil(metaType.members) && metaType.members.length > 0; + }); + } + this.destructivePackageObjPre = []; + //returns root, dir, base and name + for (let i = 0; i < filePaths.length; i++) { + let filePath = filePaths[i].path; + try { + let matcher = filePath.match(SOURCE_EXTENSION_REGEX); + let extension = ''; + if (matcher) { + extension = matcher[0]; + } else { + extension = path.parse(filePath).ext; + } + + let name = MetadataInfo.getMetadataName(filePath); + + if (name) { + if (!MetadataFiles.isCustomMetadata(filePath, name)) { + // avoid to generate destructive for Standard Components + //Support on Custom Fields and Custom Objects for now + + this.resultOutput.push({ + action: 'Skip', + componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name), + metadataType: 'StandardField/CustomMetadata', + message: '', + path: '--', + }); + + continue; + } + let member = MetadataFiles.getMemberNameFromFilepath(filePath, name); + if (name === METADATA_INFO.CustomField.xmlName) { + let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], ''); + if (isFormular) { + this.destructivePackageObjPre = this.buildDestructiveTypeObj( + this.destructivePackageObjPre, + name, + member + ); + + SFPLogger.log( + `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, + LoggerLevel.DEBUG, + this.logger + ); + + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'Manual Intervention Required', + }); + } else { + this.destructivePackageObjPost = this.buildDestructiveTypeObj( + this.destructivePackageObjPost, + name, + member + ); + } + SFPLogger.log( + `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, + LoggerLevel.DEBUG, + this.logger + ); + + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'destructiveChanges.xml', + }); + } else { + if (!deleteNotSupported.includes(name)) { + this.destructivePackageObjPost = this.buildDestructiveTypeObj( + this.destructivePackageObjPost, + name, + member + ); + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'destructiveChanges.xml', + }); + } else { + //add the component in the manual action list + // TODO + } + } + } + } catch (ex) { + this.resultOutput.push({ + action: 'ERROR', + componentName: '', + metadataType: '', + message: ex.message, + path: filePath, + }); + } + } + + this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml'); + } + + private writeDestructivechanges(destrucObj: Array, outputFolder: string, fileName: string) { + //ensure unique component per type + for (let i = 0; i < destrucObj.length; i++) { + destrucObj[i].members = _.uniq(destrucObj[i].members); + } + destrucObj = destrucObj.filter((metaType) => { + return metaType.members && metaType.members.length > 0; + }); + + if (destrucObj.length > 0) { + let dest = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: destrucObj, + }, + }; + + let destructivePackageName = fileName; + let filepath = path.join(outputFolder, destructivePackageName); + let builder = new xml2js.Builder(); + let xml = builder.buildObject(dest); + fs.writeFileSync(filepath, xml); + } + } + + private buildDestructiveTypeObj(destructiveObj, name, member) { + let typeIsPresent = false; + for (let i = 0; i < destructiveObj.length; i++) { + if (destructiveObj[i].name === name) { + typeIsPresent = true; + destructiveObj[i].members.push(member); + break; + } + } + let typeNode: any; + if (typeIsPresent === false) { + typeNode = { + name: name, + members: [member], + }; + destructiveObj.push(typeNode); + } + return destructiveObj; + } + + private async parseContent(fileContents): Promise { + const statusRegEx = /\sA\t|\sM\t|\sD\t/; + const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/; + const tabRegEx = /\t/; + const deletedFileRegEx = new RegExp(/\sD\t/); + const lineBreakRegEx = /\r?\n|\r|( $)/; + + let metadataFiles = new MetadataFiles(); + + let diffFile: DiffFile = { + deleted: [], + addedEdited: [], + }; + + for (let i = 0; i < fileContents.length; i++) { + if (statusRegEx.test(fileContents[i])) { + let lineParts = fileContents[i].split(statusRegEx); + + let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, '')); + finalPath = finalPath.trim(); + finalPath = finalPath.replace('\\303\\251', 'é'); + + if (!(await metadataFiles.isInModuleFolder(finalPath))) { + continue; + } + + if (!metadataFiles.accepts(finalPath)) { + continue; + } + + let revisionPart = lineParts[0].split(/\t|\s/); + + if (deletedFileRegEx.test(fileContents[i])) { + //Deleted + diffFile.deleted.push({ + revisionFrom: revisionPart[2].substring(0, 9), + revisionTo: revisionPart[3].substring(0, 9), + path: finalPath, + }); + } else { + // Added or edited + diffFile.addedEdited.push({ + revisionFrom: revisionPart[2].substring(0, 9), + revisionTo: revisionPart[3].substring(0, 9), + path: finalPath, + }); + } + } else if (renamedRegEx.test(fileContents[i])) { + let lineParts = fileContents[i].split(renamedRegEx); + + let paths = lineParts[1].trim().split(tabRegEx); + + let finalPath = path.join('.', paths[1].trim()); + finalPath = finalPath.replace('\\303\\251', 'é'); + let revisionPart = lineParts[0].split(/\t|\s/); + + if (!(await metadataFiles.isInModuleFolder(finalPath))) { + continue; + } + + if (!metadataFiles.accepts(paths[0].trim())) { + continue; + } + + diffFile.addedEdited.push({ + revisionFrom: '0000000', + revisionTo: revisionPart[3], + renamedPath: path.join('.', paths[0].trim()), + path: finalPath, + }); + + //allow deletion of renamed components + diffFile.deleted.push({ + revisionFrom: revisionPart[2], + revisionTo: '0000000', + path: paths[0].trim(), + }); + } + } + return diffFile; + } +} +enum AdapterId { + Bundle = 'bundle', + Decomposed = 'decomposed', + Default = 'default', + MatchingContentFile = 'matchingContentFile', + MixedContent = 'mixedContent', +} diff --git a/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts new file mode 100644 index 000000000..e620bf96c --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts @@ -0,0 +1,166 @@ +const fs = require('fs'); +const path = require('path'); +import Git from '../../git/Git'; +import IgnoreFiles from '../../ignore/IgnoreFiles'; +import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ProjectConfig from '../../project/ProjectConfig'; +import GitTags from '../../git/GitTags'; +import lodash = require('lodash'); +import { EOL } from 'os'; +import { PackageType } from '../SfpPackage'; + +export class PackageDiffOptions { + skipPackageDescriptorChange?: boolean = false; + //If not set, utlize latest git tags + useLatestGitTags?:boolean=true; + packagesMappedToLastKnownCommitId?: { [p: string]: string }; + pathToReplacementForceIgnore?: string; +} + +export default class PackageDiffImpl { + public constructor( + private logger: Logger, + private sfdx_package: string, + private project_directory: string|null, + private diffOptions?: PackageDiffOptions + ) {} + + public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> { + let git: Git = await Git.initiateRepo(this.logger,this.project_directory); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory); + let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`, + ), + LoggerLevel.TRACE, + this.logger + ); + + let tag: string; + if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) { + tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId); + } else { + tag = await this.getLatestTagFromGit(git, this.sfdx_package); + } + + if (tag) { + SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger); + + // Get the list of modified files between the tag and HEAD refs + let modified_files: string[]; + try { + modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); + } catch (error) { + SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`)); + SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`)); + SFPLogger.log(COLOR_ERROR(`Actual error received:`)); + SFPLogger.log(COLOR_ERROR(error)); + throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`) + } + + let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package); + + if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files); + + SFPLogger.log( + `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`, + LoggerLevel.TRACE, + this.logger + ); + + // Check whether the package has been modified + for (let filename of modified_files) { + + let normalizedPkgPath = path.normalize(pkgDescriptor.path); + let normalizedFilename = path.normalize(filename); + + let relativePath = path.relative(normalizedPkgPath, normalizedFilename); + + if (!relativePath.startsWith('..')) { + SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger); + return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag }; + } + } + + SFPLogger.log( + `Checking for changes to package descriptor in sfdx-project.json`, + LoggerLevel.TRACE, + this.logger + ); + let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor); + if (isPackageDescriptorChanged) { + return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag }; + } + + return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; + } else { + SFPLogger.log( + `Tag missing for ${this.sfdx_package}...marking package for build anyways`, + LoggerLevel.TRACE, + this.logger + ); + return { isToBeBuilt: true, reason: `Previous version not found` }; + } + } + + private applyForceIgnoreToModifiedFiles(modified_files: string[]) { + let forceignorePath: string; + if (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore; + else if (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore'); + else forceignorePath = '.forceignore'; + + let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString()); + + // Filter the list of modified files with .forceignore + modified_files = ignoreFiles.filter(modified_files); + + return modified_files; + } + + private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise { + const gitTags: GitTags = new GitTags(git, sfdx_package); + let tags: string[] = await gitTags.listTagsOnBranch(); + + SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG); + if (tags.length > 10) { + SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); + } else { + SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); + } + + return tags.pop(); + } + + private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise { + let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]); + let projectConfig = JSON.parse(projectConfigJson); + + let packageDescriptorFromLatestTag: string; + for (let dir of projectConfig['packageDirectories']) { + if (this.sfdx_package === dir.package) { + packageDescriptorFromLatestTag = dir; + } + } + + if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) { + SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger); + + //skip check and ignore + if (this.diffOptions?.skipPackageDescriptorChange) { + SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger); + return false; + } else return true; + } else return false; + } + + private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string { + if (packagesToCommits[sfdx_package] != null) { + return packagesToCommits[sfdx_package]; + } else { + return null; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts b/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts new file mode 100644 index 000000000..cf5e58c58 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts @@ -0,0 +1,301 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import * as rimraf from 'rimraf'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { mkdirpSync } from 'fs-extra'; +import * as fs from 'fs-extra'; +import PackageComponentDiff from '../diff/PackageComponentDiff'; +let path = require('path'); + +export default class SfpPackageContentGenerator { + public static isPreDeploymentScriptAvailable: boolean = false; + public static isPostDeploymentScriptAvailable: boolean = false; + + public static async generateSfpPackageDirectory( + logger: Logger, + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + packageDirectory: string, + versionNumber:string, + destructiveManifestFilePath?: string, + configFilePath?: string, + pathToReplacementForceIgnore?: string, + revisionFrom?: string, + revisionTo?: string + ): Promise { + let artifactDirectory: string = `.sfp/${this.makefolderid(5)}_source`, + rootDirectory: string; + + if (projectDirectory) { + rootDirectory = projectDirectory; + } else { + rootDirectory = ''; + } + + if (packageDirectory == null) packageDirectory = ''; + + mkdirpSync(artifactDirectory); + + //Ensure the directory is clean + rimraf.sync(path.join(artifactDirectory, packageDirectory)); + + //Create a new directory + fs.mkdirsSync(path.join(artifactDirectory, packageDirectory)); + + SfpPackageContentGenerator.createScripts(artifactDirectory, rootDirectory, sfdx_package); + + SfpPackageContentGenerator.createForceIgnores(artifactDirectory, rootDirectory); + + + if (pathToReplacementForceIgnore) + SfpPackageContentGenerator.replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger); + + if (destructiveManifestFilePath) { + SfpPackageContentGenerator.copyDestructiveManifests( + destructiveManifestFilePath, + artifactDirectory, + rootDirectory, + logger + ); + } + + if (configFilePath) { + SfpPackageContentGenerator.copyConfigFilePath(configFilePath, artifactDirectory, rootDirectory, logger); + } + + SfpPackageContentGenerator.handleUnpackagedMetadata( + sfdx_package, + projectConfig, + rootDirectory, + artifactDirectory + ); + + SfpPackageContentGenerator.createPackageManifests( + artifactDirectory, + rootDirectory, + projectConfig, + sfdx_package, + versionNumber + ); + + fs.copySync(path.join(rootDirectory, packageDirectory), path.join(artifactDirectory, packageDirectory)); + + return artifactDirectory; + } + + private static handleUnpackagedMetadata( + sfdx_package: string, + projectConfig: any, + rootDirectory: string, + artifactDirectory: string + ) { + const packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdx_package, projectConfig); + if (packageDescriptor.unpackagedMetadata?.path) { + if (fs.pathExistsSync(packageDescriptor.unpackagedMetadata.path)) { + let unpackagedMetadataDir: string = path.join(artifactDirectory, `unpackagedMetadata`); + mkdirpSync(unpackagedMetadataDir); + fs.copySync(path.join(rootDirectory, packageDescriptor.unpackagedMetadata.path), unpackagedMetadataDir); + } else { + throw new Error(`unpackagedMetadata ${packageDescriptor.unpackagedMetadata.path} does not exist`); + } + } + } + + private static createPackageManifests( + artifactDirectory: string, + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + versionNumber:string + ) { + // Create pruned package manifest in source directory + let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdx_package); + + //Ensure version numbers are used from + cleanedUpProjectManifest.packageDirectories[0].versionNumber=versionNumber + + //Handle unpackaged metadata + if (fs.existsSync(path.join(artifactDirectory, 'unpackagedMetadata'))) { + cleanedUpProjectManifest.packageDirectories[0].unpackagedMetadata.path = path.join('unpackagedMetadata'); + cleanedUpProjectManifest.packageDirectories.push({ path: path.join('unpackagedMetadata'), default: false }); + } + + //Setup preDeployment Script Path + if (fs.existsSync(path.join(artifactDirectory, 'scripts', `preDeployment`))) + cleanedUpProjectManifest.packageDirectories[0].preDeploymentScript = path.join('scripts', `preDeployment`); + + //Setup postDeployment Script Path + if (fs.existsSync(path.join(artifactDirectory, 'scripts', `postDeployment`))) + cleanedUpProjectManifest.packageDirectories[0].postDeploymentScript = path.join( + 'scripts', + `postDeployment` + ); + + fs.writeFileSync(path.join(artifactDirectory, 'sfdx-project.json'), JSON.stringify(cleanedUpProjectManifest)); + + // Copy original package manifest + let manifestsDir: string = path.join(artifactDirectory, `manifests`); + mkdirpSync(manifestsDir); + fs.copySync(path.join(projectDirectory, 'sfdx-project.json'), path.join(manifestsDir, 'sfdx-project.json.ori')); + } + + /** + * Create scripts directory containing preDeploy & postDeploy + * @param artifactDirectory + * @param projectDirectory + * @param sfdx_package + */ + private static createScripts(artifactDirectory: string, projectDirectory: string, sfdx_package): void { + let scriptsDir: string = path.join(artifactDirectory, `scripts`); + mkdirpSync(scriptsDir); + + let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(projectDirectory, sfdx_package); + + if (packageDescriptor.preDeploymentScript) { + if (projectDirectory) + packageDescriptor.preDeploymentScript = path.join( + projectDirectory, + packageDescriptor.preDeploymentScript + ); + + if (fs.existsSync(packageDescriptor.preDeploymentScript)) { + fs.copySync(packageDescriptor.preDeploymentScript, path.join(scriptsDir, `preDeployment`)); + } else { + throw new Error(`preDeploymentScript ${packageDescriptor.preDeploymentScript} does not exist`); + } + } + + if (packageDescriptor.postDeploymentScript) { + if (projectDirectory) + packageDescriptor.postDeploymentScript = path.join( + projectDirectory, + packageDescriptor.postDeploymentScript + ); + + if (fs.existsSync(packageDescriptor.postDeploymentScript)) { + fs.copySync(packageDescriptor.postDeploymentScript, path.join(scriptsDir, `postDeployment`)); + } else { + throw new Error(`postDeploymentScript ${packageDescriptor.postDeploymentScript} does not exist`); + } + } + } + + /** + * Create root forceignore and forceignores directory containing ignore files for different stages + * @param artifactDirectory + * @param projectDirectory + */ + private static createForceIgnores(artifactDirectory: string, projectDirectory: string): void { + let forceIgnoresDir: string = path.join(artifactDirectory, `forceignores`); + mkdirpSync(forceIgnoresDir); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let ignoreFiles = projectConfig.plugins?.sfp?.ignoreFiles; + + //TODO: Make this readable + //This is a fix when sfppackage is used in stages where build is not involved + //So it has to be build from the root of the unzipped directory + //and whatever mentioned in .json is already translated + + let rootForceIgnore: string = path.join(projectDirectory, '.forceignore'); + let copyForceIgnoreForStage = (stage) => { + if (ignoreFiles?.[stage]) { + if (fs.existsSync(path.join(projectDirectory, ignoreFiles[stage]))) { + fs.copySync( + path.join(projectDirectory, ignoreFiles[stage]), + path.join(forceIgnoresDir, '.' + stage + 'ignore') + ); + } else if (fs.existsSync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'))) { + fs.copySync( + path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'), + path.join(forceIgnoresDir, '.' + stage + 'ignore') + ); + } else throw new Error(`${ignoreFiles[stage]} does not exist`); + } else fs.copySync(rootForceIgnore, path.join(forceIgnoresDir, '.' + stage + 'ignore')); + + //append additional entry to force ignore file + //TODO: Revisit the location + fs.appendFileSync( path.join(forceIgnoresDir, '.' + stage + 'ignore'),"\n**/postDeploy"); + }; + + let stages: string[] = ['prepare', 'validate', 'quickbuild', 'build']; + stages.forEach((stage) => copyForceIgnoreForStage(stage)); + + fs.copySync(rootForceIgnore, path.join(artifactDirectory, '.forceignore')); + } + + /** + * Replaces root forceignore with provided forceignore + * @param artifactDirectory + * @param pathToReplacementForceIgnore + */ + private static replaceRootForceIgnore( + artifactDirectory: string, + pathToReplacementForceIgnore: string, + logger: Logger + ): void { + if (fs.existsSync(pathToReplacementForceIgnore)) { + fs.copySync(pathToReplacementForceIgnore, path.join(artifactDirectory, '.forceignore')); + } else { + SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, logger); + SFPLogger.log( + 'Package creation will continue using the unchanged forceignore in the root directory', + LoggerLevel.INFO, + logger + ); + } + } + + private static copyDestructiveManifests( + destructiveManifestFilePath: string, + artifactDirectory: string, + projectDirectory: any, + logger: Logger + ) { + if (fs.existsSync(destructiveManifestFilePath)) { + try { + fs.mkdirsSync(path.join(artifactDirectory, 'destructive')); + fs.copySync( + path.join(projectDirectory, destructiveManifestFilePath), + path.join(artifactDirectory, 'destructive', 'destructiveChanges.xml') + ); + } catch (error) { + SFPLogger.log( + 'Unable to read/parse destructive manifest, Please check your artifacts, Will result in an error while deploying', + LoggerLevel.WARN, + logger + ); + } + } + } + + private static copyConfigFilePath( + configFilePath: string, + artifactDirectory: string, + projectDirectory: any, + logger: Logger + ) { + if (fs.existsSync(configFilePath)) { + try { + fs.mkdirsSync(path.join(artifactDirectory, 'config')); + fs.copySync( + path.join(projectDirectory, configFilePath), + path.join(artifactDirectory, 'config', 'project-scratch-def.json') + ); + } catch (error) { + SFPLogger.log(error, LoggerLevel.TRACE, logger); + SFPLogger.log('Utilizing default config file path', LoggerLevel.TRACE, logger); + } + } + } + + private static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts new file mode 100644 index 000000000..5d59eadba --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts @@ -0,0 +1,86 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import path from 'path'; +import FileSystem from '../../utils/FileSystem'; +import { CreatePackage } from './CreatePackage'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; + +const SFDMU_CONFIG = 'export.json'; +const VLOCITY_CONFIG = 'VlocityComponents.yaml'; + +export default class CreateDataPackageImpl extends CreatePackage { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Data; + } + + isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean { + let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory)); + + let hasExportJson = files.find((file) => path.basename(file) === 'export.json'); + + let hasCsvFile = files.find((file) => path.extname(file) === '.csv'); + + let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config + + if(hasYAMLFile) return false; + + if (!hasExportJson || !hasCsvFile) return true; + else return false; + } + + preCreatePackage(sfpPackage) { + this.validateDataPackage(sfpPackage.resolvedPackageDirectory); + } + + createPackage(sfpPackage: SfpPackage) { + //Do Nothing, as no external calls or processing is required + } + + postCreatePackage(sfpPackage: SfpPackage) {} + + printAdditionalPackageSpecificHeaders() {} + + // Validate type of data package and existence of the correct configuration files + private validateDataPackage(packageDirectory: string) { + const files = FileSystem.readdirRecursive(packageDirectory); + let isSfdmu: boolean; + let isVlocity: boolean; + + for (const file of files) { + if (path.basename(file) === SFDMU_CONFIG) isSfdmu = true; + if (path.basename(file) === VLOCITY_CONFIG) isVlocity = true; + } + + if (isSfdmu && isVlocity) { + throw new Error( + `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration` + ); + } else if (isSfdmu) { + SFPLogger.log( + `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, + LoggerLevel.INFO, + this.logger + ); + } else if (isVlocity) { + SFPLogger.log( + `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, + LoggerLevel.INFO, + this.logger + ); + } else { + throw new Error( + `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts new file mode 100644 index 000000000..e94b293ab --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts @@ -0,0 +1,271 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import SFPOrg from '../../org/SFPOrg'; +import CreateSourcePackageImpl from './CreateSourcePackageImpl'; +import PackageToComponent from '../components/PackageToComponent'; +import path from 'path'; +import * as fs from 'fs-extra'; +import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher'; +import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor'; +import PackageManifest from '../components/PackageManifest'; +import MetadataCount from '../components/MetadataCount'; +import * as rimraf from 'rimraf'; +import Component from '../../dependency/Component'; +import PackageComponentDiff from '../diff/PackageComponentDiff'; + +export default class CreateDiffPackageImp extends CreateSourcePackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Diff; + } + + printAdditionalPackageSpecificHeaders() {} + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + async preCreatePackage(sfpPackage: SfpPackage) { + const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); + + //Fetch Baseline commit from DevHub + let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg); + + if (this.packageCreationParams.revisionFrom) { + this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom; + } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) { + this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]; + } else { + this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion; + } + + if (this.packageCreationParams.revisionTo) { + this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo; + } else { + this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion; + } + } + + private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) { + let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts(); + let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts); + return packagesInstalledInOrgMappedToCommits; + } + + public async createPackage(sfpPackage: SfpPackage) { + //Unresolved SHAs can be same if the package is not installed in the org or is the same + if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) { + try { + let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff( + this.logger, + this.sfpPackage.packageName, + this.sfpPackage.commitSHAFrom, + this.sfpPackage.commitSHATo, + true + ); + await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff')); + } catch (error) { + //if both are same after git resolution.. just do nothing, treat is a normal source package + if (error.message.includes('Unable to compute diff, as both commits are same')) { + SFPLogger.log( + `Both commits are same, treating it as an empty package`, + LoggerLevel.WARN, + this.logger + ); + //Create an empty diff directory to force skip of packages + const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`); + fs.mkdirpSync(diffSrcDir); + } else throw error; + } + + await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger); + + await this.replaceSourceWithDiff( + sfpPackage.workingDirectory, + sfpPackage.packageDirectory, + `diff/${sfpPackage.packageDirectory}` + ); + + SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { + package: sfpPackage.packageName, + type: sfpPackage.packageType, + }); + } + } + + postCreatePackage(sfpPackage) {} + + private async replaceSourceWithDiff( + workingDirectory: string, + packageDirectory: string, + diffPackageDirectory: string + ) { + const srcDir = path.join(workingDirectory, packageDirectory); + const diffSrcDir = path.join(workingDirectory, diffPackageDirectory); + + // Check if src directories exist, if so remove them + if (fs.pathExistsSync(srcDir)) await fs.remove(srcDir); + + // Rename diff/src directory to src + if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir); + else { + // Ensure package directory exists + await fs.mkdirpSync(diffSrcDir); + await fs.move(diffSrcDir, srcDir); + } + + //check if destructiveChanges.xml exist in diff directory + const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml'); + if (fs.existsSync(destructiveChangesPath)) { + //Move destructiveChanges.xml to diff directory + await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml')); + } + //remove diffSrcDir + if (fs.pathExistsSync(path.join(workingDirectory, 'diff'))) + fs.removeSync(path.join(workingDirectory, 'diff')); + } + + async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) { + let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; + packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts); + + return packagesMappedToLastKnownCommitId; + + async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> { + const packagesToCommits: { [p: string]: string } = {}; + let jsonOverrides = {}; + + // Add an option to override diff package from during debugging + // Also useful for when the record is yet to be baselined + try { + const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8'); + jsonOverrides = JSON.parse(jsonData); + } catch (error) { + console.log('No JSON override file found or there is an error reading it'); + } + + // Merge the installedArtifacts data with the JSON overrides + if (installedArtifacts) { + installedArtifacts.forEach((artifact) => { + packagesToCommits[artifact.Name] = artifact.CommitId__c; + }); + } + + // Add additional packages from the JSON overrides that are not in installedArtifacts + Object.keys(jsonOverrides).forEach((pkgName) => { + if (!packagesToCommits.hasOwnProperty(pkgName)) { + packagesToCommits[pkgName] = jsonOverrides[pkgName]; + } + }); + + if (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; + + return packagesToCommits; + } + } + + private async introspectDiffPackageCreated( + sfpPackage: SfpPackage, + packageParams: SfpPackageParams, + logger: Logger + ): Promise { + let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff'); + if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) { + let changedComponents = new PackageToComponent( + sfpPackage.packageName, + path.join(workingDirectory, sfpPackage.packageDirectory) + ).generateComponents(); + + let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher( + sfpPackage, + changedComponents, + logger + ); + let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses(); + + //Convert again for finding the values in the diff package + let sourceToMdapiConvertor = new SourceToMDAPIConvertor( + workingDirectory, + sfpPackage.packageDescriptor.path, + sfpPackage.apiVersion, + logger + ); + + let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath; + + const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath); + + sfpPackage.payload = packageManifest.manifestJson; + sfpPackage.apexTestClassses = impactedTestClasses; + sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage( + changedComponents, + sfpPackage.apexClassesSortedByTypes + ); + sfpPackage.isApexFound = packageManifest.isApexInPackage(); + sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); + sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); + sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); + + sfpPackage.metadataCount = await MetadataCount.getMetadataCount( + workingDirectory, + sfpPackage.packageDescriptor.path + ); + rimraf.sync(mdapiDirPath); + } else { + //Souce Diff Directory is empty + sfpPackage.payload = {}; + sfpPackage.apexTestClassses = []; + sfpPackage.apexClassWithOutTestClasses = []; + sfpPackage.isApexFound = false; + sfpPackage.isProfilesFound = false; + sfpPackage.isPermissionSetGroupFound = false; + sfpPackage.isPayLoadContainTypesSupportedByProfiles = false; + sfpPackage.metadataCount = 0; + } + + function getOnlyChangedClassesFromPackage( + changedComponents: Component[], + apexClassesSortedByTypes: ApexSortedByType + ): string[] { + // Check if the parameters are not empty or undefined + if (!changedComponents || !apexClassesSortedByTypes) { + return undefined; + } + + // Check if the 'class' property exists in apexClassesSortedByTypes + if (!apexClassesSortedByTypes.class) { + return undefined; + } + + // Get the names of all classes in the ApexSortedByType + let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name); + let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name); + const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name); + apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name)); + apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name)); + + // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass' + const filteredComponents = changedComponents.filter( + (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass' + ); + + // Extract the fullName property from the filtered components + const filteredChangedClasses = filteredComponents.map((component) => component.fullName); + + return filteredChangedClasses; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts new file mode 100644 index 000000000..4f5225b8d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts @@ -0,0 +1,146 @@ +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; + +export abstract class CreatePackage { + private startTime: number; + + constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams?: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + //Initialize Params + if (this.params == null) this.params = {}; + } + + public async exec(): Promise { + //Capture Start TimegetSFDXProjectConfig + this.startTime = Date.now(); + + //Print Header + this.printHeader(); + + //Check if the package is empty + await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path); + //Call lifecycle commands + await this.preCreatePackage(this.sfpPackage); + await this.createPackage(this.sfpPackage); + await this.postCreatePackage(this.sfpPackage); + + //Add addtional descriptors available + this.writeDeploymentStepsToArtifact(this.sfpPackage); + + //Send Metrics to Logging system + this.sendMetricsWhenSuccessfullyCreated(); + + return this.sfpPackage; + } + + abstract getTypeOfPackage(); + + abstract preCreatePackage(sfpPackage: SfpPackage); + abstract createPackage(sfpPackage: SfpPackage); + abstract postCreatePackage(sfpPackage: SfpPackage); + + private sendMetricsWhenSuccessfullyCreated() { + let elapsedTime = Date.now() - this.startTime; + + this.sfpPackage.creation_details = { + creation_time: elapsedTime, + timestamp: Date.now(), + }; + + if (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked) + SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + }); + + SFPStatsSender.logCount('package.created', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + + SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + } + + private writeDeploymentStepsToArtifact(packageDescriptor: any) { + if (packageDescriptor.assignPermSetsPreDeployment) { + if (packageDescriptor.assignPermSetsPreDeployment instanceof Array) + this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment; + else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); + } + + if (packageDescriptor.assignPermSetsPostDeployment) { + if (packageDescriptor.assignPermSetsPostDeployment instanceof Array) + this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment; + else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); + } + } + + private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) { + if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) { + if (this.packageCreationParams.breakBuildIfEmpty) + throw new Error(`Package directory ${packageDirectory} is empty`); + else this.printEmptyArtifactWarning(); + } + } + + abstract isEmptyPackage(projectDirectory: string, packageDirectory: string); + + protected printEmptyArtifactWarning() { + SFPLogger.printHeaderLine( + `WARNING! Empty aritfact encountered`, + COLOR_WARNING, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + 'Either this folder is empty or the application of .forceignore results in an empty folder', + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger); + SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger); + } + + private printHeader() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create package`)}`), LoggerLevel.INFO, this.logger); + SFPLogger.log( + COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`), + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`), + LoggerLevel.INFO, + this.logger + ); + + SFPLogger.log( + COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`), + LoggerLevel.INFO, + this.logger + ); + + this.printAdditionalPackageSpecificHeaders(); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + abstract printAdditionalPackageSpecificHeaders(); +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts new file mode 100644 index 000000000..bbef35a16 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts @@ -0,0 +1,117 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import { ApexSortedByType, FileDescriptor } from '../../apex/parser/ApexTypeFetcher'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { CreatePackage } from './CreatePackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; +import { COLOR_INFO } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +const Table = require('cli-table'); + +export default class CreateSourcePackageImpl extends CreatePackage { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Source; + } + + printAdditionalPackageSpecificHeaders() {} + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + preCreatePackage(sfpPackage: SfpPackage) {} + + public async createPackage(sfpPackage: SfpPackage) { + this.handleApexTestClasses(sfpPackage); + + SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { + package: sfpPackage.packageName, + type: sfpPackage.packageType, + }); + } + + postCreatePackage(sfpPackage) {} + + protected handleApexTestClasses(sfpPackage: SfpPackage) { + let classTypes: ApexSortedByType = sfpPackage.apexClassesSortedByTypes; + + if (sfpPackage.isApexFound && classTypes?.testClass?.length == 0) { + this.printSlowDeploymentWarning(); + sfpPackage.isTriggerAllTests = true; + } else if (sfpPackage.isApexFound && classTypes?.testClass?.length > 0) { + if (classTypes?.parseError?.length > 0) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + SFPLogger.log( + 'Unable to parse these classes to correctly identify test classes, Its not your issue, its ours!'+ + 'Please raise a issue in our repo!', + LoggerLevel.INFO, + this.logger + ); + this.printClassesIdentified(classTypes?.parseError); + sfpPackage.isTriggerAllTests = true; + } else { + this.printHintForOptimizedDeployment(); + sfpPackage.isTriggerAllTests = false; + this.printClassesIdentified(classTypes?.testClass); + sfpPackage.apexTestClassses = []; + classTypes?.testClass.forEach((element) => { + sfpPackage.apexTestClassses.push(element.name); + }); + } + } + } + + private printHintForOptimizedDeployment() { + SFPLogger.printHeaderLine('OPTION FOR DEPLOYMENT OPTIMIZATION AVAILABLE',COLOR_HEADER,LoggerLevel.INFO,this.logger); + SFPLogger.log( + `Following apex test classes were identified and can be used for deploying this package,${EOL}` + + `in an optimal manner, provided each individual class meets the test coverage requirement of 75% and above${EOL}` + + `Ensure each apex class/trigger is validated for coverage in the validation stage`, + null, + this.logger + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + private printSlowDeploymentWarning() { + SFPLogger.printHeaderLine('WARNING! YOU MIGHT NOT BE ABLE TO DEPLOY OR WILL HAVE A SLOW DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,this.logger); + SFPLogger.log( + `This package has apex classes/triggers, however apex test classes were not found, You would not be able to deploy` + + `to production org optimally if each class do not have coverage of 75% and above,We will attempt deploying` + + `this package by triggering all local tests in the org which could be realy costly in terms of deployment time!`, + null, + this.logger + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + private printClassesIdentified(fetchedClasses: FileDescriptor[]) { + if (fetchedClasses === null || fetchedClasses === undefined) return; + + let table = new Table({ + head: ['Class', 'Error'], + chars: ZERO_BORDER_TABLE + }); + + for (let fetchedClass of fetchedClasses) { + let item = [fetchedClass.name, fetchedClass.error ? JSON.stringify(fetchedClass.error) : 'N/A']; + table.push(item); + } + SFPLogger.log('Following apex test classes were identified', LoggerLevel.INFO, this.logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts new file mode 100644 index 000000000..3d15823b1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts @@ -0,0 +1,262 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import { delay } from '../../utils/Delay'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { CreatePackage } from './CreatePackage'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import PackageVersionCoverage from '../coverage/PackageVersionCoverage'; +import { Connection, SfProject } from '@salesforce/core'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import { EOL } from 'os'; +import SFPOrg, { PackageTypeInfo } from '../../org/SFPOrg'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import { PackageVersion, PackageVersionCreateRequestResult } from '@salesforce/packaging'; +import { Duration } from '@salesforce/kit'; +import PackageDependencyDisplayer from '../../display/PackageDependencyDisplayer'; +const path = require('path'); + +export default class CreateUnlockedPackageImpl extends CreatePackage { + private static packageTypeInfos: PackageTypeInfo[]; + private isOrgDependentPackage: boolean = false; + private connection: Connection; + private devhubOrg: SFPOrg; + workingDirectory: string; + + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Unlocked; + } + + async preCreatePackage(sfpPackage: SfpPackage) { + this.devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); + + this.connection = this.devhubOrg.getConnection(); + + let packageId = ProjectConfig.getPackageId(sfpPackage.projectConfig, this.sfpPackage.packageName); + + // Get working directory + this.workingDirectory = sfpPackage.workingDirectory; + + //Get the one in working directory, this is always hardcoded to match + this.params.configFilePath = path.join('config', 'project-scratch-def.json'); + + //Get Type of Package + SFPLogger.log('Fetching Package Type Info from DevHub', LoggerLevel.INFO, this.logger); + let packageTypeInfos = await this.getPackageTypeInfos(); + let packageTypeInfo = packageTypeInfos.find((pkg) => pkg.Id == packageId); + if (packageTypeInfo == null) { + SFPLogger.log( + 'Unable to find a package info for this particular package, Are you sure you created this package?', + LoggerLevel.WARN, + this.logger + ); + throw new Error('Unable to fetch Package Info'); + } + + if (packageTypeInfo.IsOrgDependent == 'Yes') this.isOrgDependentPackage = true; + + SFPLogger.log(`Package ${packageTypeInfo.Name}`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`IsOrgDependent ${packageTypeInfo.IsOrgDependent}`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Package Id ${packageTypeInfo.Id}`, LoggerLevel.INFO, this.logger); + SFPLogger.log('-------------------------', LoggerLevel.INFO, this.logger); + + //cleanup sfp constructs in working directory + this.deletesfpAdditionsToProjectConfig(this.workingDirectory); + + //Resolve the package dependencies + if (this.isOrgDependentPackage) { + // Store original dependencies to artifact + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } else if (!this.isOrgDependentPackage && !this.packageCreationParams.isSkipValidation) { + sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + this.workingDirectory, + this.sfpPackage.packageName + ); + //Store the resolved dependencies + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } else { + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } + + //Print Dependencies + PackageDependencyDisplayer.printPackageDependencies(sfpPackage.dependencies,sfpPackage.projectConfig, this.logger); + + } + + async createPackage(sfpPackage: SfpPackage) { + const sfProject = await SfProject.resolve(this.workingDirectory); + + // fix for #1202 + // bug packaging lib doesnt support unpackaged metadata from working directory which is not the root + // it keeps on searching for the unpackage in the root folder + // so fix up the path manually + let targetPackageDir = sfProject.getPackageDirectories()[0]; + if (targetPackageDir['unpackagedMetadata']) + targetPackageDir['unpackagedMetadata'] = { path: path.join(this.workingDirectory, 'unpackagedMetadata') }; + + let result = await PackageVersion.create( + { + connection: this.devhubOrg.getConnection(), + project: sfProject, + installationkey: this.packageCreationParams.installationkey, + installationkeybypass: this.packageCreationParams.installationkeybypass, + tag: sfpPackage.tag, + skipvalidation: + this.packageCreationParams.isSkipValidation && !this.isOrgDependentPackage ? true : false, + codecoverage: + this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage ? true : false, + versionnumber: sfpPackage.versionNumber, + definitionfile: path.join(this.workingDirectory, this.params.configFilePath), + packageId: this.sfpPackage.packageName, + }, + { timeout: Duration.minutes(0), frequency: Duration.seconds(30) } + ); + + SFPLogger.log(`Package creation for ${this.sfpPackage.packageName} Initiated`, LoggerLevel.INFO, this.logger); + //Poll for package creation every 30 seconds + let currentPackageCreationStatus: PackageVersionCreateRequestResult; + while (true) { + await delay(30000); //Poll every 30 seconds + currentPackageCreationStatus = await PackageVersion.getCreateStatus( + result.Id, + this.devhubOrg.getConnection() + ); + + //Too Verbose when reading errors.. use only for debug + SFPLogger.log( + `Status: ${COLOR_KEY_MESSAGE(currentPackageCreationStatus.Status)}, Next Status check in 30 seconds`, + LoggerLevel.DEBUG, + this.logger + ); + if (currentPackageCreationStatus.Status === `Success`) { + break; + } else if (currentPackageCreationStatus.Status === 'Error') { + let errorMessage = ''; + const errors = currentPackageCreationStatus?.Error; + if (errors?.length) { + errorMessage = 'Creation errors: '; + for (let i = 0; i < errors.length; i++) { + errorMessage += `\n${i + 1}) ${errors[i]}`; + } + } + throw new Error(`Unable to create ${this.sfpPackage.packageName} due to \n` + errorMessage); + } + } + + SFPLogger.log(`Package Result:${JSON.stringify(currentPackageCreationStatus)}`, LoggerLevel.TRACE, this.logger); + + //Get the full details on the package and throw an error if the result is null, usually when the comamnd is timed out + if (currentPackageCreationStatus.SubscriberPackageVersionId) { + sfpPackage.package_version_id = currentPackageCreationStatus.SubscriberPackageVersionId; + await this.getPackageInfo(sfpPackage); + } else { + throw new Error( + `The build for ${this.sfpPackage.packageName} was not completed in the wait time ${this.packageCreationParams.waitTime} provided.${EOL} + You might want to increase the wait time or better check the dependencies or convert to different package type ${EOL} + Read more about it here https://docs.flxblio.io/development-practices/types-of-packaging/unlocked-packages#build-options-with-unlocked-packages` + ); + } + + //Break if coverage is low + if (this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage) { + if (!sfpPackage.has_passed_coverage_check) + throw new Error('This package has not meet the minimum coverage requirement of 75%'); + } + } + + postCreatePackage(sfpPackage: SfpPackage) { + //copy the original config back as existing one would have cleaned up + fs.copyFileSync( + path.join(this.workingDirectory, 'sfdx-project-bak.json'), + path.join(this.workingDirectory, 'sfdx-project.json') + ); + fs.unlinkSync(path.join(this.workingDirectory, 'sfdx-project-bak.json')); + if (sfpPackage.isDependencyValidated) { + SFPStatsSender.logGauge('package.testcoverage', sfpPackage.test_coverage, { + package: sfpPackage.package_name, + from: 'createpackage', + }); + } + } + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + printAdditionalPackageSpecificHeaders() {} + + private deletesfpAdditionsToProjectConfig(workingDirectory: string) { + let projectManifestFromWorkingDirectory = ProjectConfig.getSFDXProjectConfig(workingDirectory); + let packageDescriptorInWorkingDirectory = ProjectConfig.getPackageDescriptorFromConfig( + this.sfpPackage.packageName, + projectManifestFromWorkingDirectory + ); + + fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project-bak.json'), projectManifestFromWorkingDirectory); + + //Cleanup sfp constructs + if (this.isOrgDependentPackage) delete packageDescriptorInWorkingDirectory['dependencies']; + + delete packageDescriptorInWorkingDirectory['type']; + delete packageDescriptorInWorkingDirectory['assignPermSetsPreDeployment']; + delete packageDescriptorInWorkingDirectory['assignPermSetsPostDeployment']; + delete packageDescriptorInWorkingDirectory['skipDeployOnOrgs']; + delete packageDescriptorInWorkingDirectory['skipTesting']; + delete packageDescriptorInWorkingDirectory['skipCoverageValidation']; + delete packageDescriptorInWorkingDirectory['ignoreOnStages']; + delete packageDescriptorInWorkingDirectory['ignoreDeploymentErrors']; + delete packageDescriptorInWorkingDirectory['preDeploymentScript']; + delete packageDescriptorInWorkingDirectory['postDeploymentScript']; + delete packageDescriptorInWorkingDirectory['aliasfy']; + delete packageDescriptorInWorkingDirectory['checkpointForPrepare']; + delete packageDescriptorInWorkingDirectory['testSynchronous']; + delete packageDescriptorInWorkingDirectory['tags']; + + fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project.json'), projectManifestFromWorkingDirectory); + } + + private async getPackageInfo(sfpPackage: SfpPackage) { + let packageVersionCoverage: PackageVersionCoverage = new PackageVersionCoverage(this.connection, this.logger); + let count = 0; + while (count < 10) { + count++; + try { + SFPLogger.log('Fetching Version Number and Coverage details', LoggerLevel.INFO, this.logger); + + let pkgInfoResult = await packageVersionCoverage.getCoverage(sfpPackage.package_version_id); + + sfpPackage.isDependencyValidated = !this.packageCreationParams.isSkipValidation; + sfpPackage.package_version_number = pkgInfoResult.packageVersionNumber; + sfpPackage.test_coverage = pkgInfoResult.coverage; + sfpPackage.has_passed_coverage_check = pkgInfoResult.HasPassedCodeCoverageCheck; + break; + } catch (error) { + SFPLogger.log( + `Unable to fetch package version info due to ${error.message}`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log('Retrying...', LoggerLevel.INFO, this.logger); + await delay(2000); + continue; + } + } + } + + private async getPackageTypeInfos() { + if (CreateUnlockedPackageImpl.packageTypeInfos == null) { + CreateUnlockedPackageImpl.packageTypeInfos = await this.devhubOrg.listAllPackages(); + } + return CreateUnlockedPackageImpl.packageTypeInfos; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts b/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts new file mode 100644 index 000000000..c58e992d7 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts @@ -0,0 +1,52 @@ +import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; +import path from 'path'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class SourceToMDAPIConvertor { + public constructor( + private projectDirectory: string, + private sourceDirectory: string, + private sourceApiVersion: string, + private logger?: Logger + ) {} + + public async convert() { + let mdapiDir = `.sfp/${this.makefolderid(5)}_mdapi`; + //Create destination directory + if (this.projectDirectory != null) mdapiDir = path.resolve(this.projectDirectory, mdapiDir); + + //Source Directory is nested inside project directory when used with artifacts + //TODO: projectDirectory nomenclature is incorrect, should be parentDirectory perhaps? + let resolvedSourceDirectory = this.sourceDirectory; + if (this.projectDirectory != null) + resolvedSourceDirectory = path.resolve(this.projectDirectory, this.sourceDirectory); + + //Build component set from provided source directory + let componentSet = ComponentSet.fromSource({ + fsPaths: [resolvedSourceDirectory], + }); + + if (this.sourceApiVersion) componentSet.sourceApiVersion = this.sourceApiVersion; + + const converter = new MetadataConverter(); + let convertResult = await converter.convert(componentSet, 'metadata', { + type: 'directory', + outputDirectory: mdapiDir, + }); + SFPLogger.log(`Source converted successfully to ${mdapiDir}`, LoggerLevel.TRACE, this.logger); + SFPLogger.log(`ConvertResult:` + JSON.stringify(convertResult), LoggerLevel.TRACE, this.logger); + + return convertResult; + } + + private makefolderid(length): string { + var result = ''; + var characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts new file mode 100644 index 000000000..9d4af0579 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts @@ -0,0 +1,104 @@ +const fs = require('fs-extra'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFDMURunImpl from '../../sfdmuwrapper/SFDMURunImpl'; +import VlocityPackDeployImpl from '../../vlocitywrapper/VlocityPackDeployImpl'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +const path = require('path'); +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; + +export default class InstallDataPackageImpl extends InstallPackage { + public constructor( + sfpPackage: SfpPackage, + targetOrg:SFPOrg, + logger: Logger, + options: SfpPackageInstallationOptions, + ) { + super(sfpPackage, targetOrg, logger,options); + } + + public async install() { + try { + //Fetch the sfdxcommand executor for the type + let dataPackageDeployer: SFDXCommand = await this.getSFDXCommand( + this.sfpPackage.sourceDir, + this.packageDirectory + ); + + SFPLogger.log(`Executing installation command: ${dataPackageDeployer.getGeneratedSFDXCommandWithParams()}`,LoggerLevel.INFO,this.logger); + let result = await dataPackageDeployer.exec(false); + + SFPLogger.log(result, LoggerLevel.INFO, this.logger); + } catch (error) { + let csvIssuesReportFilepath: string = path.join( + this.sfpPackage.sourceDir, + this.packageDirectory, + `CSVIssuesReport.csv` + ); + if (fs.existsSync(csvIssuesReportFilepath)) { + SFPLogger.log( + `\n---------------------WARNING: SFDMU detected CSV issues, verify the following files -------------------------------`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log(fs.readFileSync(csvIssuesReportFilepath, 'utf8'), LoggerLevel.INFO, this.logger); + } + throw error; + } + } + private async getSFDXCommand(sourceDirectory: string, packageDirectory: string): Promise { + //Determine package type + let packageType: string = this.determinePackageType(path.join(sourceDirectory, packageDirectory)); + + //Pick the type of SFDX command to use + let dataPackageDeployer: SFDXCommand; + if (packageType === 'sfdmu') { + let orgDomainUrl = await new OrgDetailsFetcher( this.sfpOrg.getUsername()).getOrgDomainUrl(); + + dataPackageDeployer = new SFDMURunImpl( + sourceDirectory, + this.sfpOrg.getUsername(), + orgDomainUrl, + packageDirectory, + this.logger, + LoggerLevel.INFO + ); + } else if (packageType === 'vlocity') { + dataPackageDeployer = new VlocityPackDeployImpl( + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + packageDirectory, + null, + null + ); + } else { + throw new Error('Unsupported package type'); + } + + return dataPackageDeployer; + } + + private determinePackageType(packageDirectory: string): string { + if (fs.pathExistsSync(path.join(packageDirectory, 'export.json'))) { + SFPLogger.log( + `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, + LoggerLevel.INFO, + this.logger + ); + return 'sfdmu'; + } else if (fs.pathExistsSync(path.join(packageDirectory, 'VlocityComponents.yaml'))) { + SFPLogger.log( + `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, + LoggerLevel.INFO, + this.logger + ); + return 'vlocity'; + } else { + throw new Error( + `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts new file mode 100644 index 000000000..304a5e2bd --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts @@ -0,0 +1,497 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { PackageInstallationResult, PackageInstallationStatus } from './PackageInstallationResult'; +import ProjectConfig from '../../project/ProjectConfig'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import AssignPermissionSets from '../../permsets/AssignPermissionSets'; +import ScriptExecutor from '../../scriptExecutor/ScriptExecutorHelpers'; +import { Connection } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import FileSystem from '../../utils/FileSystem'; +import OrgDetailsFetcher, { OrgDetails } from '../../org/OrgDetailsFetcher'; +import path = require('path'); +import PermissionSetGroupUpdateAwaiter from '../../permsets/PermissionSetGroupUpdateAwaiter'; +import SfpOrg from '../../org/SFPOrg'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; +import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import getFormattedTime from '../../utils/GetFormattedTime'; +import { TestLevel } from '../../apextest/TestOptions'; +import { PostDeployersRegistry } from '../deploymentCustomizers/PostDeployersRegistry'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import PackageComponentPrinter from '../../display/PackageComponentPrinter'; +import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; +import { PreDeployersRegistry } from '../deploymentCustomizers/PreDeployersRegistry'; +import { AnalyzerRegistry } from '../../package/analyser/AnalyzerRegistry'; + +export class SfpPackageInstallationOptions { + installationkey?: string; + apexcompile?: string = 'package'; + securitytype?: string = 'none'; + upgradetype?: string = 'mixed-mode'; + waitTime?: string; + apiVersion?: string; + publishWaitTime?: number = 60; + skipTesting?: boolean; + optimizeDeployment?: boolean; + deploymentType?: DeploymentType; + disableArtifactCommit?: boolean = false; + isInstallingForValidation?: boolean; + skipIfPackageInstalled: boolean; + isDryRun?: boolean = false; + pathToReplacementForceIgnore?: string; +} + +export abstract class InstallPackage { + protected connection: Connection; + protected packageDescriptor; + protected packageDirectory; + + private _isArtifactToBeCommittedInOrg: boolean = true; + + public constructor( + protected sfpPackage: SfpPackage, + protected sfpOrg: SfpOrg, + protected logger: Logger, + protected options: SfpPackageInstallationOptions + ) { } + + public async exec(): Promise { + let startTime = Date.now(); + let elapsedTime: number; + try { + this.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + this.sfpPackage.sourceDir, + this.sfpPackage.packageName + ); + + this.connection = this.sfpOrg.getConnection(); + + if (await this.isPackageToBeInstalled(this.options.skipIfPackageInstalled)) { + if (!this.options.isDryRun) { + await this.waitTillAllPermissionSetGroupIsUpdated(); + await this.assignPermsetsPreDeployment(); + await this.executePreDeploymentScripts(); + await this.setPackageDirectoryForPackage(); + await this.executePreDeployers(); + await this.checkPackageDirectoryExists(); + await this.install(); + await this.assignPermsetsPostDeployment(); + await this.executePostDeployers(); + await this.executePostDeploymentScript(); + await this.commitPackageInstallationStatus(); + + elapsedTime = Date.now() - startTime; + this.sendMetricsWhenSuccessfullyInstalled(elapsedTime); + } + return { result: PackageInstallationStatus.Succeeded, elapsedTime: elapsedTime }; + } else { + SFPLogger.log('Skipping Package Installation', LoggerLevel.INFO, this.logger); + return { result: PackageInstallationStatus.Skipped }; + } + } catch (error) { + elapsedTime = Date.now() - startTime; + this.sendMetricsWhenFailed(elapsedTime); + return { + result: PackageInstallationStatus.Failed, + message: error.message, + elapsedTime: elapsedTime, + }; + } + } + + checkPackageDirectoryExists() { + let absPackageDirectory: string = path.join(this.sfpPackage.sourceDir, this.packageDirectory); + if (!fs.existsSync(absPackageDirectory)) { + throw new Error(`Package directory ${absPackageDirectory} does not exist`); + } + } + + private async waitTillAllPermissionSetGroupIsUpdated() { + try { + //Package Has Permission Set Group + let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( + this.connection, + this.logger + ); + await permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated(); + } catch (error) { + //Ignore error + // Lets try proceeding + SFPLogger.log( + `Unable to check the status of Permission Set Groups due to ${error}`, + LoggerLevel.WARN, + this.logger + ); + } + } + + protected async setPackageDirectoryForPackage() { + if (this.packageDescriptor.aliasfy) { + const searchDirectory = path.join(this.sfpPackage.sourceDir, this.packageDescriptor.path); + const files = FileSystem.readdirRecursive(searchDirectory, true); + + let aliasDir: string; + + let alias = await this.sfpOrg.getAlias(); + aliasDir = files.find( + (file) => path.basename(file) === alias && fs.lstatSync(path.join(searchDirectory, file)).isDirectory() + ); + + SFPLogger.log(`Using alias directory ${aliasDir ? aliasDir : 'default'}`, LoggerLevel.INFO, this.logger); + + if (!aliasDir) { + const orgDetails = await new OrgDetailsFetcher(this.sfpOrg.getUsername()).getOrgDetails(); + + if (orgDetails.isSandbox) { + // If the target org is a sandbox, find a 'default' directory to use as package directory + aliasDir = files.find( + (file) => + path.basename(file) === 'default' && + fs.lstatSync(path.join(searchDirectory, file)).isDirectory() + ); + } + } + + if (!aliasDir) { + throw new Error( + `Aliasfied package '${this.sfpPackage.packageName}' does not have an alias with '${alias}' or 'default' directory` + ); + } + + this.packageDirectory = path.join(this.packageDescriptor.path, aliasDir); + } + else { + this.packageDirectory = path.join(this.packageDescriptor['path']); + } + + } + + private sendMetricsWhenFailed(elapsedTime: number) { + SFPLogger.log( + `Package ${COLOR_KEY_MESSAGE( + this.sfpPackage.package_name + )} installation attempt failed,it took ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` + ); + SFPStatsSender.logCount('package.installation.failure', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + } + + private sendMetricsWhenSuccessfullyInstalled(elapsedTime: number) { + SFPLogger.log( + `Package ${COLOR_KEY_MESSAGE(this.sfpPackage.package_name)} installation took ${COLOR_KEY_MESSAGE( + getFormattedTime(elapsedTime) + )}`, + LoggerLevel.INFO, + this.logger + ); + SFPStatsSender.logElapsedTime('package.installation.elapsed_time', elapsedTime, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + SFPStatsSender.logCount('package.installation', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + } + + //Set this to disable whethere info about the artifact has to be recorded in the org + public set isArtifactToBeCommittedInOrg(toCommit: boolean) { + this._isArtifactToBeCommittedInOrg = toCommit; + } + + private async commitPackageInstallationStatus() { + if (this._isArtifactToBeCommittedInOrg) { + try { + await this.sfpOrg.updateArtifactInOrg(this.logger, this.sfpPackage); + } catch (error) { + SFPLogger.log( + 'Unable to commit information about the package into org..Check whether prerequisities are installed', + LoggerLevel.WARN, + this.logger + ); + } + } + } + + protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { + if (skipIfPackageInstalled) { + let installationStatus = await this.sfpOrg.isArtifactInstalledInOrg(this.logger, this.sfpPackage); + return !installationStatus.isInstalled; + } else if(this.sfpPackage.packageType == PackageType.Diff) + { + // If diff package, check if there are any changes to be deployed, else skip + if(!this.sfpPackage.destructiveChanges && this.sfpPackage.metadataCount==0) + { + return false; + } + } + + return true; // Always install packages if skipIfPackageInstalled is false + } + + private async assignPermsetsPreDeployment() { + try { + if (this.sfpPackage.assignPermSetsPreDeployment) { + SFPLogger.log('Assigning permission sets before deployment:', LoggerLevel.INFO, this.logger); + + await AssignPermissionSets.applyPermsets( + this.sfpPackage.assignPermSetsPreDeployment, + this.connection, + this.sfpPackage.sourceDir, + this.logger + ); + } + } catch (error) { + //Proceed ahead not a critical error to break installation + SFPLogger.log(`Unable to assign permsets (Pre Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public async executePreDeploymentScripts() { + let preDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `preDeployment`); + if (fs.existsSync(preDeploymentScript)) { + let alias = await this.sfpOrg.getAlias(); + SFPLogger.log('Executing preDeployment script', LoggerLevel.INFO, this.logger); + await ScriptExecutor.executeScript( + this.logger, + preDeploymentScript, + this.sfpPackage.packageName, + this.sfpOrg.getUsername(), + alias ? alias : this.sfpOrg.getUsername(), + this.sfpPackage.sourceDir, + this.sfpPackage.packageDirectory + ); + } + } + + abstract install(); + + private async assignPermsetsPostDeployment() { + try { + if (this.sfpPackage.assignPermSetsPostDeployment) { + SFPLogger.log('Assigning permission sets after deployment:', LoggerLevel.INFO, this.logger); + + await AssignPermissionSets.applyPermsets( + this.sfpPackage.assignPermSetsPostDeployment, + this.connection, + this.sfpPackage.sourceDir, + this.logger + ); + } + } catch (error) { + //Proceed ahead not a critical error to break installation + SFPLogger.log(`Unable to assign permsets (Post Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public async executePostDeploymentScript() { + let postDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `postDeployment`); + if (fs.existsSync(postDeploymentScript)) { + SFPLogger.log('Executing postDeployment script', LoggerLevel.INFO, this.logger); + let alias = await this.sfpOrg.getAlias(); + await ScriptExecutor.executeScript( + this.logger, + postDeploymentScript, + this.sfpPackage.packageName, + this.sfpOrg.getUsername(), + alias ? alias : this.sfpOrg.getUsername(), + this.sfpPackage.sourceDir, + this.sfpPackage.packageDirectory + ); + } + } + + private async executePostDeployers() { + SFPLogger.log(`Executing Post Deployers`, LoggerLevel.INFO, this.logger); + + //Gather componentSet + let componentSet = ComponentSet.fromSource( + path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) + ); + + for (const postDeployer of PostDeployersRegistry.getPostDeployers()) { + try { + if (await postDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { + SFPLogger.log( + `Executing Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, + LoggerLevel.INFO, + this.logger + ); + + await postDeployer.execute( + this.sfpPackage, + componentSet, + this.sfpOrg, + this.logger, + {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} + ); + + } else { + SFPLogger.log( + `Post Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped or not enabled`, + LoggerLevel.INFO, + this.logger + ); + } + } catch (error) { + SFPLogger.log( + `Unable to process post deploy for ${postDeployer.getName()} due to ${error.message}`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped due to error`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + private async executePreDeployers() { + SFPLogger.log(`Executing Pre Deployers`, LoggerLevel.INFO, this.logger); + + //Gather componentSet + let componentSet = ComponentSet.fromSource( + path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) + ); + + let analyzers = AnalyzerRegistry.getAnalyzers(); + for (const analyzer of analyzers) { + if(await analyzer.isEnabled(this.sfpPackage, this.logger)) + { + SFPLogger.log(`Executing ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); + this.sfpPackage = await analyzer.analyze(this.sfpPackage,componentSet, this.logger); + } + else + { + SFPLogger.log(`Skipped ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); + } + } + + for (const preDeployer of PreDeployersRegistry.getPreDeployers()) { + try { + if (await preDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { + SFPLogger.log( + `Executing Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())}`, + LoggerLevel.INFO, + this.logger + ); + + await preDeployer.execute( + this.sfpPackage, + componentSet, + this.sfpOrg, + this.logger, + {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} + ); + + } else { + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped or not enabled`, + LoggerLevel.INFO, + this.logger + ); + } + } catch (error) { + SFPLogger.log( + `Unable to process pre deploy for ${preDeployer.getName()} due to ${error.message}`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped due to error`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + protected async generateDeploymentOptions( + waitTime: string, + optimizeDeployment: boolean, + skipTest: boolean, + target_org: string, + apiVersion: string + ): Promise { + let deploymentOptions: DeploymentOptions = { + ignoreWarnings: true, + waitTime: waitTime, + }; + deploymentOptions.ignoreWarnings = true; + deploymentOptions.waitTime = waitTime; + deploymentOptions.apiVersion = apiVersion; + + //Find Org Type + let orgDetails: OrgDetails; + try { + orgDetails = await new OrgDetailsFetcher(target_org).getOrgDetails(); + } catch (err) { + SFPLogger.log(`Unable to fetch org details,assuming it is production`, LoggerLevel.WARN, this.logger); + orgDetails = { + instanceUrl: undefined, + isScratchOrg: false, + isSandbox: false, + organizationType: undefined, + sfdxAuthUrl: undefined, + status: undefined, + }; + } + + + if (this.options.deploymentType == DeploymentType.MDAPI_DEPLOY && this.sfpPackage.isApexFound && this.options.isInstallingForValidation == false) { + if (orgDetails.isSandbox) { + //enforce during selective deployment + if (skipTest) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( + this.sfpPackage.apexTestClassses + ); + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } else { + if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( + this.sfpPackage.apexTestClassses + ); + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } + } + // #Issue 1417 + // Handle the use-cases of a not optimized source package validating + else if (this.sfpPackage.packageType == PackageType.Source && this.sfpPackage.isApexFound && this.options.isInstallingForValidation && !optimizeDeployment ) { + if (skipTest) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } else { + if (orgDetails.isSandbox) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = 'skip'; + } + } + + deploymentOptions.rollBackOnError = true; + return deploymentOptions; + } + + private getAStringOfSpecificTestClasses(apexTestClassses: string[]) { + let specifedTests = apexTestClassses.join(); + return specifedTests; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts new file mode 100644 index 000000000..dee64cf99 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts @@ -0,0 +1,397 @@ +import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; +import ReconcileProfileAgainstOrgImpl from '../components/ReconcileProfileAgainstOrgImpl'; +import DeployDestructiveManifestToOrgImpl from '../components/DeployDestructiveManifestToOrgImpl'; +import SFPLogger, { COLOR_SUCCESS, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +const path = require('path'); +const tmp = require('tmp'); +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import { TestLevel } from '../../apextest/TestOptions'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import ProjectConfig from '../../project/ProjectConfig'; +import { DeploymentFilterRegistry } from '../deploymentFilters/DeploymentFilterRegistry'; +import DeploymentOptionDisplayer from '../../display/DeploymentOptionDisplayer'; +import PackageComponentPrinter from '../../display/PackageComponentPrinter'; +import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; +import { COLOR_ERROR } from '@flxblio/sfp-logger'; +import { globSync } from 'glob'; + +export default class InstallSourcePackageImpl extends InstallPackage { + private pathToReplacementForceIgnore: string; + private deploymentType: DeploymentType; + + + + public constructor( + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + options: SfpPackageInstallationOptions, + logger: Logger + ) { + super(sfpPackage, targetOrg, logger, options); + this.options = options; + this.pathToReplacementForceIgnore = options.pathToReplacementForceIgnore; + this.deploymentType = options.deploymentType; + } + + public async install() { + let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); + let tempDir = tmpDirObj.name; + + try { + //Handle the right force ignore file + this.handleForceIgnores(); + + // Apply Destructive Manifest + await this.applyDestructiveChanges(); + + + //Apply Reconcile if Profiles are found + //To Reconcile we have to go for multiple deploys, first we have to reconcile profiles and deploy the metadata + let isReconcileActivated = false; + let isReconcileErrored = false; + let profileFolders; + ({ + profileFolders, + isReconcileActivated, + isReconcileErrored, + } = await this.reconcileProfilesBeforeDeployment( + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + tempDir + )); + + let deploymentOptions: DeploymentOptions; + let result: DeploySourceResult; + //Construct Deploy Command for actual payload + deploymentOptions = await this.generateDeploymentOptions( + this.options.waitTime, + this.options.optimizeDeployment, + this.options.skipTesting, + this.sfpOrg.getUsername(), + this.options.apiVersion + ); + + //enable source tracking + if (this.deploymentType === DeploymentType.SOURCE_PUSH) { + deploymentOptions.sourceTracking = true; + } + + //Make a copy.. dont mutate sourceDirectory + let resolvedSourceDirectory = this.sfpPackage.sourceDir; + + let emptyCheck = this.handleEmptyPackage(resolvedSourceDirectory, this.packageDirectory); + + if (emptyCheck.isToSkip == true) { + SFPLogger.log( + `${COLOR_SUCCESS(`Skipping the package as there is nothing to be deployed`)}`, + LoggerLevel.INFO, + this.logger + ); + return { + deploy_id: `000000`, + result: true, + message: `Package is empty, nothing to install,skipped`, + }; + } else if (emptyCheck.isToSkip == false) { + + //Create componentSet To Be Deployed + let componentSet = ComponentSet.fromSource( + path.resolve(emptyCheck.resolvedSourceDirectory, this.packageDirectory) + ); + + //Apply Filters + let deploymentFilters = DeploymentFilterRegistry.getImplementations(); + + for (const deploymentFilter of deploymentFilters) { + if ( + deploymentFilter.isToApply( + ProjectConfig.getSFDXProjectConfig(emptyCheck.resolvedSourceDirectory), + this.sfpPackage.packageType + ) + ) + componentSet = await deploymentFilter.apply(this.sfpOrg, componentSet, this.logger); + } + + //Check if there are components to be deployed after filtering + //Assume its successfully deployed + if (componentSet.size == 0) { + return { + deploy_id: `000000`, + result: true, + message: `Package contents were filtered out, nothing to install`, + }; + } + + //Print components inside Component Set + let components = componentSet.getSourceComponents(); + PackageComponentPrinter.printComponentTable(components, this.logger); + + + if (!this.options.isInstallingForValidation) { + DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); + } + + let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( + this.sfpOrg, + this.sfpPackage.sourceDir, + componentSet, + deploymentOptions, + this.logger + ); + + result = await deploySourceToOrgImpl.exec(); + + if (result.result) { + //Apply PostDeployment Activities + try { + if (isReconcileActivated) { + //Bring back the original profiles, reconcile and redeploy again + await this.reconcileAndRedeployProfiles( + profileFolders, + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + this.packageDirectory, + tempDir, + deploymentOptions + ); + } + } catch (error) { + + SFPLogger.log( + 'Failed to apply reconcile the second time, Partial Metadata applied', + LoggerLevel.INFO, + this.logger + ); + } + } else if (result.result === false) { + DeployErrorDisplayer.displayErrors(result.response, this.logger); + throw new Error(result.message); + } + } + //} + } catch (error) { + tmpDirObj.removeCallback(); + throw error; + } + } + + private handleEmptyPackage( + sourceDirectory: string, + packageDirectory: string + ): { isToSkip: boolean; resolvedSourceDirectory: string } { + //Check empty conditions + let status = PackageEmptyChecker.isToBreakBuildForEmptyDirectory(sourceDirectory, packageDirectory, false); + + + if (status.result == 'break') { + throw new Error('No components in the package, Please check your build again'); + } else if (status.result == 'skip') { + return { + isToSkip: true, + resolvedSourceDirectory: sourceDirectory, + }; + } else { + return { + isToSkip: false, + resolvedSourceDirectory: sourceDirectory, + }; + } + } + + private handleForceIgnores() { + if (this.pathToReplacementForceIgnore) { + this.replaceForceIgnoreInSourceDirectory(this.sfpPackage.sourceDir, this.pathToReplacementForceIgnore); + + + //Handle Diff condition + // if (this.isDiffFolderAvailable) + // this.replaceForceIgnoreInSourceDirectory( + // path.join(this.sfpPackage.sourceDir, 'diff'), + // this.pathToReplacementForceIgnore + // ); + } + } + + private async applyDestructiveChanges() { + + if(this.sfpPackage.destructiveChanges) + { + try { + SFPLogger.log( + 'Attempt to delete components mentioned in destructive manifest', + LoggerLevel.INFO, + this.logger + ); + let deployDestructiveManifestToOrg = new DeployDestructiveManifestToOrgImpl( + this.sfpOrg, + path.join(this.sfpPackage.sourceDir, 'destructive', 'destructiveChanges.xml') + ); + + await deployDestructiveManifestToOrg.exec(); + } catch (error) { + SFPLogger.log( + `We attempted a deletion of components, However we are not successful. \ + Either the components are already deleted or there are components which \ + have dependency to components in the manifest. \ + Please check whether this manifest works! \ + Actual Error Observed: \ + -------------------------------------- \ + ${COLOR_ERROR(error.message)}`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + private async reconcileProfilesBeforeDeployment(sourceDirectoryPath: string, target_org: string, tempDir: string) { + let profileFolders: any; + let isReconcileActivated: boolean = false; + let isReconcileErrored: boolean = false; + try { + //Hard exit.. no reconcile set in orchestrator + if (this.sfpPackage.reconcileProfiles == false) return { isReconcileActivated: false }; + + //Handle diff for fastfeedback + if (this.sfpPackage.isProfilesFound) { + } else { + return { isReconcileActivated: false }; + } + + SFPLogger.log( + 'Attempting reconcile to profiles as payload contain profiles', + LoggerLevel.INFO, + this.logger + ); + //copy the original profiles to temporary location + profileFolders = globSync('**/profiles', { + cwd: path.join(sourceDirectoryPath), + }); + if (profileFolders.length > 0) { + profileFolders.forEach((folder) => { + fs.copySync(path.join(sourceDirectoryPath, folder), path.join(tempDir, folder)); + }); + } + //Now Reconcile + let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( + this.sfpOrg, + path.join(sourceDirectoryPath), + this.logger + ); + await reconcileProfileAgainstOrg.exec(); + isReconcileActivated = true; + } catch (err) { + SFPLogger.log('Failed to reconcile profiles:' + err, LoggerLevel.INFO, this.logger); + isReconcileErrored = true; + if (profileFolders.length > 0) { + SFPLogger.log('Restoring original profiles as preprocessing failed', LoggerLevel.INFO, this.logger); + profileFolders.forEach((folder) => { + fs.copySync(path.join(tempDir, folder), path.join(this.sfpPackage.sourceDir, folder)); + }); + } + } + return { profileFolders, isReconcileActivated, isReconcileErrored }; + } + + private async reconcileAndRedeployProfiles( + profileFolders: string[], + sourceDirectoryPath: string, + target_org: string, + sourceDirectory: string, + tmpdir: string, + deploymentOptions: any + ) { + //if no profile supported metadata, no point in + //doing a reconcile + if (this.sfpPackage.isProfilesFound == false) return; + if (this.sfpPackage.isPayLoadContainTypesSupportedByProfiles == false) return; + + + if (profileFolders.length > 0) { + SFPLogger.log(`Restoring original profiles for reconcile and deploy`, LoggerLevel.INFO, this.logger); + profileFolders.forEach((folder) => { + fs.copySync(path.join(tmpdir, folder), path.join(sourceDirectoryPath, folder)); + }); + + //Now Reconcile + let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( + this.sfpOrg, + sourceDirectoryPath, + this.logger + ); + await reconcileProfileAgainstOrg.exec(); + + //Now deploy the profiles alone + + const profilesDirs = globSync('**/profiles/', { + cwd: path.join(sourceDirectoryPath, sourceDirectory), + absolute: true, + }); + + const profileDeploymentStagingDirectory = path.join( + sourceDirectoryPath, + 'ProfileDeploymentStagingDirectory' + ); + fs.mkdirpSync(path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); + + for (const dir of profilesDirs) { + // Duplicate profiles are overwritten + fs.copySync(dir, path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); + } + + fs.copySync( + path.join(sourceDirectoryPath, 'sfdx-project.json'), + path.join(profileDeploymentStagingDirectory, 'sfdx-project.json') + ); + fs.copySync( + path.join(sourceDirectoryPath, '.forceignore'), + path.join(profileDeploymentStagingDirectory, '.forceignore') + ); + + //Create componentSet To Be Deployed + let componentSet = ComponentSet.fromSource( + path.resolve(profileDeploymentStagingDirectory, sourceDirectory) + ); + + DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); + let deploySourceToOrgImpl: DeploySourceToOrgImpl = new DeploySourceToOrgImpl( + this.sfpOrg, + this.sfpPackage.sourceDir, + componentSet, + deploymentOptions, + this.logger + ); + let profileReconcile: DeploySourceResult = await deploySourceToOrgImpl.exec(); + + if (!profileReconcile.result) { + DeployErrorDisplayer.displayErrors(profileReconcile.response, this.logger); + SFPLogger.log('Unable to deploy reconciled profiles', LoggerLevel.INFO, this.logger); + } + } + } + + + + /** + * Replaces forceignore in source directory with provided forceignore + * @param sourceDirectory + * @param pathToReplacementForceIgnore + */ + private replaceForceIgnoreInSourceDirectory(sourceDirectory: string, pathToReplacementForceIgnore: string): void { + if (fs.existsSync(pathToReplacementForceIgnore)) + fs.copySync(pathToReplacementForceIgnore, path.join(sourceDirectory, '.forceignore')); + else { + SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, this.logger); + SFPLogger.log( + 'Package installation will continue using the unchanged forceignore in the source directory', + null, + this.logger + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts new file mode 100644 index 000000000..6635b61e8 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts @@ -0,0 +1,91 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; +import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; + +export default class InstallUnlockedPackage extends InstallPackage { + private packageVersionId; + + public constructor( + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + options: SfpPackageInstallationOptions, + logger: Logger + ) { + super(sfpPackage, targetOrg, logger, options); + this.packageVersionId = sfpPackage.package_version_id; + this.options = options; + } + + public async install() { + let installUnlockedPackageWrapper: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( + this.logger, + this.sfpOrg.getUsername(), + this.packageVersionId, + this.options, + this.sfpPackage.packageName + ); + await installUnlockedPackageWrapper.install(this.sfpPackage.payload); + } + + /** + * Checks whether unlocked package version is installed in org. + * Overrides base class method. + * @param skipIfPackageInstalled + * @returns + */ + protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { + try { + if (skipIfPackageInstalled) { + SFPLogger.log( + `${EOL}Checking whether package ${COLOR_KEY_MESSAGE( + this.sfpPackage.package_name + )} with ID ${COLOR_KEY_MESSAGE( + this.packageVersionId + )} is installed in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + let installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); + + let packageFound = installedPackages.find((installedPackage) => { + return installedPackage.subscriberPackageVersionId.substring(0,14) === this.packageVersionId.substring(0,14); + }); + + if (packageFound) { + SFPLogger.log( + `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + return false; + } else { + SFPLogger.log( + `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, + LoggerLevel.INFO, + this.logger + ); + return true; + } + } else { + SFPLogger.log( + 'Skip if package to be installed is false, Proceeding with installation', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } catch (error) { + SFPLogger.log( + 'Unable to check whether this package is installed in the target org', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts new file mode 100644 index 000000000..34af33f68 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts @@ -0,0 +1,134 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2Detail from '../Package2Detail'; +import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; +import SFPOrg from '../../org/SFPOrg'; +import { SfpPackageInstallationOptions } from './InstallPackage'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; + +export default class InstallUnlockedPackageCollection { + private installedPackages: Package2Detail[]; + constructor(private sfpOrg: SFPOrg, private logger: Logger,private dryRun:boolean=false) {} + + public async install( + package2s: Package2Detail[], + skipIfInstalled: boolean, + ignoreErrorIfAHigherVersionPackageIsInstalled: boolean = true + ) { + this.installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); + + SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); + + for (const package2 of package2s) { + if ( + package2.subscriberPackageVersionId && + this.isPackageToBeInstalled(skipIfInstalled, package2.subscriberPackageVersionId, package2.name) + ) { + SFPLogger.log( + `Installing Package ${package2.name} in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + let installUnlockedPackageImpl: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( + this.logger, + this.sfpOrg.getUsername(), + package2.subscriberPackageVersionId, + new SfpPackageInstallationOptions(), + package2.name + ); + if (package2.key) installUnlockedPackageImpl.setInstallationKey(package2.key); + try { + if(!this.dryRun) + await installUnlockedPackageImpl.install(); + } catch (error) { + let message: string = error.message; + if ( + message.includes(`A newer version of this package is currently installed`) && + ignoreErrorIfAHigherVersionPackageIsInstalled + ) { + SFPLogger.log( + `A higher version of this package is already installed and cant be dowgraded,skipping`, + LoggerLevel.WARN, + this.logger + ); + continue; + } else { + SFPLogger.log( + `Unable to install ${package2.name} in ${this.sfpOrg.getUsername()} due to ${message}`, + LoggerLevel.ERROR, + this.logger + ); + throw error; + } + } + } else { + SFPLogger.log( + `Skipping Installing of package ${COLOR_KEY_MESSAGE( + package2.name + )} in ${this.sfpOrg.getUsername()}`, + LoggerLevel.WARN, + this.logger + ); + } + } + + SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); + } + + /** + * Checks whether unlocked package version is installed in org. + * Overrides base class method. + * @param skipIfPackageInstalled + * @returns + */ + protected isPackageToBeInstalled( + skipIfPackageInstalled: boolean, + packageVersionId: string, + pacakgeName?: string + ): boolean { + try { + if (skipIfPackageInstalled) { + SFPLogger.log( + `${EOL}Checking whether package ${COLOR_KEY_MESSAGE(pacakgeName)} with ID ${COLOR_KEY_MESSAGE( + packageVersionId)}is installed in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + + let packageFound = this.installedPackages.find((installedPackage) => { + return installedPackage.subscriberPackageVersionId.substring(0,15) === packageVersionId.substring(0,15); + }); + + if (packageFound) { + SFPLogger.log( + `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + return false; + } else { + SFPLogger.log( + `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, + LoggerLevel.INFO, + this.logger + ); + return true; + } + } else { + SFPLogger.log( + 'Skip if package to be installed is false, Proceeding with installation', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } catch (error) { + SFPLogger.log( + 'Unable to check whether this package is installed in the target org', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts new file mode 100644 index 000000000..41574d826 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts @@ -0,0 +1,96 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_SUCCESS, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; +import SFPOrg from '../../org/SFPOrg'; +import { PackageInstallCreateRequest, PackagingSObjects, SubscriberPackageVersion } from '@salesforce/packaging'; +import { delay } from '../../utils/Delay'; +import { SfpPackageInstallationOptions } from './InstallPackage'; + + + +export default class InstallUnlockedPackageImpl { + public constructor( + private logger: Logger, + private targetUserName: string, + private packageId: string, + private installationOptions: SfpPackageInstallationOptions, + private packageName?:string + ) { + } + + public setInstallationKey(installationKey: string) { + this.installationOptions.installationkey = installationKey; + } + + public async install(payloadToDisplay?: any): Promise { + let connection = (await SFPOrg.create({ aliasOrUsername: this.targetUserName })).getConnection(); + //Print Metadata carried in the package + if (payloadToDisplay) PackageMetadataPrinter.printMetadataToDeploy(payloadToDisplay, this.logger); + + const subscriberPackageVersion = new SubscriberPackageVersion({ + connection, + aliasOrId: this.packageId, + password: this.installationOptions.installationkey, + }); + + const request: PackageInstallCreateRequest = { + SubscriberPackageVersionKey: await subscriberPackageVersion.getId(), + Password: this.installationOptions.installationkey as PackageInstallCreateRequest['Password'], + ApexCompileType: 'package' as PackageInstallCreateRequest['ApexCompileType'], + SecurityType: this.installationOptions.securitytype as PackageInstallCreateRequest['SecurityType'], + UpgradeType: this.installationOptions.upgradetype as PackageInstallCreateRequest['UpgradeType'], + EnableRss: true, + }; + + //Fire a package installation + let pkgInstallRequest = await subscriberPackageVersion.install(request, {}); + let status = this.parseStatus( + pkgInstallRequest, + this.targetUserName, + this.packageName ? this.packageName : this.packageId, + this.logger + ); + while (status == 'IN_PROGRESS') { + pkgInstallRequest = await SubscriberPackageVersion.getInstallRequest(pkgInstallRequest.Id, connection); + status = this.parseStatus( + pkgInstallRequest, + this.targetUserName, + this.packageName ? this.packageName : this.packageId, + this.logger + ); + await delay(30000); //Poll every 30 seconds + } + } + public parseStatus( + request: PackagingSObjects.PackageInstallRequest, + username: string, + pkgName: string, + logger: Logger + ): 'IN_PROGRESS' | 'SUCCESS' { + const { Status } = request; + if (Status === 'SUCCESS') { + SFPLogger.log( + `Status: ${COLOR_SUCCESS(`Succesfully Installed`)} ${pkgName} to ${username} with Id ${request.Id}`, + LoggerLevel.INFO, + logger + ); + return Status; + } else if (['IN_PROGRESS', 'UNKNOWN'].includes(Status)) { + SFPLogger.log( + `Status: ${COLOR_KEY_MESSAGE(`In Progress`)} Installing ${pkgName} to ${username} with Id ${request.Id}`, + LoggerLevel.INFO, + logger + ); + return 'IN_PROGRESS'; + } else { + let errorMessage = ''; + const errors = request?.Errors?.errors; + if (errors?.length) { + errorMessage = 'Installation errors: '; + for (let i = 0; i < errors.length; i++) { + errorMessage += `\n${i + 1}) ${errors[i].message}`; + } + } + throw new Error(`Unable to install ${pkgName} due to \n` + errorMessage); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts new file mode 100644 index 000000000..584155ed1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts @@ -0,0 +1,15 @@ +export type PackageInstallationResult = { + result: PackageInstallationStatus; + deploy_id?: string; + message?: string; + elapsedTime?:number; + isPreScriptExecutionSuceeded?: boolean; + isPostScriptExecutionSuceeeded?:boolean; + numberOfComponentsDeployed?:number; +}; + +export enum PackageInstallationStatus { + Skipped, + Succeeded, + Failed, +} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts b/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts new file mode 100644 index 000000000..cdf3ac4b2 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts @@ -0,0 +1,160 @@ +import SfpPackage, { PackageType } from '../SfpPackage'; +import SfpPackageBuilder from '../../package/SfpPackageBuilder'; +const tmp = require('tmp'); +import * as fs from 'fs-extra'; +const path = require('path'); +import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; +import { Logger } from '@flxblio/sfp-logger'; + +export default class PackageMergeManager { + public constructor(private sfpPackages: SfpPackage[], private logger?: Logger) {} + + public async mergePackages(targetOrAlias?: string): Promise { + let mergeResult: MergeResult = new MergeResult(); + mergeResult.skippedPackages = []; + mergeResult.unlockedPackages = []; + mergeResult.mergedPackages = []; + + mergeResult.requestedMergeOrder = this.sfpPackages; + + //Use the .sfp directory + let tmpDir = tmp.dirSync({ unsafeCleanup: true }); + let locationOfCopiedDirectory = tmpDir.name; + //Create a temporary folder + let mergedProjectDir = path.join(locationOfCopiedDirectory, `${this.makefolderid(5)}_merged`); + mergeResult.mergedProjectDirectory = mergedProjectDir; + + let mergedPackageDir = path.join(mergedProjectDir, 'force-app'); + fs.mkdirpSync(mergedPackageDir); + + //Create sfdx project.json + fs.writeJSONSync(path.join(mergedProjectDir, 'sfdx-project.json'), this.getMergedProjectManifest(), { + spaces: 4, + }); + + const converter = new MetadataConverter(); + + for (const sfpPackage of this.sfpPackages) { + let componentSet: ComponentSet; + + if (sfpPackage.packageType == PackageType.Data) { + mergeResult.skippedPackages.push(sfpPackage); + continue; + } else if (sfpPackage.packageType == PackageType.Unlocked) { + //Push for now + mergeResult.skippedPackages.push(sfpPackage); + mergeResult.unlockedPackages.push(sfpPackage); + continue; + } else { + //handle alaisfy directory + if (sfpPackage.packageDescriptor.aliasfy) { + let aliasFolder = path.join( + process.cwd(), + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + targetOrAlias ? targetOrAlias : 'default' + ); + if (fs.existsSync(aliasFolder)) { + componentSet = ComponentSet.fromSource(aliasFolder); + } else { + continue; + } + } else { + componentSet = ComponentSet.fromSource( + path.join(process.cwd(), sfpPackage.projectDirectory, sfpPackage.packageDirectory) + ); + } + + fs.copyFileSync( + path.join(sfpPackage.projectDirectory, 'forceignores', '.buildignore'), + path.join(mergedProjectDir, '.forceignore') + ); + console.log('copied file'); + + //Merge + let results = await converter.convert(componentSet, 'source', { + type: 'merge', + mergeWith: ComponentSet.fromSource(mergedPackageDir).getSourceComponents(), + defaultDirectory: mergedPackageDir, + + forceIgnoredPaths: new Set([ + path.join(process.cwd(), sfpPackage.projectDirectory, 'forceignores', '.buildignore'), + ]), + }); + + for (const component of results.converted) { + if (this.isXmlFileSuffixDuped(component.xml)) { + this.dedupeXmlFileSuffix(component.xml); + } + } + mergeResult.mergedPackages.push(sfpPackage); + } + } + + //Build SfpPackage + if (mergeResult.mergedPackages.length > 0) { + let mergedSfPPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + this.logger, + mergeResult.mergedProjectDirectory, + 'merged', + { + branch: 'temp', + packageVersionNumber: '1.0.0.0', + sourceVersion: '00000000', + }, + null + ); + mergeResult.mergedPackage = mergedSfPPackage; + } + + tmpDir.removeCallback(); + return mergeResult; + } + + private isXmlFileSuffixDuped(xmlFile: string): boolean { + return xmlFile.match(/-meta\.xml/g)?.length === 2; + } + + private dedupeXmlFileSuffix(xmlFile: string): string { + let deduped = xmlFile.replace(/-meta\.xml/, ''); + fs.renameSync(xmlFile, deduped); + + return deduped; + } + + private getMergedProjectManifest() { + let projectManifest = { + packageDirectories: [ + { + path: 'force-app', + package: 'merged', + versionNumber: '2.0.0.0', + default: true, + }, + ], + namespace: '', + sourceApiVersion: '53.0', + }; + return projectManifest; + } + + private makefolderid(length): string { + var result = ''; + var characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} + +export class MergeResult { + mergedProjectDirectory: string; + mergedPackage: SfpPackage; + mergedPackages: SfpPackage[]; + skippedPackages?: SfpPackage[]; + unlockedPackages?: SfpPackage[]; + requestedMergeOrder: SfpPackage[]; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts new file mode 100644 index 000000000..91ea99cef --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts @@ -0,0 +1,34 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { SfProject } from '@salesforce/core'; +import { PackageSaveResult, PackageVersion } from '@salesforce/packaging'; +import SFPOrg from '../../org/SFPOrg'; + +export default class PromoteUnlockedPackageImpl { + public constructor( + private project_directory: string, + private package_version_id: string, + private devhub_alias: string + ) {} + + public async promote(): Promise { + let hubOrg = await SFPOrg.create({ aliasOrUsername: this.devhub_alias }); + let project = await SfProject.resolve(this.project_directory); + + const packageVersion = new PackageVersion({ + connection: hubOrg.getConnection(), + project: project, + idOrAlias: this.package_version_id, + }); + const packageVersionData = await packageVersion.getData(); + + let result: PackageSaveResult; + try { + result = await packageVersion.promote(); + result.id = packageVersionData.SubscriberPackageVersionId; + } catch (e) { + if (e.message.includes('previously released')) { + SFPLogger.log(`Package ${this.package_version_id} is already promoted, Ignoring`); + } else throw e; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts new file mode 100644 index 000000000..079f78469 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts @@ -0,0 +1,23 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; + +export default class AssignPermissionSetFetcher implements PropertyFetcher { + public getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { + if (packageContents.packageDescriptor.assignPermSetsPreDeployment) { + if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) { + packageContents.assignPermSetsPreDeployment = + packageContents.packageDescriptor.assignPermSetsPreDeployment; + } else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); + } + + if (packageContents.packageDescriptor.assignPermSetsPostDeployment) { + if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) { + packageContents.assignPermSetsPostDeployment = + packageContents.packageDescriptor.assignPermSetsPostDeployment; + } else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); + } + + return packageContents; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts new file mode 100644 index 000000000..c4b05c5de --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts @@ -0,0 +1,29 @@ +import * as fs from 'fs-extra'; +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; +import xml2json from '../../utils/xml2json'; +import { Logger } from '@flxblio/sfp-logger'; + +export default class DestructiveManifestPathFetcher implements PropertyFetcher { + public async getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { + let destructiveChangesPath: string; + + if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) { + throw new Error('Project Config (sfdx-project.json) is null'); + } + + if (packageContents.packageDescriptor['destructiveChangePath']) { + destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath']; + packageContents.destructiveChangesPath = destructiveChangesPath; + } + + try { + if (destructiveChangesPath != null) { + packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8')); + } + } catch (error) { + throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest'); + } + return packageContents; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts new file mode 100644 index 000000000..fbe6c4f8e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts @@ -0,0 +1,11 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../SfpPackage'; + +export default interface PropertyFetcher { + /** + * Retrieves property from packageDescriptor and adds its to SfpPackage by reference + * @param packageContents + * @param packageLogger + */ + getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger); +} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts new file mode 100644 index 000000000..0e2bc06a0 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts @@ -0,0 +1,10 @@ +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; + +export default class ReconcilePropertyFetcher implements PropertyFetcher { + getsfpProperties(packageContents: SfpPackage, packageLogger?: any) { + if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) { + packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts b/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts new file mode 100644 index 000000000..8d05ba782 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts @@ -0,0 +1,85 @@ +import path from 'path'; +import { readFileSync, existsSync } from 'fs'; +import FileSystem from '../../utils/FileSystem'; +import ignore from 'ignore'; + +export default class PackageEmptyChecker { + public static isToBreakBuildForEmptyDirectory( + projectDir: string, + sourceDirectory: string, + isToBreakBuildIfEmpty: boolean + ): { + message: string; + result: string; + } { + let directoryToCheck; + let status: { message: string; result: string } = { + message: '', + result: '', + }; + + if (projectDir != null) { + directoryToCheck = path.join(projectDir, sourceDirectory); + } else directoryToCheck = sourceDirectory; + + try { + if (!existsSync(directoryToCheck)) { + //Folder do not exists, break build + if (isToBreakBuildIfEmpty) { + status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'break'; + } else { + status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'skip'; + } + return status; + } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) { + if (isToBreakBuildIfEmpty) { + status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'break'; + } else { + status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'skip'; + } + return status; + } else { + status.result = 'continue'; + return status; + } + } catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist + } else if (!isToBreakBuildIfEmpty) { + status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`; + status.result = 'skip'; + return status; + } else throw err; + } + } + + public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean { + let dirToCheck; + + if (projectDirectory != null) { + dirToCheck = path.join(projectDirectory, sourceDirectory); + } else { + dirToCheck = sourceDirectory; + } + + let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false); + // Include source directory in filepaths, as it can be a pattern in forceignore + files = files.map((file) => path.join(sourceDirectory, file)); + + let forceignorePath; + if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore'); + else forceignorePath = path.join(process.cwd(), '.forceignore'); + + // Ignore files that are listed in .forceignore + files = ignore() + .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'. + .filter(files); + + if (files == null || files.length === 0) return true; + else return false; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts new file mode 100644 index 000000000..879b84971 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts @@ -0,0 +1,109 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import semver from 'semver'; + +/** + * Fetcher for second-generation package version in Dev Hub + */ +export default class Package2VersionFetcher { + private readonly query: string = + 'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version '; + + constructor(private conn: Connection) {} + + /** + * Fetch Package2 versions by Package2 Id + * Sorts by semantic version, in descending order + * @param package2Id + * @param versionNumber + * @param isValidatedPackages + * @returns + */ + async fetchByPackage2Id( + package2Id: string, + versionNumber?: string, + isValidatedPackages?: boolean + ): Promise { + let query = this.query; + + let whereClause: string = `where Package2Id='${package2Id}' `; + + if (versionNumber) { + // TODO: validate version number + const versions = versionNumber.split('.'); + + if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; + if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; + if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; + if (versions[3]) whereClause += `and BuildNumber=${versions[3]} `; + } + + if (isValidatedPackages) whereClause += `and ValidationSkipped = false `; + + whereClause += `and IsDeprecated = false `; + query += whereClause; + + + const records = await QueryHelper.query(query, this.conn, true); + + + if (records.length > 1) { + return records.sort((a, b) => { + const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`; + const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`; + return semver.rcompare(v1, v2); + }); + } else return records; + } + + async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise { + let query = this.query; + + let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`; + query += whereClause; + + const records = await QueryHelper.query(query, this.conn, true); + return records[0]; + } + + async fetchByPackageBranchAndName( + packageBranch: string, + packageName: string, + versionNumber?: string, + ): Promise { + + let query = this.query; + + let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `; + if (versionNumber) { + // TODO: validate version number + const versions = versionNumber.split('.'); + if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; + if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; + if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; + } + query += whereClause; + + let orderByClause: string = `order by CreatedDate desc`; + query += orderByClause; + + const records = await QueryHelper.query(query, this.conn, true); + return records; + + } +} + +export interface Package2Version { + SubscriberPackageVersionId: string; + Package2Id: string; + Package2: { Name: string }; + IsPasswordProtected: boolean; + IsReleased: boolean; + MajorVersion: number; + MinorVersion: number; + PatchVersion: number; + BuildNumber: number; + CodeCoverage: { apexCodeCoveragePercentage: number }; + HasPassedCodeCoverageCheck: boolean; + Branch: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts new file mode 100644 index 000000000..906bb37d0 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts @@ -0,0 +1,26 @@ +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class Package2VersionInstaller { + public constructor( + logger: Logger, + logLevel: LoggerLevel, + working_directory: string, + private targetUserName: string, + private packageId: string, + private waitTime: string, + private publishWaitTime?: string, + private installationkey?: string, + private securityType?: string, + private upgradeType?: string, + private apiVersion?: string, + private apexCompile: string = 'package' + ) {} + + public setInstallationKey(installationKey: string) { + this.installationkey = installationKey; + } + + + + +} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts new file mode 100644 index 000000000..9075d5292 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts @@ -0,0 +1,62 @@ +import { SfProject } from '@salesforce/core'; +import { Package } from '@salesforce/packaging'; +import SFPOrg from '../../org/SFPOrg'; + +export default class PackageVersionLister { + + constructor(private hubOrg:SFPOrg) + { + + } + + public async listAllReleasedVersions(projectDir: string) { + + const sfProject = await SfProject.resolve(projectDir); + + const records = await Package.listVersions(this.hubOrg.getConnection(), sfProject, { + createdLastDays: undefined, + concise: true, + modifiedLastDays: undefined, + packages: [], + isReleased: true, + orderBy: undefined, + verbose: false, + }); + + const results: any[] = []; + + if (records?.length > 0) { + records.forEach((record) => { + results.push({ + Package2Id: record.Package2Id, + Branch: record.Branch, + Tag: record.Tag, + MajorVersion: record.MajorVersion, + MinorVersion: record.MinorVersion, + PatchVersion: record.PatchVersion, + BuildNumber: record.BuildNumber, + Id: record.Id, + SubscriberPackageVersionId: record.SubscriberPackageVersionId, + ConvertedFromVersionId: record.ConvertedFromVersionId, + Name: record.Name, + NamespacePrefix: record.Package2.NamespacePrefix, + Package2Name: record.Package2.Name, + Version: [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join( + '.' + ), + IsReleased: record.IsReleased, + CreatedDate: new Date(record.CreatedDate).toISOString().replace('T', ' ').substring(0, 16), + LastModifiedDate: new Date(record.LastModifiedDate) + .toISOString() + .replace('T', ' ') + .substring(0, 16), + ReleaseVersion: + record.ReleaseVersion == null ? '' : Number.parseFloat(record.ReleaseVersion).toFixed(1), + BuildDurationInSeconds: record.BuildDurationInSeconds == null ? '' : record.BuildDurationInSeconds, + }); + }); + } + + return results; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts new file mode 100644 index 000000000..55786d1b1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts @@ -0,0 +1,18 @@ +import SfpPackage from '../SfpPackage'; + +export default class PackageVersionUpdater { + public constructor() {} + + public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string { + if (!sfpPackage.versionNumber) { + throw new Error('The package doesnt have a version attribute, Please check your definition'); + } else { + let segments = sfpPackage.versionNumber.split('.'); + let numberToBeAppended = parseInt(buildNumber); + + if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number'); + else segments[3] = buildNumber; + return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts new file mode 100644 index 000000000..2ff6a45e1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts @@ -0,0 +1,17 @@ +import { Connection } from '@salesforce/core'; +import { Logger } from '@flxblio/sfp-logger'; +import AssignPermissionSetsImpl from './AssignPermissionSetsImpl'; + +export default class AssignPermissionSets { + static async applyPermsets(permsets: string[], conn: Connection, sourceDirectory: string, logger: Logger) { + let assignPermissionSetsImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + conn, + permsets, + sourceDirectory, + logger + ); + + let results = await assignPermissionSetsImpl.exec(); + if (results.failedAssignments.length > 0) throw new Error('Unable to assign permsets'); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts new file mode 100644 index 000000000..ba0049e0f --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts @@ -0,0 +1,93 @@ +import { Connection } from '@salesforce/core'; +import child_process = require('child_process'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PermissionSetFetcher from './PermissionSetFetcher'; +import { ZERO_BORDER_TABLE } from '../display/TableConstants'; +const Table = require('cli-table'); + +export default class AssignPermissionSetsImpl { + constructor( + private conn: Connection, + private permSets: string[], + private project_directory: string, + private packageLogger: Logger + ) {} + + public async exec(): Promise<{ + successfullAssignments: { + username: string; + permset: string; + }[]; + failedAssignments: { + username: string; + permset: string; + }[]; + }> { + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn); + let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment(); + + let failedAssignments: { + username: string; + permset: string; + }[] = []; + let successfullAssignments: { + username: string; + permset: string; + }[] = []; + + for (let permSet of this.permSets) { + let permSetAssignmentMatch = assignedPermSets.find((record) => { + return record.PermissionSet.Name === permSet; + }); + + if (permSetAssignmentMatch !== undefined) { + // Treat permsets that have already been assigned as successes + successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + continue; + } + + try { + let permsetAssignmentJson: string = child_process.execSync( + `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`, + { + cwd: this.project_directory, + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'inherit'], + } + ); + + let permsetAssignment = JSON.parse(permsetAssignmentJson); + if (permsetAssignment.status === 0) + successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + } catch (err) { + failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + } + } + + if (successfullAssignments.length > 0) { + SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger); + this.printPermsetAssignments(successfullAssignments); + } + + if (failedAssignments.length > 0) { + SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger); + this.printPermsetAssignments(failedAssignments); + } + + return { successfullAssignments, failedAssignments }; + } + + private printPermsetAssignments(assignments: { username: string; permset: string }[]) { + let table = new Table({ + head: ['Username', 'Permission Set Assignment'], + chars: ZERO_BORDER_TABLE + }); + + assignments.forEach((assignment) => { + table.push([assignment.username, assignment.permset]); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts new file mode 100644 index 000000000..5133d9958 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts @@ -0,0 +1,15 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +/* + * Retrieve Permsets for a user from a target org + */ +export default class PermissionSetFetcher { + constructor(private username: string, private conn: Connection) {} + + public async fetchAllPermsetAssignment() { + const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`; + + return QueryHelper.query(query, this.conn, false); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts new file mode 100644 index 000000000..87d04b6d7 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts @@ -0,0 +1,46 @@ +import { Connection } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { delay } from '../utils/Delay'; + +const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`; + +export default class PermissionSetGroupUpdateAwaiter { + constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {} + + async waitTillAllPermissionSetGroupIsUpdated() { + SFPLogger.log( + `Checking status of permission sets group..`, + LoggerLevel.INFO, + this.logger + ); + while (true) { + try { + let records = await QueryHelper.query(psGroupQuery, this.connection, false); + if (records.length > 0) { + SFPLogger.log( + `Pausing deployment as ${records.length} PermissionSetGroups are being updated`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`, + LoggerLevel.INFO, + this.logger + ); + await delay(this.intervalBetweenRepeats); + } else { + SFPLogger.log( + `Proceeding with deployment, as no PermissionSetGroups are being updated`, + LoggerLevel.INFO, + this.logger + ); + break; + } + } catch (error) { + SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger); + throw error; + } + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts b/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts new file mode 100644 index 000000000..ebd7e1e20 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts @@ -0,0 +1,281 @@ +const fs = require('fs-extra'); +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import _ from 'lodash'; +import { PackageType } from '../package/SfpPackage'; +let path = require('path'); + +/** + * Helper functions for retrieving info from project config + */ +export default class ProjectConfig { + /** + * Returns 0H Id of package from project config + * @param projectConfig + * @param sfdxPackage + */ + public static getPackageId(projectConfig: any, sfdxPackage: string) { + if (projectConfig['packageAliases']?.[sfdxPackage]) { + return projectConfig['packageAliases'][sfdxPackage]; + } else { + throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); + } + } + + /** + * Returns package names, as an array of strings + * @param projectDirectory + */ + public static getAllPackages(projectDirectory: string): string[] { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let sfdxpackages = []; + projectConfig['packageDirectories'].forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); + }); + return sfdxpackages; + } + + public static getAllExternalPackages( + projectConfig: any + ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] { + let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = []; + let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); + const packageAliases = projectConfig.packageAliases || {}; + Object.entries(packageAliases).forEach(([key, value]) => { + if ( + !_.find( + packagesInCurrentDirectory, + (elem) => { + return elem.package == key; + }, + 0 + ) + ) + externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string }); + }); + return externalPackages; + } + + /** + * Returns package names from projectConfig, as an array of strings + * @param projectDirectory + */ + public static getAllPackagesFromProjectConfig(projectConfig: any): string[] { + let sfdxpackages = []; + projectConfig.packageDirectories.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); + }); + return sfdxpackages; + } + + public static getAllPackagesAndItsDependencies( + projectConfig: any + ): Map { + let pkgWithDependencies = new Map(); + let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); + for (let pkg of packages) { + if (pkg.dependencies) { + pkgWithDependencies.set(pkg.package, pkg.dependencies); + } + } + return pkgWithDependencies; + } + + public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let sfdxpackages = []; + projectConfig.packageDirectories?.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); + }); + return sfdxpackages; + } + + public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] { + let sfdxpackages = []; + projectConfig.packageDirectories?.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); + }); + return sfdxpackages; + } + + /** + * Returns package manifest as JSON object + * @param projectDirectory + */ + public static getSFDXProjectConfig(projectDirectory: string): any { + let projectConfigJSON: string; + + if (projectDirectory) { + projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json'); + } else { + projectConfigJSON = 'sfdx-project.json'; + } + + try { + return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8')); + } catch (error) { + throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`); + } + } + + /** + * Returns type of package + * @param projectConfig + * @param sfdxPackage + */ + public static getPackageType( + projectConfig: any, + sfdxPackage: string + ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff { + let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); + + if (projectConfig['packageAliases']?.[sfdxPackage]) { + return PackageType.Unlocked; + } else { + if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data; + else if(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff + else + return PackageType.Source; + } + } + + /** + * Returns package descriptor from package manifest at project directory + * @param projectDirectory + * @param sfdxPackage + */ + public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + + let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); + + return sfdxPackageDescriptor; + } + + /** + * Returns package descriptor from project config JSON object + * @param sfdxPackage + * @param projectConfig + */ + public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) { + let sfdxPackageDescriptor: any; + + if (sfdxPackage) { + projectConfig['packageDirectories'].forEach((pkg) => { + if (sfdxPackage == pkg['package']) { + sfdxPackageDescriptor = pkg; + } + }); + } + + if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`); + + return sfdxPackageDescriptor; + } + + /** + * Returns descriptor of default package + * @param projectDirectory + */ + public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any { + let packageDirectory: string; + let sfdxPackageDescriptor: any; + + let projectConfig = this.getSFDXProjectConfig(projectDirectory); + + //Return the default package directory + projectConfig['packageDirectories'].forEach((pkg) => { + if (pkg['default'] == true) { + packageDirectory = pkg['path']; + sfdxPackageDescriptor = pkg; + } + }); + + if (packageDirectory == null) throw new Error('Package or package directory not exist'); + else return sfdxPackageDescriptor; + } + + /** + * Returns pruned package manifest, containing sfdxPackage only + * @param projectDirectory + * @param sfdxPackage + */ + public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any { + const projectConfig = this.getSFDXProjectConfig(projectDirectory); + + return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage); + } + + /** + * Returns pruned package manifest, containing sfdxPackage only + * @param projectConfig + * @param sfdxPackage + */ + public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any { + if (sfdxPackage) { + let i = projectConfig['packageDirectories'].length; + while (i--) { + if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) { + projectConfig['packageDirectories'].splice(i, 1); + } + } + } else { + let i = projectConfig['packageDirectories'].length; + while (i--) { + if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) { + projectConfig['packageDirectories'].splice(i, 1); + } + } + } + projectConfig['packageDirectories'][0]['default'] = true; //add default = true + return projectConfig; + } + + /** + * Returns pruned package manifest, containing sfdxPackages only + * @param projectConfig + * @param sfdxPackages + */ + public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any { + let revisedPackageDirectory = []; + let originalPackageDirectory = projectConfig['packageDirectories']; + for (let pkg of originalPackageDirectory) { + for (const sfdxPackage of sfdxPackages) { + if (pkg.name == sfdxPackage) { + pkg.default = false; + revisedPackageDirectory.push(pkg); + } + } + } + projectConfig['packageDirectories'][0]['default'] = true; //add default = true + projectConfig.packageDirectories = revisedPackageDirectory; + return projectConfig; + } + + /** + * Returns pruned package manifest, containing sfdxPackages only + * @param projectConfig + * @param sfdxPackages + */ + public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any { + const projectConfig = this.getSFDXProjectConfig(projectDirectory); + return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages); + } + + + + public static async updateProjectConfigWithDependencies( + projectConfig: any, + dependencyMap: Map + ) { + let updatedprojectConfig = await _.cloneDeep(projectConfig); + updatedprojectConfig.packageDirectories.map((pkg) => { + return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) }); + }); + + return updatedprojectConfig; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts b/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts new file mode 100644 index 000000000..a56301ad5 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts @@ -0,0 +1,61 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Connection, LoggerLevel } from '@salesforce/core'; +import _ from 'lodash'; +import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver'; + +/** + * Functions to deal with externalDependencyMap supplied by the user + * to aid in resolving transitive dependencies + */ +export default class UserDefinedExternalDependencyMap { + + + public fetchDependencyEntries(projectConfig: any) { + if (projectConfig.plugins?.sfp?.externalDependencyMap) { + let externalDependencyMap = projectConfig.plugins.sfp.externalDependencyMap; + SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG); + return externalDependencyMap; + } + else + return {}; + } + + public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) { + let externalDependencies = []; + let updatedProjectConfig = await _.cloneDeep(projectConfig); + let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null); + + let externalDependencyMap = this.fetchDependencyEntries(projectConfig); + + let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); + + for (let externalPackage2 of externalPackage2s) { + externalDependencies.push(externalPackage2.name); + } + for (let dependency of externalDependencies) { + if (!Object.keys(externalDependencyMap).includes(dependency)) { + externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }]; + } + } + updatedProjectConfig.plugins.sfp.externalDependencyMap = externalDependencyMap; + return updatedProjectConfig; + } + + public async cleanupEntries(projectConfig: any) { + let updatedProjectConfig = await _.cloneDeep(projectConfig); + if (updatedProjectConfig?.plugins?.sfp?.externalDependencyMap) { + const externalDependencyMap = updatedProjectConfig.plugins.sfp.externalDependencyMap; + for (let externalPackage of Object.keys(externalDependencyMap)) { + if (externalDependencyMap[externalPackage][0].package == '') { + delete externalDependencyMap[externalPackage]; + } else if ( + externalDependencyMap[externalPackage][0].package != '' && + externalDependencyMap[externalPackage][0].versionNumber == '' + ) { + delete externalDependencyMap[externalPackage][0].versionNumber; + } + } + } + return updatedProjectConfig; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts b/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts new file mode 100644 index 000000000..c6a6c9b7d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts @@ -0,0 +1,38 @@ + + +/** + * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars) + * @param collection values in SOQL WHERE clause + * @param chunkSize default is 4000 + * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000 + */ +export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] { + const result: string[][] = []; + chunkSize = chunkSize - offset; + + let chunk: string[] = []; + let numberOfCharsInChunk: number = 0; + for (const elem of collection) { + if (elem.length + 2 > chunkSize) { + throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`); + } + + const commasAndQuotes = 2*(chunk.length+1) + chunk.length; + if (numberOfCharsInChunk + elem.length + commasAndQuotes <= chunkSize) { + chunk.push(elem); + numberOfCharsInChunk += elem.length; + } else { + result.push(chunk); + + // Create new chunk + chunk = []; + numberOfCharsInChunk = 0; + chunk.push(elem); + numberOfCharsInChunk += elem.length; + } + } + + result.push(chunk); + + return result; +} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts b/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts new file mode 100644 index 000000000..9b077895c --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts @@ -0,0 +1,18 @@ +import { Connection } from '@salesforce/core'; + +const retry = require('async-retry'); + +export default class QueryHelper { + static async query(query: string, conn: Connection, isTooling: boolean): Promise { + return retry( + async (bail) => { + let records; + if (isTooling) records = (await conn.tooling.query(query)).records; + else records = (await conn.query(query)).records; + + return records; + }, + { retries: 3, minTimeout: 2000 } + ); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts new file mode 100644 index 000000000..482d5d529 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts @@ -0,0 +1,41 @@ +import { Connection, User, AuthInfo, LoggerLevel } from '@salesforce/core'; +import SFPLogger from '@flxblio/sfp-logger'; + +export default class PasswordGenerator { + public async exec(userName: string) { + const query = `SELECT id FROM User WHERE username = '${userName}'`; + + const authInfo = await AuthInfo.create({ username: userName }); + const userConnection = await Connection.create({ authInfo: authInfo }); + let userRecord = (await userConnection.query(query)).records as any; + let passwordBuffer = User.generatePasswordUtf8(); + let pwd; + + await passwordBuffer.value(async (buffer: Buffer) => { + try { + pwd = buffer.toString('utf8'); + + // eslint-disable-next-line @typescript-eslint/ban-ts-ignore + // @ts-ignore TODO: expose `soap` on Connection however appropriate + const soap = userConnection.soap; + await soap.setPassword(userRecord[0].Id, pwd); + } catch (e) { + console.log(e); + pwd = undefined; + if (e.message === 'INSUFFICIENT_ACCESS: Cannot set password for self') { + SFPLogger.log( + `${e.message}. Incase of scratch org, Add "features": ["EnableSetPasswordInApi"] in your project-scratch-def.json then create your scratch org.`, + LoggerLevel.WARN + ); + } else { + SFPLogger.log(`${e.message}`, LoggerLevel.WARN); + } + } + }); + + return { + username: userName, + password: pwd, + }; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts new file mode 100644 index 000000000..8c700d757 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts @@ -0,0 +1,18 @@ +export default interface ScratchOrg { + failureMessage?: string; + tag?: string; + recordId?: string; + orgId?: string; + loginURL?: string; + signupEmail?: string; + username?: string; + alias?: string; + password?: string; + isScriptExecuted?: boolean; + expiryDate?: string; + accessToken?: string; + instanceURL?: string; + status?: string; + sfdxAuthUrl?: string; + elapsedTime?:number +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts new file mode 100644 index 000000000..f354fbbd8 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts @@ -0,0 +1,149 @@ +import { AuthInfo, Org, StateAggregator } from '@salesforce/core'; +import ScratchOrg from './ScratchOrg'; +import PasswordGenerator from './PasswordGenerator'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { Duration } from '@salesforce/kit'; +import { ScratchOrgRequest } from '@salesforce/core'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import getFormattedTime from '../utils/GetFormattedTime'; +import SFPStatsSender from '../stats/SFPStatsSender'; +const retry = require('async-retry'); + +export default class ScratchOrgOperator { + constructor(private hubOrg: Org) {} + + public async create( + alias: string, + config_file_path: string, + expiry: number, + waitTime: number = 6 + ): Promise { + SFPLogger.log('Parameters: ' + alias + ' ' + config_file_path + ' ' + expiry + ' ', LoggerLevel.TRACE); + + let startTime = Date.now(); + SFPLogger.log(`Requesting Scratch Org ${alias}..`, LoggerLevel.INFO); + let scatchOrgResult = await this.requestAScratchOrg( + alias, + config_file_path, + Duration.days(expiry), + Duration.minutes(waitTime) + ); + SFPLogger.log(JSON.stringify(scatchOrgResult), LoggerLevel.TRACE); + + //create scratchOrg object + let scratchOrg: ScratchOrg = { + alias: alias, + orgId: scatchOrgResult.orgId, + username: scatchOrgResult.username, + loginURL: scatchOrgResult.loginURL, + elapsedTime: Date.now() - startTime, + }; + + try { + //Get Sfdx Auth URL + const authInfo = await AuthInfo.create({ username: scratchOrg.username }); + scratchOrg.sfdxAuthUrl = authInfo.getSfdxAuthUrl(); + } catch (error) { + throw new Error( + `Unable to set auth URL, Ignoring this scratch org, as its not suitable for pool due to ${error.message}` + ); + } + + //Generate Password + let passwordData = await new PasswordGenerator().exec(scratchOrg.username); + + scratchOrg.password = passwordData.password; + + if (!passwordData.password) { + throw new Error('Unable to setup password to scratch org'); + } else { + SFPLogger.log(`Password successfully set for ${scratchOrg.alias}`, LoggerLevel.DEBUG); + } + + SFPLogger.log( + `Creation request for Scratch Org ${scratchOrg.alias} is completed successfully in ${COLOR_KEY_MESSAGE( + getFormattedTime(scratchOrg.elapsedTime) + )}`, + LoggerLevel.INFO + ); + SFPStatsSender.logElapsedTime(`scratchorg.creation.time`,scratchOrg.elapsedTime) + return scratchOrg; + } + + public async delete(scratchOrgIds: string[]) { + let hubConn = this.hubOrg.getConnection(); + + await retry( + async (bail) => { + let result = await hubConn.del('ActiveScratchOrg', scratchOrgIds); + }, + { retries: 3, minTimeout: 3000 } + ); + } + + private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration) { + const createCommandOptions: ScratchOrgRequest = { + durationDays: expireIn.days, + nonamespace: false, + noancestors: false, + wait: waitTime, + retry: 3, + definitionfile: definitionFile, + }; + + const { username, scratchOrgInfo, authFields, warnings } = await this.hubOrg.scratchOrgCreate( + createCommandOptions + ); + + await this.setAliasForUsername(username, alias); + + return { + username: username, + loginURL: scratchOrgInfo.LoginUrl, + warnings, + orgId: authFields.orgId, + }; + } + + public async shareScratchOrgThroughEmail(emailId: string, scratchOrg: ScratchOrg) { + let hubOrgUserName = this.hubOrg.getUsername(); + let apiVersion = this.hubOrg.getConnection().retrieveMaxApiVersion(); + let body = `${hubOrgUserName} has fetched a new scratch org from the Scratch Org Pool!\n + All the post scratch org scripts have been succesfully completed in this org!\n + The Login url for this org is : ${scratchOrg.loginURL}\n + Username: ${scratchOrg.username}\n + Password: ${scratchOrg.password}\n + Please use sfdx force:auth:web:login -r ${scratchOrg.loginURL} -a command to authenticate against this Scratch org

+ Thank you for using SFPLogger!`; + + const options = { + method: 'POST', + body: JSON.stringify({ + inputs: [ + { + emailBody: body, + emailAddresses: emailId, + emailSubject: `${hubOrgUserName} created you a new Salesforce org`, + senderType: 'CurrentUser', + }, + ], + }), + url: `/services/data/v${apiVersion}actions/standard/emailSimple`, + }; + + await retry( + async (bail) => { + await this.hubOrg.getConnection().requestPost(options.url, options.body); + }, + { retries: 3, minTimeout: 30000 } + ); + + SFPLogger.log(`Succesfully send email to ${emailId} for ${scratchOrg.username}`, LoggerLevel.INFO); + } + + private async setAliasForUsername(username: string, aliasToSet: string): Promise { + const stateAggregator = await StateAggregator.getInstance(); + stateAggregator.aliases.set(aliasToSet, { username: username }); + await stateAggregator.aliases.write(); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts new file mode 100644 index 000000000..806dd2de1 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts @@ -0,0 +1,205 @@ +const path = require('path'); +import * as fs from 'fs-extra'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Connection, SfProject } from '@salesforce/core'; +import SFPOrg from '../../org/SFPOrg'; +import { SourceTracking } from '@salesforce/source-tracking'; +import ProjectConfig from '../../project/ProjectConfig'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import { EOL } from 'os'; +import { PackageType } from '../../package/SfpPackage'; +import Git from '../../git/Git'; + +const tmp = require('tmp'); + +export default class ClientSourceTracking { + private conn: Connection; + private org: SFPOrg; + private logger: Logger; + + private sfdxOrgIdDir; + + private constructor() {} + + static async create(conn: Connection, logger: Logger) { + const clientSourceTracking = new ClientSourceTracking(); + + clientSourceTracking.conn = conn; + + clientSourceTracking.org = await SFPOrg.create({ connection: clientSourceTracking.conn }); + clientSourceTracking.logger = logger; + + clientSourceTracking.sfdxOrgIdDir = `.sf/orgs/${clientSourceTracking.org.getOrgId()}`; + + return clientSourceTracking; + } + + async creatSourceTrackingFiles(): Promise { + await this.createRemoteSourceTracking(); + await this.createLocalSourceTracking(); + } + + private async createRemoteSourceTracking() { + const project = await SfProject.resolve(); + const tracking = await SourceTracking.create({ + org: this.org, + project: project, + }); + + tracking.resetRemoteTracking(); + } + + /** + * Create local source tracking from sfp artifacts installed in scratch org + */ + private async createLocalSourceTracking() { + + let git; + try { + git = await Git.initiateRepoAtTempLocation(this.logger); + + const sfpArtifacts = await this.org.getInstalledArtifacts(); + + if(sfpArtifacts.length==0) + throw new Error(`Unable to find any artifacts in the org`); + + //clean up MPD to just one package, so that source tracking lib + //does do a full scan and break + this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), sfpArtifacts[0].Name); + + const project = await SfProject.resolve(git.getRepositoryPath()); + + // Create local source tracking files in temp repo + const tracking = await SourceTracking.create({ + org: this.org, + project: project, + }); + + + + SFPLogger.log( + `Total Artifacts to Analyze: ${sfpArtifacts.length}`, + LoggerLevel.INFO, + this.logger + ); + + let count = 1; + for (const artifact of sfpArtifacts) { + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log( + COLOR_HEADER(`Package ${count} of ${sfpArtifacts.length}`), + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log(`Analyzing package ${COLOR_KEY_MESSAGE(artifact.Name)}`, LoggerLevel.INFO, this.logger); + // Checkout version of source code from which artifact was created + await git.checkout(artifact.CommitId__c,true) + + SFPLogger.log( + `Version pushed while preparing this org is ${artifact.Version__c} with SHA ${artifact.CommitId__c}`, + LoggerLevel.INFO, + this.logger + ); + + //clean up MPD to per package, to speed up + this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), artifact.Name); + + const projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); + + try { + const packageType = ProjectConfig.getPackageType(projectConfig, artifact.Name); + if (packageType === PackageType.Unlocked || packageType === PackageType.Source) { + let componentSet = ComponentSet.fromSource( + path.join( + git.getRepositoryPath(), + ProjectConfig.getPackageDescriptorFromConfig(artifact.Name, projectConfig).path + ) + ); + let components = componentSet.getSourceComponents(); + + //Get all components in the directory + //Count for logging purposes. dont have to waste processing convering + //a lazy collection to array once again + let componentCount = 1; + let componentPaths: string[] = []; + for (const component of components) { + componentCount++; + componentPaths.push(component.xml); + if (component.content) componentPaths.push(component.content); + } + + await tracking.updateLocalTracking({ + files: componentPaths, + }); + SFPLogger.log( + `Updated source tracking for package: ${artifact.Name} with ${componentCount} items`, + LoggerLevel.INFO, + this.logger + ); + } else SFPLogger.log(`Encountered data package... skipping`, LoggerLevel.INFO, this.logger); + } catch (error) { + if(error.message.includes) + { + SFPLogger.log( + ` sfp is unable to sync the package ${artifact.name}${EOL}, + as it not able to find the find equivalent git references`, + LoggerLevel.ERROR, + this.logger); + } + else + SFPLogger.log( + `Unable to update local source tracking due to ${error.message}`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log(`Skipping package.. ${artifact.Name}`, LoggerLevel.WARN, this.logger); + } + count++; + } + + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Copying the temporary repository over to original location`, LoggerLevel.INFO, this.logger); + // Copy source tracking files from temp repo to actual repo + fs.mkdirpSync(path.join(this.sfdxOrgIdDir, 'localSourceTracking')); + fs.copySync( + path.join(git.getRepositoryPath(), this.sfdxOrgIdDir, 'localSourceTracking'), + path.join(this.sfdxOrgIdDir, 'localSourceTracking') + ); + } catch (error) { + + if(error.message.includes(`reference is not a tree`)) + { + SFPLogger.log( + `sfp is unable to sync this repository, + as it not able to find the matching git references${EOL} + Are you sure this pool was created from the same repository?`, + LoggerLevel.ERROR, + this.logger); + } + else + SFPLogger.log( + `Unable to update local source tracking due to ${error.message}`, + LoggerLevel.ERROR, + this.logger + ); + } finally { + if(git) + git.deleteTempoRepoIfAny(); + } + } + + private cleanupSFDXProjectJsonTonOnePackage(projectDir: string, packageName: string) { + try { + let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectDirectory(projectDir, packageName); + fs.writeJSONSync(path.join(projectDir, 'sfdx-project.json'), cleanedUpProjectManifest, { + spaces: 4, + }); + } catch (error) { + SFPLogger.log( + `sfdx-project.json not found/unable to write, skipping..` + error.message, + LoggerLevel.DEBUG, + this.logger + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts new file mode 100644 index 000000000..d21987759 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts @@ -0,0 +1,47 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class OrphanedOrgsDeleteImpl extends PoolBaseImpl { + public constructor(hubOrg: Org, private logger:Logger) { + super(hubOrg); + this.hubOrg = hubOrg; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getOrphanedScratchOrgs()) as any; + + let scratchOrgToDelete: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + let scrathOrgIds: string[] = []; + for (let element of results.records) { + if (element.Description?.includes(`"requestedBy":"sfp"`)) { + let soDetail: ScratchOrg = {}; + soDetail.orgId = element.ScratchOrg; + soDetail.username = element.SignupUsername; + soDetail.status = 'recovered'; + scratchOrgToDelete.push(soDetail); + scrathOrgIds.push(`'${element.Id}'`); + } + } + + if (scrathOrgIds.length > 0) { + let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( + scrathOrgIds.join(',') + ); + + if (activeScrathOrgs.records.length > 0) { + for (let scratchOrg of activeScrathOrgs.records) { + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); + SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is recovered`,LoggerLevel.TRACE,this.logger); + } + } + } + } + + return scratchOrgToDelete; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts new file mode 100644 index 000000000..ba7ef6c41 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts @@ -0,0 +1,22 @@ +import { Org } from '@salesforce/core'; +import { Result } from 'neverthrow'; +import ScratchOrg from '../ScratchOrg'; +import { PoolConfig } from './PoolConfig'; +import { PoolError } from './PoolError'; +import PreRequisiteCheck from './prequisitecheck/PreRequisiteCheck'; + +export abstract class PoolBaseImpl { + protected hubOrg: Org; + + constructor(hubOrg: Org) { + this.hubOrg = hubOrg; + } + + public async execute(): Promise|void> { + let prerequisiteCheck: PreRequisiteCheck = new PreRequisiteCheck(this.hubOrg); + await prerequisiteCheck.checkForPrerequisites(); + return this.onExec(); + } + + protected abstract onExec(): Promise|void>; +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts new file mode 100644 index 000000000..b18fc05f2 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts @@ -0,0 +1,40 @@ +import ScratchOrg from '../ScratchOrg'; + +export interface PoolConfig { + tag: string; + maxAllocation: number; + waitTime?: number; + expiry?: number; + batchSize?: number; + configFilePath: string; + releaseConfigFile?:string; + succeedOnDeploymentErrors?: boolean; + keys?: string; + installAll: boolean; + enableSourceTracking: boolean; + relaxAllIPRanges?: boolean; + ipRangesToBeRelaxed?: []; + retryOnFailure?: boolean; + fetchArtifacts: { + artifactFetchScript?: string; + npm?: { + npmrcPath?: string; + scope: string; + }; + }; + disableSourcePackageOverride?:boolean; + snapshotPool?:string; + postDeploymentScriptPath: string; + preDependencyInstallationScriptPath: string; + enableVlocity?: boolean; + min_allocation?: number; + current_allocation?: number; + to_allocate?: number; + to_satisfy_min?: number; + to_satisfy_max?: number; + scratchOrgs?: ScratchOrg[]; + failedToCreate?: number; + maxRetryCount?:number; + + +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts new file mode 100644 index 000000000..12c0bcadf --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts @@ -0,0 +1,432 @@ +import { Org } from '@salesforce/core'; +import Bottleneck from 'bottleneck'; +import { PoolConfig } from './PoolConfig'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgLimitsFetcher from './services/fetchers/ScratchOrgLimitsFetcher'; +import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; +import * as rimraf from 'rimraf'; +import * as fs from 'fs-extra'; +import PoolJobExecutor, { ScriptExecutionResult } from './PoolJobExecutor'; +import { PoolError, PoolErrorCodes } from './PoolError'; +import SFPLogger, { COLOR_KEY_MESSAGE, LoggerLevel } from '@flxblio/sfp-logger'; +import { Result, ok, err } from 'neverthrow'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import { EOL } from 'os'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; +import PoolFetchImpl from './PoolFetchImpl'; +import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; +import { COLOR_ERROR } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../utils/GetFormattedTime'; +import path from 'path'; + +export default class PoolCreateImpl extends PoolBaseImpl { + private limiter; + private scriptExecutorWrappedForBottleneck; + private limits: any; + private scratchOrgInfoFetcher: ScratchOrgInfoFetcher; + private scratchOrgInfoAssigner: ScratchOrgInfoAssigner; + private scratchOrgOperator: ScratchOrgOperator; + private totalToBeAllocated: number; + private totalAllocated: number = 0; + + public constructor( + hubOrg: Org, + private pool: PoolConfig, + private poolScriptExecutor: PoolJobExecutor, + private logLevel: LoggerLevel + ) { + super(hubOrg); + this.limiter = new Bottleneck({ + maxConcurrent: this.pool.batchSize, + }); + + this.scriptExecutorWrappedForBottleneck = this.limiter.wrap(this.scriptExecutor); + } + + protected async onExec(): Promise> { + await this.hubOrg.refreshAuth(); + + const scriptExecPromises: Array> = []; + + + //fetch current status limits + this.limits = await new ScratchOrgLimitsFetcher(this.hubOrg).getScratchOrgLimits(); + + //Create Service classes + this.scratchOrgInfoFetcher = new ScratchOrgInfoFetcher(this.hubOrg); + this.scratchOrgInfoAssigner = new ScratchOrgInfoAssigner(this.hubOrg); + + //Create Operator + this.scratchOrgOperator = new ScratchOrgOperator(this.hubOrg); + + // Setup Logging Directory + rimraf.sync('script_exec_outputs'); + fs.mkdirpSync('script_exec_outputs'); + + //Compute allocation + try { + if (!this.pool.snapshotPool) { + SFPLogger.log(COLOR_KEY_MESSAGE('Computing Allocation..'), LoggerLevel.INFO); + try { + this.totalToBeAllocated = await this.computeAllocation(); + } catch (error) { + return err({ + success: 0, + failed: 0, + message: `Unable to access fields on ScratchOrgInfo, Please check the profile being used`, + errorCode: PoolErrorCodes.PrerequisiteMissing, + }); + } + + if (this.totalToBeAllocated === 0) { + if (this.limits.ActiveScratchOrgs.Remaining > 0) { + return err({ + success: 0, + failed: 0, + message: `The tag provided ${this.pool.tag} is currently at the maximum capacity , No scratch orgs will be allocated`, + errorCode: PoolErrorCodes.Max_Capacity, + }); + } else { + return err({ + success: 0, + failed: 0, + message: `There is no capacity to create a pool at this time, Please try again later`, + errorCode: PoolErrorCodes.No_Capacity, + }); + } + } + + //Generate Scratch Orgs + this.pool.scratchOrgs = await this.generateScratchOrgs( + this.pool, + this.scratchOrgOperator, + this.scratchOrgInfoAssigner + ); + } else { + this.pool.scratchOrgs = await this.fetchScratchOrgsFromSnapshotPool( + this.pool, + this.scratchOrgInfoFetcher, + this.scratchOrgInfoAssigner + ); + } + } catch (error) { + return err({ + success: 0, + failed: this.pool.failedToCreate, + message: `All requested scratch orgs failed to provision, Please check your code or config \n Failed with ${error.message}`, + errorCode: PoolErrorCodes.UnableToProvisionAny, + }); + } + + // Assign workers to executed scripts + for (const scratchOrg of this.pool.scratchOrgs) { + const result = this.scriptExecutorWrappedForBottleneck(scratchOrg, this.hubOrg.getUsername()); + scriptExecPromises.push(result); + } + + await Promise.all(scriptExecPromises); + + this.pool = await this.finalizeGeneratedScratchOrgs( + this.pool, + this.scratchOrgOperator, + this.scratchOrgInfoFetcher + ); + + if (!this.pool.scratchOrgs || this.pool.scratchOrgs.length == 0) { + return err({ + success: 0, + failed: this.pool.failedToCreate, + message: `All requested scratch orgs failed to provision, Please check your code or config`, + errorCode: PoolErrorCodes.UnableToProvisionAny, + }); + } + return ok(this.pool); + + + } + + private async computeAllocation(): Promise { + //Compute current pool requirement + const activeCount = await this.scratchOrgInfoFetcher.getCountOfActiveScratchOrgsByTag(this.pool.tag); + return this.allocateScratchOrgsPerTag(this.limits.ActiveScratchOrgs.Remaining, activeCount, this.pool); + } + + private allocateScratchOrgsPerTag( + remainingScratchOrgs: number, + countOfActiveScratchOrgs: number, + pool: PoolConfig + ) { + pool.current_allocation = countOfActiveScratchOrgs; + pool.to_allocate = 0; + pool.to_satisfy_max = + pool.maxAllocation - pool.current_allocation > 0 ? pool.maxAllocation - pool.current_allocation : 0; + + if (pool.to_satisfy_max > 0 && pool.to_satisfy_max <= remainingScratchOrgs) { + pool.to_allocate = pool.to_satisfy_max; + } else if (pool.to_satisfy_max > 0 && pool.to_satisfy_max > remainingScratchOrgs) { + pool.to_allocate = remainingScratchOrgs; + } + + SFPLogger.log( + `${EOL}Current Allocation of ScratchOrgs in the pool ${this.pool.tag}: ` + pool.current_allocation, + LoggerLevel.INFO + ); + SFPLogger.log('Remaining Active scratchOrgs in the org: ' + remainingScratchOrgs, LoggerLevel.INFO); + SFPLogger.log('ScratchOrgs to be allocated: ' + pool.to_allocate, LoggerLevel.INFO); + return pool.to_allocate; + } + + private async generateScratchOrgs( + pool: PoolConfig, + scratchOrgOperator: ScratchOrgOperator, + scratchOrgInfoAssigner: ScratchOrgInfoAssigner + ) { + //Generate Scratch Orgs + SFPLogger.log(COLOR_KEY_MESSAGE('Generate Scratch Orgs..'), LoggerLevel.INFO); + + const scratchOrgPromises = new Array>(); + + const scratchOrgCreationLimiter = new Bottleneck({ + maxConcurrent: pool.batchSize, + }); + + addDescriptionToScratchOrg(pool); + + const startTime = Date.now(); + for (let i = 1; i <= pool.to_allocate; i++) { + const scratchOrgPromise: Promise = scratchOrgCreationLimiter.schedule(() => + scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime) + ); + scratchOrgPromises.push(scratchOrgPromise); + } + + SFPLogger.log(`Waiting for all scratch org request to complete, Please wait`); + //Wait for all orgs to be created + const scratchOrgCreationResults = await Promise.allSettled(scratchOrgPromises); + //Only worry about scrath orgs that have suceeded + const isFulfilled = (p: PromiseSettledResult): p is PromiseFulfilledResult => p.status === 'fulfilled'; + const isRejected = (p: PromiseSettledResult): p is PromiseRejectedResult => p.status === 'rejected'; + + let scratchOrgs = scratchOrgCreationResults.filter(isFulfilled).map((p) => p.value); + const rejectedScratchOrgs = scratchOrgCreationResults.filter(isRejected).map((p) => p.reason); + for (const reason of rejectedScratchOrgs) { + if (reason.message.includes(`The client has timed out`)) { + //Log how many we were able to create + const elapsedTime = Date.now() - startTime; + SFPLogger.log( + `A scratch org creation was rejected due to saleforce not responding within the set wait time of ${pool.waitTime} mins \n` + + `Time elasped so far ${COLOR_KEY_MESSAGE( + getFormattedTime(elapsedTime) + )},You might need to inrease the wait time further and rety ` + ); + } else SFPLogger.log(`A scratch org creation was rejected due to ${reason.message}`); + } + + //Log how many we were able to create + const elapsedTime = Date.now() - startTime; + SFPLogger.log( + `Created ${COLOR_SUCCESS(scratchOrgs.length)} of ${pool.to_allocate} successfully with ${COLOR_ERROR( + rejectedScratchOrgs.length + )} failures in ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` + ); + + SFPStatsSender.logElapsedTime(`pool.scratchorg.creation.time`, elapsedTime, { pool: pool.tag }); + if (scratchOrgs && scratchOrgs.length > 0) { + //Splice scratchorgs that are having incorrect status of deleted , Why salesforce why?? + let index = scratchOrgs.length; + while (index--) { + try { + const orgDetails = await new OrgDetailsFetcher(scratchOrgs[index].username).getOrgDetails(); + if (orgDetails.status === 'Deleted') { + throw new Error( + `Throwing away scratch org ${this.pool.scratchOrgs[index].alias} as it has a status of deleted` + ); + } + } catch (error) { + scratchOrgs.splice(index, 1); + } + } + + scratchOrgs = await this.scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); + + const scratchOrgInprogress = []; + + scratchOrgs.forEach((scratchOrg) => { + scratchOrgInprogress.push({ + Id: scratchOrg.recordId, + Pooltag__c: this.pool.tag, + Password__c: scratchOrg.password, + SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, + Allocation_status__c: 'In Progress', + }); + }); + + if (scratchOrgInprogress.length > 0) { + //set pool tag + await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); + } + return scratchOrgs; + } else throw new Error(`No scratch orgs were sucesfully generated`); + + function addDescriptionToScratchOrg(pool: PoolConfig) { + + const configClonePath = path.join('.sfp','scratchorg-configs',`${ makeFileId(8)}.json`); + fs.mkdirpSync('.sfp/scratchorg-configs'); + fs.copyFileSync(pool.configFilePath,configClonePath); + + const scratchOrgDefn = fs.readJSONSync(configClonePath); + if (!scratchOrgDefn.description) + scratchOrgDefn.description = JSON.stringify({ + requestedBy: 'sfp', + pool: pool.tag, + requestedAt: new Date().toISOString(), + }); + else + scratchOrgDefn.description = scratchOrgDefn.description.concat( + ' ', + JSON.stringify({ + requestedBy: 'sfp', + pool: pool.tag, + requestedAt: new Date().toISOString(), + }) + ); + fs.writeJSONSync(configClonePath, scratchOrgDefn, { spaces: 4 }); + pool.configFilePath = configClonePath; + } + + function makeFileId(length): string { + let result = ''; + const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + } + + private async fetchScratchOrgsFromSnapshotPool( + pool: PoolConfig, + scratchOrgInfoFetcher: ScratchOrgInfoFetcher, + scratchOrgInfoAssigner: ScratchOrgInfoAssigner + ) { + //Generate Scratch Orgs + SFPLogger.log( + COLOR_KEY_MESSAGE(`Fetching Scratch Orgs from snapshot pool ${this.pool.snapshotPool}`), + LoggerLevel.INFO + ); + + let scratchOrgs = (await new PoolFetchImpl( + this.hubOrg, + this.pool.snapshotPool, + false, + true, + undefined, + undefined, + undefined, + true, + this.pool.maxAllocation + ).execute()) as ScratchOrg[]; + scratchOrgs = await scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); + + const scratchOrgInprogress = []; + + if (scratchOrgs && scratchOrgs.length > 0) { + scratchOrgs.forEach((scratchOrg) => { + scratchOrgInprogress.push({ + Id: scratchOrg.recordId, + Pooltag__c: this.pool.tag, + Password__c: scratchOrg.password, + SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, + Allocation_status__c: 'In Progress', + }); + }); + + if (scratchOrgInprogress.length > 0) { + //set pool tag + await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); + } + return scratchOrgs; + } else { + throw new Error('No scratch orgs were found to be fetched'); + } + } + + private async finalizeGeneratedScratchOrgs( + pool: PoolConfig, + scratchOrgOperator: ScratchOrgOperator, + scratchOrgInfoFetcher: ScratchOrgInfoFetcher + ) { + pool.failedToCreate = 0; + for (let i = pool.scratchOrgs.length - 1; i >= 0; i--) { + const scratchOrg = pool.scratchOrgs[i]; + if (scratchOrg.isScriptExecuted) { + continue; + } + + SFPLogger.log( + `Failed to execute scripts for ${scratchOrg.username} with alias ${scratchOrg.alias} due to ${scratchOrg.failureMessage}`, + LoggerLevel.ERROR + ); + + try { + //Delete scratchorgs that failed to execute script + + const activeScratchOrgRecordId = await scratchOrgInfoFetcher.getActiveScratchOrgRecordIdGivenScratchOrg( + scratchOrg.orgId + ); + + await scratchOrgOperator.delete([activeScratchOrgRecordId]); + console.log(`Succesfully deleted scratchorg ${scratchOrg.username}`); + } catch (error) { + SFPLogger.log( + `Unable to delete the scratchorg ${scratchOrg.username}.. due to\n` + error, + LoggerLevel.ERROR + ); + } + + pool.failedToCreate += 1; + pool.scratchOrgs.splice(i, 1); + } + return pool; + } + + private async scriptExecutor(scratchOrg: ScratchOrg): Promise { + SFPLogger.log( + `Executing Preparation Job ${scratchOrg.alias} with username: ${scratchOrg.username}`, + LoggerLevel.INFO + ); + + const startTime = Date.now(); + const result = await this.poolScriptExecutor.execute(scratchOrg, this.hubOrg, this.logLevel); + + if (result.isOk()) { + scratchOrg.isScriptExecuted = true; + const submitInfoToPool = await this.scratchOrgInfoAssigner.setScratchOrgInfo({ + Id: scratchOrg.recordId, + Allocation_status__c: 'Available', + }); + if (!submitInfoToPool) { + scratchOrg.isScriptExecuted = false; + scratchOrg.failureMessage = 'Unable to set the scratch org record in Pool'; + SFPStatsSender.logCount('prepare.org.failed'); + } else { + SFPStatsSender.logCount('prepare.org.succeeded'); + } + + SFPStatsSender.logElapsedTime('prepare.org.singlejob.elapsed_time', Date.now() - startTime, { + poolname: this.pool.tag, + }); + } else { + scratchOrg.isScriptExecuted = false; + scratchOrg.failureMessage = result.error.message; + SFPStatsSender.logCount('prepare.org.failed'); + } + + return scratchOrg; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts new file mode 100644 index 000000000..1a6768542 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts @@ -0,0 +1,65 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; +import { Logger } from '@flxblio/sfp-logger'; +import { LoggerLevel } from '@flxblio/sfp-logger'; + +export default class PoolDeleteImpl extends PoolBaseImpl { + private tag: string; + private mypool: boolean; + private allScratchOrgs: boolean; + private inprogressonly: boolean; + + public constructor(hubOrg: Org, tag: string, mypool: boolean, allScratchOrgs: boolean, inprogressonly: boolean,private logger:Logger) { + super(hubOrg); + this.hubOrg = hubOrg; + this.tag = tag; + this.mypool = mypool; + this.allScratchOrgs = allScratchOrgs; + this.inprogressonly = inprogressonly; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + this.mypool, + !this.allScratchOrgs + )) as any; + + let scratchOrgToDelete: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + let scrathOrgIds: string[] = []; + for (let element of results.records) { + if (!this.inprogressonly || element.Allocation_status__c === 'In Progress') { + let soDetail: ScratchOrg = {}; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.expiryDate = element.ExpirationDate; + soDetail.status = 'Deleted'; + + scratchOrgToDelete.push(soDetail); + scrathOrgIds.push(`'${element.Id}'`); + } + } + + if (scrathOrgIds.length > 0) { + let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( + scrathOrgIds.join(',') + ); + + if (activeScrathOrgs.records.length > 0) { + for (let scratchOrg of activeScrathOrgs.records) { + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); + SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is deleted successfully`,LoggerLevel.TRACE,this.logger); + } + } + } + } + + return scratchOrgToDelete; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts new file mode 100644 index 000000000..820346576 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts @@ -0,0 +1,13 @@ +export interface PoolError { + success: number; + failed: number; + errorCode: PoolErrorCodes; + message?: string; +} + +export enum PoolErrorCodes { + Max_Capacity = 'MaxCapacity', + No_Capacity = 'NoCapacity', + PrerequisiteMissing = 'PrerequisitesMissing', + UnableToProvisionAny = 'UnableToProvisionAny', +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts new file mode 100644 index 000000000..77a2c3566 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts @@ -0,0 +1,244 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { AuthInfo, LoggerLevel, Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import { getUserEmail } from './services/fetchers/GetUserEmail'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; +import ClientSourceTracking from './ClientSourceTracking'; +import isValidSfdxAuthUrl from './prequisitecheck/IsValidSfdxAuthUrl'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class PoolFetchImpl extends PoolBaseImpl { + private tag: string; + private mypool: boolean; + private sendToUser: string; + private alias: string; + private setdefaultusername: boolean; + private authURLEnabledScratchOrg: boolean; + private isSourceTrackingToBeSet: boolean = false; + + public constructor( + hubOrg: Org, + tag: string, + mypool: boolean, + authURLEnabledScratchOrg: boolean, + sendToUser?: string, + alias?: string, + setdefaultusername?: boolean, + private fetchAllScratchOrgs?: boolean, + private limitBy?:number + ) { + super(hubOrg); + this.tag = tag; + this.mypool = mypool; + this.authURLEnabledScratchOrg = authURLEnabledScratchOrg; + this.sendToUser = sendToUser; + this.alias = alias; + this.setdefaultusername = setdefaultusername; + } + + public setSourceTrackingOnFetch() { + this.isSourceTrackingToBeSet = true; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + this.mypool, + true + )) as any; + + let availableSo = []; + if (results.records.length > 0) { + availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); + } + if (availableSo.length == 0) { + throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); + } + + if (this.fetchAllScratchOrgs) { + return this.fetchAllScratchOrg(availableSo,this.limitBy); + } else return this.fetchSingleScratchOrg(availableSo); + } + + private async fetchAllScratchOrg(availableSo: any[],limitBy?:number): Promise { + let fetchedSOs: ScratchOrg[] = []; + + if (availableSo.length > 0) { + SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); + + let count = 1; + for (let element of availableSo) { + if (this.authURLEnabledScratchOrg) { + if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { + SFPLogger.log( + `Iterating through pool to find a scratch org with valid authURL`, + LoggerLevel.TRACE + ); + continue; + } + } + + + + SFPLogger.log( + `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, + LoggerLevel.TRACE + ); + let soDetail: any = {}; + soDetail['Id'] = element.Id; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; + soDetail.status = 'Available'; + soDetail.alias = `SO` + count; + fetchedSOs.push(soDetail); + + + if(limitBy && count==limitBy) + break; + + count++; + } + } + + for (const soDetail of fetchedSOs) { + //Login to the org + let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); + if (!isLoginSuccessFull) { + SFPLogger.log(`Unable to login to scratchorg ${soDetail.username}}`, LoggerLevel.ERROR); + fetchedSOs = fetchedSOs.filter((item) => item.username !== soDetail.username); + } + } + + return fetchedSOs; + } + + private async fetchSingleScratchOrg(availableSo: any[]): Promise { + let soDetail: ScratchOrg; + + if (availableSo.length > 0) { + SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); + + for (let element of availableSo) { + if (this.authURLEnabledScratchOrg) { + if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { + SFPLogger.log( + `Iterating through pool to find a scratch org with valid authURL`, + LoggerLevel.TRACE + ); + continue; + } + } + + let allocateSO = await new ScratchOrgInfoAssigner(this.hubOrg).setScratchOrgInfo({ + Id: element.Id, + Allocation_status__c: 'Allocate', + }); + if (allocateSO === true) { + SFPLogger.log( + `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, + LoggerLevel.TRACE + ); + soDetail = {}; + soDetail['Id'] = element.Id; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; + soDetail.status = 'Assigned'; + + break; + } else { + SFPLogger.log( + `Scratch org ${element.SignupUsername} allocation failed. trying to get another Scratch org from ${this.tag} pool`, + LoggerLevel.TRACE + ); + } + } + } + + if (availableSo.length == 0 || !soDetail) { + throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); + } + + if (this.sendToUser) { + //Fetch the email for user id + let emailId; + try { + emailId = await getUserEmail(this.sendToUser, this.hubOrg); + } catch (error) { + SFPLogger.log( + 'Unable to fetch details of the specified user, Check whether the user exists in the org ', + LoggerLevel.ERROR + ); + throw new Error('Failed to fetch user details'); + } + + try { + //Send an email for username + await new ScratchOrgOperator(this.hubOrg).shareScratchOrgThroughEmail(emailId, soDetail); + } catch (error) { + SFPLogger.log( + 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org', + LoggerLevel.ERROR + ); + throw new Error( + 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org' + ); + } + } else { + //Login to the org + let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); + //Attempt to Fetch Source Tracking Files and silently continue if it fails + if (isLoginSuccessFull && this.isSourceTrackingToBeSet) { + try { + const conn = (await Org.create({ aliasOrUsername: soDetail.username })).getConnection(); + const clientSourceTracking = await ClientSourceTracking.create(conn, null); + await clientSourceTracking.creatSourceTrackingFiles(); + } catch (error) { + SFPLogger.log('Retriveing Source Tracking skipped.. ' + error.message, LoggerLevel.TRACE); + } + } + } + return soDetail; + } + + private async loginToScratchOrgIfSfdxAuthURLExists(soDetail: ScratchOrg): Promise { + try { + if (soDetail.sfdxAuthUrl && isValidSfdxAuthUrl(soDetail.sfdxAuthUrl)) { + + + const oauth2Options = AuthInfo.parseSfdxAuthUrl(soDetail.sfdxAuthUrl); + const authInfo = await AuthInfo.create({ oauth2Options }); + await authInfo.save({...authInfo.getFields(),isScratch:true,devHubUsername:this.hubOrg.getUsername(),expirationDate:soDetail.expiryDate}); + + await authInfo.handleAliasAndDefaultSettings({ + alias: this.alias?this.alias:soDetail.alias, + setDefault: true, + setDefaultDevHub: false, + }); + + const result = authInfo.getFields(true); + // ensure the clientSecret field... even if it is empty + // as per https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/auth/sfdxurl/store.ts + result.clientSecret = result.clientSecret ?? ''; + await AuthInfo.identifyPossibleScratchOrgs(result, authInfo); + + return true; + } else { + SFPLogger.log('Unable to autenticate to the scratch org', LoggerLevel.INFO); + return false; + } + } catch (error) { + SFPLogger.log('Unable to autenticate to the scratch org due ' + error.message, LoggerLevel.ERROR); + return false; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts new file mode 100644 index 000000000..1d70e4aff --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts @@ -0,0 +1,41 @@ +import { Org } from '@salesforce/core'; +import { PoolConfig } from './PoolConfig'; +import ScratchOrg from '../ScratchOrg'; +import { Result } from 'neverthrow'; +import * as fs from 'fs-extra'; +import { EOL } from 'os'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +export default abstract class PoolJobExecutor { + protected logToFilePath: string; + + constructor(protected pool: PoolConfig) {} + + async execute( + scratchOrg: ScratchOrg, + hubOrg: Org, + logLevel: LoggerLevel + ): Promise> { + this.logToFilePath = `.sfp/prepare_logs/${scratchOrg.alias}.log`; + //Create file logger + fs.outputFileSync(this.logToFilePath, `sfp--log${EOL}`); + SFPLogger.log(`Preparation Log files for ${scratchOrg.username} written to ${this.logToFilePath}`); + return this.executeJob(scratchOrg, hubOrg, this.logToFilePath, logLevel); + } + + abstract executeJob( + scratchOrg: ScratchOrg, + hubOrg: Org, + logToFilePath: string, + logLevel: LoggerLevel + ): Promise>; +} + +export interface ScriptExecutionResult { + scratchOrgUsername: string; +} + +export interface JobError { + message: string; + scratchOrgUsername: string; +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts new file mode 100644 index 000000000..bf5ad0d64 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts @@ -0,0 +1,48 @@ +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; + +export default class PoolListImpl extends PoolBaseImpl { + private tag: string; + private allScratchOrgs: boolean; + + public constructor(hubOrg: Org, tag: string, allScratchOrgs: boolean) { + super(hubOrg); + this.hubOrg = hubOrg; + this.tag = tag; + this.allScratchOrgs = allScratchOrgs; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + null, + !this.allScratchOrgs + )) as any; + + let scratchOrgList: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + for (let element of results.records) { + let soDetail: ScratchOrg = {}; + soDetail.tag = element.Pooltag__c; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + if (element.Allocation_status__c === 'Assigned') { + soDetail.status = 'In use'; + } else if (element.Allocation_status__c === 'Available') { + soDetail.status = 'Available'; + } else { + soDetail.status = 'Provisioning in progress'; + } + + scratchOrgList.push(soDetail); + } + } + + return scratchOrgList; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts new file mode 100644 index 000000000..435d6fac7 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts @@ -0,0 +1,26 @@ +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class PoolOrgDeleteImpl extends PoolBaseImpl { + username: string; + + public constructor(hubOrg: Org, username: string) { + super(hubOrg); + this.hubOrg = hubOrg; + this.username = username; + } + + protected async onExec(): Promise { + try { + let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgIdGivenUserName(this.username); + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrgId); + } catch (err) { + throw new Error( + `Either the scratch org doesn't exist or you do not have the correct permissions, Failed with ` + + err.message + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts new file mode 100644 index 000000000..9cd50260a --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts @@ -0,0 +1,19 @@ +export default function isValidSfdxAuthUrl(sfdxAuthUrl: string): boolean { + if (sfdxAuthUrl.match(/force:\/\/(?[a-zA-Z0-9._]+)@.+/)) { + return true; + } else { + let match = sfdxAuthUrl.match( + /force:\/\/(?[a-zA-Z0-9._=]+):(?[a-zA-Z0-9]*):(?[a-zA-Z0-9._=]+)@.+/ + ); + + if (match !== null) { + if (match.groups.refreshToken === 'undefined') { + return false; + } else { + return true; + } + } else { + return false; + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts new file mode 100644 index 000000000..18da896a9 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts @@ -0,0 +1,63 @@ +import { Org } from '@salesforce/core'; +const retry = require('async-retry'); +import { Result, ok, err } from 'neverthrow'; +import { PoolConfig } from '../PoolConfig'; +import { PoolError, PoolErrorCodes } from '../PoolError'; + +export default class PreRequisiteCheck { + private static isPrerequisiteChecked: boolean = false; + private static isPrerequisiteMet = false; + private static describeResult; + + private hubOrg: Org; + + constructor(hubOrg: Org) { + this.hubOrg = hubOrg; + } + + public async checkForPrerequisites(): Promise { + let sfdxAuthUrlFieldExists = false; + let conn = this.hubOrg.getConnection(); + let expectedValues = ['In Progress', 'Available', 'Allocate', 'Assigned','Return']; + let availableValues: string[] = []; + if (!PreRequisiteCheck.isPrerequisiteChecked) { + await retry( + async (bail) => { + PreRequisiteCheck.describeResult = await conn.sobject('ScratchOrgInfo').describe(); + if (PreRequisiteCheck.describeResult) { + for (const field of PreRequisiteCheck.describeResult.fields) { + if (field.name === 'SfdxAuthUrl__c') { + sfdxAuthUrlFieldExists = true; + } + + if (field.name === 'Allocation_status__c' && field.picklistValues.length >= 4) { + for (let picklistValue of field.picklistValues) { + if (picklistValue.active) { + availableValues.push(picklistValue.value); + } + } + } + } + } + }, + { retries: 3, minTimeout: 30000 } + ); + + PreRequisiteCheck.isPrerequisiteChecked = true; + //If there are values returned, its not compatible + let statusValuesAvailable = + expectedValues.filter((item) => { + return !availableValues.includes(item); + }).length <= 1 + ? true + : false; + + if (sfdxAuthUrlFieldExists && statusValuesAvailable) PreRequisiteCheck.isPrerequisiteMet = true; + } + + if (!PreRequisiteCheck.isPrerequisiteMet) { + throw new Error( `Required Prerequisite values in ScratchOrgInfo is missing in the DevHub` + + `For more information Please refer https://sfp.flxblio.io/getting-started/prerequisites \n`); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts new file mode 100644 index 000000000..e0c34bf9e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts @@ -0,0 +1,28 @@ +import { LoggerLevel, Org } from '@salesforce/core'; + +let retry = require('async-retry'); +import SFPLogger from '@flxblio/sfp-logger'; + +export async function getUserEmail(username: string, hubOrg: Org) { + let hubConn = hubOrg.getConnection(); + + return retry( + async (bail) => { + if (!username) { + bail(new Error('username cannot be null. provide a valid username')); + return; + } + let query = `SELECT email FROM user WHERE username='${username}'`; + + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + + if (results.records.size < 1) { + bail(new Error(`No user found with username ${username} in devhub.`)); + return; + } + return results.records[0].Email; + }, + { retries: 3, minTimeout: 3000 } + ); +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts new file mode 100644 index 000000000..a89ad737a --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts @@ -0,0 +1,187 @@ +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import ScratchOrg from '../../../ScratchOrg'; +const retry = require('async-retry'); +const ORDER_BY_FILTER = ' ORDER BY CreatedDate DESC'; + +export default class ScratchOrgInfoFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgRecordId(scratchOrgs: ScratchOrg[]) { + if (scratchOrgs == undefined || scratchOrgs.length == 0) return; + + let hubConn = this.hubOrg.getConnection(); + + let scratchOrgIds = scratchOrgs + .map(function (scratchOrg) { + scratchOrg.orgId = scratchOrg.orgId.slice(0, 15); + return `'${scratchOrg.orgId}'`; + }) + .join(','); + + let query = `SELECT Id, ScratchOrg FROM ScratchOrgInfo WHERE ScratchOrg IN ( ${scratchOrgIds} )`; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + + return retry( + async (bail) => { + const results = (await hubConn.query(query)) as any; + let resultAsObject = this.arrayToObject(results.records, 'ScratchOrg'); + + SFPLogger.log(JSON.stringify(resultAsObject), LoggerLevel.TRACE); + + scratchOrgs.forEach((scratchOrg) => { + scratchOrg.recordId = resultAsObject[scratchOrg.orgId]['Id']; + }); + + return scratchOrgs; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getScratchOrgsByTag(tag: string, isMyPool: boolean, unAssigned: boolean) { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query; + + if (tag) + query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + else + query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c != null AND Status = 'Active' `; + + if (isMyPool) { + query = query + ` AND createdby.username = '${this.hubOrg.getUsername()}' `; + } + if (unAssigned) { + // if new version compatible get Available / In progress + query = + query + `AND ( Allocation_status__c ='Available' OR Allocation_status__c = 'In Progress' ) `; + } + query = query + ORDER_BY_FILTER; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getOrphanedScratchOrgs() { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query; + query = `SELECT Id, Pooltag__c, SignupUsername, Description, ScratchOrg FROM ScratchOrgInfo WHERE Pooltag__c = null AND Status = 'Active'`; + query = query + ORDER_BY_FILTER; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgsByInfoId(scrathOrgIds: string) { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, SignupUsername FROM ActiveScratchOrg WHERE ScratchOrgInfoId IN (${scrathOrgIds}) `; + + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getCountOfActiveScratchOrgsByTag(tag: string): Promise { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + SFPLogger.log('RESULT:' + JSON.stringify(results), LoggerLevel.TRACE); + return results.totalSize; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getCountOfActiveScratchOrgsByTagAndUsername(tag: string): Promise { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results.totalSize; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgRecordIdGivenScratchOrg(scratchOrgId: string): Promise { + let hubConn = this.hubOrg.getConnection(); + return retry( + async (bail) => { + let query = `SELECT Id FROM ActiveScratchOrg WHERE ScratchOrg = '${scratchOrgId}'`; + let records = (await hubConn.query(query)).records; + + SFPLogger.log('Retrieve Active ScratchOrg Id:' + JSON.stringify(records), LoggerLevel.TRACE); + return records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgRecordsAsMapByUser(hubOrg: Org) { + let conn = this.hubOrg.getConnection(); + let query = + 'SELECT count(id) In_Use, SignupEmail FROM ActiveScratchOrg GROUP BY SignupEmail ORDER BY count(id) DESC'; + const results = (await conn.query(query)) as any; + SFPLogger.log(`Info Fetched: ${JSON.stringify(results)}`, LoggerLevel.DEBUG); + + let scratchOrgRecordAsMapByUser = this.arrayToObject(results.records, 'SignupEmail'); + return scratchOrgRecordAsMapByUser; + } + + public async getScratchOrgIdGivenUserName(username: string) { + let conn = this.hubOrg.getConnection(); + let query = `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername = '${username}'`; + return retry( + async (bail) => { + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await conn.query(query)) as any; + return results.records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getScratchOrgInfoIdGivenUserName(username: string) { + let conn = this.hubOrg.getConnection(); + let query = `SELECT Id FROM ScratchOrgInfo WHERE SignupUsername = '${username}'`; + return retry( + async (bail) => { + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await conn.query(query)) as any; + return results.records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + private arrayToObject = (array, keyfield) => + array.reduce((obj, item) => { + obj[item[keyfield]] = item; + return obj; + }, {}); +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts new file mode 100644 index 000000000..d8d54a45e --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts @@ -0,0 +1,13 @@ +import { Org } from '@salesforce/core'; + +export default class ScratchOrgLimitsFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgLimits(): Promise { + let conn = this.hubOrg.getConnection(); + let apiVersion = await conn.retrieveMaxApiVersion(); + let query_uri = `${conn.instanceUrl}/services/data/v${apiVersion}/limits`; + const result = await conn.request(query_uri); + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts new file mode 100644 index 000000000..5055b8cc3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts @@ -0,0 +1,24 @@ +import { LoggerLevel, Org } from '@salesforce/core'; +let retry = require('async-retry'); +import SFPLogger from '@flxblio/sfp-logger'; +import ScratchOrgInfoFetcher from '../fetchers/ScratchOrgInfoFetcher'; +import ObjectCRUDHelper from '../../../../utils/ObjectCRUDHelper'; + +export default class ScratchOrgInfoAssigner { + constructor(private hubOrg: Org) {} + + public async setScratchOrgInfo(soInfo: any): Promise { + let hubConn = this.hubOrg.getConnection(); + let result = await ObjectCRUDHelper.updateRecord(hubConn,'ScratchOrgInfo',soInfo); + if(result) return true; + } + + public async setScratchOrgStatus(username: string, status: 'Allocate' | 'InProgress' | 'Return'): Promise { + let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgInfoIdGivenUserName(username); + + return this.setScratchOrgInfo({ + Id: scratchOrgId, + Allocation_status__c: status, + }); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts b/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts new file mode 100644 index 000000000..0c7f92965 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts @@ -0,0 +1,19 @@ +import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import defaultShell from '../utils/DefaultShell'; + +export default class scriptExecutorHelpers { + static async executeScript(logger: Logger, ...args: string[]) { + let cmd: string; + let argStr =args.join(' '); + if (process.platform !== 'win32') { + cmd = `${defaultShell()} -e ${argStr}`; + } else { + cmd = `cmd.exe /c ${argStr}`; + } + + SFPLogger.log(`Executing command.. ${cmd}`,LoggerLevel.INFO,logger); + let scriptExecutor: ExecuteCommand = new ExecuteCommand(logger, LoggerLevel.INFO, true); + let result = await scriptExecutor.execCommand(cmd, null); + } + } diff --git a/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts b/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts new file mode 100644 index 000000000..4df46887d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts @@ -0,0 +1,28 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class SFDMURunImpl extends SFDXCommand { + public constructor( + working_directory: string, + target_org: string, + private targetOrgDomain: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, working_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'sf sfdmu run'; + } + getCommandName(): string { + return 'sfdmu run'; + } + + getGeneratedParams(): string { + let command = `--path ${this.packageDirectory} -s csvfile -u ${this.target_org} --noprompt --canmodify ${this.targetOrgDomain}`; + if (this.logLevel) command += ` --loglevel ${LoggerLevel[this.logLevel]}`; + return command; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts new file mode 100644 index 000000000..b68631635 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts @@ -0,0 +1,22 @@ +import { Logger } from '@flxblio/sfp-logger'; + +export abstract class NativeMetricSender { + constructor(protected logger: Logger) {} + + abstract initialize(apiHost: string, apiKey: string): void; + + abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void; + + abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void; + + protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] { + if (tags != null && !Array.isArray(tags)) { + let transformedTagArray: string[] = []; + for (const [key, value] of Object.entries(tags)) { + transformedTagArray.push(`${key}:${value}`); + } + return transformedTagArray; + } + return tags as string[]; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts b/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts new file mode 100644 index 000000000..24e0bd165 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts @@ -0,0 +1,114 @@ +import StatsDClient, { ClientOptions, StatsD } from 'hot-shots'; +import * as fs from 'fs-extra'; +import { EOL } from 'os'; +import { NativeMetricSender } from './NativeMetricSender'; +import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender'; +import { Logger } from '@flxblio/sfp-logger'; +import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender'; +import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender'; + +export default class SFPStatsSender { + private static client: StatsD; + private static metricsLogger; + private static nativeMetricsSender: NativeMetricSender; + + static initialize(port: string, host: string, protocol: string) { + let options: ClientOptions = { + host: host, + port: port == null ? 8125 : Number(port), + protocol: protocol == 'tcp' ? 'tcp' : 'udp', + prefix: 'sfp.', + }; + SFPStatsSender.client = new StatsDClient(options); + } + + static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) { + switch (type) { + case 'DataDog': + this.nativeMetricsSender = new DataDogMetricsSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + case 'NewRelic': + this.nativeMetricsSender = new NewRelicMetricSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + case 'Splunk': + this.nativeMetricsSender = new SplunkMetricSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + default: + throw new Error('Invalid Metric Type'); + } + } + + static initializeLogBasedMetrics() { + try { + fs.mkdirpSync('.sfp/logs'); + SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`; + } catch (error) { + console.log('Unable to initiate Log based metrics', error); + } + } + + static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags); + + //Native Datadog integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `timers`, + value: elapsedMilliSeconds, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags); + + //Native Metrics integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `guage`, + value: value, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logCount(metric: string, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags); + + //Native Metrics integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `count`, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logMetrics(key: any, logger?: any) { + if (logger) { + fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8'); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts new file mode 100644 index 000000000..b1e6cb574 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts @@ -0,0 +1,52 @@ +import { BufferedMetricsLogger } from 'datadog-metrics'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { NativeMetricSender } from '../NativeMetricSender'; + +export class DataDogMetricsSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private nativeDataDogMetricsLogger: BufferedMetricsLogger; + + public initialize(apiHost: string, apiKey: string) { + try { + this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({ + apiHost: apiHost, + apiKey: apiKey, + prefix: 'sfp.', + flushIntervalSeconds: 0, + }); + } catch (error) { + SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger); + } + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + try { + let transformedTags = this.transformTagsToStringArray(tags); + this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags); + this.nativeDataDogMetricsLogger.flush(); + } catch (error) { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.TRACE, + this.logger + ); + } + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + try { + let transformedTags = this.transformTagsToStringArray(tags); + this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags); + this.nativeDataDogMetricsLogger.flush(); + } catch (error) { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.TRACE, + this.logger + ); + } + } +} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts new file mode 100644 index 000000000..bc6d6130d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts @@ -0,0 +1,66 @@ +import { NativeMetricSender } from '../NativeMetricSender'; +import { telemetry } from '@newrelic/telemetry-sdk'; +import { + CountMetric, + GaugeMetric, + MetricBatch, + MetricClient, +} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export class NewRelicMetricSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private nrMetricClient: telemetry.metrics.MetricClient; + + //Ignore API Host, as newrelic sdk doesnt need it + public initialize(apiHost: string, apiKey: string) { + try { + this.nrMetricClient = new MetricClient({ apiKey: apiKey }); + } catch (error) { + SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const guageMetric = new GaugeMetric(metric, value); + guageMetric.attributes = tags as { [key: string]: string }; + const batch = new MetricBatch({}, Date.now(), 1); + batch.addMetric(guageMetric); + this.nrMetricClient.send(batch, (error, response, body) => { + if (response) { + SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); + } + if (error) + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const countMetric = new CountMetric(metric); + countMetric.record(1); + countMetric.attributes = tags as { [key: string]: string }; + const batch = new MetricBatch({}, Date.now(), 1); + batch.addMetric(countMetric); + + this.nrMetricClient.send(batch, (error, response, body) => { + if (response) { + SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); + } + if (error) + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts new file mode 100644 index 000000000..f92a5f5d8 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts @@ -0,0 +1,49 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { NativeMetricSender } from '../NativeMetricSender'; +import axios ,{AxiosInstance} from 'axios'; + + + +export class SplunkMetricSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private instance: AxiosInstance; + + public initialize(apiHost: string, apiKey: string) { + this.instance = axios.create({ + baseURL: apiHost, + headers: {'Authorization': apiKey, 'Content-Type': 'application/json'} + }); + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}}; + this.instance.post('', JSON.stringify(payload)) + .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) + .catch((error) => { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}}; + this.instance.post('', JSON.stringify(payload)) + .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) + .catch((error) => { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } +} + diff --git a/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts b/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts new file mode 100644 index 000000000..f7d41dbb3 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts @@ -0,0 +1,16 @@ +import { StateAggregator } from '@salesforce/core'; + + +export async function convertAliasToUsername(alias: string) { + const stateAggregator = await StateAggregator.getInstance(); + await stateAggregator.orgs.readAll(); + return await stateAggregator.aliases.resolveUsername(alias) +} + +export async function convertUsernameToAlias(username: string) { + + const stateAggregator = await StateAggregator.getInstance(); + await stateAggregator.orgs.readAll(); + return await stateAggregator.aliases.resolveAlias(username) + +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts b/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts new file mode 100644 index 000000000..7cd6fa0d8 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts @@ -0,0 +1,11 @@ +export function chunkArray(perChunk: number, inputArray: any[]): Array { + let chunks = [], + i = 0, + n = inputArray.length; + + while (i < n) { + chunks.push(inputArray.slice(i, (i += perChunk))); + } + + return chunks; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts b/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts new file mode 100644 index 000000000..d8b4ae16a --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts @@ -0,0 +1,7 @@ +const sfp_DEFAULT_SHELL = `sh`; + +export default function defaultShell(): string { + return process.env.sfp_DEFAULT_SHELL + ? process.env.sfp_DEFAULT_SHELL + : sfp_DEFAULT_SHELL; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/Delay.ts b/packages/sfpowerscripts-cli/src/core/utils/Delay.ts new file mode 100644 index 000000000..80eb87107 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/Delay.ts @@ -0,0 +1,3 @@ +export async function delay(ms: number = 0) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts b/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts new file mode 100644 index 000000000..d77a7744d --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts @@ -0,0 +1,52 @@ +import fs = require('fs-extra'); +import path = require('path'); + +export default class FileSystem { + /** + * List nested files within a directory + * @param directory + * @param includeDirectories + * @returns + */ + static readdirRecursive( + searchDirectory: string, + includeDirectories: boolean = false, + isAbsolute: boolean = false + ): string[] { + const result: string[] = []; + + if (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`); + + (function readdirRecursiveHandler(directory: string): void { + const files: string[] = fs.readdirSync(directory); + + files.forEach((file) => { + let filepath: string; + if (isAbsolute) { + filepath = path.resolve(directory, file); + } else { + filepath = path.join(directory, file); + } + + if (fs.lstatSync(filepath).isDirectory()) { + if (includeDirectories) { + if (isAbsolute) { + result.push(path.resolve(filepath)); + } else { + result.push(path.relative(searchDirectory, filepath)); + } + } + readdirRecursiveHandler(filepath); + } else { + if (isAbsolute) { + result.push(path.resolve(filepath)); + } else { + result.push(path.relative(searchDirectory, filepath)); + } + } + }); + })(searchDirectory); + + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts b/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts new file mode 100644 index 000000000..b121332b0 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts @@ -0,0 +1,204 @@ +const fs = require('fs'); +const path = require('path'); +const _ = require('lodash'); +const os = require('os'); + +const SEP = /\/|\\/; + +export const PLUGIN_CACHE_FOLDER = 'sfpowerkit'; + +export default class FileUtils { + /** + * Delete file or directories recursively from the project + * @param deletedComponents Files or directories to delete + */ + public static deleteComponents(deletedComponents: string[]) { + deletedComponents.forEach((component) => { + if (fs.existsSync(component)) { + if (fs.lstatSync(component).isDirectory()) { + FileUtils.deleteFolderRecursive(component); + } else { + fs.unlinkSync(component); + } + } + }); + } + /** + * Load all files from the given folder with the given extension + * @param folder the folder from which files wille be loaded + * @param extension File extension to load. + */ + public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] { + let result: string[] = []; + let pathExists = fs.existsSync(folder); + let folderName = path.basename(folder); + if (!pathExists) { + console.log('Folder does not exist:', folderName); + return result; + } + let content: string[] = fs.readdirSync(folder); + content.forEach((file) => { + let curFile = path.join(folder, file); + let stats = fs.statSync(curFile); + if (stats.isFile()) { + if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') { + result.push(curFile); + } + } else if (stats.isDirectory()) { + let files: string[] = this.getAllFilesSync(curFile, extension); + result = _.concat(result, files); + } + }); + return result; + } + + public static getGlobalCacheDir() { + let homedir = os.homedir(); + let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; + if (!fs.existsSync(configDir)) { + console.log('Config folder does not exists, Creating Folder'); + fs.mkdirSync(configDir); + } + + return configDir; + } + + /** + * Get the cache path for the given cache file name + * @param fileName + */ + public static getGlobalCachePath(fileName: string) { + let homedir = os.homedir(); + let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; + if (!fs.existsSync(configDir)) { + console.log('Config folder does not exists, Creating Folder'); + fs.mkdirSync(configDir); + } + return configDir + path.sep + fileName; + } + + /** + * Create a folder path recursively + * @param targetDir + * @param param1 + */ + public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) { + const sep = path.sep; + const initDir = path.isAbsolute(targetDir) ? sep : ''; + const baseDir = isRelativeToScript ? __dirname : '.'; + + targetDir.split(sep).reduce((parentDir, childDir) => { + const curDir = path.resolve(baseDir, parentDir, childDir); + try { + fs.mkdirSync(curDir); + } catch (err) { + if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') { + throw err; + } + } + return curDir; + }, initDir); + } + /** + * Get the file name withoud extension + * @param filePath file path + * @param extension extension + */ + public static getFileNameWithoutExtension(filePath: string, extension?: string): string { + let fileParts = filePath.split(SEP); + let fileName = fileParts[fileParts.length - 1]; + if (extension) { + fileName = fileName.substr(0, fileName.lastIndexOf(extension)); + } else { + fileName = fileName.substr(0, fileName.indexOf('.')); + } + return fileName; + } + + /** + * Copu folder recursively + * @param src source folder to copy + * @param dest destination folder + */ + public static copyRecursiveSync(src, dest) { + let exists = fs.existsSync(src); + if (exists) { + let stats = fs.statSync(src); + let isDirectory = stats.isDirectory(); + if (isDirectory) { + exists = fs.existsSync(dest); + if (!exists) { + fs.mkdirSync(dest); + } + fs.readdirSync(src).forEach(function (childItemName) { + FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); + }); + } else { + fs.copyFileSync(src, dest); + } + } + } + /** + * Get path to a given folder base on the parent folder + * @param src Parent folder + * @param foldername folder to build the path to + */ + public static getFolderPath(src, foldername) { + let exists = fs.existsSync(src); + let toReturn = ''; + if (exists) { + let stats = fs.statSync(src); + let isDirectory = stats.isDirectory(); + if (isDirectory) { + let childs = fs.readdirSync(src); + for (let i = 0; i < childs.length; i++) { + let childItemName = childs[i]; + if (childItemName === foldername) { + toReturn = path.join(src, childItemName); + } else { + let childStat = fs.statSync(path.join(src, childItemName)); + if (childStat.isDirectory()) { + toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername); + } + } + if (toReturn !== '') { + break; + } + } + } + } + return toReturn; + } + + /** + * Delete a folder and its content recursively + * @param folder folder to delete + */ + public static deleteFolderRecursive(folder) { + if (fs.existsSync(folder)) { + fs.readdirSync(folder).forEach(function (file, index) { + let curPath = path.join(folder, file); + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + //console.log("Delete recursively"); + FileUtils.deleteFolderRecursive(curPath); + } else { + // delete file + //console.log("Delete file "+ curPath); + fs.unlinkSync(curPath); + } + }); + //console.log("delete folder "+ folder); + fs.rmdirSync(folder); + } + } + public static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts b/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts new file mode 100644 index 000000000..0c4fd9057 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts @@ -0,0 +1,6 @@ +export default function getFormattedTime(milliseconds: number): string { + let date = new Date(0); + date.setMilliseconds(milliseconds); + let timeString = date.toISOString().substr(11, 12); + return timeString; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts b/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts new file mode 100644 index 000000000..e4db23cc5 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts @@ -0,0 +1,38 @@ +import { Connection } from '@salesforce/core'; +import { Record, SaveResult } from 'jsforce'; +import { isArray } from 'lodash'; + +const retry = require('async-retry'); + +export default class ObjectCRUDHelper { + static async updateRecord(conn: Connection, sObject: string, record: Record): Promise { + return retry( + async (bail) => { + let result = await conn.update(sObject, record); + if (isArray(result)) { + let isAllRecordsSucceeded = true; + for (const individualResult of result as SaveResult[]) { + if (!individualResult.success) { + isAllRecordsSucceeded = false; + } + } + if (isAllRecordsSucceeded) return 'All records updated'; + else throw new Error('Some records have been failed to update'); + } else if ((result as SaveResult).success) return (result as SaveResult).id; + else bail(); + }, + { retries: 3, minTimeout: 2000 } + ); + } + + static async createRecord(conn: Connection, sObject: string, record: Record): Promise { + return retry( + async (bail) => { + let result = await conn.create(sObject, record); + if (result.success) return result.id; + else bail(); + }, + { retries: 3, minTimeout: 2000 } + ); + } +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts b/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts new file mode 100644 index 000000000..5daeff556 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts @@ -0,0 +1,17 @@ +import { ChildProcess } from 'child_process'; + +export async function onExit(childProcess: ChildProcess, message?: string): Promise<{}> { + return new Promise((resolve, reject) => { + childProcess.once('close', (code: number, signal: string) => { + if (code === 0 || (code === null && signal === 'SIGTERM')) { + resolve(undefined); + } else { + reject(new Error(message ? message : `Exit with error code ${code}`)); + } + }); + + childProcess.once('error', (err: Error) => { + reject(new Error(message ? message : err.message)); + }); + }); +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts b/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts new file mode 100644 index 000000000..36d0d7272 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts @@ -0,0 +1,9 @@ +export function makeRandomId(length): string { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts b/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts new file mode 100644 index 000000000..b86c233eb --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts @@ -0,0 +1,33 @@ +/** + * Converts build-number dot delimeter to hyphen + * If dot delimeter does not exist, returns input + * @param version + */ +export default function convertBuildNumDotDelimToHyphen(version: string) { + let convertedVersion = version; + + let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version); + if (version[indexOfBuildNumDelimiter] === '.') { + convertedVersion = + version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1); + } + return convertedVersion; +} + +/** + * Get the index of the build-number delimeter + * Returns null if unable to find index of delimeter + * @param version + */ +function getIndexOfBuildNumDelimeter(version: string) { + let numOfDelimetersTraversed: number = 0; + for (let i = 0; i < version.length; i++) { + if (!Number.isInteger(parseInt(version[i], 10))) { + numOfDelimetersTraversed++; + } + if (numOfDelimetersTraversed === 3) { + return i; + } + } + return null; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts b/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts new file mode 100644 index 000000000..1f7844797 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts @@ -0,0 +1,10 @@ +/** + * Extracts domain name from full URL string + * @param url + * @returns + */ +export default function extractDomainFromUrl(url: string): string { + if (!url) return url; + const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); + return matches && matches[1]; +} diff --git a/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts b/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts new file mode 100644 index 000000000..9fdeb2d78 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts @@ -0,0 +1,10 @@ +const xmlParser = require('xml2js').Parser({ explicitArray: false }); + +export default function xml2json(xml) { + return new Promise((resolve, reject) => { + xmlParser.parseString(xml, function (err, json) { + if (err) reject(err); + else resolve(json); + }); + }); +} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts new file mode 100644 index 000000000..981f942a5 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts @@ -0,0 +1,21 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityInitialInstall extends SFDXCommand { + public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packUpdateSettings'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} --nojob installVlocityInitial`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts new file mode 100644 index 000000000..2cdc70087 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts @@ -0,0 +1,31 @@ +import path from 'path'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityPackDeployImpl extends SFDXCommand { + public constructor( + project_directory: string, + target_org: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packDeploy'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} -job ${path.join( + this.packageDirectory, + 'VlocityComponents.yaml' + )} packDeploy`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts new file mode 100644 index 000000000..6d4f6584c --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts @@ -0,0 +1,21 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityPackUpdateSettings extends SFDXCommand { + public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packUpdateSettings'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} --nojob packUpdateSettings`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts new file mode 100644 index 000000000..b31df3640 --- /dev/null +++ b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts @@ -0,0 +1,31 @@ +import path from 'path'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityRefreshBase extends SFDXCommand { + public constructor( + project_directory: string, + target_org: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:refreshVlocityBase'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} -job ${path.join( + this.packageDirectory, + 'VlocityComponents.yaml' + )} refreshVlocityBase`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts b/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts index 4381e1070..334f3c552 100644 --- a/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts +++ b/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts @@ -1,8 +1,8 @@ -import SfpowerscriptsError from './SfpowerscriptsError'; +import SfpError from './SfpError'; import { ReleaseResult } from '../impl/release/ReleaseImpl'; -export default class ReleaseError extends SfpowerscriptsError { +export default class ReleaseError extends SfpError { /** * Payload for the results of the release */ diff --git a/packages/sfpowerscripts-cli/src/errors/SfpowerscriptsError.ts b/packages/sfpowerscripts-cli/src/errors/SfpError.ts similarity index 86% rename from packages/sfpowerscripts-cli/src/errors/SfpowerscriptsError.ts rename to packages/sfpowerscripts-cli/src/errors/SfpError.ts index 7463428c0..2665ed5c3 100644 --- a/packages/sfpowerscripts-cli/src/errors/SfpowerscriptsError.ts +++ b/packages/sfpowerscripts-cli/src/errors/SfpError.ts @@ -1,4 +1,4 @@ -export default abstract class SfpowerscriptsError extends Error { +export default abstract class SfpError extends Error { readonly message: string; readonly code: string; /** diff --git a/packages/sfpowerscripts-cli/src/errors/ValidateError.ts b/packages/sfpowerscripts-cli/src/errors/ValidateError.ts index a8aa5e5ae..5890a1ec6 100644 --- a/packages/sfpowerscripts-cli/src/errors/ValidateError.ts +++ b/packages/sfpowerscripts-cli/src/errors/ValidateError.ts @@ -1,7 +1,7 @@ -import SfpowerscriptsError from './SfpowerscriptsError'; +import SfpError from './SfpError'; import ValidateResult from '../impl/validate/ValidateResult'; -export default class ValidateError extends SfpowerscriptsError { +export default class ValidateError extends SfpError { /** * Payload for the results of the release */ diff --git a/packages/sfpowerscripts-cli/src/flags/duration.ts b/packages/sfpowerscripts-cli/src/flags/duration.ts index ee3984a55..af0994e29 100644 --- a/packages/sfpowerscripts-cli/src/flags/duration.ts +++ b/packages/sfpowerscripts-cli/src/flags/duration.ts @@ -9,7 +9,7 @@ import { Messages } from '@salesforce/core'; import { Duration } from '@salesforce/kit'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'core-messages'); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); type DurationUnit = Lowercase; diff --git a/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts b/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts index cb0ffd8c2..92ca9ac74 100644 --- a/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts +++ b/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts @@ -8,7 +8,7 @@ import { Flags } from '@oclif/core'; import { Messages, Lifecycle, OrgConfigProperties, validateApiVersion } from '@salesforce/core'; Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'core-messages'); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); // versions below this are retired export const minValidApiVersion = 21; @@ -16,7 +16,7 @@ export const minValidApiVersion = 21; export const maxDeprecated = 30; export const maxDeprecatedUrl = 'https://help.salesforce.com/s/articleView?id=000354473&type=1;'; -/**const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'core-messages'); +/**const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); * apiVersion for a salesforce org's rest api. * Will validate format and that the api version is still supported. * Will default to the version specified in Config, if it exists (and will provide an override warning) diff --git a/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts b/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts index 54694ac7f..9d73f98da 100644 --- a/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts +++ b/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts @@ -1,6 +1,6 @@ /* - * Modified from sfdx-plugins-core to meet sfpowerscripts requirment - * sfpowerscripts is not moving to the new style immediately + * Modified from sfdx-plugins-core to meet sfp requirment + * sfp is not moving to the new style immediately * to reduce migration efforts in pipelines * * @@ -25,7 +25,7 @@ export const orgApiVersionFlagSfdxStyle = orgApiVersionFlag({ }); Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@dxatscale/sfpowerscripts', 'core-messages'); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); export const loglevel = Flags.string({ description: 'logging level for this command invocation', diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts index 5185af3b9..8e5cead2d 100644 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts +++ b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts @@ -2,7 +2,7 @@ import * as fs from 'fs-extra'; import child_process = require('child_process'); import path = require('path'); import FetchAnArtifact from './FetchAnArtifact'; -import SFPLogger, { COLOR_WARNING } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_WARNING } from '@flxblio/sfp-logger'; export class FetchAnArtifactFromNPM implements FetchAnArtifact { constructor(private scope: string, private npmrcPath: string) { @@ -40,8 +40,8 @@ export class FetchAnArtifactFromNPM implements FetchAnArtifact { packageName = packageName.toLowerCase(); let cmd: string; - if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfpowerscripts_artifact`; - else cmd = `npm pack ${packageName}_sfpowerscripts_artifact`; + if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfp_artifact`; + else cmd = `npm pack ${packageName}_sfp_artifact`; cmd += `@${version}`; diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts index 56563dc67..abd9fd714 100644 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts +++ b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts @@ -1,8 +1,8 @@ -import SFPLogger, { COLOR_WARNING, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; const fs = require('fs-extra'); import child_process = require('child_process'); import FetchAnArtifact from './FetchAnArtifact'; -import defaultShell from '@dxatscale/sfpowerscripts.core/lib/utils/DefaultShell'; +import defaultShell from '../../core/utils/DefaultShell'; export class FetchAnArtifactUsingScript implements FetchAnArtifact { constructor(private scriptPath: string) {} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts index 5a9a392ff..dcf60ac28 100644 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts +++ b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts @@ -1,9 +1,9 @@ -import SfpowerscriptsError from '../../errors/SfpowerscriptsError'; +import SfpError from '../../errors/SfpError'; import { ArtifactVersion } from './FetchImpl'; -export default class FetchArtifactsError extends SfpowerscriptsError { +export default class FetchArtifactsError extends SfpError { /** * Payload consisting of artifacts that succeeded and failed to fetch */ diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts index f32b11960..33df9a75c 100644 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts @@ -1,14 +1,14 @@ import * as fs from 'fs-extra'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; -import GitTags from '@dxatscale/sfpowerscripts.core/lib/git/GitTags'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; import FetchArtifactsError from './FetchArtifactsError'; import * as rimraf from 'rimraf'; import FetchArtifactSelector from './FetchArtifactSelector'; import _ from 'lodash'; import path from 'path'; -import FileUtils from '@dxatscale/sfpowerscripts.core/lib/utils/Fileutils'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import FileUtils from '../../core/utils/Fileutils'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; export default class FetchImpl { constructor( diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts index 4923e3222..1326bec90 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts @@ -1,4 +1,4 @@ -import ArtifactFetcher, { Artifact } from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; import { ReleaseChangelog } from './ReleaseChangelog'; import ChangelogMarkdownGenerator from './ChangelogMarkdownGenerator'; import ReleaseChangelogUpdater from './ReleaseChangelogUpdater'; @@ -8,10 +8,10 @@ import { marked } from 'marked'; const TerminalRenderer = require('marked-terminal'); const retry = require('async-retry'); import { GitError } from 'simple-git'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SFPLogger, { LoggerLevel, ConsoleLogger, Logger } from '@dxatscale/sfp-logger'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; +import SfpPackage from '../../core/package/SfpPackage'; +import SFPLogger, { LoggerLevel, ConsoleLogger, Logger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import Git from '../../core/git/Git'; import FileOutputHandler from '../../outputs/FileOutputHandler'; @@ -97,7 +97,7 @@ export default class ChangelogImpl { } else { console.log(`${sfpPackage.packageName} artifact is missing branch information`); console.log( - `This will cause an error in the future. Re-create the artifact using the latest version of sfpowerscripts to maintain compatibility.` + `This will cause an error in the future. Re-create the artifact using the latest version of sfp to maintain compatibility.` ); } } diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts index d17e50a37..e20879963 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts @@ -1,5 +1,5 @@ import { Release } from './ReleaseChangelog'; -import { Changelog as PackageChangelog } from '@dxatscale/sfpowerscripts.core/lib/changelog/interfaces/GenericChangelogInterfaces'; +import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; import ReadPackageChangelog from './ReadPackageChangelog'; export default class CommitUpdater { diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts index 64090d316..2fa69ae3c 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts @@ -1,4 +1,4 @@ -import { Changelog as PackageChangelog } from '@dxatscale/sfpowerscripts.core/lib/changelog/interfaces/GenericChangelogInterfaces'; +import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; export default interface ReadPackageChangelog { (changelogFilePath: string): PackageChangelog; diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts index 8851d9d32..456d8544f 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts @@ -1,4 +1,4 @@ -import { Changelog, Commit } from '@dxatscale/sfpowerscripts.core/lib/changelog/interfaces/GenericChangelogInterfaces'; +import { Changelog, Commit } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; export class ReleaseChangelog { releases: Release[]; diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts index 2b3fe3850..4a8808c4b 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts @@ -4,7 +4,7 @@ import WorkItemUpdater from './WorkItemUpdater'; import OrgsUpdater from './OrgsUpdater'; import ReadPackageChangelog from './ReadPackageChangelog'; import * as fs from 'fs-extra'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import SfpPackage from '../../core/package/SfpPackage'; var hash = require('object-hash'); export default class ReleaseChangelogUpdater { diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts index 7faef8fbd..71c9eec7e 100644 --- a/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts +++ b/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts @@ -1,4 +1,4 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { Release } from './ReleaseChangelog'; diff --git a/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts b/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts index 9428f9f9b..daf033582 100644 --- a/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts +++ b/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts @@ -2,7 +2,7 @@ import path = require('path'); import * as fs from 'fs-extra'; import { marked } from 'marked'; const TerminalRenderer = require('marked-terminal'); -import { delay } from '@dxatscale/sfpowerscripts.core/lib/utils/Delay'; +import { delay } from '../../core/utils/Delay'; export default class DemoReelPlayer { public async execute(demoReelFolderPath: string) { diff --git a/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts b/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts index 7df3bf7b1..cf58a7187 100644 --- a/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts @@ -1,10 +1,10 @@ -import TransitiveDependencyResolver from '@dxatscale/sfpowerscripts.core/lib/package/dependencies/TransitiveDependencyResolver'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@dxatscale/sfp-logger'; -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; +import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; import _ from 'lodash'; import { Connection } from '@salesforce/core'; const Table = require('cli-table'); -import UserDefinedExternalDependency from '@dxatscale/sfpowerscripts.core/lib/project/UserDefinedExternalDependency'; +import UserDefinedExternalDependency from '../../core/project/UserDefinedExternalDependency'; export default class ShrinkImpl { private dependencyMap; diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts b/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts index 4e83da473..98851aaad 100644 --- a/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts @@ -1,28 +1,28 @@ -import ArtifactFetcher, { Artifact } from '@dxatscale/sfpowerscripts.core/lib/artifacts/ArtifactFetcher'; -import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, FileLogger, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, FileLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { EOL } from 'os'; import { Stage } from '../Stage'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; import semver = require('semver'); -import PromoteUnlockedPackageImpl from '@dxatscale/sfpowerscripts.core/lib/package/promote/PromoteUnlockedPackageImpl'; -import { DeploymentType } from '@dxatscale/sfpowerscripts.core/lib/deployers/DeploymentExecutor'; -import { COLOR_KEY_MESSAGE,COLOR_KEY_VALUE,COLOR_HEADER } from '@dxatscale/sfp-logger'; +import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl'; +import { DeploymentType } from '../../core/deployers/DeploymentExecutor'; +import { COLOR_KEY_MESSAGE,COLOR_KEY_VALUE,COLOR_HEADER } from '@flxblio/sfp-logger'; import { PackageInstallationResult, PackageInstallationStatus, -} from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; -import SfpPackage, { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import SfpPackageInquirer from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInquirer'; +} from '../../core/package/packageInstallers/PackageInstallationResult'; +import SFPOrg from '../../core/org/SFPOrg'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; import { PostDeployHook } from './PostDeployHook'; import { PreDeployHook } from './PreDeployHook'; -import SfpPackageBuilder from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder'; -import SfpPackageInstaller from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackageInstaller'; -import { SfpPackageInstallationOptions } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallPackage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; +import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; import * as _ from 'lodash'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import convertBuildNumDotDelimToHyphen from '@dxatscale/sfpowerscripts.core/lib/utils/VersionNumberConverter'; +import convertBuildNumDotDelimToHyphen from '../../core/utils/VersionNumberConverter'; import ReleaseConfig from '../release/ReleaseConfig'; import fs from 'fs-extra'; import { Align, getMarkdownTable } from 'markdown-table-ts'; diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts b/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts index 2b6e3e324..7f73cf3ba 100644 --- a/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts +++ b/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts @@ -1,6 +1,6 @@ -import { Logger } from '@dxatscale/sfp-logger'; -import { PackageInstallationResult } from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import { Logger } from '@flxblio/sfp-logger'; +import { PackageInstallationResult } from '../../core/package/packageInstallers/PackageInstallationResult'; +import SfpPackage from '../../core/package/SfpPackage'; export interface PostDeployHook { postDeployPackage( diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts b/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts index 5f94ca2b1..58294b363 100644 --- a/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts +++ b/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts @@ -1,5 +1,5 @@ -import { Logger } from '@dxatscale/sfp-logger'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../../core/package/SfpPackage'; export interface PreDeployHook { preDeployPackage( diff --git a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts b/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts index a3640b6c9..0d00338bb 100644 --- a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts +++ b/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts @@ -1,9 +1,9 @@ -import PackageDiffImpl, { PackageDiffOptions } from '@dxatscale/sfpowerscripts.core/lib/package/diff/PackageDiffImpl'; +import PackageDiffImpl, { PackageDiffOptions } from '../../core/package/diff/PackageDiffImpl'; import { Stage } from '../Stage'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; -import { PackageType } from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import { PackageType } from '../../core/package/SfpPackage'; import * as fs from 'fs-extra'; -import { Logger } from '@dxatscale/sfp-logger'; +import { Logger } from '@flxblio/sfp-logger'; import BuildCollections from '../parallelBuilder/BuildCollections'; export interface ImpactedPackageProps { @@ -44,7 +44,7 @@ export default class ImpactedPackageResolver { private getPathToForceIgnoreForCurrentStage(projectConfig: any, currentStage: Stage): string { let stageForceIgnorePath: string; - let ignoreFiles: { [key in Stage]: string } = projectConfig.plugins?.sfpowerscripts?.ignoreFiles; + let ignoreFiles: { [key in Stage]: string } = projectConfig.plugins?.sfp?.ignoreFiles; if (ignoreFiles) { Object.keys(ignoreFiles).forEach((key) => { if (key.toLowerCase() == currentStage) { diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts index 7962ef12f..7d3e3b5dc 100644 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts +++ b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts @@ -1,5 +1,5 @@ import UndirectedGraph from './UndirectedGraph'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; /** * Class for the manipulation of package build collections diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts index aa11d3f68..5bc6a3e82 100644 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts @@ -3,12 +3,12 @@ import DependencyHelper from "./DependencyHelper"; import Bottleneck from "bottleneck"; import PackageDiffImpl, { PackageDiffOptions, -} from "@dxatscale/sfpowerscripts.core/lib/package/diff/PackageDiffImpl"; +} from "../../core/package/diff/PackageDiffImpl"; import { EOL } from "os"; -import SFPStatsSender from "@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender"; +import SFPStatsSender from "../../core/stats/SFPStatsSender"; import { Stage } from "../Stage"; import * as fs from "fs-extra"; -import ProjectConfig from "@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig"; +import ProjectConfig from "../../core/project/ProjectConfig"; import BuildCollections from "./BuildCollections"; const Table = require("cli-table"); import SFPLogger, { @@ -17,26 +17,26 @@ import SFPLogger, { FileLogger, LoggerLevel, VoidLogger, -} from "@dxatscale/sfp-logger"; -import { COLOR_KEY_MESSAGE } from "@dxatscale/sfp-logger"; -import { COLOR_HEADER } from "@dxatscale/sfp-logger"; -import { COLOR_ERROR } from "@dxatscale/sfp-logger"; +} from "@flxblio/sfp-logger"; +import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; +import { COLOR_HEADER } from "@flxblio/sfp-logger"; +import { COLOR_ERROR } from "@flxblio/sfp-logger"; import SfpPackage, { PackageType, -} from "@dxatscale/sfpowerscripts.core/lib/package/SfpPackage"; -import SfpPackageBuilder from "@dxatscale/sfpowerscripts.core/lib/package/SfpPackageBuilder"; -import getFormattedTime from "@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime"; +} from "../../core/package/SfpPackage"; +import SfpPackageBuilder from "../../core/package/SfpPackageBuilder"; +import getFormattedTime from "../../core/utils/GetFormattedTime"; import { COLON_MIDDLE_BORDER_TABLE, ZERO_BORDER_TABLE, } from "../../ui/TableConstants"; -import PackageDependencyResolver from "@dxatscale/sfpowerscripts.core/lib/package/dependencies/PackageDependencyResolver"; -import SFPOrg from "@dxatscale/sfpowerscripts.core/lib/org/SFPOrg"; -import Git from "@dxatscale/sfpowerscripts.core/lib/git/Git"; -import TransitiveDependencyResolver from "@dxatscale/sfpowerscripts.core/lib/package/dependencies/TransitiveDependencyResolver"; +import PackageDependencyResolver from "../../core/package/dependencies/PackageDependencyResolver"; +import SFPOrg from "../../core/org/SFPOrg"; +import Git from "../../core/git/Git"; +import TransitiveDependencyResolver from "../../core/package/dependencies/TransitiveDependencyResolver"; import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; -import UserDefinedExternalDependency from "@dxatscale/sfpowerscripts.core/lib/project/UserDefinedExternalDependency"; -import PackageDependencyDisplayer from "@dxatscale/sfpowerscripts.core/lib/display/PackageDependencyDisplayer"; +import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; +import PackageDependencyDisplayer from "../../core/display/PackageDependencyDisplayer"; const PRIORITY_UNLOCKED_PKG_WITH_DEPENDENCY = 1; const PRIORITY_UNLOCKED_PKG_WITHOUT_DEPENDENCY = 3; @@ -445,11 +445,11 @@ export default class BuildImpl { SFPLogger.log(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"); + fs.appendFileSync(`.sfp/logs/${pkg}`, reason.message, "utf8"); + let data = fs.readFileSync(`.sfp/logs/${pkg}`, "utf8"); - const pathToMarkDownFile = `.sfpowerscripts/outputs/build-error-info.md`; - fs.mkdirpSync(".sfpowerscripts/outputs"); + const pathToMarkDownFile = `.sfp/outputs/build-error-info.md`; + fs.mkdirpSync(".sfp/outputs"); fs.createFileSync(pathToMarkDownFile); fs.appendFileSync(pathToMarkDownFile, `\nPlease find the errors observed during build\n\n`); fs.appendFileSync(pathToMarkDownFile, `## ${pkg}\n\n`); @@ -755,7 +755,7 @@ export default class BuildImpl { return SfpPackageBuilder.buildPackageFromProjectDirectory( - new FileLogger(`.sfpowerscripts/logs/${sfdx_package}`), + new FileLogger(`.sfp/logs/${sfdx_package}`), this.props.projectDirectory, sfdx_package, { @@ -800,7 +800,7 @@ export default class BuildImpl { let stageForceIgnorePath: string; let ignoreFiles: { [key in Stage]: string } = - projectConfig.plugins?.sfpowerscripts?.ignoreFiles; + projectConfig.plugins?.sfp?.ignoreFiles; if (ignoreFiles) { Object.keys(ignoreFiles).forEach((key) => { if (key.toLowerCase() == currentStage) { @@ -823,11 +823,11 @@ export default class BuildImpl { projectConfig: any, ): { [key: string]: any }[] { this.isMultiConfigFilesEnabled = - this.projectConfig?.plugins?.sfpowerscripts?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles; + this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles; let configFiles: { [key: string]: any }[]; if (this.isMultiConfigFilesEnabled) { configFiles = - this.projectConfig?.plugins?.sfpowerscripts?.scratchOrgDefFilePaths + this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths ?.packages; } return configFiles; @@ -835,7 +835,7 @@ export default class BuildImpl { private async resolvePackageDependencies(projectConfig: any) { let isDependencyResolverEnabled = - !projectConfig?.plugins?.sfpowerscripts + !projectConfig?.plugins?.sfp ?.disableTransitiveDependencyResolver; if (isDependencyResolverEnabled) { diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts index 7549e809e..9e2164912 100644 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts +++ b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts @@ -1,4 +1,4 @@ -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; export default class DependencyHelper { static getParentsToBeFullFilled(packagesWithParents: AdjacentList, packages: string[]): any { for (let [pkgName, parents] of Object.entries(packagesWithParents)) { diff --git a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts index 98b976b19..1087c6367 100644 --- a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts @@ -1,33 +1,33 @@ import { Org } from '@salesforce/core'; -import { PoolConfig } from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolConfig'; -import isValidSfdxAuthUrl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, ConsoleLogger, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import ArtifactGenerator from '@dxatscale/sfpowerscripts.core/lib/artifacts/generators/ArtifactGenerator'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import isValidSfdxAuthUrl from '../../core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ArtifactGenerator from '../../core/artifacts/generators/ArtifactGenerator'; +import ProjectConfig from '../../core/project/ProjectConfig'; import { Result } from 'neverthrow'; import FetchAnArtifact from '../artifacts/FetchAnArtifact'; import FetchArtifactSelector from '../artifacts/FetchArtifactSelector'; import BuildImpl, { BuildProps } from '../parallelBuilder/BuildImpl'; -import PoolCreateImpl from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolCreateImpl'; -import { PoolError } from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolError'; +import PoolCreateImpl from '../../core/scratchorg/pool/PoolCreateImpl'; +import { PoolError } from '../../core/scratchorg/pool/PoolError'; import { Stage } from '../Stage'; import PrepareOrgJob from './PrepareOrgJob'; import * as rimraf from 'rimraf'; import * as fs from 'fs-extra'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; -import GitTags from '@dxatscale/sfpowerscripts.core/lib/git/GitTags'; -import OrgDetailsFetcher from '@dxatscale/sfpowerscripts.core/lib/org/OrgDetailsFetcher'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; +import OrgDetailsFetcher from '../../core/org/OrgDetailsFetcher'; +import SFPOrg from '../../core/org/SFPOrg'; import { EOL } from 'os'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import ExternalPackage2DependencyResolver from '@dxatscale/sfpowerscripts.core/lib/package/dependencies/ExternalPackage2DependencyResolver'; -import ExternalDependencyDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/ExternalDependencyDisplayer'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; import ReleaseDefinitionGenerator from '../release/ReleaseDefinitionGenerator'; import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; import ReleaseConfig from '../release/ReleaseConfig'; -import { COLOR_KEY_VALUE } from '@dxatscale/sfp-logger'; +import { COLOR_KEY_VALUE } from '@flxblio/sfp-logger'; const Table = require('cli-table'); diff --git a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts index 2a38eb9b9..eae028d18 100644 --- a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts +++ b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts @@ -1,31 +1,31 @@ import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../deploy/DeployImpl'; -import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE, ConsoleLogger } from '@dxatscale/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; import { Stage } from '../Stage'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; -import ScratchOrg from '@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; import { Result, ok, err } from 'neverthrow'; import PoolJobExecutor, { JobError, ScriptExecutionResult, -} from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolJobExecutor'; +} from '../../core/scratchorg/pool/PoolJobExecutor'; import { Connection, Org } from '@salesforce/core'; -import { PoolConfig } from '@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolConfig'; -import VlocityPackUpdateSettings from '@dxatscale/sfpowerscripts.core/lib/vlocitywrapper/VlocityPackUpdateSettings'; -import VlocityInitialInstall from '@dxatscale/sfpowerscripts.core/lib/vlocitywrapper/VlocityInitialInstall'; -import ScriptExecutor from '@dxatscale/sfpowerscripts.core/lib/scriptExecutor/ScriptExecutorHelpers'; -import DeploymentSettingsService from '@dxatscale/sfpowerscripts.core/lib/deployers/DeploymentSettingsService'; -import PackageDetails from '@dxatscale/sfpowerscripts.core/lib/package/Package2Detail'; -import InstallUnlockedPackageCollection from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallUnlockedPackageCollection'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import VlocityPackUpdateSettings from '../../core/vlocitywrapper/VlocityPackUpdateSettings'; +import VlocityInitialInstall from '../../core/vlocitywrapper/VlocityInitialInstall'; +import ScriptExecutor from '../../core/scriptExecutor/ScriptExecutorHelpers'; +import DeploymentSettingsService from '../../core/deployers/DeploymentSettingsService'; +import PackageDetails from '../../core/package/Package2Detail'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; +import SFPOrg from '../../core/org/SFPOrg'; import { PreDeployHook } from '../deploy/PreDeployHook'; -import SfpPackage from '@dxatscale/sfpowerscripts.core/lib/package/SfpPackage'; -import ExternalPackage2DependencyResolver from '@dxatscale/sfpowerscripts.core/lib/package/dependencies/ExternalPackage2DependencyResolver'; -import ExternalDependencyDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/ExternalDependencyDisplayer'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; -import { FileLogger } from '@dxatscale/sfp-logger'; +import SfpPackage from '../../core/package/SfpPackage'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import { FileLogger } from '@flxblio/sfp-logger'; const fs = require('fs-extra'); -const SFPOWERSCRIPTS_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; +const sfp_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployHook { public constructor( protected pool: PoolConfig, @@ -57,8 +57,8 @@ export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployH individualSODeploymentActivityLogger ); - //Install sfpowerscripts package - await this.installSfPowerscriptsArtifactPackage( + //Install sfp package + await this.installsfpArtifactPackage( scratchOrg, individualSODeploymentActivityLogger, packageCollectionInstaller @@ -140,27 +140,27 @@ export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployH return deploymentSucceed; } - private async installSfPowerscriptsArtifactPackage( + private async installsfpArtifactPackage( scratchOrg: ScratchOrg, logger: Logger, packageCollectionInstaller: InstallUnlockedPackageCollection ) { - SFPLogger.log(`Installing sfpowerscripts_artifact package to the ${scratchOrg.alias}`, null, logger); + SFPLogger.log(`Installing sfp_artifact package to the ${scratchOrg.alias}`, null, logger); - //Install sfpowerscripts artifact package + //Install sfp artifact package await packageCollectionInstaller.install( [ { - name: 'sfpowerscripts_artifact2', - subscriberPackageVersionId: process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE - ? process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE - : SFPOWERSCRIPTS_ARTIFACT_PACKAGE, + name: 'sfp_artifact2', + subscriberPackageVersionId: process.env.sfp_ARTIFACT_PACKAGE + ? process.env.sfp_ARTIFACT_PACKAGE + : sfp_ARTIFACT_PACKAGE, }, ], true ); - SFPLogger.log(`Suscessfully Installed sfpowerscripts_artifact package to the ${scratchOrg.alias}`, null, logger); + SFPLogger.log(`Suscessfully Installed sfp_artifact package to the ${scratchOrg.alias}`, null, logger); } private async invokeDeployImpl( diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts index 299152d12..dfa6f13cf 100644 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts +++ b/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts @@ -1,10 +1,10 @@ import * as fs from 'fs-extra'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; import Ajv, { _ } from 'ajv'; import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; import lodash = require('lodash'); const yaml = require('js-yaml'); -import { Logger } from '@dxatscale/sfp-logger'; +import { Logger } from '@flxblio/sfp-logger'; const path = require('path'); export default class ReleaseConfig { diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts index 27e383be1..accfb708b 100644 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts +++ b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts @@ -3,8 +3,8 @@ import Ajv from 'ajv'; const yaml = require('js-yaml'); import lodash = require('lodash'); import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import Git from '../../core/git/Git'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; const fs = require('fs-extra'); const path = require('path'); diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts index 473cfb90a..1b283240b 100644 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts +++ b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts @@ -1,14 +1,14 @@ import { GitError } from 'simple-git'; import * as fs from 'fs-extra'; import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../../core/project/ProjectConfig'; import Ajv, { _ } from 'ajv'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger } from '@flxblio/sfp-logger'; import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; import lodash = require('lodash'); -import { LoggerLevel } from '@dxatscale/sfp-logger'; -import Git from '@dxatscale/sfpowerscripts.core/lib/git/Git'; -import GitTags from '@dxatscale/sfpowerscripts.core/lib/git/GitTags'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; const retry = require('async-retry'); const yaml = require('js-yaml'); const path = require('path'); diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts index dc7eddbff..c2d7c7fd5 100644 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts @@ -1,16 +1,16 @@ import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; import DeployImpl, { DeployProps, DeploymentMode, DeploymentResult } from '../deploy/DeployImpl'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { Stage } from '../Stage'; import ReleaseError from '../../errors/ReleaseError'; import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; -import SFPStatsSender from '@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; import { Release } from '../changelog/ReleaseChangelog'; -import SFPOrg from '@dxatscale/sfpowerscripts.core/lib/org/SFPOrg'; +import SFPOrg from '../../core/org/SFPOrg'; import path = require('path'); import { EOL } from 'os'; -import Package2Detail from '@dxatscale/sfpowerscripts.core/lib/package/Package2Detail'; -import InstallUnlockedPackageCollection from '@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallUnlockedPackageCollection'; +import Package2Detail from '../../core/package/Package2Detail'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; import FetchImpl from '../artifacts/FetchImpl'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; diff --git a/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts b/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts index a8ad16c43..d12cf51fa 100644 --- a/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts @@ -1,4 +1,4 @@ -import { Logger } from "@dxatscale/sfp-logger"; +import { Logger } from "@flxblio/sfp-logger"; export interface AlignRepoProps { artifactDirectory: string; diff --git a/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts b/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts index c986f644f..09170a45a 100644 --- a/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts +++ b/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts @@ -1,5 +1,5 @@ -import ChangedComponentsFetcher from "@dxatscale/sfpowerscripts.core/lib/dependency/ChangedComponentsFetcher"; -import Component from "@dxatscale/sfpowerscripts.core/lib/dependency/Component"; +import ChangedComponentsFetcher from "../../core/dependency/ChangedComponentsFetcher"; +import Component from "../../core/dependency/Component"; export class Analyzer { diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts b/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts index 555af29c7..1b4e650a6 100644 --- a/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts +++ b/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts @@ -1,8 +1,8 @@ -import SFPLogger, { COLOR_HEADER, Logger } from "@dxatscale/sfp-logger"; -import { CoverageOptions } from "@dxatscale/sfpowerscripts.core/lib/apex/coverage/IndividualClassCoverage"; -import { TestOptions, RunAllTestsInPackageOptions, RunSpecifiedTestsOption } from "@dxatscale/sfpowerscripts.core/lib/apextest/TestOptions"; -import TriggerApexTests from "@dxatscale/sfpowerscripts.core/lib/apextest/TriggerApexTests"; -import SfpPackage, { PackageType } from "@dxatscale/sfpowerscripts.core/lib/package/SfpPackage"; +import SFPLogger, { COLOR_HEADER, Logger } from "@flxblio/sfp-logger"; +import { CoverageOptions } from "../../core/apex/coverage/IndividualClassCoverage"; +import { TestOptions, RunAllTestsInPackageOptions, RunSpecifiedTestsOption } from "../../core/apextest/TestOptions"; +import TriggerApexTests from "../../core/apextest/TriggerApexTests"; +import SfpPackage, { PackageType } from "../../core/package/SfpPackage"; import { LoggerLevel } from "@salesforce/core"; import { ValidationMode } from "./ValidateImpl"; diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts b/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts index c01d52f7f..ff804e593 100644 --- a/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts +++ b/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts @@ -4,7 +4,7 @@ import DeployImpl, { DeployProps, DeploymentResult, } from "../deploy/DeployImpl"; -import ArtifactGenerator from "@dxatscale/sfpowerscripts.core/lib/artifacts/generators/ArtifactGenerator"; +import ArtifactGenerator from "../../core/artifacts/generators/ArtifactGenerator"; import { Stage } from "../Stage"; import SFPLogger, { COLOR_KEY_VALUE, @@ -12,40 +12,40 @@ import SFPLogger, { ConsoleLogger, Logger, LoggerLevel, -} from "@dxatscale/sfp-logger"; +} from "@flxblio/sfp-logger"; import { PackageInstallationResult, PackageInstallationStatus, -} from "@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/PackageInstallationResult"; -import { PackageDiffOptions } from "@dxatscale/sfpowerscripts.core/lib/package/diff/PackageDiffImpl"; -import PoolFetchImpl from "@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolFetchImpl"; +} from "../../core/package/packageInstallers/PackageInstallationResult"; +import { PackageDiffOptions } from "../../core/package/diff/PackageDiffImpl"; +import PoolFetchImpl from "../../core/scratchorg/pool/PoolFetchImpl"; import { Org } from "@salesforce/core"; -import InstalledArtifactsDisplayer from "@dxatscale/sfpowerscripts.core/lib/display/InstalledArtifactsDisplayer"; +import InstalledArtifactsDisplayer from "../../core/display/InstalledArtifactsDisplayer"; import ValidateError from "../../errors/ValidateError"; -import ScratchOrg from "@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg"; -import { COLOR_KEY_MESSAGE } from "@dxatscale/sfp-logger"; -import { COLOR_WARNING } from "@dxatscale/sfp-logger"; -import { COLOR_ERROR } from "@dxatscale/sfp-logger"; -import { COLOR_HEADER } from "@dxatscale/sfp-logger"; -import { COLOR_SUCCESS } from "@dxatscale/sfp-logger"; -import { COLOR_TIME } from "@dxatscale/sfp-logger"; -import SFPStatsSender from "@dxatscale/sfpowerscripts.core/lib/stats/SFPStatsSender"; -import ScratchOrgInfoFetcher from "@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher"; -import ScratchOrgInfoAssigner from "@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner"; +import ScratchOrg from "../../core/scratchorg/ScratchOrg"; +import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; +import { COLOR_WARNING } from "@flxblio/sfp-logger"; +import { COLOR_ERROR } from "@flxblio/sfp-logger"; +import { COLOR_HEADER } from "@flxblio/sfp-logger"; +import { COLOR_SUCCESS } from "@flxblio/sfp-logger"; +import { COLOR_TIME } from "@flxblio/sfp-logger"; +import SFPStatsSender from "../../core/stats/SFPStatsSender"; +import ScratchOrgInfoFetcher from "../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher"; +import ScratchOrgInfoAssigner from "../../core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner"; import ValidateResult from "./ValidateResult"; -import PoolOrgDeleteImpl from "@dxatscale/sfpowerscripts.core/lib/scratchorg/pool/PoolOrgDeleteImpl"; -import SFPOrg from "@dxatscale/sfpowerscripts.core/lib/org/SFPOrg"; +import PoolOrgDeleteImpl from "../../core/scratchorg/pool/PoolOrgDeleteImpl"; +import SFPOrg from "../../core/org/SFPOrg"; import SfpPackage, { PackageType, -} from "@dxatscale/sfpowerscripts.core/lib/package/SfpPackage"; +} from "../../core/package/SfpPackage"; -import getFormattedTime from "@dxatscale/sfpowerscripts.core/lib/utils/GetFormattedTime"; +import getFormattedTime from "../../core/utils/GetFormattedTime"; import { PostDeployHook } from "../deploy/PostDeployHook"; import * as rimraf from "rimraf"; -import ProjectConfig from "@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig"; -import InstallUnlockedPackageCollection from "@dxatscale/sfpowerscripts.core/lib/package/packageInstallers/InstallUnlockedPackageCollection"; -import ExternalPackage2DependencyResolver from "@dxatscale/sfpowerscripts.core/lib/package/dependencies/ExternalPackage2DependencyResolver"; -import ExternalDependencyDisplayer from "@dxatscale/sfpowerscripts.core/lib/display/ExternalDependencyDisplayer"; +import ProjectConfig from "../../core/project/ProjectConfig"; +import InstallUnlockedPackageCollection from "../../core/package/packageInstallers/InstallUnlockedPackageCollection"; +import ExternalPackage2DependencyResolver from "../../core/package/dependencies/ExternalPackage2DependencyResolver"; +import ExternalDependencyDisplayer from "../../core/display/ExternalDependencyDisplayer"; import { PreDeployHook } from "../deploy/PreDeployHook"; import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; import ReleaseConfig from "../release/ReleaseConfig"; @@ -107,9 +107,9 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { } else if ( this.props.validateAgainst === ValidateAgainst.PRECREATED_POOL ) { - if (process.env.SFPOWERSCRIPTS_DEBUG_PREFETCHED_SCRATCHORG) + if (process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG) scratchOrgUsername = - process.env.SFPOWERSCRIPTS_DEBUG_PREFETCHED_SCRATCHORG; + process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG; else scratchOrgUsername = await this.fetchScratchOrgFromPool( this.props.pools, @@ -138,7 +138,7 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { let installedArtifacts = await this.orgAsSFPOrg.getInstalledArtifacts(); if (installedArtifacts.length == 0) { SFPLogger.log( - COLOR_ERROR("Failed to query org for Sfpowerscripts Artifacts"), + COLOR_ERROR("Failed to query org for sfp Artifacts"), ); } packagesInstalledInOrgMappedToCommits = diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts b/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts index c25c30cc0..a8c360812 100644 --- a/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts +++ b/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts @@ -1,5 +1,5 @@ import { DeploymentResult, PackageInfo } from '../deploy/DeployImpl'; -import DependencyViolation from '@dxatscale/sfpowerscripts.core/lib/dependency/DependencyViolation'; +import DependencyViolation from '../../core/dependency/DependencyViolation'; export default interface ValidateResult { deploymentResult?: DeploymentResult; diff --git a/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts b/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts index cba026c60..1d473cf3d 100644 --- a/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts +++ b/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts @@ -7,7 +7,7 @@ export default class FileOutputHandler { public static getInstance() { if (!FileOutputHandler.instance) - FileOutputHandler.instance = new FileOutputHandler('.sfpowerscripts/outputs'); + FileOutputHandler.instance = new FileOutputHandler('.sfp/outputs'); return FileOutputHandler.instance; } diff --git a/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts b/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts index fee2cb14b..42f284f3c 100644 --- a/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts +++ b/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts @@ -1,5 +1,5 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import { EOL } from 'os'; //TODO: Move to sfpconsole package diff --git a/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts b/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts index 228aca8b0..f3ef01d3e 100644 --- a/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts +++ b/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts @@ -1,10 +1,10 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_VALUE, COLOR_KEY_MESSAGE, COLOR_TRACE } from "@dxatscale/sfp-logger"; -import SFPOrg from "@dxatscale/sfpowerscripts.core/lib/org/SFPOrg"; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_VALUE, COLOR_KEY_MESSAGE, COLOR_TRACE } from "@flxblio/sfp-logger"; +import SFPOrg from "../core/org/SFPOrg"; const Table = require("cli-table"); import { LoggerLevel } from "@salesforce/core"; import GroupConsoleLogs from "./GroupConsoleLogs"; import { COLON_MIDDLE_BORDER_TABLE } from "./TableConstants"; -import ScratchOrg from "@dxatscale/sfpowerscripts.core/lib/scratchorg/ScratchOrg"; +import ScratchOrg from "../core/scratchorg/ScratchOrg"; import { Align, getMarkdownTable } from "markdown-table-ts"; import fs from "fs-extra"; import FileOutputHandler from "../outputs/FileOutputHandler"; diff --git a/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts b/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts index 3f131d071..a3a2f6da0 100644 --- a/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts +++ b/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts @@ -1,9 +1,9 @@ -import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig'; +import ProjectConfig from '../src/core/project/ProjectConfig'; import { jest, expect } from '@jest/globals'; import ProjectValidation from '../src/ProjectValidation'; describe('Given a sfdx-project.json, it should be validated against the scehma', () => { - it('should not throw an error for a valid sfdx-project.json without any sfpowerscripts decorators', () => { + it('should not throw an error for a valid sfdx-project.json without any sfp decorators', () => { let sfdx_project = { packageDirectories: [ { @@ -108,7 +108,7 @@ describe('Given a sfdx-project.json, it should be validated against the scehma', }).not.toThrow(); }); - it('should not throw an error for a sfdx-project.json where various sfpowerscripts orchestrator properties are used', () => { + it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are used', () => { let sfdx_project = { packageDirectories: [ { @@ -184,7 +184,7 @@ describe('Given a sfdx-project.json, it should be validated against the scehma', }).not.toThrow(); }); - it('should not throw an error for a sfdx-project.json where various sfpowerscripts orchestrator properties are incorrectly used', () => { + it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are incorrectly used', () => { //As the errors are moved to warning, it will not throw an error let sfdx_project = { packageDirectories: [ diff --git a/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts b/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts new file mode 100644 index 000000000..ac9e026b3 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts @@ -0,0 +1,77 @@ +import { jest, expect } from '@jest/globals'; +const fs = require('fs-extra'); +import ApexTestSuite from '../../../src/core/apextest/ApexTestSuite'; +import * as globSync from 'glob'; + + + +describe('Provided an apex test suite from a source directory', () => { + it('should return all the apexclasses', () => { + + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/test.testSuite-meta.xml'); + }); + + + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + + + AccountAccountRelationTriggerTest + AccountContactRelationTriggerTest + AccountTeamMemberTriggerTest + AccountTriggerTest + ContactTriggerTest + + `; + }); + + let resultTestClasses = new Array(); + resultTestClasses.push(`AccountAccountRelationTriggerTest`); + resultTestClasses.push(`AccountContactRelationTriggerTest`); + resultTestClasses.push(`AccountTeamMemberTriggerTest`); + resultTestClasses.push(`AccountTriggerTest`); + resultTestClasses.push(`ContactTriggerTest`); + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); + }); + + it('should throw an error if apex test suite is not avaiable in the directory', async () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return []; + }); + + + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + + expect(apexTestSuite.getConstituentClasses()).rejects.toThrowError(); + }); + + it('should return apexclass even if there is only one', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/test.testSuite-meta.xml');; + }); + + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + + + AccountAccountRelationTriggerTest + + `; + }); + + let resultTestClasses = new Array(); + resultTestClasses.push(`AccountAccountRelationTriggerTest`); + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts b/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts new file mode 100644 index 000000000..f30a3ab4f --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts @@ -0,0 +1,52 @@ +import { jest, expect } from '@jest/globals'; +import ArtifactFetcher from '../../../src/core/artifacts/ArtifactFetcher'; +import * as globSync from 'glob'; + +describe('Provided a path to the artifacts folder containing sfp artifact', () => { + it('should return all the artifacts, if a package name is not provided', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core2_sfp_artifact_1.0.0-2.zip', + '/path/to/core3_sfp_artifact_1.0.0-3.zip', + '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + ]; + }); + + + let artifacts = ArtifactFetcher.findArtifacts('artifacts'); + expect(artifacts).toEqual( + [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core2_sfp_artifact_1.0.0-2.zip', + '/path/to/core3_sfp_artifact_1.0.0-3.zip', + '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + ] + ); + }); + + it('provided only one artifact exists for a package and a package name is provided, it should just return the one artifact', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/core_sfp_artifact_1.0.0-2.zip'); + }); + + let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); + expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-2.zip')); + }); + + it('provided multiple artifacts of the same package exists and a package name is provied, it should return the latest', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core_sfp_artifact_1.0.0-3.zip', + '/path/to/core_sfp_artifact_1.0.0-4.zip', + '/path/to/core_sfp_artifact_1.0.0-5.tgz' + ]; + }); + let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); + expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-5.tgz')); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts b/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts new file mode 100644 index 000000000..f2be12f57 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts @@ -0,0 +1,167 @@ +import IndividualClassCoverage from '../../../src/core/apex/coverage/IndividualClassCoverage'; +import { expect } from '@jest/globals'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; + +describe('Given a test coverage report', () => { + it('should be able to get a list of all classes and its test coverage', () => { + let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( + testCoverage, + new ConsoleLogger() + ); + let expectedValue = [ + { name: 'CustomerServices', coveredPercent: 87 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'ReservationManagerController', coveredPercent: 72 }, + { name: 'ReservationManager', coveredPercent: 93 }, + ]; + expect(individualClasCoverage.getIndividualClassCoverage()).toEqual(expectedValue); + }); + + it('given a coverage threshold, provide a list of classes that do not satisfy the threshold', () => { + let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( + testCoverage, + new ConsoleLogger() + ); + let validationResult = individualClasCoverage.validateIndividualClassCoverage( + individualClasCoverage.getIndividualClassCoverage(), + 75 + ); + expect(validationResult.classesWithInvalidCoverage).toContainEqual({ + name: 'ReservationManagerController', + coveredPercent: 72, + }); + }); +}); + +let testCoverage = [ + { + id: '01p0w000001qr8HAAQ', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87, + }, + { + id: '01p0w000001qr8JAAQ', + name: 'MarketServices', + totalLines: 3, + lines: { + '3': 1, + '4': 1, + '16': 1, + }, + totalCovered: 3, + coveredPercent: 100, + }, + { + id: '01p0w000001qr8NAAQ', + name: 'ReservationManagerController', + totalLines: 32, + lines: { + '4': 1, + '7': 1, + '8': 1, + '17': 1, + '22': 1, + '23': 1, + '25': 1, + '26': 1, + '27': 1, + '28': 1, + '29': 1, + '30': 1, + '31': 1, + '32': 1, + '33': 1, + '34': 1, + '35': 1, + '36': 1, + '37': 1, + '39': 1, + '41': 1, + '42': 0, + '43': 0, + '44': 0, + '45': 0, + '46': 0, + '47': 0, + '48': 0, + '50': 0, + '52': 0, + '56': 1, + '57': 1, + }, + totalCovered: 23, + coveredPercent: 72, + }, + { + id: '01p0w000001qr8MAAQ', + name: 'ReservationManager', + totalLines: 28, + lines: { + '3': 1, + '6': 1, + '7': 1, + '8': 1, + '9': 1, + '10': 1, + '12': 1, + '13': 1, + '15': 1, + '20': 1, + '24': 1, + '25': 1, + '26': 1, + '27': 1, + '29': 1, + '30': 1, + '31': 1, + '34': 1, + '35': 1, + '36': 1, + '37': 1, + '39': 1, + '40': 1, + '41': 1, + '42': 1, + '43': 0, + '44': 0, + '48': 1, + }, + totalCovered: 26, + coveredPercent: 93, + }, +]; diff --git a/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts b/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts new file mode 100644 index 000000000..e87764aaa --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts @@ -0,0 +1,83 @@ +import { jest, expect } from '@jest/globals'; +import GitTags from '../../../src/core/git/GitTags'; +import Git from '../../../src/core/git/Git'; + +import child_process = require('child_process'); + +let tags: string[]; +jest.mock('../../../src/core/git/Git', () => { + class Git { + tag = jest.fn().mockReturnValue(tags); + log = jest.fn().mockReturnValue(gitLog); + getRepositoryPath() + { + return process.cwd(); + } + static async initiateRepo(){ + return new Git(); + } + } + + return Git; +}); + +describe('Given a package, listTagsOnBranch', () => { + beforeEach(() => { + const childProcessMock = jest.spyOn(child_process, 'execSync'); + childProcessMock.mockImplementation(() => showRefs); + }); + + it('should return tags belonging to package, on current branch', async () => { + tags = coreTags; + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual(coreTags.slice(0, 4)); + }); + + it('should return an empty array if there are no tags', async () => { + tags = []; + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual([]); + }); + + it('should return an empty array if there are no tags belonging to package, on current branch', async () => { + tags = coreTags.slice(4); + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual([]); + }); +}); + +// Last two tags are not found on the current branch +const coreTags = [ + 'core_v1.0.0.11', + 'core_v1.0.0.43', + 'core_v1.0.0.48', + 'core_v1.0.0.53', + 'core_v1.0.0.85', + 'core_v1.0.0.163', +]; + +// Commits on current branch +const gitLog = [ + '9d7795b9e2391a93b72ae7cf391f55eac5a869c1', + '65ed6f19bb87d31e56efd49cd50a6a19ba172626', + '9e244f0048f53858fe5e5aff210805389f10e523', + '544b52bea434aed68770adb23c168bb89a35b031', +]; + +const showRefs = Buffer.from( + 'fc29c8bedb5cc32b425825aeec6c5ae054704b85 refs/tags/core_v1.0.0.11\n' + + '9d7795b9e2391a93b72ae7cf391f55eac5a869c1 refs/tags/core_v1.0.0.11^{}\n' + + '4fcb4b948d174e721093ff63ffff59cb220ddd7b refs/tags/core_v1.0.0.43\n' + + '65ed6f19bb87d31e56efd49cd50a6a19ba172626 refs/tags/core_v1.0.0.43^{}\n' + + 'ed45cbda7daee5152db1353960fe0ae3b8ad5ed2 refs/tags/core_v1.0.0.48\n' + + '9e244f0048f53858fe5e5aff210805389f10e523 refs/tags/core_v1.0.0.48^{}\n' + + '9eb7e59ef46890495b4c7d9e6cfb2c5e2ef85851 refs/tags/core_v1.0.0.53\n' + + '544b52bea434aed68770adb23c168bb89a35b031 refs/tags/core_v1.0.0.53^{}\n' + + '4af7e0c6b1f663e5b1c2ecc9e424fba2af8e0d63 refs/tags/core__v1.0.0.85\n' + + '46dd375e91d5c00a0f9b64ee38350171f9cf4e50 refs/tags/core_v1.0.0.85^{}\n' + + '1a5c15c8decb0a939447aebf057e1d0889f4eeb6 refs/tags/core_v1.0.0.163\n' + + '86f2f2d107564b053c40abe66555c354f3b7f0f8 refs/tags/core_v1.0.0.163^{}\n' +); diff --git a/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts b/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts new file mode 100644 index 000000000..d4b739399 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts @@ -0,0 +1,214 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { ConsoleLogger, VoidLogger } from '@flxblio/sfp-logger'; +import { AnyJson, ensureJsonMap, JsonMap, ensureString } from '@salesforce/ts-types'; +import SFPOrg from '../../../src/core/org/SFPOrg'; +import SfpPackage from '../../../src/core/package/SfpPackage'; + + +const $$ = new TestContext(); +const createOrg = async () => { + + const testData = new MockTestOrgData(); + await $$.stubAuths(testData); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + + return await SFPOrg.create({ aliasOrUsername: testData.username }); +}; + +describe('Fetch a list of sfp artifacts from an org', () => { + it('Return a blank list of sfp artifact, if there are no previously installed artifacts ', async () => { + let org = await createOrg(); + + let records = { records: [] }; + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(records); + }; + + let artifacts = await org.getInstalledArtifacts(); + expect(artifacts).toEqual([]); + }); + + it('Return a list of sfp artifact, if there are previously installed artifacts ', async () => { + let org = await createOrg(); + + let records = { records:[ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'sfp-package', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }, + ]}; + + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(records); + }; + + let artifacts = await org.getInstalledArtifacts(); + let expectedpackage = { + Id: 'a0zR0000003F1FuIAK', + Name: 'sfp-package', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }; + expect(artifacts).toEqual([expectedpackage]); + }); + + it('When unable to fetch, it should return a blank list', async () => { + let org = await createOrg(); + + $$.fakeConnectionRequest = (request) => { + return Promise.reject('Failed'); + }; + + let artifacts = await org.getInstalledArtifacts(); + expect(artifacts).toEqual([]); + },45000); +}); + +describe('Update a sfp artifact to an org', () => { + it('Update a sfp artifact, installing it the first time', async () => { + let org = await createOrg(); + + let records = { records: [] }; + + let pushResult = { + id: 'a0zR0000003F1FuIAK', + success: true, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request = ensureJsonMap(request); + if (_request.method == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function () { + throw new Error('Function not implemented.'); + }, + }; + + let result = await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); + expect(result).toEqual(pushResult.id); + }); + + it('Update a sfp artifact, installing a newer version of it', async () => { + let org = await createOrg(); + + let records = { records : [ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'core', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + } + ]}; + + let pushResult: AnyJson = { + id: 'a0zR0000003F1FuIAK', + success: true, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request: JsonMap = ensureJsonMap(request); + if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function (): any { + throw new Error('Function not implemented.'); + }, + }; + + let result = await org.updateArtifactInOrg(new ConsoleLogger(), sfpPackage); + + expect(result).toEqual(pushResult.id); + }); + + it('Update a sfp artifact and resulting an error,should throw an exception', async () => { + let org = await createOrg(); + + let records={ records : [ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'core', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }, + ]}; + + let pushResult: AnyJson = { + success: false, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request: JsonMap = ensureJsonMap(request); + if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function () { + throw new Error('Function not implemented.'); + }, + }; + + try { + await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); + } catch (error) { + expect(error.message).toContain('Aborted'); + } + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts b/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts new file mode 100644 index 000000000..0c6af8b2b --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts @@ -0,0 +1,59 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AnyJson } from '@salesforce/ts-types'; +import SFPOrg from '../../../src/core/org/SFPOrg'; +import { OrgConfigProperties } from '@salesforce/core'; + +const $$ = new TestContext(); + +describe('Retrieve all packages from devhub', () => { + it('should return all the packages provided a devhub', async () => { + + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { + records: [ + { + attributes: { + type: 'Package2', + url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005000k9bNSXQ', + }, + Id: '0Ho1P005000k9bNSXQ', + Name: 'async-framework', + Description: null, + NamespacePrefix: null, + ContainerOptions: 'Unlocked', + IsOrgDependent: false, + }, + { + attributes: { + type: 'Package2', + url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005100k9bNSXQ', + }, + Id: '0Ho1P005100k9bNSXQ', + Name: 'async-framework2', + Description: null, + NamespacePrefix: null, + ContainerOptions: 'Unlocked', + IsOrgDependent: true, + }, + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + const org: SFPOrg = await SFPOrg.create({ aliasOrUsername: testData.username }); + + let packages = await org.listAllPackages(); + expect(packages).toHaveLength(2); + expect(packages[0].Name).toMatch('async-framework'); + expect(packages[0].Id).toMatch('0Ho1P005000k9bNSXQ'); + expect(packages[0].IsOrgDependent).toMatch('No'); + expect(packages[1].IsOrgDependent).toMatch('Yes'); //Translate true to Yes + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts new file mode 100644 index 000000000..2b7589393 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts @@ -0,0 +1,79 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo } from '@salesforce/core'; +import Package2VersionFetcher from '../../../src/core/package/version/Package2VersionFetcher'; +import { AnyJson } from '@salesforce/ts-types'; + +const $$ = new TestContext(); + +let conn: Connection; + +describe("Given a PackageDependencyResolver", () => { + + beforeEach(async () => { + const testData = new MockTestOrgData(); + + testData.makeDevHub(); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: any = { + records: [ + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' + }, + SubscriberPackageVersionId: '04t5i000000V2DiAAK', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 17, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'king' + }, + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' + }, + SubscriberPackageVersionId: '04t5i000000UyCJAA0', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 16, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'king' + } + ], + }; + $$.fakeConnectionRequest = (request: any): Promise => { + return Promise.resolve(records); + }; + conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + }) + it('should return an array of Package2Version records if matching records found', async () => { + // Mock the query method in QueryHelper to return some dummy data + const package2VersionFetcher = new Package2VersionFetcher(conn); + + const result = await package2VersionFetcher.fetchByPackageBranchAndName('king', 'core'); + + expect(result[0].Package2.Name).toEqual('core'); + expect(result[0].Branch).toEqual('king'); + }); + +}); + diff --git a/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts b/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts new file mode 100644 index 000000000..75a8ed5e4 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts @@ -0,0 +1,295 @@ +import { jest, expect } from '@jest/globals'; +const fs = require('fs'); +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageDiffImpl, { PackageDiffOptions } from '../../../src/core/package/diff/PackageDiffImpl'; +import ProjectConfig from '../../../src/core/project/ProjectConfig'; + +let gitTags: string[] = []; +let gitDiff: string[] = []; +let gitShow: string = ''; + +jest.mock('../../../src/core/git/Git', () => { + class Git { + diff = jest.fn().mockReturnValue(gitDiff); + show = jest.fn().mockReturnValue(gitShow); + static async initiateRepo(){ + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let ignoreFilterResult: string[] = []; +jest.mock('../../../src/core/ignore/IgnoreFiles', () => { + class IgnoreFiles { + filter = jest.fn().mockReturnValue(ignoreFilterResult); + } + + return IgnoreFiles; +}); + +describe('Determines whether a given package has changed', () => { + beforeEach(() => { + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return JSON.parse(packageConfigJson); + }); + + const fsMock = jest.spyOn(fs, 'readFileSync'); + fsMock.mockImplementation(() => { + return '**README.md'; + }); + }); + + it('should throw error if package does not exist', () => { + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl( + new ConsoleLogger(), + 'UNKNOWN-PACKAGE', + null, + ); + expect(() => packageDiffImpl.exec()).rejects.toThrowError(); + }); + + it('should return true if package metadata has changed', async () => { + gitTags = coreTags; + gitDiff = [`packages/domains/core/X/Y/Z/A-meta.xml`]; + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Found change(s) in package`); + + packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core-b', null); + result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + + }); + + it('should return true if package descriptor has changed', async () => { + gitTags = coreTags; + gitDiff = ['sfdx-project.json']; + gitShow = packageDescriptorChange; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Package Descriptor Changed`); + }); + + it('should return false even if package descriptor has changed when asked to ignore ', async () => { + gitTags = coreTags; + gitDiff = ['sfdx-project.json']; + gitShow = packageDescriptorChange; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,{skipPackageDescriptorChange:true}); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + }); + + it('should return false if only config file has changed', async () => { + gitDiff = ['config/project-scratch-def.json']; + + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + gitTags = coreTags; + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + expect(result.reason).toEqual(`No changes found`); + }); + + it('should return true if package does not have any tags', async () => { + gitTags = []; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Previous version not found`); + }); + + it('should return true if packageToCommits is an empty object', async () => { + let packageDiffOptions = new PackageDiffOptions(); + packageDiffOptions.packagesMappedToLastKnownCommitId={}; + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,packageDiffOptions); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Previous version not found`); + }); + + it('should return false if package metadata and package config has not changed', async () => { + gitTags = coreTags; + gitDiff = [`packages/access-mgmt/X/Y/Z/A-meta.xml`, `packages/bi/X/Y/Z/B-meta.xml`]; + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + expect(result.reason).toEqual(`No changes found`); + }); +}); + +const coreTags = [ + `core_v1.0.0.2`, + `core_v1.0.0.3`, + `core_v1.0.0.5`, + `core_v1.0.0.6`, + `core_v1.0.0.7`, + `core_v1.0.0.8`, + `core_v1.0.0.9`, + `core_v1.0.0.10`, +]; + +const packageConfigJson: string = ` +{ + "packageDirectories": [ + { + "path": "packages/temp", + "default": true, + "package": "temp", + "versionName": "temp", + "versionNumber": "1.0.0.0", + "ignoreOnStage": ["prepare","validate","build"] + }, + { + "path": "packages/domains/core", + "package": "core", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA", + "PermSetB", + "PermSetC" + ] + }, + { + "path": "packages/domains/core-b", + "package": "core-b", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA", + "PermSetB", + "PermSetC" + ] + }, + { + "path": "packages/frameworks/mass-dataload", + "package": "mass-dataload", + "default": false, + "type":"data", + "versionName": "mass-dataload", + "versionNumber": "1.0.0.0" + }, + { + "path": "packages/access-mgmt", + "package": "access-mgmt", + "default": false, + "versionName": "access-mgmt", + "versionNumber": "1.0.0.0", + "reconcileProfiles": "true" + }, + { + "path": "packages/bi", + "package": "bi", + "default": false, + "versionName": "bi", + "versionNumber": "1.0.0.0", + "ignoreOnStage":["prepare","validate"] + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "50.0", + "packageAliases": { + "bi":"0x002232323232", + "core":"0H04X00000000XXXXX" + } +}`; + +const packageDescriptorChange: string = ` +{ + "packageDirectories": [ + { + "path": "packages/temp", + "default": true, + "package": "temp", + "versionName": "temp", + "versionNumber": "1.0.0.0", + "ignoreOnStage": ["prepare","validate","build"] + }, + { + "path": "packages/domains/core", + "package": "core", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA" + ] + }, + { + "path": "packages/frameworks/mass-dataload", + "package": "mass-dataload", + "default": false, + "type":"data", + "versionName": "mass-dataload", + "versionNumber": "1.0.0.0" + }, + { + "path": "packages/access-mgmt", + "package": "access-mgmt", + "default": false, + "versionName": "access-mgmt", + "versionNumber": "1.0.0.0", + "reconcileProfiles": "true" + }, + { + "path": "packages/bi", + "package": "bi", + "default": false, + "versionName": "bi", + "versionNumber": "1.0.0.0", + "ignoreOnStage":["prepare","validate"] + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "50.0", + "packageAliases": { + "bi":"0x002232323232", + "core":"0H04X00000000XXXXX" + } +} +`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts b/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts new file mode 100644 index 000000000..e9acf2b69 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts @@ -0,0 +1,300 @@ +import fs from 'fs-extra'; +import { jest, expect } from '@jest/globals'; +import PackageManifest from '../../../src/core/package/components/PackageManifest'; + +describe('Given a mdapi directory that contains manifest file', () => { + beforeEach(() => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML; + }); + }); + + it('should return the manifest in json format', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON); + }); + + it('should return the manifest in xml format', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.manifestXml).toEqual(packageManifestXML); + }); + + it('should return true if there is apex', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isApexInPackage()).toBe(true); + }); + + it('should return undefined if there are no triggers', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.fetchTriggers()).toBe(undefined); + }); + + it('should return false if there are no profiles', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isProfilesInPackage()).toBe(false); + }); + + it('should return false if there are no permission set groups', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(false); + }); +}); + +describe('Given a list of components', () => { + it('should create a package manifest from scratch', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest).toBeInstanceOf(PackageManifest); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON_b); + expect(packageManifest.manifestXml).toEqual(packageManifestXML_b); + }); + + it('should fetch triggers', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.fetchTriggers()).toEqual(['ContractTrigger']); + }); + + it('should return true if there are permission set groups ', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(true); + }); + + it('should return true if there are profiles', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.isProfilesInPackage()).toBe(true); + }); + + it('should return true if there are types supported by profiles', async () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + expect(packageManifest.isPayLoadContainTypesSupportedByProfiles()).toBe(true); + }); + + it('should return true if there are types other than', async () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + expect(packageManifest.isPayloadContainTypesOtherThan('Profile')).toBe(true); + }); +}); + +describe('Given a manifest json payload', () => { + it('should create an instance of PackageManifest', async () => { + const packageManifest: PackageManifest = await PackageManifest.createWithJSONManifest(packageManifestJSON); + + expect(packageManifest).toBeInstanceOf(PackageManifest); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON); + expect(packageManifest.manifestXml).toEqual(packageManifestXML); + }); +}); + +const components: { fullName: string; type: string }[] = [ + { + fullName: 'ContractService', + type: 'ApexClass', + }, + { + fullName: 'ContractTrigger', + type: 'ApexTrigger', + }, + { + fullName: 'ContractVariables__mdt-ContractVariables Layout', + type: 'Layout', + }, + { + fullName: 'Contract.Reason__c', + type: 'CustomField', + }, + { + fullName: 'Contract.ContractTerm__c', + type: 'CustomField', + }, + { + fullName: 'Contract', + type: 'CustomObject', + }, + { + fullName: 'ContractPermissionSetGroup', + type: 'PermissionSetGroup', + }, + { + fullName: 'Contractor', + type: 'Profile', + }, +]; + +const packageManifestJSON_b = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: [ + { + name: 'ApexClass', + members: ['ContractService'], + }, + { + name: 'ApexTrigger', + members: ['ContractTrigger'], + }, + { + name: 'Layout', + members: ['ContractVariables__mdt-ContractVariables Layout'], + }, + { + name: 'CustomField', + members: ['Contract.Reason__c', 'Contract.ContractTerm__c'], + }, + { + name: 'CustomObject', + members: ['Contract'], + }, + { + name: 'PermissionSetGroup', + members: ['ContractPermissionSetGroup'], + }, + { + name: 'Profile', + members: ['Contractor'], + }, + ], + version: '50.0', + }, +}; + +const packageManifestXML_b: string = ` + + + ApexClass + ContractService + + + ApexTrigger + ContractTrigger + + + Layout + ContractVariables__mdt-ContractVariables Layout + + + CustomField + Contract.Reason__c + Contract.ContractTerm__c + + + CustomObject + Contract + + + PermissionSetGroup + ContractPermissionSetGroup + + + Profile + Contractor + + 50.0 +`; + +const packageManifestJSON = { + Package: { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [ + { + name: 'AuraDefinitionBundle', + members: ['openRecordAction', 'selectObject'], + }, + { + name: 'ApexClass', + members: [ + 'CustomerServices', + 'CustomerServicesTest', + 'MarketServices', + 'MarketServicesTest', + 'TestDataFactory', + ], + }, + { + name: 'CustomMetadata', + members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], + }, + { + name: 'Layout', + members: 'Customer_Fields__mdt-Customer Fields Layout', + }, + { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, + { + name: 'LightningMessageChannel', + members: ['Flow_Status_Change', 'Tile_Selection'], + }, + { name: 'CustomObject', members: 'Customer_Fields__mdt' }, + { + name: 'CustomField', + members: [ + 'Customer_Fields__mdt.Customer_City__c', + 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', + 'Customer_Fields__mdt.Customer_Email__c', + 'Customer_Fields__mdt.Customer_Name__c', + 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', + 'Customer_Fields__mdt.Customer_State__c', + 'Customer_Fields__mdt.Customer_Status__c', + 'Customer_Fields__mdt.Sobject_Type__c', + ], + }, + ], + version: '50.0', + }, +}; + +const packageManifestXML: string = ` + + + AuraDefinitionBundle + openRecordAction + selectObject + + + ApexClass + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + + CustomMetadata + Customer_Fields.Contact_Customer_Fields + Customer_Fields.Lead_Customer_Fields + + + Layout + Customer_Fields__mdt-Customer Fields Layout + + + LightningComponentBundle + errorPanel + ldsUtils + + + LightningMessageChannel + Flow_Status_Change + Tile_Selection + + + CustomObject + Customer_Fields__mdt + + + CustomField + Customer_Fields__mdt.Customer_City__c + Customer_Fields__mdt.Customer_Draft_Status_Values__c + Customer_Fields__mdt.Customer_Email__c + Customer_Fields__mdt.Customer_Name__c + Customer_Fields__mdt.Customer_Reservation_Status_Value__c + Customer_Fields__mdt.Customer_State__c + Customer_Fields__mdt.Customer_Status__c + Customer_Fields__mdt.Sobject_Type__c + + 50.0 +`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts b/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts new file mode 100644 index 000000000..fa6936479 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts @@ -0,0 +1,374 @@ +import { jest, expect } from '@jest/globals'; +import SfpPackage, { PackageType, SfpPackageParams } from '../../../src/core/package/SfpPackage'; +import SfpPackageBuilder, { PackageCreationParams } from '../../../src/core/package/SfpPackageBuilder'; +import * as fs from "fs-extra"; +import { Logger } from '@flxblio/sfp-logger'; + + +let packageType = PackageType.Source; +jest.mock('../../../src/core/project/ProjectConfig', () => { + class ProjectConfig { + static getSFDXPackageDescriptor(projectDirectory, sfdx_package) { + return { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + } + + static getSFDXProjectConfig(projectDirectory) { + return { + packageDirectories: [ + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + }; + } + static getPackageType(projectConfig: any, sfdxPackage: string) { + return packageType; + } + } + return ProjectConfig; +}); + +jest.mock('../../../src/core/package/generators/SfpPackageContentGenerator', () => { + class SfpPackageContentGenerator { + static async generateSfpPackageDirectory( + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + packageDirectory: string, + destructiveManifestFilePath?: string, + configFilePath?: string, + pathToReplacementForceIgnore?: string + ): Promise { + return '.sfp/3sIRD_source'; + } + } + + return SfpPackageContentGenerator; +}); + +jest.mock('../../../src/core/package/packageFormatConvertors/SourceToMDAPIConvertor', () => { + class SourceToMDAPIConvertor { + convert = jest.fn().mockReturnValueOnce(Promise.resolve({ packagePath: 'mdapidir' })); + } + return SourceToMDAPIConvertor; +}); + +jest.mock('../../../src/core/package/components/MetadataCount', () => { + class MetadataCount { + static getMetadataCount = jest.fn().mockReturnValue(Promise.resolve(20)); + } + return MetadataCount; +}); + +jest.mock('../../../src/core/apex/parser/ApexTypeFetcher', () => { + class ApexTypeFetcher { + getClassesClassifiedByType = jest.fn(); + getTestClasses = jest + .fn() + .mockReturnValue( + new Array( + 'AccountTriggerHandlerTest', + 'Generate_Dose_Admin_PdfTest', + 'RecordHunterController_Test', + 'SObjectController2Test', + 'Send_Receipt_Test', + 'TestDataFactory', + 'TestFileRestriction', + 'appoinmentSchedulerControllerTest' + ) + ); + + getClassesOnlyExcludingTestsAndInterfaces = jest + .fn() + .mockReturnValue( + new Array( + 'AccountTriggerHandler', + 'Data_TableV2_Controller', + 'Generate_Dose_Admin_Pdf', + 'Generate_QR_Code', + 'RecordHunterController', + 'RecordHunterField', + 'RecordHunterLexer', + 'SObjectController2', + 'Send_Receipt' + ) + ); + } + + return ApexTypeFetcher; +}); + +jest.mock('../../../src/core/package/packageCreators/CreateUnlockedPackageImpl', () => { + class CreateUnlockedPackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) {} + + public async exec(): Promise { + return this.sfpPackage; + } + } + return CreateUnlockedPackageImpl; +}); + +// jest.mock('../../src/package/packageCreators/CreatePackage', () => { +// class CreatePackage { +// public constructor( +// protected projectDirectory: string, +// protected sfpPackage: SfpPackage, +// protected packageCreationParams: PackageCreationParams, +// protected logger?: Logger, +// protected params?: SfpPackageParams +// ) {} +// } +// return CreatePackage; +// }); + +jest.mock('../../../src/core/package/packageCreators/CreateSourcePackageImpl', () => { + + + class CreateSourcePackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + + } + + public async exec(): Promise { + this.sfpPackage.packageType = PackageType.Source; + return this.sfpPackage; + } + getTypeOfPackage() {} + isEmptyPackage(projectDirectory: string, packageDirectory: string){} + preCreatePackage(sfpPackage: SfpPackage) {} + createPackage(sfpPackage: SfpPackage) {} + postCreatePackage(sfpPackage: SfpPackage) {} + printAdditionalPackageSpecificHeaders() {} + } + return CreateSourcePackageImpl; +}); + +describe.skip('Given a sfdx package, build a sfp package', () => { + it('should build a sfp package', async () => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML; + }); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + null, + null, + 'ESBaseCodeLWC' + ); + expect(sfpPackage.isProfilesFound).toStrictEqual(false); + expect(sfpPackage.isApexFound).toStrictEqual(true); + expect(sfpPackage.isPermissionSetGroupFound).toStrictEqual(true); + expect(sfpPackage.triggers).toBeUndefined(); + expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); + expect(sfpPackage.payload).toStrictEqual(packageManifestJSON); + expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); + expect(sfpPackage.packageDescriptor).toStrictEqual({ + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }); + expect(sfpPackage.apexTestClassses).toStrictEqual( + new Array( + 'AccountTriggerHandlerTest', + 'Generate_Dose_Admin_PdfTest', + 'RecordHunterController_Test', + 'SObjectController2Test', + 'Send_Receipt_Test', + 'TestDataFactory', + 'TestFileRestriction', + 'appoinmentSchedulerControllerTest' + ) + ); + expect(sfpPackage.apexClassWithOutTestClasses).toStrictEqual( + new Array( + 'AccountTriggerHandler', + 'Data_TableV2_Controller', + 'Generate_Dose_Admin_Pdf', + 'Generate_QR_Code', + 'RecordHunterController', + 'RecordHunterField', + 'RecordHunterLexer', + 'SObjectController2', + 'Send_Receipt' + ) + ); + }); + + it('should build a sfp package when there is only one type', async () => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML2; + }); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + null, + null, + 'ESBaseCodeLWC' + ); + expect(sfpPackage.isProfilesFound).toStrictEqual(true); + expect(sfpPackage.isApexFound).toStrictEqual(false); + expect(sfpPackage.triggers).toBeUndefined(); + expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); + expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); + expect(sfpPackage.packageDescriptor).toStrictEqual({ + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }); + expect(sfpPackage.isPayLoadContainTypesSupportedByProfiles).toStrictEqual(false); + }); +}); + +let packageManifestJSON = { + Package: { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [ + { + name: 'AuraDefinitionBundle', + members: ['openRecordAction', 'selectObject'], + }, + { + name: 'ApexClass', + members: [ + 'CustomerServices', + 'CustomerServicesTest', + 'MarketServices', + 'MarketServicesTest', + 'TestDataFactory', + ], + }, + { + name: 'CustomMetadata', + members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], + }, + { + name: 'Layout', + members: 'Customer_Fields__mdt-Customer Fields Layout', + }, + { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, + { + name: 'LightningMessageChannel', + members: ['Flow_Status_Change', 'Tile_Selection'], + }, + { name: 'CustomObject', members: 'Customer_Fields__mdt' }, + { name: 'PermissionSetGroup', members: 'TestPermissionSetGroup' }, + { + name: 'CustomField', + members: [ + 'Customer_Fields__mdt.Customer_City__c', + 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', + 'Customer_Fields__mdt.Customer_Email__c', + 'Customer_Fields__mdt.Customer_Name__c', + 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', + 'Customer_Fields__mdt.Customer_State__c', + 'Customer_Fields__mdt.Customer_Status__c', + 'Customer_Fields__mdt.Sobject_Type__c', + ], + }, + ], + version: '50.0', + }, +}; + +let packageManifestXML: string = ` + + + + AuraDefinitionBundle + openRecordAction + selectObject + + + ApexClass + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + + CustomMetadata + Customer_Fields.Contact_Customer_Fields + Customer_Fields.Lead_Customer_Fields + + + Layout + Customer_Fields__mdt-Customer Fields Layout + + + LightningComponentBundle + errorPanel + ldsUtils + + + LightningMessageChannel + Flow_Status_Change + Tile_Selection + + + CustomObject + Customer_Fields__mdt + + + PermissionSetGroup + TestPermissionSetGroup + + + CustomField + Customer_Fields__mdt.Customer_City__c + Customer_Fields__mdt.Customer_Draft_Status_Values__c + Customer_Fields__mdt.Customer_Email__c + Customer_Fields__mdt.Customer_Name__c + Customer_Fields__mdt.Customer_Reservation_Status_Value__c + Customer_Fields__mdt.Customer_State__c + Customer_Fields__mdt.Customer_Status__c + Customer_Fields__mdt.Sobject_Type__c + + 50.0 + +`; + +let packageManifestXML2: string = ` + + + + Profile + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + 50.0 + +`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts b/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts new file mode 100644 index 000000000..437c055d5 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts @@ -0,0 +1,360 @@ +import { jest, expect } from '@jest/globals'; +import FHTAnalyser from '../../../../src/core/package/analyser/FHTAnalyzer'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; +import { VoidLogger } from '@flxblio/sfp-logger'; + +let isYamlFileFound: boolean = true; + +describe('FHT Analyzer', () => { + beforeEach(() => { + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + Account: + - Name + - Phone + Contact: + - Name + - Phone + `; + }); + const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); + fsExistSyncMock.mockImplementationOnce(() => { + return isYamlFileFound; + }); + }); + + it('Should not be enabled for data packages', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Data, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); + }); + + it('Should be enabled for source packages by default', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Source, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it('Should be enabled for unlocked packages by default', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + }); + + it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); + }); + + it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(fhtFields).not.toHaveProperty('Test__c'); + }); + + it(' When no yaml is provided, package has history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = false; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts b/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts new file mode 100644 index 000000000..bc78d22b0 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts @@ -0,0 +1,363 @@ +import { jest, expect } from '@jest/globals'; +import FTAnalyser from '../../../../src/core/package/analyser/FTAnalyzer'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; +import { VoidLogger } from '@flxblio/sfp-logger'; + +let isYamlFileFound: boolean = true; + +describe('FT Analyzer', () => { + beforeEach(() => { + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + Account: + - Name + - Phone + Contact: + - Name + - Phone + `; + }); + const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); + fsExistSyncMock.mockImplementationOnce(() => { + return isYamlFileFound; + }); + }); + + it('Should not be enabled for data packages', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Data, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); + }); + + it('Should be enabled for source packages by default', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Source, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it('Should be enabled for unlocked packages by default', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + }); + + it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); + }); + + it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + false + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(ftFields).not.toHaveProperty('Test__c'); + }); + + it(' When no yaml is provided, package has feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = false; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts b/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts new file mode 100644 index 000000000..fa3ab1d6e --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts @@ -0,0 +1,330 @@ +import PackageTestCoverage from '../../../../src/core/package/coverage/PackageTestCoverage'; +import { jest, expect } from '@jest/globals'; +import { ConsoleLogger, Logger } from '@flxblio/sfp-logger'; +import ApexClassFetcher from '../../../../src/core/apex/ApexClassFetcher'; +import ApexTriggerFetcher from '../../../../src/core/apex/ApexTriggerFetcher'; +import ApexCodeCoverageAggregateFetcher from '../../../../src/core/apex/coverage/ApexCodeCoverageAggregateFetcher'; + +import { AuthInfo, ConfigAggregator, Connection, Org, OrgConfigProperties } from '@salesforce/core'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; +const $$ = new TestContext(); + +let packageType = PackageType.Unlocked; + + + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.apexClassWithOutTestClasses = new Array('CustomerServices', 'MarketServices'); + sfpPackage.triggers = new Array('AccountTrigger'); + sfpPackage.packageType = packageType; + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + + +const setupConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; + } + + + +describe('Given a sfp package and code coverage report, a package coverage calculator', () => { + it('should be able to provide the coverage of a provided unlocked package', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); + }); + + it('should able to validate whether the coverage of unlocked package is above a certain threshold', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 80; + let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should able to validate whether the coverage of unlocked package is above mandatory threshold', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 75; + let result = await packageTestCoverage.validateTestCoverage(); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should be able to provide the coverage of a provided source package', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); + }); + + it('should able to validate whether the coverage of source package is above a certain threshold', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 80; + let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should able to validate whether the coverage of source package is above mandatory threshold', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 75; + let result = await packageTestCoverage.validateTestCoverage(); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should account for untouched classes and triggers when calculating package test coverage', async () => { + const conn = await setupConnection(); + + jest.spyOn(ApexClassFetcher.prototype, 'fetchApexClassByName').mockResolvedValue([ + { Id: '01p0w000001n1SfAAI', Name: 'MarketServices' }, + ]); + jest.spyOn(ApexTriggerFetcher.prototype, 'fetchApexTriggerByName').mockResolvedValue([ + { Id: '01p2O000003s9qcQAA', Name: 'AccountTrigger' }, + ]); + jest.spyOn(ApexCodeCoverageAggregateFetcher.prototype, 'fetchACCAById').mockResolvedValue([ + { ApexClassOrTriggerId: '01p0w000001n1SfAAI', NumLinesCovered: 0, NumLinesUncovered: 3, Coverage: {} }, + { ApexClassOrTriggerId: '01p2O000003s9qcQAA', NumLinesCovered: 0, NumLinesUncovered: 4, Coverage: {} }, + ]); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + testCoverageWithUntouchedClasses, + new ConsoleLogger(), + conn + ); + let result = await packageTestCoverage.validateTestCoverage(); + + expect(result.result).toBe(false); + expect(result.packageTestCoverage).toBe(71); + expect(result.classesCovered).toEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 0 }, + { name: 'AccountTrigger', coveredPercent: 0 }, + ]); + expect(result.classesWithInvalidCoverage).toEqual([ + { name: 'MarketServices', coveredPercent: 0 }, + { name: 'AccountTrigger', coveredPercent: 0 }, + ]); + }); +}); + +let succesfulTestCoverage = [ + { + id: '01p0w000001n1SdAAI', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87.09677419354838, + }, + { + id: '01p0w000001n1SfAAI', + name: 'MarketServices', + totalLines: 3, + lines: { + '3': 1, + '4': 1, + '16': 1, + }, + totalCovered: 3, + coveredPercent: 100, + }, + { + id: '01p2O000003s9qcQAA', + name: 'AccountTrigger', + totalLines: 4, + lines: { + '3': 1, + '5': 1, + '10': 1, + '11': 1, + }, + totalCovered: 4, + coveredPercent: 100, + }, +]; + +const testCoverageWithUntouchedClasses = [ + { + id: '01p0w000001n1SdAAI', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87.09677419354838, + }, +]; diff --git a/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts b/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts new file mode 100644 index 000000000..0a27c92a1 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts @@ -0,0 +1,346 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; +import PackageDependencyResolver from '../../../../src/core/package/dependencies/PackageDependencyResolver'; +const $$ = new TestContext(); + +const setupFakeConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(response); + }; + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; +} + +jest.mock('../../../../src/core/git/Git', () => { + class Git { + static async initiateRepo() + { + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let conn: Connection; +let gitTags; +let response; + +describe("Given a PackageDependencyResolver", () => { + + beforeEach(async () => { + conn = await setupFakeConnection(); + gitTags = coreGitTags; + response = coreResponse; + }) + + it("should resolve package dependencies to current branch", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management", "contact-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.2"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.2"); + }); + + it("should skip dependency resolution for packages that are not queued for build", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should skip dependencies on packages from the same build", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core", "candidate-management", "contact-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should skip dependencies on a subscriber package version id", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + const packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + const techFrameworkDependency = packageDescriptor.dependencies.find(dependency => dependency.package.startsWith("tech-framework")); + expect(techFrameworkDependency.versionNumber).toBeUndefined(); + }); + + it("should throw if dependency package version cannot be found for current branch ", async () => { + gitTags = []; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + + it("should throw if there are no validated dependency package versions", async () => { + response = {records: []}; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + + it("should throw if there are no validated dependency package id", async () => { + response = {records: []}; + const packageDependencyResolver = new PackageDependencyResolver(conn, falseProjectConfig, ["contact-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + it('should return the latest branched package version id if matching records found', async () => { + // Mock the query method in QueryHelper to return some dummy data + response = { + records: [ + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' + }, + SubscriberPackageVersionId: '04t5i000000V2DiAAK', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 17, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'inspection' + }, + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' + }, + SubscriberPackageVersionId: '04t5i000000UyCJAA0', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 16, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'inspection' + } + ], + }; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["inspections"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + expect(resolvedProjectConfig.packageAliases['core@0.1.0.17-inspection']).toEqual('04t5i000000V2DiAAK'); + }); + + // TODO: test cache +}); + +let coreGitTags = ['core_v1.0.0.2']; + +let coreResponse = { + records: [ + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx3', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 3, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx2', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 2, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx1', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 1, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + ] +} + +const projectConfig = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST', + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/inspections', + package: 'inspections', + default: false, + versionName: 'inspections-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST', + branch: 'inspection' + } + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "core": '0Ho4a00000000xxxxx', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2' + } +}; + +const falseProjectConfig = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2' + } +}; + diff --git a/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts b/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts new file mode 100644 index 000000000..ff8343eb2 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts @@ -0,0 +1,235 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; +import TransitiveDependencyResolver from '../../../../src/core/package/dependencies/TransitiveDependencyResolver'; +const $$ = new TestContext(); + +const setupFakeConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(response); + }; + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; +} + +jest.mock('../../../../src/core/git/Git', () => { + class Git { + static async initiateRepo() + { + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let conn: Connection; +let gitTags; +let response; + +describe("Given a TransitiveDependencyResolver", () => { + + beforeEach(async () => { + conn = await setupFakeConnection(); + + }) + + it("should resolve missing package dependencies with transitive dependency", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + let resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let dependencies = resolvedDependencies.get('candidate-management'); + expect(dependencies?.find(dependency => dependency.package === "temp")).toBeTruthy(); + expect(dependencies?.find(dependency => dependency.package === "temp")?.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should resolve package dependencies in the same order as its dependent packages", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let baseIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "base"); + expect(baseIndex).toBe(2); + let tempIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "temp"); + expect(tempIndex).toBe(3); + let coreIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "core"); + expect(coreIndex).toBe(4); + + }); + + + it("should resolve package dependencies with a higher version of a given package if a higher version is specified", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let dependencies = resolvedDependencies.get('quote-management'); + expect(dependencies?.find(dependency => dependency.package === "core")?.versionNumber).toBe("1.2.0.LATEST"); + + }); + + it("should have only one version of a package", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + expect(verifyUniquePkgs(resolvedDependencies.get('quote-management'))).toBeTruthy(); + + }); + + it("should expand the dependencies of external packages", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + let externalDependencyIndex = resolvedDependencies.get('contact-management')?.findIndex(dependency => dependency.package === "sfdc-framework"); + expect(externalDependencyIndex).toBe(0); + + }); + + function verifyUniquePkgs(arr) { + let pkgs = {}; + for (let i = 0; i < arr.length; i++) { + if (arr[i].hasOwnProperty('package')) { + if (pkgs.hasOwnProperty(arr[i].package)) { + return false; + } + pkgs[arr[i].package] = true; + } + } + return true; + } + + + // TODO: test cache +}); + +const projectConfig = { + packageDirectories: [ + { + path: 'packages/base', + default: true, + package: 'base', + versionName: 'temp', + versionNumber: '1.0.2.NEXT', + }, + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'base', + versionNumber: '1.0.2.LATEST' + } + ] + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'temp', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + }, + { + package: 'candidate-management', + versionNumber: '1.0.0.LATEST' + }, + ] + }, + { + path: 'packages/quote-management', + package: 'quote-management', + default: false, + versionName: 'quote-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.2.0.LATEST' + }, + { + package: 'candidate-management', + versionNumber: '1.0.0.LATEST' + }, + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2', + "sfdc-framework":"04t1000x00x00x" + }, + "plugins": { + "sfp": { + "disableTransitiveDependencyResolver": false, + "externalDependencyMap": { + "tech-framework@2.0.0.38": [ + { + "package": "sfdc-framework" + } + ] + } + } + } +}; + diff --git a/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts b/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts new file mode 100644 index 000000000..cce32d2ff --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts @@ -0,0 +1,500 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext, } from '@salesforce/core/lib/testSetup'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { AnyJson } from '@salesforce/ts-types'; +import SFPOrg from '../../../../src/core/org/SFPOrg'; +import { ComponentSet, VirtualDirectory, VirtualTreeContainer } from '@salesforce/source-deploy-retrieve'; +import EntitlementVersionFilter from '../../../../src/core/package/deploymentFilters/EntitlementVersionFilter'; +import { OrgConfigProperties } from '@salesforce/core'; + +const fs = require('fs-extra'); + + +const $$ = new TestContext(); +const createOrg = async () => { + const testData = new MockTestOrgData(); + + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + + return await SFPOrg.create({ aliasOrUsername: testData.username }); +}; + +let entitlementSetting:any={}; +jest.mock('../../../../src/core/metadata/MetadataFetcher', () => { + class MetadataFetcher { + getSetttingMetadata= jest.fn().mockReturnValue(entitlementSetting) + } + + return MetadataFetcher; +}); + + +describe('Filter entitlements during deployment', () => { + + beforeEach(() => { + const fsMock = jest.spyOn(fs, 'writeFileSync'); + fsMock.mockImplementationOnce(() => { + return ; + }); + }); + + it('Should return a component set by filtering entitlement versions which are existing in the org', async () => { + + let org = await createOrg(); + let records: AnyJson = { + records: [ + { + Name: 'TestEntitlement1', + NameNorm: 'testentitlement1_v1', + VersionNumber: 1, + VersionMaster:'5522N000000c01Q', + } + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_2) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + entitlementSetting={ + "enableEntitlementVersioning":true + }; + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); + + + + }); + + it('Should only return component sets when the version number is higher than whats existing in the org', async () => { + entitlementSetting={enableEntitlementVersioning:true}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + { + Name: 'TestEntitlement1', + NameNorm: 'testentitlement1_v1', + VersionNumber: 1, + VersionMaster:'5522N000000c01Q', + }, + { + Name: 'TestEntitlement2', + NameNorm: 'testentitlement2_v1', + VersionNumber: 1, + VersionMaster:'5522O000000LlFu', + } + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_2) + }, + { + name: 'testentitlement2_v2.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_2_V2) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v2`)).toBeDefined(); + + + + }); + + + it('should return all components when there are no existing versions in the org', async () => { + entitlementSetting={enableEntitlementVersioning:true}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_1) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeDefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); + + + + }); + + it('should return all components when entitlement versioning is not enabled in the org', async () => { + entitlementSetting={enableEntitlementVersioning:undefined}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'TestEntitlement.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); + + + + + }); + + it('should return the same components when unable to fetch entitlement settings', async () => { + entitlementSetting=undefined; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'TestEntitlement.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); + + + + + }); + +}); + + +const TESTENTITLEMENT_1=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement1 + 5522O000000LlFu + 1 + +` + +const TESTENTITLEMENT_2=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement2 + 5522O000000LlFu + 1 + +` + +const TESTENTITLEMENT_2_V2=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement2 + 5522O000000LlFu + 2 + +` + +const TESTENTITLEMENT_NO_VERSION_NUMBER=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement + +` diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts new file mode 100644 index 000000000..5bfa5628e --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts @@ -0,0 +1,39 @@ +import ArtifactFetcher from '../../../../src/core/artifacts/ArtifactFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; +import PackageMergeManager from '../../../../src/core/package/packageMerger/PackageMergeManager' +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import { jest, expect } from '@jest/globals'; + +const path = require('path'); + +describe('Given multiple sfpPackages, packageManager should be', () => { + it('able to merge into a single package', async () => { + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementation(() => { + return set; + }); + // TODO: Complete along with PackageMergeManager Feature + // let artifacts = ArtifactFetcher.fetchArtifacts(path.join(__dirname, 'artifacts1'), undefined, undefined); + // let sfpPackages: SfpPackage[] = []; + + // for (const artifact of artifacts) { + // let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); + // sfpPackages.push(sfpPackage); + // } + + // let packageMerger = new PackageMergeManager(sfpPackages); + // let mergeResult = await packageMerger.mergePackages(); + + // expect(mergeResult.mergedPackages.length).toBeGreaterThanOrEqual(2); + // expect(mergeResult.mergedPackage.apexTestClassses?.length).toBeGreaterThanOrEqual(7); + // expect(mergeResult.mergedPackage.isApexFound).toBeTruthy(); + + + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip new file mode 100644 index 0000000000000000000000000000000000000000..b5436df6dd5882319d3577edc14132a05275fe3f GIT binary patch literal 8405 zcmeHLc{mi>8y*bV2FXqcNtQt*OVP;A*s@)OF-FEV%vhsE#LbPscOQjDOzu`_A`$=e*}N)TIEj007j~07HPVX@3$B zyo($Fcmf0fWB~vG9EC>gv&A@ipnMT%3>=O0@WR-_&|XMK7~D&8`G>6=!VBgA^MZk$ zF(~(wCQww@VW#p)F@bE&ckCUw(zL=U<037{XmVC_9&h!HV&DBr`VgbV03Q&QYcx84 zs;A6Y(?tDC!PU7CGuK|c1HqB&T{#gv&A6sg-|Zat^=h7%FuLAjvEkp z8XbrFGnH>~ew;o~>*SYism#xLxw8XynH${~)FU=Nj+6B%y;h9{ zu52pht}Uve$*oPY&=(VK@j{;a^p(>1c+Y=IFZGiSjx{%2(Q*L=cZ|CUtu{dh0Equ% z%fX#s?#B_XsN-K+?LwrAOSKf!{n&3S`i>| zXa8=>OIIU&$DhCOwTkj|3ad2K&Im8x?lmd#(n826D5r8UTr{)~%_aFtTLg3Uj>?r( z@Nm2s;wt;%j>JP;lO`f1OjvVlHI4IcrUgAYWI~_W@9jEWQ=!IS9@#&^qo*^cTt0Gv z_wufG&Rg1O^U2q4sf*$oijA`mWyDh|*+zKTEY3`Xo_`5cQW$WBfdZo_>FBD>7?u0? zwdZ3xllR=ZVF30KvW$k7%;g_E1d(?`WiPNVZxZ0kToU%>+uBX|weehHP~K=bLUI{m zX|$UW2dg{?dz?lXZ|TiKfE`f;B;;{-!a0y&gm>qbW*V7i1-8;CGkX{V-(YL@(&K5! zOAbm6_Uv@4$irWrnin1y;%2xg%o;0$zdeX8`}Dr()Fq|N8(6lF*Y=$~*b|-*I8}pw zPp0K~xk=EX>2>!sV@P21wV|{G_TS$Z9*(v+`W|^DyCVoas+n2%>?7!$haeQ42(zz_ z=^9H1zdb6L3QK$f0Y5m$V5uZuJW6R8g*33Li+N~-ch%-*2xY+~N2fF-)V1ddIq6s&ot-up;Za&zejw=aBBL54K>Y)ibW zd-ciStMIo6$OBZ(9Hm?9s$>isGg?Y4y;Sd=MhzN-$fUTW1Y#{o(B6-ESGO>2mJGxeC+@@%H0up zd{rZum38gcCNzR91puJ7*+%$^VgsTAN1$UBgKsYW9VzdgXiZF=2%Ibp( zbUT$G+Ek(B(WXVlZT(u{{Bv;4SGvinfwS=(;a%?~gVU}ho*pl+>4q@#_Ges&1P@4W z@9frMvy*Db^K7{09Hjxe5?^$?oJysogl)Ja{hqFqWiY1{P@S^&1?-k;Uqo}*M1cHn zyR<2BZimQ@{%)dY{lrTyFIWg#BNoRhhCY__VfITfzg|dm~*PejNxu^FUa8o*&*?Ej`c(4;cE_ z@%~ef_qEkLvbAb@dL!X3zsB>Y-`8sk3fWpgePFIg!mH}neE!t=Tr0mMH(O3Om^;!D zf$>^>4eLno$u8zkp9M+RY(}W`5 z_^4FFsn5zEs{9f@KWv_9ShyrB6VK1|s9uD>FbN3L$cN}0DQFq2VI|K|8s;oaHom5? zNUdlXHq0LgwWc>L^9yNX;L^9G&Fr_f?mY2nL2^t{0Yob)Zkyf*f7Ma^K{z6MA~jVU zHQ62^ITJR2v+K2xyP4AinCNte1Et+tS$-QdUhVm#yqt01G=yTN`1(xnO?*O4FZ5Bw zc>@!&aT{*?LX8VZNWZ8YOvI(~Tl60(PopnAx~m)fXaJ*&TN)YI4(h-Zp0QXwr| zN@B&EvwC*|249C?Eu?m8fpz$}w9nh~>rrzA%d;u_GuU^=ybc-fa%s0LDlQg#C_1WG zu!ysQ%iWiJNzHQUb6%n#opp{O9#nt>f$O`A=oMHxr1AO!b$7$!uTV>dPIRfOJLcP) zE5}sq>2+coF=!XPornQG9Bbz@xYEQ_%}Yb_(DGStF-n@`PxX`m4e5R;&E!Wa zZKgRFdKR@C=cwvS-(AR67`8jx0r85BdDYVD>(2UEYEJ$cmxTVw)GOvuC#+P>pta=W z0=IU{slQ0J=VcBs;E3bFT+hhN;@7$aI($-fTi5P+`m`!_rTO0M&W_xo(!krGp6F`_ zK4XriJ`jG&_;O)X#UQ=TC!KBPNWaGR*de<0w}0=Z_Y4jHw)Ja|kWGtu3;~At*q4B# z-8R5G@FQV;!*hcn-8TSL**Yl7p7=~8oqKC{K=a>&L*Q_fx4YK{8R-9aB#uags{<*a zrAuD?Wp*TxFiHJ{kK2FF^))|zZ#R1c+SV2h{t|-((QF0#xw#^u8r`e;S=441X=^HK zwfV9{^-N3)9$zpYQxup})VSaGE+hJ`9gqR=5i*80`7YEMM_xU#- zsuMpl(F_(boh0kPGYLD{hV@g=craZSHxsb(sQO<^orVl{iVxb*r7LTF(Bfg+@kYg5 z9>W4-W`Uw;u9>7-;S)E9$tLgt;}8_HH*N!jIgj`xofKf;s!AjZ~`I{xVayz~^ zB#5Tu^1=mmZx-@+OKqcEh}Xx` zBIXjgZIijIa)wrB^nEFa-q7;G1@&$T|9hv1l*`hfe$RDynTYU>3(6));!SnZid?`e zoQ#dwh;QrVg$weh+Y;OAm-a@4kYzT)H!esAv?aooFF_LB+PNgYO_mn1GdLMHNk@8I zkieHpwfe2H437(P{BiKVeYubr*QP^MyGx6h&Xw((Ooya>SN8a7^}7s?3+mrA^lB}< zQTRl)xU`7jv+mez_+PZ+a_DP!W##x={|GE`w!Uh~_3?>nk`(sME#ZIFmg|!c)g_69 zjBrJ6YVKDE;x8m5t+_rKQEigQZ2mnNNqeqON>raD((3@uuw^Iy_kY+So!tNc literal 0 HcmV?d00001 diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip new file mode 100644 index 0000000000000000000000000000000000000000..6adbcf2731d852b7133e9e771c7a5152ba9df920 GIT binary patch literal 35211 zcmeHQcRbeZ_qVgj%BJkS$=-WpQ$qG0*)ngNtgMh(vO>tpC^J+>NOtzh%E&CgTe=g{ z^YnaE{qg&}UcGK9pYy)X^*-l1*SXGh$V)>)VSs_b!h*?zk*nk_p~5IYfq|7$f`RdX zfq@ws=-AoY7|>Z5S=g~?+ZtM1IU3m5>e-lB+u3UC*w~pE>gd@qfWFYSFtF3n*Rj)~ zH?_60oWG)B)z6OY*7gwAhxb_oLxJLYuI;RjfIo~y2@i&^fKpV87#e4U=_uyrB8mMY zQfVwqZU8jtrB-qG+qM!x{!#9Ui7)uaD0J~7+nqctui~By41sV$QEh?~^i=lt_YAQVBfvw$|-{8 z1BP#?>PI=E9z7@WQZ3i)Jf(-#Wg6P=uxXFeVxiFDHMFO zjo&(;&8LSFK%|M44v{Uc)_8#7xrcD7Z#8L>Mm{T>p0=j(PamAo>!Fi;?4c3rT;HHg z6`A!yjT8!5ZO89ca*wDC1r%H%@z%t`%Db3HsY@TgI0B$!A58QW&yly4)Uu(aX-=9! zEv|c0uJ5p<@WIPddRA`+&Cg}P5l>usYE)X*&y=&ap+(fxRN{w%!Q1Lqy_vV&nfLDe zC9k46Uli3)^s-u+4DT@kx1vBJXMAN(Bb`f=QxGI?-RxHh&J#f_tteV3KMb`F$8C+C z*g@|J&!m~<5ixyvm*-|M`P+<$`)KzmAL<6$sX9n=vNEb6mnz~Eo?l@G+ za%_6ddcL21h-?uu&_sk2uTh>VbvMhj@Y7_3B*M;=cQuqW$1-O)KMPJnX(4U5PRwO2 zqnN54wE@n+fIgGe#Q_HGai3ce?B}?%Vr|4qc#|q0WhhZG8DYsx=bJLcwokdRDXJ;r zCXH8-h>cuKNKhTI-l~i`kAEj(Nba^Kw!i#}YpUCG8I!wQQDw-DHe)NJ$XuX{q6G&7WBu2z zO3zrw(#XKv%ILF;(hT88sU^m!Uw4PE&6Wk*W-t$3uzWUB+-^$SfD!O2{jH{eg^X4C zz~EvPm7tar7#WjzS@g9*N~PCS6?OfWOzbn&#rhLUp60)j(#(C|LIoq(Ir@qG%-QJ( zDTS!Z9~y3lfZ-9b)T&D@M=6V6xh}*>#U5oX)D3pg<&~bm@M~|WRIEIX;rSa`X-w@6 z?_AEKrU>%26U5&^Ig71dgopPy-IOi~yhfTw+)-|l12lZF&z>4M;;#=K@T-64sco(7 zZS)KnK(E?&`t1fhwbno_-iH7KZS?R%8I|>&AC zlgQd6>*&@+_bp`5zf&T)r<2?%NdM9o`3m>Nl6h$PTPBw@8lzhjD$FJEko_>yQX}p* zCpLEHUC4j+rr(9Bw%2d=+JM6Y-+Mi93c+q{ESa{5UhT-?p^%vQ?#m90HF&sE;5Jw+-@mJHT>mqDg*9G{-kLj?EA z#=A2(y02bsbR{IqAmzA73|%mPa%-sdZBMY-tKB&vHOEh8>YBZ&XWn=_L4v07I3xbO zL409^o|UDciO~^as8;r|N$!~!Bp8^?&l2Oy8?9}uObztx=zu|kj-8${oxXwLXVVLb z;J2z}L~U^76CLM7AmA31gz&*$Kx5SWQ;)@?u!SKH-!>#dzXus&r3q5S@41@1t`m0?X+Xh_a>FCr-{X+vC+)kS|6zGNDvD(%o{|v?MRo(QJ0;I0a5e;^m*i`KTv&GEzvina6t|HrNw5z>PmvVq&qlbOq zKNiL-Z3%eY<1&v!tIfVaRzYGtb<0M>9~Mb#?Afp_HO39{p0{0D(brzw@5kSm>CJwg zYf!fE#722o+WO|qCr5&MdyWm5lS#n!vs3nsDcc^Q!nZy`?07M;>wT(ib{;l?z?E!bo8CUKKeAdX-tGzcqZZj-! zaU#Jp&}wH4>rM5PY>|gXyuWvk)@r3Yl;MN_W=`KUsims%OC9R99)0L*?^uboY$`+s z+wyZ4q1FT;Ka?bW@Xo17tbZ%p7P^=hNwny_fku3HGol_+f8`9^qMejegaC1Md3qC^ZXs?z6+VJrPqVtZf2 z;&VpU?Tw!HS?n|GzEWILLeoM$&sF#-O+$~pfngFBBXT!CnFQf#u6zYjVHy&BQ-3ic zCq@rbh1`Y4r~dIVund0h`$R;*?_i3(HkdL$P|L=mTT*+ zRt>SBR(+((#Fod`7T0im_3)B!hQWKRz;A$gTX0um*I#E&l%W^*U(3s0PkHGq7p%IL zJ%o31_{jFNWc-pBJQ6vY$_P6Q0$(Ktq$A%?zw#&nWy4zb$mgRCy*bc_>>aVViTBYL+~iBsth)AFMRlf^wyiRJ@Oi;0a}q zqqcUJ>79hv+B!QbCkg3i7mIT!*c|cO-#m8ie$k&0+IV|G@MQvuZwTAPwzntG1=CL} z&PMO+JRJ8k|30<*WqW7~e4U|WLG z(F3L~ejrQfm&>xyF|quCK#kK8sAsNYYin>YdHYd?hP(?d-JWRz_xL`iD_Gdx*3Qa8 z_RAT8*#6Oil7XF_iKUUPyp5HEiN1jiy`H(Py`r?GHzVqxZO~;jWnV}Ug?p;mQKI~& z$exIVXlf;bAKIz2ZPxn&WdYUZ0`6h!IFUw|A#mm{_B{`X5xF-4jbjfp;wd6TMCTei zsbS43Kp}RmJ+*J>Ri&H-?u0sajVGq>C{$Y_*_o#om|6ok-IIzmsYIcp^}At&>KoBY zP|hpUD5R1jNJqVe8W?|aCt31o+a|=4mb;Fqe3Hv}2vsl|v1vP!;GkW+H!oY_xX!s0 zZYq}tF*xZdPb3jB9RO9s??lDOM=Ex<5O3mg_>pvMjL*ywbVA~wpa|vED(<}0l;h>P z=?K=(x!l*gP)wFiBjcjN@0dH7!!EhIFneEGuKyj3ALmCz_R1N+i>JEv?~Nktn0o5) z86{WBh8mv+Z+fItX6qzt_(?CH0XdER>9l30@eTw|<3r$|kiTR)>GqC==$$OgWkYJ< zfjJ+M#m%7bie7bPk&dVf8_=_ElJ{WxNbTNqw3W)Aono)UOR|_uy{&{zHL3g{mtD$l z-1c1OBh}J(2DZwD*K142UQQ7Pj@w8mKR9R02`>Na?#wN5qM|lPc+_J#C& zB-adOLat>*6kSgk4QnSmb1jP+P+tp1VXc%AA`wX~Nl`y2DIExgQbN1Cn{1#0r<}L;);%x3#f=JN~0bo6HeOQ?pC><;$G_-gw2im^HDguCGDoai8VzyOsC1Gi&1(`^O0&t9qcpz+8T(awILR%?&IJ zEbVmcOsp*TJXW-lpye1NV&yg_4;SY}6j*qu7E1tO3FVbJNQ}5V-)J)7yBf4uo7+-_ z`Wj;RDLfm*wtflcoqHA$dg`*oUW80b8bkBv>v)r*YBCfEi_-GEgUJ+i5)$(kyja?_ zoAQ48EfyW)us7MDpntuo7-E1XDTIk}xD#Hrx!2TqQUh7HgfUmDKyYzuVqEJjFYgx zvZbG4_1bfI?#0;v*JZU~6w%kj2`)0Xtfh@?)t{8{-F9)w8M`FX#aynC;WY&lrS-{V zbr`k?yfvz09GUVuEpFx`0#-pKFcuS~PxClW%LZX4__@w4%JmMK8oPFT1a&p%4kVc~ z5f;ZZxt`;1Oj}M2zSCN`WK+Kxlp{84=xPO>jgp4HyYXhF4PjbO!Rf}^hVAu{)u?xc zC@C;hx81e^=%F0LI+NeYM58g6P-_R9IvAQrUg?c*fQE_%G}Pa-1bhjd_e`@GXqv!?xpF0_N>E;e5LMLlO0gn+Zr3X0v&#WWdL(+d zcd0!dA|clZFhtJ^UvM@uGJ5ucIutTsWW*CwC8tXUz9*)qnmY!b1|z=6kr@(#LBcK< z^+P5b`eT!;&<2S%VgMUO6%Nk_b&g<@IiqJix>L0z0WmeY_%F0*`Z>UIyq!buL}@D6 z(B6pS8$_z-X-_QtNL1kwaknEo{R*|(q7Iot8g@3G$_{7V#f&Cs4B3zLRyZ415pLh- z-D=9#j~#i2^0ID|6{c@!GV|l`-B)Fy6MbYV)E`7yKU|lqFk;hS6CR|6JR_sN))crA zY>4YekcdFmM!bZ`-O5Da`e3=Qgogv8|J+TUO5PD;8p^XmrV?irx!G57vDWJov|ae< zC!DPM9>{7)GH2!VaYCB4E#Wu7h_q}H1&6v7z~?Y@n8Htm7~A6@-H^T{!Pc~@KOnP4 zCRW?(3LzpN43qGIk`;lN*yc`tKB;#Wxv^{*>RJ%^on5y}-SDqp=1hU7l~as939#lo zUpKivwdnq^=17S7ZPfI8mbh=o@wZz}SK|Yz3gFTf478r#s+_}{&afI}uf5I5#~@DX zb9~hZ?}rsa+yw#9rYU6e-9Fg6no^YDXzPWNMq7sLvSKSL4QsRV}m)wJA5(StLz_gek%W-d&hDzwS1*-Rj6kQQ1p9V^ysV zxPj_Aw+2aM=atp|PH@TW{aD?b>ZgH~*0s{KO^)UkX9UHfJoH{(XmfG!B?oAE1-Z?x zKh6JSlk7jn;bClcUeB{H??&pn^2(Ph*YIPyj;IrDv^j%5XMOZd8 zVIfVLv}80tNO{WKbFqYziFRo+?bMO@VEB?Ia}yaaJl1=&8M6|Sx8OM$WxMk0*^%>{ z;+;bSR1;)UuJ8KZMM2GV5kFSSmtIe{n##*&pMnF{>C}H#eI*-kG)Yt_>mSZp;K689v@{UYwYLtE#Z(8g0UPkI`p?RTZWK zZ=h{AJT#W#wp39{I@T^zj9kwZofdbIif6CO(3l_%VUZxbT{bAb2oX}3sBY9zrJr$? zqu(0QG(mTMfmI7SdANMc3DGja$d~X6P4^9sbt7LW7nwzE^%lhy-7F|1doI#ZNp|Y1 z;?p0f8{xE?W<8RdwtrAVbV^oXrMp)TbdZKTZjPsvRsae9j#Ye3#_n%OBmHM=hk&Me z8EB>vr(>c&0`nb!^!xw+t9@F8x5(8qBKj=4!P7X#d!Y(Z-r*&lhl4^}0<)Z5z+KLG zmODJ(+`+r*8OHMVr3Cx-;;>F?mUR%f{h$LpWjU)g&q7z@_Q0L>= z6hqzKtVjv>_Hxpf7C4>bnf6rEck(Ja2Xm20FQ%jvB6YDqVsc!MDOZNx4(5D=DM3OU z?8AHsD#G)A^{sP3)#qK{F`(Px9!<%OKk;nj54i9l3FaP0!)>ZCUT2rGs3*51G?{Ni ztC4Oy3+=8FsRs|0(>%2vN#cDG=9cKv);b;1gT2H7TjpFmf>Vo90w6*=RHve&)8tcNC%$TD=>NMeP#1$ zAFsA9CTXxohr~{Z47DPq7~ZeHFIhnX&yYazu$I!obxx4Bg@2+%;8w zhb2%GYkgzzeBq#;3bpDX(Nxi7l%#aSASI5|;Dfn&UR(*iD-NY8wsS`fI#_sY7>SYg z=7z^)RaTBoX16B?2U_LbDMV|HzUIcf>esnWK5p!1i_&6Wq~Fdjw1X%1=kxNYz-(!q zW7)x|gI}KMVZ+nNP#psks>-YsY~M_WR}R zJtTPV%;z6Ye3XHj+1tbV-l{RJV?^{@bcP=st)4~*7U;d!E-Y;V&utdijhmpaZX-qM zyxwdQVd2Z17)<(PcXwjVFRWgdy;3}^_124qGtVO!thh0}I?l6H!o<+QsZwr;QPwC4 zUMS&wKUA8S+a!*76}|n++mtbv$^4WawDNA%>M8cJS%DxEhnmNZG*h_-sspsTg@Kq4 zP#=&%OMLbScJDhvPYy2ZJ9|HLGq8%9Wxo+)fy3gEm zew3p7QL1=VWuC&dO=wNZ15g<&D%t-;YQZLc4y11w3>et2-{c&k@R#NIyNM|f zcUx3yEP;nPz?zs!bh`Lq$ac~qlgNwtvXCZI?YK=6=uv4YrlW6f7fJRbJ`?EE;ZzCv zX#RA4Ae6#1RH_kuO^Q?pu{SXWn*5b&2f-^?DiWz0bTmx~S9QH|LC)qp+@aBhBs4FYZ#Q@;Z`K)l zBU)FSCF**I!6+KBv2;~S4! z!@;`HduWFhBxsB~djcm-jWQQM*1Q;nRMM+1d|ZHUuj5Hi6GksuQ`IJ*YF&-+%qv1; z1+KXw2HsM$8--UrKSiCwv4@9yR*3zYFPE#WcHiv#g2oEGYhlT0Yk9)cHzrGHI#MDm zu1TqqMWks))D`nRZo;IvYMnakGcTD{nfg%e`6t-cENccR;o4NqqMLA~?Tz&WcfY#m z<3|$#r)!-5hGr*NYLTaFC>~LPSKNPrcb(^9|za)q1 zg(4tPL__^PzX(lv+q_obuKiqBlC?s^(>HQL`H&J8#aC2Jr^s#@whpvP&dm(uw9B({ zXg{75N{J1pXIjAI>bDh=fZ~ARBgs%4LknbnYzw>b3ev0-SG!7^*zckN+?+}Ycws9A zS%_@Be7Zgchk%iE2RokmyK#gh5*g2ljC5SQ(px%ij4iehXeb0mU0w;!kIw+=><7X8 zUkBF_L?GN8Wv3@x&#Ov8)Zr@vWKxy0F4Z{5!!v<(m&9Z%nhQ{SMJ=A~4k!%LL3z~j zy(pg9oA~5bc@ZAjK z9`wDxG_9~(v1Zu`O>g96XX7fSx6x|p6iX?|6G^VSQi&RS&knKI2JW_;shNh1_2%=@ z8d-X6RF>RmKXL{Hp^v_mfqb+k54xVk`CfR!g}Io4QKHPr_c*K^?UTnVJCVq^+1>h@ zf@L+S$rm3)Xrzy8Ug}^wZ^#%6PK=2`^YcK z#gk)>(%srw=Hq{nezv{(3B`ifvH~ZF!jf8)U9Gz2(&1TfvBm$STv1EMrP&8$=nHe!N?wa*^x^70=%k;O{W|&g4 z7Lbr~TWbN>&$uEt=@P?QO@!_sb2FT=SYV>u-Y~F`etjAGw#NLj9a`iD1ZabI+?WA> zP?LYJP4DX|vAMJ&52zmzAmbc=m!3o|j}xwCuUgD!(K(3Ml))K{ftu3k{V2M5e=f|j zIJ=<8)SFMpOf}Cxr^3IT zX<6(xtnfgVT?EFAzjPP(b@lk{%|VX!Z~^LZ##zX}kn;uBovvU$62V#m=ip$%wX!)^ z{vNVP9>&-lVW!9uan};zKH8dj{L47bFm@Fc0q8K^f_$6nHtg0Uc0*_bYj-6gua|`k z`XKY5L)KWM%ED$)TUVHK)%Abxfq2(jKN&DQt~0bL<`X&Xsb?wP%NS9 zDLkyPZh3$x{ zmtL`Rl9u-lb*-BuVWxsNXBliR zEkhGbClZ6Gkd1(`=|U#zFi))XxFtGFC%B1GLEtz*G0g)0-`j@Go(*n7NM8;bZr`@0@(* z9@fW*=su;U>_(*1$ttTf1BczIGD;3Lw;5I9Cw9ADbJS+_EkjY`mAnBcG-HkXd|hvi zwr%G~kro`JZfG#7rVwr|ZbQC>OuR?Ht{6S^$GTd{aV&BsI0D&qYYF58s zE9iJ@aDD_GVx%4`rQ20l#GOk34G5*zg!z4T2@zFsD=?-{YOzQsuRXDaF705kPvjJS zp}e9lw6zg?^}_hIh1Eq|H(n)Y{VAB{kWcO{yEiVa=N55Zx@LKe&f(2v8R`2z)@#8G z?eHs@p|=M3kkyes^qmbw@$%TVQ;)Hfre6Hu4|Pf5#d0u~9HKRc%ouaIaf)U6Ir?yZ zTcZK*3hjY6m}VOu;!D0;-H0X6*VHqHC4pz|6fSac>~&LFHWB1Fq?ec$kb5fx#;h6G zz`AhS3w-1_v)0wnyXS$tK+zDvb*sdMfG zqS&jV5B~#bj>0>7>TVF;A_c_++>xwc$S%lG#X*x=?O zZg>lPTV3TNW>lZs887shSta}idw$sJ>5jQE9gJk6&ev6*i3?qN4-#tcd=zTT->K&c zBC&N3FC>rLF2B^Ev#1!(QD;rzuYnWZV%`HgSYu=QY&NK^l9kTO{jNSzjgOy(U~CgU zbx{yY56jY7om`(c2$Kw(_{=)hO_S&DkNdfpT+q9<8j~}go$H>iideNHtwL7Xjmx(= zn@iDV^l^yRIb&RGHflibUd7jP-{W*R#hu@YbolOBJAD!a7AlYtQ-6pRUqF2ctB#+t zhuqq~lKQz8W7ZQ@sL3A1H;8apxlHwreuujGT+@*9e19Z+6#w<=Qi3*jZnHa^PYjBM zW#~69J8-tJKx_Lw-<+p)xy-;|$--8O{%AVV$6=;A8uyB8yg`VBV}?C^m#h+jZlDRy z6}RXq4z8!&bUxH*&*wyt8oPK`Sc>yelHkRPd!xiWg6?Gq$@0FSxsIZNPJ#VVn7dyQ zN0UO>up&FUo=^%m6PMJ@$CNS)VyTWgLqWVrt+AXkj)7>ricL)C1iubo4BUV33J zgfANX-cz^O#LBP7o5v}2Itjbahjk~rwbKbTJ_`lyD?!5dy%?!&Hh(?PdpQ94>Ut_( z?2z#9ChU~IoT*!c3GU@kMAtbR%1j|fq0>@QpgAtgLW^;m5~oMRQHxeqo36a5gpR zuy((#r1t&8+WmVY?tLZ_&aB()6;@jUndtJnbai<9`IU&5r1yw8IEC@Z459-eAO*qK zQltw(W8BxRV5F*7JDt3kJ+TDSD%MQ~XCU6!F#@u?=d`ZxMrgZ*dVYnsoqQ?vUhy3E=wDWc{F(dZuOAI}(fkmu9f_(Yf8a@EZi7mK=+F{pC-{h*F%Y+sGoZWQyQKvJBJ zF`=f$E6q(T1vegCS^L^x>-e_sm)?l^nhW`kb$?%{e>?qXh?FK?0cjTwq@VZc)9**w zJrE7u!UThW6>&g+DB6;Zj$P>q>lNINAliixm7V~n>?oamH^9lUV!ns#QS4Lr=&gsJ zl4A}n0nyuZmuaj_* zLI8tpZlnteWx12|gPEzt8vf->9$Iu;n9H}B64`NuKO*^mG7H44feLDXCY&m~hmErB z48hmrQr4~9x%qadJEY~^oM=?GLVw)dKAnM?F_aq^q~3EHQtO*9lzD7dU+b((sUzOZ zdw89N!}bTazk~k{jsNW=&E?H~Q41uf4X}{tH>@W=PUC=RId&=Q&*-tnXJlj;X)`#9(l&c7 zzPiVxpI6TjC06`K0|UY!9LEwDOKmXnA?qUt_R=zT{1SF9&sqcB{nxlO4dug zKGf0`D3la426hl=yUZqo4R}p5wjR83EK=g^F7lMwKI5$CG>A#&|D^h=_90O0;VzY-~=io=;8@d_t|1a zr0I%s6wbEoT)z(f zK#^q*nTyIi7KVQy6=|HhFd{3WYsDDgNxVQgfdP94r%|wxz#U;NwJlR=x|nK0?_OR( ztbUE(s>hBEwaHWS{L0|u4`cmVZpB^_=pd?4ZYK8OzVdN5S5dBJSph0%XE zmapA=4}<@USo_&mf7{LXMl=4S{B|%bwpJ{*ul>bTa;iicP zVvpN5$5*j?46;4@lVT70?;Qx)pUR_c{XlZk08Rg0$akCk9Y{VtyuHS7`_JC+z<~bx zr-*ydCho9p9BmW_5|Rc``e_kI+s6H9I7}cxpS^J~=Fbl2bEh@XP>ySBuh-iCv!|{8 z|ML288khZOAO~#Ulf;Jg9|rP`q;KaGn5RE^fP1~z4hER;E5&~4%yzQuy?Z(bvSH8t z!XbZ_{iPW2WB_~jb`AhIpALY7JR=CmzB@SDyA1>-4X}K=Kn`!U#ZK2 zF7PuAP=j+Sa|cr0zefBuDn1JRXqPY$dSH}=d#cdCsCTah^C+folc9UJWQsRo4j~SgO#Qf1 z$-xl*Nta->r!oXkF~g659IVZIk-78f0{M9)9|1V*8ZChP_HW5{@~@}-w?zF60JLE^0J3i}M|&n5%;x0j z0@>TS{L2msM=>95EpUL@mgQ8H_Y;`EvncK>{OAq;1MpeE?DHwk{14E977AHA*(0-grozxX>)AGy5!Bc<+Lz6Cu%rE>oPc;8Xu@sMNh z4($H3w-_-2lYhT#^1r-j??xYsG#2|@_`Oan*={xOgzs`TjnM-bpNfR)gxqdlAw{W;YhUgNMt{y5kZ zReba^-hqlmMSm0OlL|5ZiNAZd%0N#VfJXc;fcqUaA76tGyZ@`eGv`zCWhbREj$ZaU zP-5@tgAv=`Jpa_yuY>jLpR{QUJWD?%ZGyJwKLWFNM`-`qTiKURAIwp0eiQucuS!Sn z41w^a0o;MVviOu$bqw9nZ~ROi!x04ibLh4!`}@(KkjOZC0SAOL4G;x9`~BT2{-^6W zKces9=vYzyG|>NJ8so5gY&<;>C#5ouUQjuhPZ5Pv(+CL6cjHb_N#eoW?Hl*E+iG7B zOyFl4;4W~Z_3N2;Ca{)q~251E)(0&W#!=c>2(e2@5y9+9R6zGYn zJ$j$uK((@}r;hkX(el4h@m@JT=t%=S1$v@W=EA=Le4?t4R>dD6UsnH3$WMxz|BbTu pYOFy|8bA%0IQ}il{wK)as2du1-C*xm^U8qD08fL0ukQWr{{TM{Zeaib literal 0 HcmV?d00001 diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts new file mode 100644 index 000000000..dd2c050fe --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts @@ -0,0 +1,55 @@ +import { jest, expect } from '@jest/globals'; +import { Logger } from '@flxblio/sfp-logger'; +import AssignPermissionSetFetcher from '../../../../src/core/package/propertyFetchers/AssignPermissionSetFetcher'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new AssignPermissionSetFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + +describe('Given a package descriptor with assignPermSetsPreDeployment or assignPermSetsPostDeployment', () => { + it('Should set assignPermSetsPreDeployment property in SfpPackage', async () => { + let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + assignPermissionSetFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.assignPermSetsPreDeployment).toStrictEqual(['PermSetB']); + }); + + it('Should set assignPermSetsPostDeployment property in SfpPackage', async () => { + let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + assignPermissionSetFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.assignPermSetsPostDeployment).toStrictEqual(['PermSetA']); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + assignPermSetsPostDeployment: ['PermSetA'], + assignPermSetsPreDeployment: ['PermSetB'], +}; diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts new file mode 100644 index 000000000..9f8d33dd4 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts @@ -0,0 +1,85 @@ +import { jest, expect } from '@jest/globals'; +import DestructiveManifestPathFetcher from '../../../../src/core/package/propertyFetchers/DestructiveManifestPathFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { Logger } from '@flxblio/sfp-logger'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new DestructiveManifestPathFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + + +describe('Given a package descriptor with a destructiveChangePath', () => { + beforeEach(() => { + jest.spyOn(fs, 'readFileSync').mockImplementation(() => { + return destructiveChangesXml; + }); + }); + + it('Should set destructiveChangesPath property in SfpPackage', async () => { + let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.destructiveChangesPath).toBe('destructiveChanges.xml'); + }); + + it('Should set destructiveChanges property in SfpPackage', async () => { + let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.destructiveChanges).toEqual(destructiveChanges); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + destructiveChangePath: 'destructiveChanges.xml', +}; + +const destructiveChangesXml: string = ` + + + + MyCustomObject__c + CustomObject + + +`; +const destructiveChanges: any = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: { + members: 'MyCustomObject__c', + name: 'CustomObject', + }, + }, +}; diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts new file mode 100644 index 000000000..d7b7a5c22 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts @@ -0,0 +1,48 @@ +import { jest, expect } from '@jest/globals'; +import { Logger } from '@flxblio/sfp-logger'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import ReconcileProfilePropertyFetcher from '../../../../src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new ReconcileProfilePropertyFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + +describe('Given a package descriptor with reconcileProfiles', () => { + it('Should set reconcileProfiles property in SfpPackage', async () => { + let reconcileProfilePropertyFetcher: ReconcileProfilePropertyFetcher = new ReconcileProfilePropertyFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + reconcileProfilePropertyFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.reconcileProfiles).toBe(false); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + reconcileProfiles: false, +}; diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts new file mode 100644 index 000000000..8c8660ca4 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts @@ -0,0 +1,198 @@ +const child_process = require('child_process'); +import AssignPermissionSetsImpl from '../../../src/core/permsets/AssignPermissionSetsImpl'; +import { jest, expect } from '@jest/globals'; +import { VoidLogger } from '@flxblio/sfp-logger'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; + +const $$ = new TestContext(); + +jest.mock('../../../src/core/permsets/PermissionSetFetcher', () => { + class PermissionSetFetcher { + constructor(private username: string, private conn: Connection) {} + fetchAllPermsetAssignment(): any[] { + return [ + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', + }, + Id: '0Pa2s000000PC8fCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', + }, + Name: 'Salesforce_DX_Permissions', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: 'test-sfvulqawd2w0@example.com', + }, + }, + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', + }, + Id: '0Pa2s000000PC8aCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', + }, + Name: 'X00ex00000018ozT_128_09_43_34_1', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: 'test-sfvulqawd2w0@example.com', + }, + }, + ]; + } + } + return PermissionSetFetcher; +}); + +describe('Given a set of permsets, assign it to the user who is deploying the packages', () => { + it('should assign a set of permset, if its not previously assigned', async () => { + + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(2); + expect(results.failedAssignments).toHaveLength(0); + }); + + it('should assign a partial set of permset, if any of them fails', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(1); + expect(results.failedAssignments).toHaveLength(1); + }); + + it('should assign none, if all of them fails', async () => { + const testData = new MockTestOrgData(); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(0); + expect(results.failedAssignments).toHaveLength(2); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts new file mode 100644 index 000000000..cc8bffb51 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts @@ -0,0 +1,115 @@ +import { expect } from '@jest/globals'; +import PermissionSetFetcher from '../../../src/core/permsets/PermissionSetFetcher'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AnyJson } from '@salesforce/ts-types'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +const $$ = new TestContext(); + +describe('Retrieve assigned permsets provided username and a target org', () => { + it('should return all the permsets for the provided username', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + + let records: AnyJson = { + records: [ + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', + }, + Id: '0Pa2s000000PC8fCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', + }, + Name: 'Salesforce_DX_Permissions', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: testData.username, + }, + }, + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', + }, + Id: '0Pa2s000000PC8aCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', + }, + Name: 'X00ex00000018ozT_128_09_43_34_1', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: testData.username, + }, + }, + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); + expect(permsetRecords).toHaveLength(2); + }); + + it('should return an empty array, if no permsets are assigned', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + + let records: AnyJson = { records: [] }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); + expect(permsetRecords).toHaveLength(0); + }); + + it('should throw an error, if unable to query permsets', async () => { + const testData = new MockTestOrgData(); + + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { records: [] }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + throw new Error('Unable to fetch records'); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + + try { + await permsetListImpl.fetchAllPermsetAssignment(); + } catch (error) { + expect(error).toBeDefined(); + } + }, 500000); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts new file mode 100644 index 000000000..6afcb47cd --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts @@ -0,0 +1,35 @@ +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +import { AnyJson } from '@salesforce/ts-types'; +const $$ = new TestContext(); +import PermissionSetGroupUpdateAwaiter from '../../../src/core/permsets/PermissionSetGroupUpdateAwaiter'; +import { expect } from '@jest/globals'; + +describe('Await till permissionsets groups are updated', () => { + it('should return if all permsets groups are updated', async () => { + const testData = new MockTestOrgData(); + + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { + records: [], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( + connection, + null + ); + await expect(permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated()).resolves.toBeUndefined(); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts b/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts new file mode 100644 index 000000000..2bb7616a2 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts @@ -0,0 +1,278 @@ +const fs = require("fs-extra"); +import { jest, expect } from '@jest/globals'; +import { PackageType } from '../../../src/core/package/SfpPackage'; +import ProjectConfig from '../../../src/core/project/ProjectConfig'; + +describe('Given a project directory or sfdx-project.json with multiple packages', () => { + //given the below sfdx-project.json + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0x002232323232' }, + }; + + beforeEach(() => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return JSON.stringify(sfdx_project); + }); + }); + + it('Get the package id of an unlocked package', () => { + expect(ProjectConfig.getPackageId(sfdx_project, 'bi')).toBe('0x002232323232'); + }); + + it('Throws an error, if the package id is missing in PackageAlias', () => { + expect(() => { + ProjectConfig.getPackageId(sfdx_project, 'bi2'); + }).toThrowError('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); + }); + + it('Fetches all the package', () => { + const manifestHelperMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + manifestHelperMock.mockImplementation((projectDirectory: string) => { + return sfdx_project; + }); + expect(ProjectConfig.getAllPackages(null)).toStrictEqual([ + 'temp', + 'core', + 'mass-dataload', + 'access-mgmt', + 'bi', + ]); + }); + + it('Fetches all the package from a project config', () => { + + expect(ProjectConfig.getAllPackagesFromProjectConfig(sfdx_project)).toStrictEqual([ + 'temp', + 'core', + 'mass-dataload', + 'access-mgmt', + 'bi', + ]); + }); + + it('Get manifest, provided a directory', () => { + expect(ProjectConfig.getSFDXProjectConfig(null)).toStrictEqual(sfdx_project); + }); + + it('Gets the type of a package', () => { + expect(ProjectConfig.getPackageType(sfdx_project, 'bi')).toBe(PackageType.Unlocked); + expect(ProjectConfig.getPackageType(sfdx_project, 'core')).toBe(PackageType.Source); + expect(ProjectConfig.getPackageType(sfdx_project, 'mass-dataload')).toBe(PackageType.Data); + }); + + + + + it('Gets the package descriptor of a provided package,provided directory', () => { + let corePackage = { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + expect(ProjectConfig.getSFDXPackageDescriptor(null, 'core')).toStrictEqual(corePackage); + }); + + it('Gets the package descriptor of a provided package', () => { + let corePackage = { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + expect(ProjectConfig.getPackageDescriptorFromConfig('core', sfdx_project)).toStrictEqual(corePackage); + }); + + it('Gets the default package, provided directory', () => { + let defaultPackage = { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }; + + expect(ProjectConfig.getDefaultSFDXPackageDescriptor(null)).toStrictEqual(defaultPackage); + }); + + it('Cleans any other package, than the one provided', () => { + let cleaned_sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0x002232323232' }, + }; + + expect(ProjectConfig.cleanupMPDFromProjectDirectory(null, 'temp')).toStrictEqual(cleaned_sfdx_project); + }); + + it(`Gets all the external dependencies of a project`,()=>{ + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0H432322321',bi2:'0H43232232' }, + }; + + + + expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([{ + alias:'bi2', + Package2IdOrSubscriberPackageVersionId:"0H43232232" + }]) + + }); + + it(`Returns empty if there are no external dependencies`,()=>{ + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0H432322321' }, + }; + + expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([]) + + }); + +}); diff --git a/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts b/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts new file mode 100644 index 000000000..85c598341 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts @@ -0,0 +1,30 @@ +import { expect } from '@jest/globals'; +import chunkCollection from '../../../src/core/queryHelper/ChunkCollection'; + +describe('Given a collection', () => { + + it('should return a single chunk for a collection less than 3000 chars', () => { + const collection = ["ApexClassA", "ApexClassB", "ApexClassC"]; + const result = chunkCollection(collection); + expect(result.length).toBe(1); + expect(result).toEqual([ + ["ApexClassA", "ApexClassB", "ApexClassC"] + ]); + }); + + + it('should return N chunks for a collection exceeding the chunk size', () => { + const collection = ["ApexClassA", "ApexClassB", "ApexClassC", "ApexClassD"]; + const result = chunkCollection(collection, 1050, 1000); + expect(result.length).toBe(2); + expect(result).toEqual([ + ["ApexClassA", "ApexClassB", "ApexClassC"], + ["ApexClassD"] + ]); + }); + + it('should throw an error if single element in collection exceeds chunk size', () => { + const collection = ["ApexClassWithAnExceedinglyLongNameGreaterThanTheChunkSize"]; + expect(() => {chunkCollection(collection, 1050, 1000)}).toThrow(); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts new file mode 100644 index 000000000..15d92cd24 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts @@ -0,0 +1,24 @@ +import { expect } from '@jest/globals'; +import { chunkArray } from '../../../src/core/utils/ChunkArray'; + +describe('Given an input array', () => { + const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + + it('should chunk for even chunk size', () => { + const result = chunkArray(2, input); + expect(result.length).toBe(5); + expect(result).toEqual([ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + [9, 10], + ]); + }); + + it('should chunk for odd chunk size', () => { + const result = chunkArray(3, input); + expect(result.length).toBe(4); + expect(result).toEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts new file mode 100644 index 000000000..8686ef38c --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts @@ -0,0 +1,35 @@ +import { expect } from '@jest/globals'; +import FileSystem from '../../../src/core/utils/FileSystem'; +const path = require('path'); + +describe('Given a search directory', () => { + it('should return nested files', () => { + const resourcesDir = path.join(__dirname, 'resources'); + let files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, false); + expect(files).toEqual(expectedFiles); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, false); + expect(files).toEqual(expectedFilesIncludingDirs); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, true); + expect(files).toEqual(expectedFiles.map((elem) => path.join(resourcesDir, 'a', elem))); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, true); + expect(files).toEqual(expectedFilesIncludingDirs.map((elem) => path.join(resourcesDir, 'a', elem))); + }); +}); + +const expectedFiles = ['b/b1.file', 'b/c/c1.file', 'b/c/c2.file', 'b/d/d1.file', 'b/d/x/x1.file', 'b/e/e1.file']; +const expectedFilesIncludingDirs = [ + 'b', + 'b/b1.file', + 'b/c', + 'b/c/c1.file', + 'b/c/c2.file', + 'b/d', + 'b/d/d1.file', + 'b/d/x', + 'b/d/x/x1.file', + 'b/e', + 'b/e/e1.file', +]; diff --git a/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts new file mode 100644 index 000000000..a0fa39e73 --- /dev/null +++ b/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts @@ -0,0 +1,34 @@ +import { expect } from '@jest/globals'; +import extractDomainFromUrl from '../../../src/core/utils/extractDomainFromUrl'; + +describe('Given a URL', () => { + it('should extract the domain name for https', () => { + expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( + 'force-power-8147.cs115.my.salesforce.com' + ); + }); + + it('should extract the domain name for http', () => { + expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( + 'force-power-8147.cs115.my.salesforce.com' + ); + }); + + it('should extract only the domain name', () => { + expect( + extractDomainFromUrl( + 'https://company.lightning.force.com/lightning/o/Account/list?filterName=00B4Y000000VyMDUA0' + ) + ).toBe('company.lightning.force.com'); + }); + + it('should return null for protocol other than http/s', () => { + expect(extractDomainFromUrl('ftp://ftp.example.com/files/fileA')).toBe(null); + }); + + it('should return input for falsy values', () => { + expect(extractDomainFromUrl('')).toBe(''); + expect(extractDomainFromUrl(undefined)).toBe(undefined); + expect(extractDomainFromUrl(null)).toBe(null); + }); +}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts index 854d187e7..ce1ba2f70 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts @@ -1,7 +1,7 @@ import { expect } from '@jest/globals'; import CommitUpdater from '../../../src/impl/changelog/CommitUpdater'; import ReadPackageChangelog from '../../../src/impl/changelog/ReadPackageChangelog'; -import { Changelog as PackageChangelog } from '@dxatscale/sfpowerscripts.core/lib/changelog/interfaces/GenericChangelogInterfaces'; +import { Changelog as PackageChangelog } from '../../../src/core/changelog/interfaces/GenericChangelogInterfaces'; import { Release } from '../../../src/impl/changelog/ReleaseChangelog'; const path = require('path'); import * as fs from 'fs-extra'; diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts index b34314cbb..712f4a477 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts @@ -204,7 +204,7 @@ const referenceReleaseChangelog: ReleaseChangelog = { author: 'Azlam', message: 'Add persist credential to PR (#6)', body: - '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly ', + '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', }, ], }, diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts index d4bba472e..c49c64934 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts @@ -36,7 +36,7 @@ describe('Given a WorkItemUpdater', () => { author: 'Azlam', message: 'NGV-626 Add persist credential to PR (#6)', body: - '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly ', + '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', }, { commitId: 'd7124579', diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json index 0270de439..2fa66c2ed 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json @@ -7,7 +7,7 @@ "date": "2021-01-25T11:01:55+11:00", "author": "Azlam", "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly " + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " }, { "commitId": "d7124579", diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json index d88712474..070bcd232 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json @@ -14,7 +14,7 @@ "date": "2021-01-25T11:01:55+11:00", "author": "Azlam", "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly " + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " }, { "commitId": "d7124579", diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json index 3b3e51726..62ea88528 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json @@ -15,7 +15,7 @@ "date": "2021-01-25T11:01:55+11:00", "author": "Azlam", "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly " + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " }, { "commitId": "d7124579", diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json index 32b27072b..0af6bd844 100644 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json +++ b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json @@ -19,7 +19,7 @@ "date": "2021-01-25T11:01:55+11:00", "author": "Azlam", "message": "NGV-626 Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfpowerscripts\r\n\r\nCo-authored-by: sfpowerscripts \r\nCo-authored-by: Alan Ly " + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " }, { "commitId": "d7124579", diff --git a/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts b/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts index 9cb9834f6..7a6d6879a 100644 --- a/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts +++ b/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts @@ -23,7 +23,7 @@ const setupFakeConnection = async () => { return conn; } -jest.mock('../../../../core/src/git/Git', () => { +jest.mock('../../../src/core/git/Git', () => { class Git { static async initiateRepo() { @@ -34,7 +34,7 @@ jest.mock('../../../../core/src/git/Git', () => { return Git; }); -jest.mock('../../../../core/src/git/GitTags', () => { +jest.mock('../../../src/core/git/GitTags', () => { class GitTags { async listTagsOnBranch(): Promise { return gitTags; @@ -205,7 +205,7 @@ const projectConfig = { "sfdc-framework":"04t1000x00x00x" }, "plugins": { - "sfpowerscripts": { + "sfp": { "disableShrinkImpl": false, "externalDependencyMap": { "tech-framework@2.0.0.38": [ diff --git a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts b/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts index 0fca1bad2..876858d10 100644 --- a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts +++ b/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts @@ -2,7 +2,7 @@ import { jest, expect } from '@jest/globals'; import BuildCollections from '../../../src/impl/parallelBuilder/BuildCollections'; let packageManifest = null; -jest.mock('../../../../core/lib/project/ProjectConfig', () => { +jest.mock('../../../src/core/project/ProjectConfig', () => { class ProjectConfig { static getSFDXProjectConfig(projectDirectory: string) { return packageManifest; From 2b56d6f79ff76992b3b94c05ce2d832fe7f1de04 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 16:35:23 +1100 Subject: [PATCH 02/95] chore: update fork to flxbl --- packages/sfp-cli/.babel.config.js | 7 + packages/sfp-cli/README.md | 98 ++ packages/sfp-cli/bin/run | 5 + packages/sfp-cli/bin/run.cmd | 3 + packages/sfp-cli/jest.config.js | 17 + packages/sfp-cli/messages/analyze.json | 4 + .../sfp-cli/messages/analyze_with_PMD.json | 13 + .../sfp-cli/messages/artifacts_query.json | 4 + packages/sfp-cli/messages/build.json | 18 + packages/sfp-cli/messages/core-messages.md | 118 ++ packages/sfp-cli/messages/create-package.json | 13 + .../sfp-cli/messages/create_data_package.json | 12 + .../messages/create_delta_package.json | 13 + .../messages/create_source_package.json | 13 + .../messages/create_unlocked_package.json | 21 + .../sfp-cli/messages/dependency_expand.json | 4 + .../sfp-cli/messages/dependency_install.json | 4 + .../sfp-cli/messages/dependency_shrink.json | 4 + packages/sfp-cli/messages/deploy.json | 15 + packages/sfp-cli/messages/fetch.json | 10 + .../sfp-cli/messages/generate_changelog.json | 14 + packages/sfp-cli/messages/impact_package.json | 4 + .../messages/impact_release_config.json | 7 + .../messages/increment_build_number.json | 10 + .../messages/install_data_package.json | 8 + .../sfp-cli/messages/install_package.json | 14 + .../messages/install_package_command.json | 6 + .../messages/install_source_package.json | 12 + .../messages/install_unlocked_package.json | 16 + packages/sfp-cli/messages/metrics_report.json | 3 + .../sfp-cli/messages/org_profile_diff.json | 6 + packages/sfp-cli/messages/patch.json | 11 + packages/sfp-cli/messages/pool_delete.json | 8 + packages/sfp-cli/messages/prepare.json | 8 + packages/sfp-cli/messages/profile_merge.json | 7 + .../sfp-cli/messages/profile_reconcile.json | 8 + .../sfp-cli/messages/profile_retrieve.json | 7 + packages/sfp-cli/messages/promote.json | 7 + packages/sfp-cli/messages/publish.json | 17 + packages/sfp-cli/messages/quickbuild.json | 17 + packages/sfp-cli/messages/release.json | 19 + .../messages/releasedefinition_generate.json | 10 + .../messages/scratchorg_poolFetch.json | 9 + .../scratchorg_pool_metrics_publish.json | 3 + .../messages/scratchorg_pool_org_delete.json | 4 + .../sfp-cli/messages/scratchorg_poollist.json | 6 + .../sfp-cli/messages/trigger_apex_test.json | 13 + packages/sfp-cli/messages/validate.json | 26 + .../sfp-cli/messages/validateAgainstOrg.json | 16 + .../messages/validate_apex_coverage.json | 5 + packages/sfp-cli/package.json | 177 +++ packages/sfp-cli/resources/metadatainfo.json | 1075 +++++++++++++++++ .../schemas/pooldefinition.schema.json | 147 +++ .../schemas/releasedefinition.schema.json | 73 ++ .../releasedefinitiongenerator.schema.json | 101 ++ .../schemas/sfdx-project.schema.json | 654 ++++++++++ packages/sfp-cli/src/BuildBase.ts | 273 +++++ packages/sfp-cli/src/InstallPackageCommand.ts | 91 ++ packages/sfp-cli/src/PackageCreateCommand.ts | 198 +++ packages/sfp-cli/src/ProjectValidation.ts | 87 ++ packages/sfp-cli/src/SfpCommand.ts | 177 +++ .../sfp-cli/src/commands/apextests/trigger.ts | 162 +++ .../sfp-cli/src/commands/artifacts/fetch.ts | 109 ++ .../sfp-cli/src/commands/artifacts/query.ts | 57 + .../src/commands/changelog/generate.ts | 110 ++ .../sfp-cli/src/commands/dependency/expand.ts | 74 ++ .../src/commands/dependency/install.ts | 67 + .../sfp-cli/src/commands/dependency/shrink.ts | 69 ++ .../sfp-cli/src/commands/impact/package.ts | 80 ++ .../src/commands/impact/releaseconfig.ts | 133 ++ .../sfp-cli/src/commands/metrics/report.ts | 88 ++ .../src/commands/orchestrator/build.ts | 45 + .../src/commands/orchestrator/deploy.ts | 168 +++ .../src/commands/orchestrator/prepare.ts | 222 ++++ .../src/commands/orchestrator/promote.ts | 115 ++ .../src/commands/orchestrator/publish.ts | 460 +++++++ .../src/commands/orchestrator/quickbuild.ts | 44 + .../src/commands/orchestrator/release.ts | 256 ++++ .../src/commands/orchestrator/validate.ts | 221 ++++ .../orchestrator/validateAgainstOrg.ts | 184 +++ .../src/commands/package/data/create.ts | 80 ++ .../src/commands/package/data/install.ts | 76 ++ .../sfp-cli/src/commands/package/install.ts | 136 +++ .../src/commands/package/source/create.ts | 71 ++ .../src/commands/package/source/install.ts | 130 ++ .../src/commands/package/unlocked/create.ts | 132 ++ .../src/commands/package/unlocked/install.ts | 116 ++ packages/sfp-cli/src/commands/pool/delete.ts | 125 ++ packages/sfp-cli/src/commands/pool/fetch.ts | 163 +++ packages/sfp-cli/src/commands/pool/list.ts | 129 ++ .../src/commands/pool/metrics/publish.ts | 133 ++ .../sfp-cli/src/commands/pool/org/delete.ts | 57 + .../sfp-cli/src/commands/profile/merge.ts | 157 +++ .../sfp-cli/src/commands/profile/reconcile.ts | 123 ++ .../sfp-cli/src/commands/profile/retrieve.ts | 128 ++ .../commands/releasedefinition/generate.ts | 83 ++ packages/sfp-cli/src/commands/repo/patch.ts | 309 +++++ .../sfp-cli/src/core/apex/ApexClassFetcher.ts | 28 + .../src/core/apex/ApexTriggerFetcher.ts | 28 + .../ApexCodeCoverageAggregateFetcher.ts | 42 + .../apex/coverage/IndividualClassCoverage.ts | 76 ++ .../src/core/apex/parser/ApexTypeFetcher.ts | 134 ++ .../apex/parser/listeners/ApexTypeListener.ts | 38 + .../src/core/apextest/ApexTestSuite.ts | 30 + .../src/core/apextest/ClearCodeCoverage.ts | 53 + .../apextest/ImpactedApexTestClassFetcher.ts | 90 ++ .../sfp-cli/src/core/apextest/JSONReporter.ts | 174 +++ .../sfp-cli/src/core/apextest/TestOptions.ts | 73 ++ .../src/core/apextest/TestReportDisplayer.ts | 118 ++ .../src/core/apextest/TriggerApexTests.ts | 767 ++++++++++++ .../src/core/artifacts/ArtifactFetcher.ts | 224 ++++ .../artifacts/generators/ArtifactGenerator.ts | 105 ++ .../changelog/GeneratePackageChangelog.ts | 76 ++ .../interfaces/GenericChangelogInterfaces.ts | 30 + .../dependency/ChangedComponentsFetcher.ts | 93 ++ .../sfp-cli/src/core/dependency/Component.ts | 16 + .../core/dependency/DependencyViolation.ts | 7 + .../sfp-cli/src/core/dependency/Entrypoint.ts | 20 + .../core/deployers/DeploySourceToOrgImpl.ts | 230 ++++ .../src/core/deployers/DeploymentExecutor.ts | 17 + .../deployers/DeploymentSettingsService.ts | 64 + .../display/DependencyViolationDisplayer.ts | 31 + .../src/core/display/DeployErrorDisplayer.ts | 103 ++ .../core/display/DeploymentOptionDisplayer.ts | 51 + .../display/ExternalDependencyDisplayer.ts | 30 + .../display/InstalledArtifactsDisplayer.ts | 22 + .../display/InstalledPackagesDisplayer.ts | 22 + .../core/display/PackageComponentPrinter.ts | 27 + .../display/PackageDependencyDisplayer.ts | 35 + .../core/display/PackageMetadataPrinter.ts | 38 + .../src/core/display/PushErrorDisplayer.ts | 75 ++ .../src/core/display/TableConstants.ts | 38 + packages/sfp-cli/src/core/git/Git.ts | 246 ++++ packages/sfp-cli/src/core/git/GitDiffUtil.ts | 175 +++ packages/sfp-cli/src/core/git/GitIdentity.ts | 34 + packages/sfp-cli/src/core/git/GitTags.ts | 151 +++ .../sfp-cli/src/core/ignore/IgnoreFiles.ts | 13 + .../sfp-cli/src/core/limits/LimitsFetcher.ts | 30 + .../src/core/metadata/CustomFieldFetcher.ts | 45 + .../src/core/metadata/MetadataFetcher.ts | 71 ++ .../src/core/metadata/MetadataFiles.ts | 343 ++++++ .../sfp-cli/src/core/metadata/MetadataInfo.ts | 214 ++++ .../src/core/metadata/SettingsFetcher.ts | 22 + .../sfp-cli/src/core/org/OrgDetailsFetcher.ts | 120 ++ .../src/core/org/OrganizationFetcher.ts | 12 + packages/sfp-cli/src/core/org/SFPOrg.ts | 271 +++++ .../src/core/org/ScratchOrgInfoFetcher.ts | 30 + .../InstalledPackagesQueryExecutor.ts | 14 + .../src/core/package/Package2Detail.ts | 10 + .../sfp-cli/src/core/package/SfpPackage.ts | 143 +++ .../src/core/package/SfpPackageBuilder.ts | 278 +++++ .../src/core/package/SfpPackageInquirer.ts | 178 +++ .../src/core/package/SfpPackageInstaller.ts | 63 + .../core/package/analyser/AnalyzerRegistry.ts | 20 + .../src/core/package/analyser/FHTAnalyzer.ts | 76 ++ .../src/core/package/analyser/FTAnalyzer.ts | 74 ++ .../core/package/analyser/PackageAnalyzer.ts | 12 + .../core/package/analyser/PicklistAnalyzer.ts | 52 + .../DeployDestructiveManifestToOrgImpl.ts | 129 ++ .../core/package/components/MetadataCount.ts | 18 + .../package/components/PackageManifest.ts | 271 +++++ .../package/components/PackageToComponent.ts | 28 + .../ReconcileProfileAgainstOrgImpl.ts | 53 + .../package/coverage/PackageTestCoverage.ts | 273 +++++ .../coverage/PackageVersionCoverage.ts | 39 + .../ExternalPackage2DependencyResolver.ts | 103 ++ .../dependencies/PackageDependencyResolver.ts | 269 +++++ .../TransitiveDependencyResolver.ts | 109 ++ .../DeploymentCustomizer.ts | 27 + .../deploymentCustomizers/FHTEnabler.ts | 121 ++ .../deploymentCustomizers/FTEnabler.ts | 107 ++ .../MetadataDeploymentCustomizer.ts | 83 ++ .../deploymentCustomizers/PicklistEnabler.ts | 218 ++++ .../PostDeployersRegistry.ts | 18 + .../PreDeployersRegistry.ts | 14 + .../deploymentFilters/DeploymentFilter.ts | 13 + .../DeploymentFilterRegistry.ts | 18 + .../EntitlementVersionFilter.ts | 110 ++ .../core/package/diff/PackageComponentDiff.ts | 424 +++++++ .../src/core/package/diff/PackageDiffImpl.ts | 166 +++ .../generators/SfpPackageContentGenerator.ts | 301 +++++ .../packageCreators/CreateDataPackageImpl.ts | 86 ++ .../packageCreators/CreateDiffPackageImpl.ts | 271 +++++ .../package/packageCreators/CreatePackage.ts | 146 +++ .../CreateSourcePackageImpl.ts | 117 ++ .../CreateUnlockedPackageImpl.ts | 262 ++++ .../SourceToMDAPIConvertor.ts | 52 + .../InstallDataPackageImpl.ts | 104 ++ .../packageInstallers/InstallPackage.ts | 497 ++++++++ .../InstallSourcePackageImpl.ts | 397 ++++++ .../InstallUnlockedPackage.ts | 91 ++ .../InstallUnlockedPackageCollection.ts | 134 ++ .../InstallUnlockedPackageImpl.ts | 96 ++ .../PackageInstallationResult.ts | 15 + .../packageMerger/PackageMergeManager.ts | 160 +++ .../promote/PromoteUnlockedPackageImpl.ts | 34 + .../AssignPermissionSetFetcher.ts | 23 + .../DestructiveManifestPathFetcher.ts | 29 + .../propertyFetchers/PropertyFetcher.ts | 11 + .../ReconcileProfilePropertyFetcher.ts | 10 + .../package/validators/PackageEmptyChecker.ts | 85 ++ .../package/version/Package2VersionFetcher.ts | 109 ++ .../version/Package2VersionInstaller.ts | 26 + .../package/version/PackageVersionLister.ts | 62 + .../package/version/PackageVersionUpdater.ts | 18 + .../src/core/permsets/AssignPermissionSets.ts | 17 + .../core/permsets/AssignPermissionSetsImpl.ts | 93 ++ .../src/core/permsets/PermissionSetFetcher.ts | 15 + .../PermissionSetGroupUpdateAwaiter.ts | 46 + .../sfp-cli/src/core/project/ProjectConfig.ts | 281 +++++ .../project/UserDefinedExternalDependency.ts | 61 + .../src/core/queryHelper/ChunkCollection.ts | 38 + .../src/core/queryHelper/QueryHelper.ts | 18 + .../src/core/scratchorg/PasswordGenerator.ts | 41 + .../sfp-cli/src/core/scratchorg/ScratchOrg.ts | 18 + .../src/core/scratchorg/ScratchOrgOperator.ts | 149 +++ .../scratchorg/pool/ClientSourceTracking.ts | 205 ++++ .../scratchorg/pool/OrphanedOrgsDeleteImpl.ts | 47 + .../src/core/scratchorg/pool/PoolBaseImpl.ts | 22 + .../src/core/scratchorg/pool/PoolConfig.ts | 40 + .../core/scratchorg/pool/PoolCreateImpl.ts | 432 +++++++ .../core/scratchorg/pool/PoolDeleteImpl.ts | 65 + .../src/core/scratchorg/pool/PoolError.ts | 13 + .../src/core/scratchorg/pool/PoolFetchImpl.ts | 244 ++++ .../core/scratchorg/pool/PoolJobExecutor.ts | 41 + .../src/core/scratchorg/pool/PoolListImpl.ts | 48 + .../core/scratchorg/pool/PoolOrgDeleteImpl.ts | 26 + .../prequisitecheck/IsValidSfdxAuthUrl.ts | 19 + .../pool/prequisitecheck/PreRequisiteCheck.ts | 63 + .../pool/services/fetchers/GetUserEmail.ts | 28 + .../fetchers/ScratchOrgInfoFetcher.ts | 187 +++ .../fetchers/ScratchOrgLimitsFetcher.ts | 13 + .../updaters/ScratchOrgInfoAssigner.ts | 24 + .../scriptExecutor/ScriptExecutorHelpers.ts | 19 + .../src/core/sfdmuwrapper/SFDMURunImpl.ts | 28 + .../src/core/stats/NativeMetricSender.ts | 22 + .../sfp-cli/src/core/stats/SFPStatsSender.ts | 114 ++ .../DataDogMetricSender.ts | 52 + .../NewRelicMetricSender.ts | 66 + .../SplunkMetricSender.ts | 49 + packages/sfp-cli/src/core/utils/AliasList.ts | 16 + packages/sfp-cli/src/core/utils/ChunkArray.ts | 11 + .../sfp-cli/src/core/utils/DefaultShell.ts | 7 + packages/sfp-cli/src/core/utils/Delay.ts | 3 + packages/sfp-cli/src/core/utils/FileSystem.ts | 52 + packages/sfp-cli/src/core/utils/Fileutils.ts | 204 ++++ .../src/core/utils/GetFormattedTime.ts | 6 + .../src/core/utils/ObjectCRUDHelper.ts | 38 + packages/sfp-cli/src/core/utils/OnExit.ts | 17 + packages/sfp-cli/src/core/utils/RandomId.ts | 9 + .../src/core/utils/VersionNumberConverter.ts | 33 + .../src/core/utils/extractDomainFromUrl.ts | 10 + packages/sfp-cli/src/core/utils/xml2json.ts | 10 + .../vlocitywrapper/VlocityInitialInstall.ts | 21 + .../vlocitywrapper/VlocityPackDeployImpl.ts | 31 + .../VlocityPackUpdateSettings.ts | 21 + .../core/vlocitywrapper/VlocityRefreshBase.ts | 31 + packages/sfp-cli/src/errors/ReleaseError.ts | 22 + packages/sfp-cli/src/errors/SfpError.ts | 20 + packages/sfp-cli/src/errors/ValidateError.ts | 21 + packages/sfp-cli/src/flags/duration.ts | 75 ++ packages/sfp-cli/src/flags/orgApiVersion.ts | 74 ++ packages/sfp-cli/src/flags/salesforceId.ts | 70 ++ packages/sfp-cli/src/flags/sfdxflags.ts | 139 +++ packages/sfp-cli/src/impl/Stage.ts | 10 + .../src/impl/artifacts/FetchAnArtifact.ts | 8 + .../impl/artifacts/FetchAnArtifactFromNPM.ts | 64 + .../artifacts/FetchAnArtifactUsingScript.ts | 58 + .../impl/artifacts/FetchArtifactSelector.ts | 17 + .../src/impl/artifacts/FetchArtifactsError.ts | 26 + .../sfp-cli/src/impl/artifacts/FetchImpl.ts | 144 +++ .../src/impl/changelog/ChangelogImpl.ts | 194 +++ .../changelog/ChangelogMarkdownGenerator.ts | 184 +++ .../src/impl/changelog/CommitUpdater.ts | 57 + .../sfp-cli/src/impl/changelog/OrgsUpdater.ts | 127 ++ .../impl/changelog/ReadPackageChangelog.ts | 5 + .../src/impl/changelog/ReleaseChangelog.ts | 72 ++ .../impl/changelog/ReleaseChangelogUpdater.ts | 187 +++ .../src/impl/changelog/WorkItemUpdater.ts | 41 + .../src/impl/demoreelplayer/DemoReelPlayer.ts | 61 + .../sfp-cli/src/impl/dependency/ShrinkImpl.ts | 81 ++ .../sfp-cli/src/impl/deploy/DeployImpl.ts | 851 +++++++++++++ .../sfp-cli/src/impl/deploy/PostDeployHook.ts | 14 + .../sfp-cli/src/impl/deploy/PreDeployHook.ts | 12 + .../impl/impact/ImpactedPackagesResolver.ts | 140 +++ .../src/impl/impact/ImpactedReleaseConfig.ts | 83 ++ .../impl/parallelBuilder/BatchingTopoSort.ts | 63 + .../impl/parallelBuilder/BuildCollections.ts | 65 + .../src/impl/parallelBuilder/BuildImpl.ts | 879 ++++++++++++++ .../impl/parallelBuilder/DependencyHelper.ts | 80 ++ .../impl/parallelBuilder/UndirectedGraph.ts | 49 + .../sfp-cli/src/impl/prepare/PrepareImpl.ts | 306 +++++ .../sfp-cli/src/impl/prepare/PrepareOrgJob.ts | 416 +++++++ .../sfp-cli/src/impl/release/ReleaseConfig.ts | 115 ++ .../src/impl/release/ReleaseDefinition.ts | 79 ++ .../release/ReleaseDefinitionGenerator.ts | 285 +++++ .../ReleaseDefinitionGeneratorConfigSchema.ts | 21 + .../impl/release/ReleaseDefinitionSchema.ts | 21 + .../sfp-cli/src/impl/release/ReleaseImpl.ts | 358 ++++++ packages/sfp-cli/src/impl/repo/AlignImpl.ts | 20 + .../sfp-cli/src/impl/validate/Analyzer.ts | 22 + .../src/impl/validate/ApexTestValidator.ts | 203 ++++ .../sfp-cli/src/impl/validate/ValidateImpl.ts | 744 ++++++++++++ .../src/impl/validate/ValidateResult.ts | 8 + packages/sfp-cli/src/index.ts | 1 + .../sfp-cli/src/outputs/FileOutputHandler.ts | 35 + packages/sfp-cli/src/ui/GroupConsoleLogs.ts | 58 + packages/sfp-cli/src/ui/OrgInfoDisplayer.ts | 156 +++ packages/sfp-cli/src/ui/TableConstants.ts | 37 + .../src/utils/FetchArtifactsFromOrg.ts | 31 + .../src/utils/Get18DigitSalesforceId.ts | 19 + .../sfp-cli/tests/ProjectValidation.test.ts | 414 +++++++ .../tests/core/apextest/ApexTestSuite.test.ts | 77 ++ .../artifacts/ArtifactsFromFileSystem.test.ts | 52 + .../coverage/IndividualClassCoverage.test.ts | 167 +++ .../sfp-cli/tests/core/git/GitTags.test.ts | 83 ++ .../tests/core/org/ArtifactsToOrg.test.ts | 214 ++++ .../tests/core/org/ListAllPackages.test.ts | 59 + .../package/Package2VersionFetcher.test.ts | 79 ++ .../core/package/PackageDiffImpl.test.ts | 295 +++++ .../core/package/PackageManifest.test.ts | 300 +++++ .../core/package/SFPackageBuilder.test.ts | 374 ++++++ .../package/analysers/FHTAnalyzer.test.ts | 360 ++++++ .../core/package/analysers/FTAnalyzer.test.ts | 363 ++++++ .../coverage/PackageTestCoverage.test.ts | 330 +++++ .../PackageDependencyResolver.test.ts | 346 ++++++ .../TransitiveDependencyResolver.test.ts | 235 ++++ .../EntitlementVersionFilter.test.ts | 500 ++++++++ .../packageMerger/PackageMergeManager.test.ts | 39 + .../core2_sfpowerscripts_artifact_1.0.4-1.zip | Bin 0 -> 8405 bytes ...-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip | Bin 0 -> 35211 bytes .../AssignPermissionSetFetcher.test.ts | 55 + .../DestructiveManifestPathFetcher.test.ts | 85 ++ .../ReconcileProfilePropertyFetcher.test.ts | 48 + .../permsets/AssignPermissionSets.test.ts | 198 +++ .../permsets/PermissionSetFetcher.test.ts | 115 ++ .../PermissionSetGroupUpdateAwaiter.test.ts | 35 + .../tests/core/project/ProjectConfig.test.ts | 278 +++++ .../core/queryHelper/ChunkCollection.test.ts | 30 + .../tests/core/utils/ChunkArray.test.ts | 24 + .../tests/core/utils/FileSystem.test.ts | 35 + .../core/utils/extractDomainFromUrl.test.ts | 34 + .../tests/core/utils/resources/a/b/b1.file | 0 .../tests/core/utils/resources/a/b/c/c1.file | 0 .../tests/core/utils/resources/a/b/c/c2.file | 0 .../tests/core/utils/resources/a/b/d/d1.file | 0 .../core/utils/resources/a/b/d/x/x1.file | 0 .../tests/core/utils/resources/a/b/e/e1.file | 0 .../impl/changelog/CommitUpdater.test.ts | 241 ++++ .../tests/impl/changelog/OrgUpdater.test.ts | 224 ++++ .../impl/changelog/WorkItemUpdater.test.ts | 157 +++ .../resources/ESBaseCodeLWCChangelog.json | 216 ++++ .../resources/ESBaseStylesLWCChangelog.json | 125 ++ .../resources/ESObjectsChangelog.json | 27 + .../resources/ESSpaceMgmtLWCChangelog.json | 251 ++++ ...update_latestRelease_with_all_commits.json | 635 ++++++++++ ..._latestRelease_with_subset_of_commits.json | 128 ++ ..._update_latestRelease_with_work_items.json | 132 ++ .../tests/impl/dependency/ShrinkImpl.test.ts | 220 ++++ .../parallelBuilder/BuildCollections.test.ts | 183 +++ .../parallelBuilder/UndirectedGraph.test.ts | 93 ++ .../impl/release/ReleaseDefinition.test.ts | 125 ++ packages/sfp-cli/tsconfig.json | 10 + 363 files changed, 38094 insertions(+) create mode 100644 packages/sfp-cli/.babel.config.js create mode 100644 packages/sfp-cli/README.md create mode 100755 packages/sfp-cli/bin/run create mode 100644 packages/sfp-cli/bin/run.cmd create mode 100644 packages/sfp-cli/jest.config.js create mode 100644 packages/sfp-cli/messages/analyze.json create mode 100644 packages/sfp-cli/messages/analyze_with_PMD.json create mode 100644 packages/sfp-cli/messages/artifacts_query.json create mode 100644 packages/sfp-cli/messages/build.json create mode 100644 packages/sfp-cli/messages/core-messages.md create mode 100644 packages/sfp-cli/messages/create-package.json create mode 100644 packages/sfp-cli/messages/create_data_package.json create mode 100644 packages/sfp-cli/messages/create_delta_package.json create mode 100644 packages/sfp-cli/messages/create_source_package.json create mode 100644 packages/sfp-cli/messages/create_unlocked_package.json create mode 100644 packages/sfp-cli/messages/dependency_expand.json create mode 100644 packages/sfp-cli/messages/dependency_install.json create mode 100644 packages/sfp-cli/messages/dependency_shrink.json create mode 100644 packages/sfp-cli/messages/deploy.json create mode 100644 packages/sfp-cli/messages/fetch.json create mode 100644 packages/sfp-cli/messages/generate_changelog.json create mode 100644 packages/sfp-cli/messages/impact_package.json create mode 100644 packages/sfp-cli/messages/impact_release_config.json create mode 100644 packages/sfp-cli/messages/increment_build_number.json create mode 100644 packages/sfp-cli/messages/install_data_package.json create mode 100644 packages/sfp-cli/messages/install_package.json create mode 100644 packages/sfp-cli/messages/install_package_command.json create mode 100644 packages/sfp-cli/messages/install_source_package.json create mode 100644 packages/sfp-cli/messages/install_unlocked_package.json create mode 100644 packages/sfp-cli/messages/metrics_report.json create mode 100644 packages/sfp-cli/messages/org_profile_diff.json create mode 100644 packages/sfp-cli/messages/patch.json create mode 100644 packages/sfp-cli/messages/pool_delete.json create mode 100644 packages/sfp-cli/messages/prepare.json create mode 100644 packages/sfp-cli/messages/profile_merge.json create mode 100644 packages/sfp-cli/messages/profile_reconcile.json create mode 100644 packages/sfp-cli/messages/profile_retrieve.json create mode 100644 packages/sfp-cli/messages/promote.json create mode 100644 packages/sfp-cli/messages/publish.json create mode 100644 packages/sfp-cli/messages/quickbuild.json create mode 100644 packages/sfp-cli/messages/release.json create mode 100644 packages/sfp-cli/messages/releasedefinition_generate.json create mode 100644 packages/sfp-cli/messages/scratchorg_poolFetch.json create mode 100644 packages/sfp-cli/messages/scratchorg_pool_metrics_publish.json create mode 100644 packages/sfp-cli/messages/scratchorg_pool_org_delete.json create mode 100644 packages/sfp-cli/messages/scratchorg_poollist.json create mode 100644 packages/sfp-cli/messages/trigger_apex_test.json create mode 100644 packages/sfp-cli/messages/validate.json create mode 100644 packages/sfp-cli/messages/validateAgainstOrg.json create mode 100644 packages/sfp-cli/messages/validate_apex_coverage.json create mode 100644 packages/sfp-cli/package.json create mode 100644 packages/sfp-cli/resources/metadatainfo.json create mode 100644 packages/sfp-cli/resources/schemas/pooldefinition.schema.json create mode 100644 packages/sfp-cli/resources/schemas/releasedefinition.schema.json create mode 100644 packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json create mode 100644 packages/sfp-cli/resources/schemas/sfdx-project.schema.json create mode 100644 packages/sfp-cli/src/BuildBase.ts create mode 100644 packages/sfp-cli/src/InstallPackageCommand.ts create mode 100644 packages/sfp-cli/src/PackageCreateCommand.ts create mode 100644 packages/sfp-cli/src/ProjectValidation.ts create mode 100644 packages/sfp-cli/src/SfpCommand.ts create mode 100644 packages/sfp-cli/src/commands/apextests/trigger.ts create mode 100644 packages/sfp-cli/src/commands/artifacts/fetch.ts create mode 100644 packages/sfp-cli/src/commands/artifacts/query.ts create mode 100644 packages/sfp-cli/src/commands/changelog/generate.ts create mode 100644 packages/sfp-cli/src/commands/dependency/expand.ts create mode 100644 packages/sfp-cli/src/commands/dependency/install.ts create mode 100644 packages/sfp-cli/src/commands/dependency/shrink.ts create mode 100644 packages/sfp-cli/src/commands/impact/package.ts create mode 100644 packages/sfp-cli/src/commands/impact/releaseconfig.ts create mode 100644 packages/sfp-cli/src/commands/metrics/report.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/build.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/deploy.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/prepare.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/promote.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/publish.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/quickbuild.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/release.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/validate.ts create mode 100644 packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts create mode 100644 packages/sfp-cli/src/commands/package/data/create.ts create mode 100644 packages/sfp-cli/src/commands/package/data/install.ts create mode 100644 packages/sfp-cli/src/commands/package/install.ts create mode 100644 packages/sfp-cli/src/commands/package/source/create.ts create mode 100644 packages/sfp-cli/src/commands/package/source/install.ts create mode 100644 packages/sfp-cli/src/commands/package/unlocked/create.ts create mode 100644 packages/sfp-cli/src/commands/package/unlocked/install.ts create mode 100644 packages/sfp-cli/src/commands/pool/delete.ts create mode 100644 packages/sfp-cli/src/commands/pool/fetch.ts create mode 100644 packages/sfp-cli/src/commands/pool/list.ts create mode 100644 packages/sfp-cli/src/commands/pool/metrics/publish.ts create mode 100644 packages/sfp-cli/src/commands/pool/org/delete.ts create mode 100644 packages/sfp-cli/src/commands/profile/merge.ts create mode 100644 packages/sfp-cli/src/commands/profile/reconcile.ts create mode 100644 packages/sfp-cli/src/commands/profile/retrieve.ts create mode 100644 packages/sfp-cli/src/commands/releasedefinition/generate.ts create mode 100644 packages/sfp-cli/src/commands/repo/patch.ts create mode 100644 packages/sfp-cli/src/core/apex/ApexClassFetcher.ts create mode 100644 packages/sfp-cli/src/core/apex/ApexTriggerFetcher.ts create mode 100644 packages/sfp-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts create mode 100644 packages/sfp-cli/src/core/apex/coverage/IndividualClassCoverage.ts create mode 100644 packages/sfp-cli/src/core/apex/parser/ApexTypeFetcher.ts create mode 100644 packages/sfp-cli/src/core/apex/parser/listeners/ApexTypeListener.ts create mode 100644 packages/sfp-cli/src/core/apextest/ApexTestSuite.ts create mode 100644 packages/sfp-cli/src/core/apextest/ClearCodeCoverage.ts create mode 100644 packages/sfp-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts create mode 100644 packages/sfp-cli/src/core/apextest/JSONReporter.ts create mode 100644 packages/sfp-cli/src/core/apextest/TestOptions.ts create mode 100644 packages/sfp-cli/src/core/apextest/TestReportDisplayer.ts create mode 100644 packages/sfp-cli/src/core/apextest/TriggerApexTests.ts create mode 100644 packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts create mode 100644 packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts create mode 100644 packages/sfp-cli/src/core/changelog/GeneratePackageChangelog.ts create mode 100644 packages/sfp-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts create mode 100644 packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts create mode 100644 packages/sfp-cli/src/core/dependency/Component.ts create mode 100644 packages/sfp-cli/src/core/dependency/DependencyViolation.ts create mode 100644 packages/sfp-cli/src/core/dependency/Entrypoint.ts create mode 100644 packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts create mode 100644 packages/sfp-cli/src/core/deployers/DeploymentExecutor.ts create mode 100644 packages/sfp-cli/src/core/deployers/DeploymentSettingsService.ts create mode 100644 packages/sfp-cli/src/core/display/DependencyViolationDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/DeployErrorDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/DeploymentOptionDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/ExternalDependencyDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/InstalledArtifactsDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/InstalledPackagesDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/PackageComponentPrinter.ts create mode 100644 packages/sfp-cli/src/core/display/PackageDependencyDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/PackageMetadataPrinter.ts create mode 100644 packages/sfp-cli/src/core/display/PushErrorDisplayer.ts create mode 100644 packages/sfp-cli/src/core/display/TableConstants.ts create mode 100644 packages/sfp-cli/src/core/git/Git.ts create mode 100644 packages/sfp-cli/src/core/git/GitDiffUtil.ts create mode 100644 packages/sfp-cli/src/core/git/GitIdentity.ts create mode 100644 packages/sfp-cli/src/core/git/GitTags.ts create mode 100644 packages/sfp-cli/src/core/ignore/IgnoreFiles.ts create mode 100644 packages/sfp-cli/src/core/limits/LimitsFetcher.ts create mode 100644 packages/sfp-cli/src/core/metadata/CustomFieldFetcher.ts create mode 100644 packages/sfp-cli/src/core/metadata/MetadataFetcher.ts create mode 100644 packages/sfp-cli/src/core/metadata/MetadataFiles.ts create mode 100644 packages/sfp-cli/src/core/metadata/MetadataInfo.ts create mode 100644 packages/sfp-cli/src/core/metadata/SettingsFetcher.ts create mode 100644 packages/sfp-cli/src/core/org/OrgDetailsFetcher.ts create mode 100644 packages/sfp-cli/src/core/org/OrganizationFetcher.ts create mode 100644 packages/sfp-cli/src/core/org/SFPOrg.ts create mode 100644 packages/sfp-cli/src/core/org/ScratchOrgInfoFetcher.ts create mode 100644 packages/sfp-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts create mode 100644 packages/sfp-cli/src/core/package/Package2Detail.ts create mode 100644 packages/sfp-cli/src/core/package/SfpPackage.ts create mode 100644 packages/sfp-cli/src/core/package/SfpPackageBuilder.ts create mode 100644 packages/sfp-cli/src/core/package/SfpPackageInquirer.ts create mode 100644 packages/sfp-cli/src/core/package/SfpPackageInstaller.ts create mode 100644 packages/sfp-cli/src/core/package/analyser/AnalyzerRegistry.ts create mode 100644 packages/sfp-cli/src/core/package/analyser/FHTAnalyzer.ts create mode 100644 packages/sfp-cli/src/core/package/analyser/FTAnalyzer.ts create mode 100644 packages/sfp-cli/src/core/package/analyser/PackageAnalyzer.ts create mode 100644 packages/sfp-cli/src/core/package/analyser/PicklistAnalyzer.ts create mode 100644 packages/sfp-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts create mode 100644 packages/sfp-cli/src/core/package/components/MetadataCount.ts create mode 100644 packages/sfp-cli/src/core/package/components/PackageManifest.ts create mode 100644 packages/sfp-cli/src/core/package/components/PackageToComponent.ts create mode 100644 packages/sfp-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts create mode 100644 packages/sfp-cli/src/core/package/coverage/PackageTestCoverage.ts create mode 100644 packages/sfp-cli/src/core/package/coverage/PackageVersionCoverage.ts create mode 100644 packages/sfp-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts create mode 100644 packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts create mode 100644 packages/sfp-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/FTEnabler.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilter.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts create mode 100644 packages/sfp-cli/src/core/package/diff/PackageComponentDiff.ts create mode 100644 packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts create mode 100644 packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts create mode 100644 packages/sfp-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageCreators/CreatePackage.ts create mode 100644 packages/sfp-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/packageInstallers/PackageInstallationResult.ts create mode 100644 packages/sfp-cli/src/core/package/packageMerger/PackageMergeManager.ts create mode 100644 packages/sfp-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts create mode 100644 packages/sfp-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts create mode 100644 packages/sfp-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts create mode 100644 packages/sfp-cli/src/core/package/propertyFetchers/PropertyFetcher.ts create mode 100644 packages/sfp-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts create mode 100644 packages/sfp-cli/src/core/package/validators/PackageEmptyChecker.ts create mode 100644 packages/sfp-cli/src/core/package/version/Package2VersionFetcher.ts create mode 100644 packages/sfp-cli/src/core/package/version/Package2VersionInstaller.ts create mode 100644 packages/sfp-cli/src/core/package/version/PackageVersionLister.ts create mode 100644 packages/sfp-cli/src/core/package/version/PackageVersionUpdater.ts create mode 100644 packages/sfp-cli/src/core/permsets/AssignPermissionSets.ts create mode 100644 packages/sfp-cli/src/core/permsets/AssignPermissionSetsImpl.ts create mode 100644 packages/sfp-cli/src/core/permsets/PermissionSetFetcher.ts create mode 100644 packages/sfp-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts create mode 100644 packages/sfp-cli/src/core/project/ProjectConfig.ts create mode 100644 packages/sfp-cli/src/core/project/UserDefinedExternalDependency.ts create mode 100644 packages/sfp-cli/src/core/queryHelper/ChunkCollection.ts create mode 100644 packages/sfp-cli/src/core/queryHelper/QueryHelper.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/PasswordGenerator.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/ScratchOrg.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/ClientSourceTracking.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolBaseImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolError.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolListImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts create mode 100644 packages/sfp-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts create mode 100644 packages/sfp-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts create mode 100644 packages/sfp-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts create mode 100644 packages/sfp-cli/src/core/stats/NativeMetricSender.ts create mode 100644 packages/sfp-cli/src/core/stats/SFPStatsSender.ts create mode 100644 packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts create mode 100644 packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts create mode 100644 packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts create mode 100644 packages/sfp-cli/src/core/utils/AliasList.ts create mode 100644 packages/sfp-cli/src/core/utils/ChunkArray.ts create mode 100644 packages/sfp-cli/src/core/utils/DefaultShell.ts create mode 100644 packages/sfp-cli/src/core/utils/Delay.ts create mode 100644 packages/sfp-cli/src/core/utils/FileSystem.ts create mode 100644 packages/sfp-cli/src/core/utils/Fileutils.ts create mode 100644 packages/sfp-cli/src/core/utils/GetFormattedTime.ts create mode 100644 packages/sfp-cli/src/core/utils/ObjectCRUDHelper.ts create mode 100644 packages/sfp-cli/src/core/utils/OnExit.ts create mode 100644 packages/sfp-cli/src/core/utils/RandomId.ts create mode 100644 packages/sfp-cli/src/core/utils/VersionNumberConverter.ts create mode 100644 packages/sfp-cli/src/core/utils/extractDomainFromUrl.ts create mode 100644 packages/sfp-cli/src/core/utils/xml2json.ts create mode 100644 packages/sfp-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts create mode 100644 packages/sfp-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts create mode 100644 packages/sfp-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts create mode 100644 packages/sfp-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts create mode 100644 packages/sfp-cli/src/errors/ReleaseError.ts create mode 100644 packages/sfp-cli/src/errors/SfpError.ts create mode 100644 packages/sfp-cli/src/errors/ValidateError.ts create mode 100644 packages/sfp-cli/src/flags/duration.ts create mode 100644 packages/sfp-cli/src/flags/orgApiVersion.ts create mode 100644 packages/sfp-cli/src/flags/salesforceId.ts create mode 100644 packages/sfp-cli/src/flags/sfdxflags.ts create mode 100644 packages/sfp-cli/src/impl/Stage.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchAnArtifact.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchArtifactSelector.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchArtifactsError.ts create mode 100644 packages/sfp-cli/src/impl/artifacts/FetchImpl.ts create mode 100644 packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts create mode 100644 packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts create mode 100644 packages/sfp-cli/src/impl/changelog/CommitUpdater.ts create mode 100644 packages/sfp-cli/src/impl/changelog/OrgsUpdater.ts create mode 100644 packages/sfp-cli/src/impl/changelog/ReadPackageChangelog.ts create mode 100644 packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts create mode 100644 packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts create mode 100644 packages/sfp-cli/src/impl/changelog/WorkItemUpdater.ts create mode 100644 packages/sfp-cli/src/impl/demoreelplayer/DemoReelPlayer.ts create mode 100644 packages/sfp-cli/src/impl/dependency/ShrinkImpl.ts create mode 100644 packages/sfp-cli/src/impl/deploy/DeployImpl.ts create mode 100644 packages/sfp-cli/src/impl/deploy/PostDeployHook.ts create mode 100644 packages/sfp-cli/src/impl/deploy/PreDeployHook.ts create mode 100644 packages/sfp-cli/src/impl/impact/ImpactedPackagesResolver.ts create mode 100644 packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts create mode 100644 packages/sfp-cli/src/impl/parallelBuilder/BatchingTopoSort.ts create mode 100644 packages/sfp-cli/src/impl/parallelBuilder/BuildCollections.ts create mode 100644 packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts create mode 100644 packages/sfp-cli/src/impl/parallelBuilder/DependencyHelper.ts create mode 100644 packages/sfp-cli/src/impl/parallelBuilder/UndirectedGraph.ts create mode 100644 packages/sfp-cli/src/impl/prepare/PrepareImpl.ts create mode 100644 packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseConfig.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinition.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseImpl.ts create mode 100644 packages/sfp-cli/src/impl/repo/AlignImpl.ts create mode 100644 packages/sfp-cli/src/impl/validate/Analyzer.ts create mode 100644 packages/sfp-cli/src/impl/validate/ApexTestValidator.ts create mode 100644 packages/sfp-cli/src/impl/validate/ValidateImpl.ts create mode 100644 packages/sfp-cli/src/impl/validate/ValidateResult.ts create mode 100644 packages/sfp-cli/src/index.ts create mode 100644 packages/sfp-cli/src/outputs/FileOutputHandler.ts create mode 100644 packages/sfp-cli/src/ui/GroupConsoleLogs.ts create mode 100644 packages/sfp-cli/src/ui/OrgInfoDisplayer.ts create mode 100644 packages/sfp-cli/src/ui/TableConstants.ts create mode 100644 packages/sfp-cli/src/utils/FetchArtifactsFromOrg.ts create mode 100644 packages/sfp-cli/src/utils/Get18DigitSalesforceId.ts create mode 100644 packages/sfp-cli/tests/ProjectValidation.test.ts create mode 100644 packages/sfp-cli/tests/core/apextest/ApexTestSuite.test.ts create mode 100644 packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts create mode 100644 packages/sfp-cli/tests/core/coverage/IndividualClassCoverage.test.ts create mode 100644 packages/sfp-cli/tests/core/git/GitTags.test.ts create mode 100644 packages/sfp-cli/tests/core/org/ArtifactsToOrg.test.ts create mode 100644 packages/sfp-cli/tests/core/org/ListAllPackages.test.ts create mode 100644 packages/sfp-cli/tests/core/package/Package2VersionFetcher.test.ts create mode 100644 packages/sfp-cli/tests/core/package/PackageDiffImpl.test.ts create mode 100644 packages/sfp-cli/tests/core/package/PackageManifest.test.ts create mode 100644 packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts create mode 100644 packages/sfp-cli/tests/core/package/analysers/FHTAnalyzer.test.ts create mode 100644 packages/sfp-cli/tests/core/package/analysers/FTAnalyzer.test.ts create mode 100644 packages/sfp-cli/tests/core/package/coverage/PackageTestCoverage.test.ts create mode 100644 packages/sfp-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts create mode 100644 packages/sfp-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts create mode 100644 packages/sfp-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts create mode 100644 packages/sfp-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts create mode 100644 packages/sfp-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip create mode 100644 packages/sfp-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip create mode 100644 packages/sfp-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts create mode 100644 packages/sfp-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts create mode 100644 packages/sfp-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts create mode 100644 packages/sfp-cli/tests/core/permsets/AssignPermissionSets.test.ts create mode 100644 packages/sfp-cli/tests/core/permsets/PermissionSetFetcher.test.ts create mode 100644 packages/sfp-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts create mode 100644 packages/sfp-cli/tests/core/project/ProjectConfig.test.ts create mode 100644 packages/sfp-cli/tests/core/queryHelper/ChunkCollection.test.ts create mode 100644 packages/sfp-cli/tests/core/utils/ChunkArray.test.ts create mode 100644 packages/sfp-cli/tests/core/utils/FileSystem.test.ts create mode 100644 packages/sfp-cli/tests/core/utils/extractDomainFromUrl.test.ts create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/b1.file create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/c/c1.file create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/c/c2.file create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/d/d1.file create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/d/x/x1.file create mode 100644 packages/sfp-cli/tests/core/utils/resources/a/b/e/e1.file create mode 100644 packages/sfp-cli/tests/impl/changelog/CommitUpdater.test.ts create mode 100644 packages/sfp-cli/tests/impl/changelog/OrgUpdater.test.ts create mode 100644 packages/sfp-cli/tests/impl/changelog/WorkItemUpdater.test.ts create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ESObjectsChangelog.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json create mode 100644 packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json create mode 100644 packages/sfp-cli/tests/impl/dependency/ShrinkImpl.test.ts create mode 100644 packages/sfp-cli/tests/impl/parallelBuilder/BuildCollections.test.ts create mode 100644 packages/sfp-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts create mode 100644 packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts create mode 100644 packages/sfp-cli/tsconfig.json diff --git a/packages/sfp-cli/.babel.config.js b/packages/sfp-cli/.babel.config.js new file mode 100644 index 000000000..6e7404754 --- /dev/null +++ b/packages/sfp-cli/.babel.config.js @@ -0,0 +1,7 @@ +module.exports = { + + plugins: [ + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-nullish-coalescing-operator' + ], +}; \ No newline at end of file diff --git a/packages/sfp-cli/README.md b/packages/sfp-cli/README.md new file mode 100644 index 000000000..0abca1322 --- /dev/null +++ b/packages/sfp-cli/README.md @@ -0,0 +1,98 @@ +

+ sfp +

+ +![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) +[![GitHub stars](https://img.shields.io/github/stars/flxblio/sfp)](https://github.com/flxblio/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxblio/sfp.svg)](https://github.com/flxblio/sfp/graphs/contributors/) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxblio/sfp/blob/master/LICENSE) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) + +[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxblio) + +A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxblio.io + +#### Features + +- Features an Orchestrator, which utilizes sfdx-project.json as the source of truth for driving the build system, ensuring very low maintenance on programs often dealing with multiple number of packages +- Builds packages in parallel by respecting dependencies +- Ability to selectively build changed packages in a mono repo +- Ability to deploy only packages that are changed in repo +- Pooling commands to prepare a pool of scratch org's with packages pre installed for optimized Pull/Merge Request validation +- Artifacts Driven, all create commands produce an artifact or operate on an artifact +- Integrate with any CI/CD system of choice +- All commands are enabled with statsD, for collecting metrics about your pipeline. + +There are lot more features to explore. Read more at https://docs.flxblio.io + +The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxblio/sfp) or can be +used by using the [docker image](https://github.com/flxblio/sfp/pkgs/container/sfp) + + + + + +#### Motivation + +- Need for artifact driven build system for package based development models especially on complex and large programs + +- Providing additional functionality that is either not supported by the sfdx-cli, such as data packages or automatically understanding tests in a given package + +- Ease of use, one should not be spending too much time scripting a pipeline. + +#### CI/CD Reference Implementation + +Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxblio.io/implementing-your-ci-cd/github) + +#### Installing sfp locally + +sfp can be installed on your local device using npm + +``` +npm i -g @flxblio/sfp +``` + + +#### Docker + +Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxblio/sfp/pkgs/container/sfp). + +We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. + +#### Build Instructions +To build sfp execute the following on the terminal: +``` +npm i -g lerna #Install Lerna Globally +cd # Navigate to the checked out directory +pnpm i +lerna run build +``` + +To run unit tests + +``` +lerna run test +``` + +To debug and test plugin + +``` + cd packages/sfp-cli + npm link +``` + +#### Maintainers + +List of Maintainers are available in the [link](https://docs.flxblio.io/about-us) + + +#### Where do I reach for queries? + +Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxblio) as well. + + +## License +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_large) diff --git a/packages/sfp-cli/bin/run b/packages/sfp-cli/bin/run new file mode 100755 index 000000000..ab6300955 --- /dev/null +++ b/packages/sfp-cli/bin/run @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +const oclif = require('@oclif/core') + +oclif.run().then(require('@oclif/core/flush')).catch(require('@oclif/core/handle')) \ No newline at end of file diff --git a/packages/sfp-cli/bin/run.cmd b/packages/sfp-cli/bin/run.cmd new file mode 100644 index 000000000..968fc3075 --- /dev/null +++ b/packages/sfp-cli/bin/run.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\run" %* diff --git a/packages/sfp-cli/jest.config.js b/packages/sfp-cli/jest.config.js new file mode 100644 index 000000000..a1009b2d2 --- /dev/null +++ b/packages/sfp-cli/jest.config.js @@ -0,0 +1,17 @@ +module.exports = { + preset: 'ts-jest/presets/js-with-babel', + testEnvironment: 'node', + restoreMocks: true, + clearMocks: true, + resetMocks: true, + transform: { + '^.+\\.[t]sx?$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.json', + babelConfig: true, + }, + ] + }, + transformIgnorePatterns: ['/node_modules/(?!@salesforce/source-deploy-retrieve)(.*)'], +}; diff --git a/packages/sfp-cli/messages/analyze.json b/packages/sfp-cli/messages/analyze.json new file mode 100644 index 000000000..f5e4a1e73 --- /dev/null +++ b/packages/sfp-cli/messages/analyze.json @@ -0,0 +1,4 @@ +{ + "commandDescription": "Runs static analysis on the code/config based on configurable rules", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task" +} diff --git a/packages/sfp-cli/messages/analyze_with_PMD.json b/packages/sfp-cli/messages/analyze_with_PMD.json new file mode 100644 index 000000000..898f7f5d3 --- /dev/null +++ b/packages/sfp-cli/messages/analyze_with_PMD.json @@ -0,0 +1,13 @@ +{ + "commandDescription": "This task is used to run a static analysis of the apex classes and triggers using PMD, Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task", + "sourceDirectoryFlagDescription": "The directory that is to be analzed using PMD, If omitted default project diretory as mentioned in sfdx-project.json will be used", + "rulesetFlagDescription": "Inbuilt is the default ruleset that comes with the task, If you choose custom, please provide the path to the ruleset", + "rulesetPathFlagDescription": "The path to the ruleset if you are utilizing your own ruleset", + "formatFlagDescription": "https://pmd.github.io/latest/pmd_userdocs_cli_reference.html#available-report-formats", + "outputPathFlagDescription": "The file to which the output for static analysis will be written", + "versionFlagDescription": "The version of PMD to be used for static analysis", + "thresholdFlagDescription": "Violations with a priority less than or equal to the threshold will cause the command to fail", + "isToBreakBuildFlagDescription": "Enable this option if the build should be reported as failure if 1 or more critical defects are reported during the analysis", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/artifacts_query.json b/packages/sfp-cli/messages/artifacts_query.json new file mode 100644 index 000000000..6f013b01c --- /dev/null +++ b/packages/sfp-cli/messages/artifacts_query.json @@ -0,0 +1,4 @@ +{ + "commandDescription": "Fetch details about artifacts installed in a target org", + "branchNameFlagDescription": "Repository branch in which the changelog files are located" +} diff --git a/packages/sfp-cli/messages/build.json b/packages/sfp-cli/messages/build.json new file mode 100644 index 000000000..fddd4ee44 --- /dev/null +++ b/packages/sfp-cli/messages/build.json @@ -0,0 +1,18 @@ +{ + "commandDescription": "Build all packages (unlocked/source/data) in a repo in parallel, respecting the dependency of each packages and generate artifacts to a provided directory", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", + "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "buildNumberFlagDescription": "The build number to be used for source packages, Unlocked Packages will be assigned the buildnumber from Saleforce directly if using .NEXT", + "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the generated artifact is to be written", + "isValidationToBeSkippedFlagDescription": "Skips validation of dependencies, package ancestors, and metadata during package version creation. Skipping validation reduces the time it takes to create a new package version, but package versions created without validation can’t be promoted.", + "waitTimeFlagDescription": "Wait time for command to finish in minutes", + "executorCountFlagDescription": "Number of parallel package task schedulors", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "releaseConfigFileFlagDescription":"Path to the release config file which determines what packages should be built" +} diff --git a/packages/sfp-cli/messages/core-messages.md b/packages/sfp-cli/messages/core-messages.md new file mode 100644 index 000000000..7c7aa6971 --- /dev/null +++ b/packages/sfp-cli/messages/core-messages.md @@ -0,0 +1,118 @@ +# error.prefix + +Error%s: + +# warning.security + +This command will expose sensitive information that allows for subsequent activity using your current authenticated session. Sharing this information is equivalent to logging someone in under the current credential, resulting in unintended access and escalation of privilege. For additional information, please review the authorization section of the + +# errors.RequiresProject + +This command is required to run from within a Salesforce project directory. + +# errors.InvalidIdLength + +The id must be %s characters. + +# errors.InvalidIdLength.or + +or + +# errors.InvalidId + +The id is invalid. + +# errors.InvalidPrefix + +The id must begin with %s. + +# errors.NoDefaultEnv + +No default environment found. Use -o or --target-org to specify an environment. + +# errors.NoDefaultDevHub + +No default dev hub found. Use -v or --target-dev-hub to specify an environment. + +# errors.NotADevHub + +The specified org %s is not a Dev Hub. + +# flags.targetOrg.summary + +Username or alias of the target org. + +# flags.targetDevHubOrg.summary + +Username or alias of the Dev Hub org. + +# flags.logsgroupsymbol.summary + +Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol. + +# flags.apiVersion.description + +Override the api version used for api requests made by this command + +# flags.apiVersion.overrideWarning + +org-api-version configuration overridden at %s + +# flags.apiVersion.warning.deprecated + +API versions up to %s are deprecated. See %s for more information. + +# errors.InvalidApiVersion + +%s is not a valid API version. It should end in '.0' like '54.0'. + +# errors.RetiredApiVersion + +The API version must be greater than %s. + +# errors.InvalidDuration + +The value must be an integer. + +# errors.DurationBounds + +The value must be between %s and %s (inclusive). + +# errors.DurationBoundsMin + +The value must be at least %s. + +# errors.DurationBoundsMax + +The value must be no more than %s. + +# warning.prefix + +Warning: + +# warning.loglevel + +The loglevel flag is no longer in use on this command. You may use it without error, but it will be ignored. +Set the log level using the `SFDX_LOG_LEVEL` environment variable. + +# actions.tryThis + +Try this: + +# warning.CommandInBeta + +This command is currently in beta. Any aspect of this command can change without advanced notice. Don't use beta commands in your scripts. + +# error.InvalidArgumentFormat + +Error in the following argument +%s +Set varargs with this format: key=value or key="value with spaces" + +# error.DuplicateArgument + +Found duplicate argument %s. + +# warning.arrayInputFormat + +The input format for array arguments has changed. Use this format: --array-flag value1 --array-flag value2 --array-flag value3 \ No newline at end of file diff --git a/packages/sfp-cli/messages/create-package.json b/packages/sfp-cli/messages/create-package.json new file mode 100644 index 000000000..6f42df950 --- /dev/null +++ b/packages/sfp-cli/messages/create-package.json @@ -0,0 +1,13 @@ +{ + "commandDescription": "Creates a versioned artifact from a source directory containing SFDMU-based data (in csv format and export json). The artifact can be consumed by release pipelines, to deploy the data to orgs", + "packageFlagDescription": "The name of the package", + "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "diffCheckFlagDescription": "Only build when the package has changed", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "refNameFlagDescription": "Reference name to be prefixed to output variables", + "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org" +} diff --git a/packages/sfp-cli/messages/create_data_package.json b/packages/sfp-cli/messages/create_data_package.json new file mode 100644 index 000000000..6351a9c1c --- /dev/null +++ b/packages/sfp-cli/messages/create_data_package.json @@ -0,0 +1,12 @@ +{ + "commandDescription": "Creates a versioned artifact from a source directory containing SFDMU-based data (in csv format and export json). The artifact can be consumed by release pipelines, to deploy the data to orgs", + "packageFlagDescription": "The name of the package", + "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "diffCheckFlagDescription": "Only build when the package has changed", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/create_delta_package.json b/packages/sfp-cli/messages/create_delta_package.json new file mode 100644 index 000000000..e7833495f --- /dev/null +++ b/packages/sfp-cli/messages/create_delta_package.json @@ -0,0 +1,13 @@ +{ + "commandDescription": "This task is used to create a delta package between two commits and bundle the created delta as as a deployable artifact. Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task", + "packageNameFlagDescription": "The name of the package", + "revisionFromFlagDescription": "Provide the full SHA Commit ID, from where the diff should start generating", + "revisionToFlagDescription": "If not set, the head commit ID of the current branch is used", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "versionNameFlagDescription": "Provide a meaningful name such as the default value, so this artifact can be identified in the release", + "generateDestructiveManifestFlagDescription": "Check this option to generate a destructive manifest to be deployed", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/create_source_package.json b/packages/sfp-cli/messages/create_source_package.json new file mode 100644 index 000000000..7d7458fe4 --- /dev/null +++ b/packages/sfp-cli/messages/create_source_package.json @@ -0,0 +1,13 @@ +{ + "commandDescription": "This task simulates a packaging experience similar to unlocked packaging - creating an artifact that consists of the metadata (e.g. commit Id), source code & an optional destructive manifest. The artifact can then be consumed by release pipelines, to deploy the package", + "packageFlagDescription": "The name of the package", + "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "destructiveManiFestFilePathFlagDescription": "Path to a destructiveChanges.xml, mentioning any metadata that need to be deleted before the contents in the source package need to be installed in the org", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "diffCheckFlagDescription": "Only build when the package has changed", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/create_unlocked_package.json b/packages/sfp-cli/messages/create_unlocked_package.json new file mode 100644 index 000000000..b8d0db5e3 --- /dev/null +++ b/packages/sfp-cli/messages/create_unlocked_package.json @@ -0,0 +1,21 @@ +{ + "commandDescription": "Creates a new package version, and generates an artifact that consists of the metadata (e.g. version Id). The artifact can then be consumed by release pipelines, to install the unlocked package. Utilize this task in a package build for DX Unlocked Package", + "packageFlagDescription": "ID (starts with 0Ho) or alias of the package to create a version of", + "buildArtifactEnabledFlagDescription": "Create a build artifact, so that this pipeline can be consumed by a release pipeline", + "installationKeyFlagDescription": "Installation key for this package", + "installationKeyBypassFlagDescription": "Bypass the requirement for having an installation key for this version of the package", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", + "diffCheckFlagDescription": "Only build when the package has changed", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", + "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "enableCoverageFlagDescription": "Please note this command takes a longer time to compute, activating this on every packaging build might not necessary", + "isValidationToBeSkippedFlagDescription": "Skips validation of dependencies, package ancestors, and metadata during package version creation. Skipping validation reduces the time it takes to create a new package version, but package versions created without validation can’t be promoted.", + "tagFlagDescription": "the package version's tag", + "waitTimeFlagDescription": "wait time for command to finish in minutes", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/dependency_expand.json b/packages/sfp-cli/messages/dependency_expand.json new file mode 100644 index 000000000..2ae6e3f80 --- /dev/null +++ b/packages/sfp-cli/messages/dependency_expand.json @@ -0,0 +1,4 @@ +{ + "commandDescription":"Expand the dependency list in sfdx-project.json file for each package, fix the gap of dependencies from its dependent packages", + "overWriteProjectConfigFlagDescription":"Flag to overwrite existing sfdx-project.json file" +} \ No newline at end of file diff --git a/packages/sfp-cli/messages/dependency_install.json b/packages/sfp-cli/messages/dependency_install.json new file mode 100644 index 000000000..65437b7f3 --- /dev/null +++ b/packages/sfp-cli/messages/dependency_install.json @@ -0,0 +1,4 @@ +{ + "commandDescription":"Install all the external dependencies of a given project", + "installationkeysFlagDescription":"Installation key for key-protected packages (format is packagename:key --> core:key nCino:key vlocity:key to allow some packages without installation key)" +} \ No newline at end of file diff --git a/packages/sfp-cli/messages/dependency_shrink.json b/packages/sfp-cli/messages/dependency_shrink.json new file mode 100644 index 000000000..9c7175036 --- /dev/null +++ b/packages/sfp-cli/messages/dependency_shrink.json @@ -0,0 +1,4 @@ +{ + "commandDescription":"Shrink the dependency list in sfdx-project.json file for each package, remove duplicate dependencies that already exist in its dependent packages", + "overWriteProjectConfigFlagDescription":"Flag to overwrite existing sfdx-project.json file" +} \ No newline at end of file diff --git a/packages/sfp-cli/messages/deploy.json b/packages/sfp-cli/messages/deploy.json new file mode 100644 index 000000000..12e357891 --- /dev/null +++ b/packages/sfp-cli/messages/deploy.json @@ -0,0 +1,15 @@ +{ + "commandDescription": "Deploy packages from the provided aritfact directory, to a given org, using the order and configurable flags provided in sfdx-project.json", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "artifactDirectoryFlagDescription": "The directory containing artifacts to be deployed", + "waitTimeFlagDescription": "Wait time for command to finish in minutes", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "tagFlagDescription": "Tag the deploy with a label, useful for identification in metrics", + "validateModeFlagDescription": "Enable for validation deployments", + "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org", + "baselineorgFlagDescription": "The org against which the package skip should be baselined", + "allowUnpromotedPackagesFlagDescription": "Allow un-promoted packages to be installed in production", + "retryOnFailureFlagDescription": "Retry on a failed deployment of a package", + "configFileFlagDescription":"Path to the config file which determines how the packages are deployed based on the filters in release config", + "enableSourceTrackingFlagDescription": "Enable source tracking on the packages being deployed to an org" +} diff --git a/packages/sfp-cli/messages/fetch.json b/packages/sfp-cli/messages/fetch.json new file mode 100644 index 000000000..c86cb016b --- /dev/null +++ b/packages/sfp-cli/messages/fetch.json @@ -0,0 +1,10 @@ +{ + "commandDescription": "Fetch artifacts from an artifact registry that is either NPM compatible or supports universal artifacts", + "releaseDefinitionFlagDescription": "Path to YAML file containing map of packages and package versions to download", + "artifactDirectoryFlagDescription": "Directory to save downloaded artifacts", + "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", + "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", + "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", + "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." +} diff --git a/packages/sfp-cli/messages/generate_changelog.json b/packages/sfp-cli/messages/generate_changelog.json new file mode 100644 index 000000000..8844686d9 --- /dev/null +++ b/packages/sfp-cli/messages/generate_changelog.json @@ -0,0 +1,14 @@ +{ + "commandDescription": "Generates release changelog, providing a summary of artifact versions, work items and commits introduced in a release. Creates a release definition based on artifacts contained in the artifact directory, and compares it to previous release definition in changelog stored on a source repository", + "limitFlagDescription": "limit the number of releases to display in changelog markdown", + "artifactDirectoryFlagDescription": "Directory containing sfp artifacts", + "releaseNameFlagDescription": "Name of the release for which to generate changelog", + "workItemFilterFlagDescription": "Regular expression used to search for work items (user stories) introduced in release", + "workItemUrlFlagDescription": "Generic URL for work items. Each work item ID will be appended to the URL, providing quick access to work items", + "repoUrlFlagDescription": "Repository in which the changelog files are located. Assumes user is already authenticated.", + "branchNameFlagDescription": "Repository branch in which the changelog files are located", + "noPushFlagDescription":"Do not push the changelog to a repository to the provided branch", + "showAllArtifactsFlagDescription": "Show all artifacts in changelog markdown, including those that have not changed in the release", + "forcePushFlagDescription": "Force push changes to the repository branch", + "directoryFlagDescription": "Relative path to directory to which the release defintion file should be generated, if the directory doesnt exist, it will be created" +} diff --git a/packages/sfp-cli/messages/impact_package.json b/packages/sfp-cli/messages/impact_package.json new file mode 100644 index 000000000..991ac7d66 --- /dev/null +++ b/packages/sfp-cli/messages/impact_package.json @@ -0,0 +1,4 @@ +{ + "commandDescription": "Figures out impacted packages of a project, due to a change from the last known tags", + "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used" +} diff --git a/packages/sfp-cli/messages/impact_release_config.json b/packages/sfp-cli/messages/impact_release_config.json new file mode 100644 index 000000000..d96edc890 --- /dev/null +++ b/packages/sfp-cli/messages/impact_release_config.json @@ -0,0 +1,7 @@ +{ + "commandDescription": "Figures out impacted release configurations of a project, due to a change,from the last known tags", + "releaseConfigFileFlagDescription":"Path to the directory containing release defns", + "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used from", + "filterByFlagDescription": "Filter by a specific release config name", + "explictDependencyCheckFlagDescription": "Activate to consider dependencyOn attribut while handling impact" +} diff --git a/packages/sfp-cli/messages/increment_build_number.json b/packages/sfp-cli/messages/increment_build_number.json new file mode 100644 index 000000000..59cf4d79a --- /dev/null +++ b/packages/sfp-cli/messages/increment_build_number.json @@ -0,0 +1,10 @@ +{ + "commandDescription": "Increment the selected version counter by one and optionally commit changes to sfdx-project.json. This command does not push changes to the source repository", + "segmentFlagDescription": "Select the segment of the version", + "appendBuildNumberFlagDescription": "Set the build segment of the version number to the build number rather than incremenenting", + "packageFlagDescription": "The name of the package of which the version need to be incremented,If not specified the default package is utilized", + "projectDirectoryFlagDescription": "The directory should contain a sfdx-project.json for this command to succeed", + "commitChangesFlagDescription": "Mark this if you want to commit the modified sfdx-project json, Please note this will not push to the repo only commits in the local checked out repo, You would need to have a push to the repo at the end of the packaging task if everything is successfull", + "refNameFlagDescription": "Reference name to be prefixed to output variables", + "runNumberFlagDescription": "The build number of the CI pipeline, usually available through an environment variable" +} diff --git a/packages/sfp-cli/messages/install_data_package.json b/packages/sfp-cli/messages/install_data_package.json new file mode 100644 index 000000000..5b883e245 --- /dev/null +++ b/packages/sfp-cli/messages/install_data_package.json @@ -0,0 +1,8 @@ +{ + "commandDescription": "(DEPRECATED) Installs a SFDMU-based data package consisting of csvfiles and export.json to a target org", + "packageFlagDescription": "Name of the package to be installed", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "artifactDirectoryFlagDescription": "The directory where the artifact is located", + "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", + "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org" +} diff --git a/packages/sfp-cli/messages/install_package.json b/packages/sfp-cli/messages/install_package.json new file mode 100644 index 000000000..2dfc9c318 --- /dev/null +++ b/packages/sfp-cli/messages/install_package.json @@ -0,0 +1,14 @@ +{ + "commandDescription": "Installs a sfp artifact to an org", + "packageFlagDescription": "Name of the package to be installed", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "apexCompileOnlyPackageFlagDescription": "(unlocked) package installation triggers a compilation of apex, flag to trigger compilation of package only", + "artifactDirectoryFlagDescription": "The directory where the artifact is located", + "securityTypeFlagDescription": "(unlocked) Select the security access for the package installation", + "optimizedeployment": "(source) Optimize deployment by triggering test classes that are in the package, rather than using the whole tests in the org", + "skiptesting": "(source) Skips running test when deploying to a sandbox", + "upgradeTypeFlagDescription": "(unlocked)the upgrade type for the package installation", + "waitTimeFlagDescription": "wait time for command to finish in minutes", + "publishWaitTimeFlagDescription": "(unlocked) number of minutes to wait for subscriber package version ID to become available in the target org", + "skipIfAlreadyInstalled": "Skip the installation if the package is already installed in the org" +} diff --git a/packages/sfp-cli/messages/install_package_command.json b/packages/sfp-cli/messages/install_package_command.json new file mode 100644 index 000000000..b0b22e4de --- /dev/null +++ b/packages/sfp-cli/messages/install_package_command.json @@ -0,0 +1,6 @@ +{ + "packageFlagDescription": "Name of the package to be installed", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "artifactDirectoryFlagDescription": "The directory where the artifact is located", + "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages" +} diff --git a/packages/sfp-cli/messages/install_source_package.json b/packages/sfp-cli/messages/install_source_package.json new file mode 100644 index 000000000..0d5be458a --- /dev/null +++ b/packages/sfp-cli/messages/install_source_package.json @@ -0,0 +1,12 @@ +{ + "commandDescription": "(DEPRECATED) Installs a sfp source package to the target org", + "packageFlagDescription": "Name of the package to be installed", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "artifactDirectoryFlagDescription": "The directory where the artifact is located", + "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", + "waitTimeFlagDescription": "wait time for command to finish in minutes", + "optimizedeployment": "Optimize deployment by triggering test classes that are in the package, rather than using the whole tests in the org", + "skiptesting": "Skips running test when deploying to a sandbox", + "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org", + "refNameFlagDescription": "Reference name to be prefixed to output variables" +} diff --git a/packages/sfp-cli/messages/install_unlocked_package.json b/packages/sfp-cli/messages/install_unlocked_package.json new file mode 100644 index 000000000..ac93c9e9d --- /dev/null +++ b/packages/sfp-cli/messages/install_unlocked_package.json @@ -0,0 +1,16 @@ +{ + "commandDescription": "(DEPRECATED) Installs an unlocked package using sfp metadata", + "packageFlagDescription": "Name of the package to be installed", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "packageInstalledFromFlagDescription": "automatically retrieve the version ID of the package to be installed, from the build artifact", + "packageVersionIdFlagDescription": "manually input package version Id of the package to be installed", + "installationKeyFlagDescription": "installation key for key-protected package", + "apexCompileOnlyPackageFlagDescription": "Each package installation triggers a compilation of apex, flag to trigger compilation of package only", + "artifactDirectoryFlagDescription": "The directory where the artifact is located", + "securityTypeFlagDescription": "Select the security access for the package installation", + "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", + "upgradeTypeFlagDescription": "the upgrade type for the package installation", + "waitTimeFlagDescription": "wait time for command to finish in minutes", + "publishWaitTimeFlagDescription": "number of minutes to wait for subscriber package version ID to become available in the target org", + "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org" +} diff --git a/packages/sfp-cli/messages/metrics_report.json b/packages/sfp-cli/messages/metrics_report.json new file mode 100644 index 000000000..9a2718a83 --- /dev/null +++ b/packages/sfp-cli/messages/metrics_report.json @@ -0,0 +1,3 @@ +{ + "commandDescription": "Report a custom metric to any sfp supported metric provider" +} diff --git a/packages/sfp-cli/messages/org_profile_diff.json b/packages/sfp-cli/messages/org_profile_diff.json new file mode 100644 index 000000000..2eb640af1 --- /dev/null +++ b/packages/sfp-cli/messages/org_profile_diff.json @@ -0,0 +1,6 @@ +{ + "commandDescription": "Compare profiles from project against target org or between two orgs (source and target)", + "profileListFlagDescription": "List of profiles to compare, comma separated profile names. If not provided and no sourceusername is provided, all profiles from the source folder will be processed.", + "sourceUsernameDescription": "Source org. If no profile is provided in the profilelist parameter, all the profile from this org will be fetched", + "outputFolderDescription": "Output folder. Provide the output folder if comparing profiles from source org." +} diff --git a/packages/sfp-cli/messages/patch.json b/packages/sfp-cli/messages/patch.json new file mode 100644 index 000000000..ff60ea2e1 --- /dev/null +++ b/packages/sfp-cli/messages/patch.json @@ -0,0 +1,11 @@ +{ + "commandDescription": "[Alpha] Patch a branch in the repository as per the release definition and create a new branch", + "releaseDefinitionFlagDescription": "Path to release definiton yaml", + "sourcebranchNameFlagDescription": "Name of the source branch to be used on which the alignment need to be applied", + "targetbranchNameFlagDescription": "Name of the target branch to be created after the alignment", + "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", + "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", + "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", + "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." +} diff --git a/packages/sfp-cli/messages/pool_delete.json b/packages/sfp-cli/messages/pool_delete.json new file mode 100644 index 000000000..a1ddb8c53 --- /dev/null +++ b/packages/sfp-cli/messages/pool_delete.json @@ -0,0 +1,8 @@ +{ + "commandDescription": "Deletes the pooled scratch orgs from the Scratch Org Pool", + "tagDescription": "tag used to identify the scratch org pool", + "mypoolDescription": "Filter only Scratch orgs created by current user in the pool", + "allscratchorgsDescription": "Deletes all used and unused Scratch orgs from pool by the tag", + "inprogressonlyDescription": "Deletes all In Progress Scratch orgs from pool by the tag", + "recoverOrphanedScratchOrgsDescription": "Recovers scratch orgs that were created by salesforce but were not tagged to sfp due to timeouts etc." +} diff --git a/packages/sfp-cli/messages/prepare.json b/packages/sfp-cli/messages/prepare.json new file mode 100644 index 000000000..1d72f9957 --- /dev/null +++ b/packages/sfp-cli/messages/prepare.json @@ -0,0 +1,8 @@ +{ + "commandDescription": "Prepare a pool of scratchorgs with all the packages upfront, so that any incoming change can be validated in an optimized manner", + "poolConfigFlagDescription": "The path to the configuration file for creating a pool of scratch orgs", + "keysDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", + "apiversion": "API version to be used", + "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to a npm registry when using npm based artifacts. If left blank, defaults to home directory", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." +} diff --git a/packages/sfp-cli/messages/profile_merge.json b/packages/sfp-cli/messages/profile_merge.json new file mode 100644 index 000000000..f477a2467 --- /dev/null +++ b/packages/sfp-cli/messages/profile_merge.json @@ -0,0 +1,7 @@ +{ + "commandDescription": "This command is used in the lower environments such as ScratchOrgs , Development / System Testing Sandboxes, inorder to apply the changes made in the environment to retrieved profile, so that it can be deployed to the higher environments", + "folderFlagDescription": "comma separated list of folders to scan for profiles. If ommited, the folders in the packageDirectories configuration will be used.", + "profileListFlagDescription": "comma separated list of profiles. If ommited, all the profiles found in the folder(s) will be merged", + "metadataFlagDescription": "comma separated list of metadata for which the permissions will be retrieved.", + "deleteFlagDescription": "set this flag to delete profile files that does not exist in the org." +} diff --git a/packages/sfp-cli/messages/profile_reconcile.json b/packages/sfp-cli/messages/profile_reconcile.json new file mode 100644 index 000000000..8248bc9d6 --- /dev/null +++ b/packages/sfp-cli/messages/profile_reconcile.json @@ -0,0 +1,8 @@ +{ + "commandDescription": "This command is used in the lower environments such as ScratchOrgs , Development / System Testing Sandboxes, where a retrieved profile from production has to be cleaned up only for the metadata that is contained in the environment or base it only as per the metadata that is contained in the packaging directory.", + "folderFlagDescription": "path to the folder which contains the profiles to be reconciled,if project contain multiple package directories, please provide a comma seperated list, if omitted, all the package directories will be checked for profiles", + "nameFlagDescription": "list of profiles to be reconciled. If ommited, all the profiles components will be reconciled.", + "destFolderFlagDescription": " the destination folder for reconciled profiles, if omitted existing profiles will be reconciled and will be rewritten in the current location", + "sourceonlyFlagDescription": "set this flag to reconcile profiles only against component available in the project only. Configure ignored perissions in sfdx-project.json file in the array plugins->sfpowerkit->ignoredPermissions.", + "targetorgFlagDescription": " org against which profiles will be reconciled. this parameter can be ommited if sourceonly flag is set." +} diff --git a/packages/sfp-cli/messages/profile_retrieve.json b/packages/sfp-cli/messages/profile_retrieve.json new file mode 100644 index 000000000..e1e31933a --- /dev/null +++ b/packages/sfp-cli/messages/profile_retrieve.json @@ -0,0 +1,7 @@ +{ + "commandDescription": "Retrieve profiles from the salesforce org with all its associated permissions. Common use case for this command is to migrate profile changes from a integration environment to other higher environments [overcomes SFDX CLI Profile retrieve issue where it doesnt fetch the full profile unless the entire metadata is present in source], or retrieving profiles from production to lower environments for testing.", + "folderFlagDescription": "retrieve only updated versions of profiles found in this directory, If ignored, all profiles will be retrieved.", + "profileListFlagDescription": "comma separated list of profiles to be retrieved. Use it for selectively retrieving an existing profile or retrieving a new profile", + "deleteFlagDescription": "set this flag to delete profile files that does not exist in the org, when retrieving in bulk", + "retriveDelayWarning":"Retrieving profiles may take a significant time depending on the number of profiles \nand managed package components installed in your org,Please be patient" +} diff --git a/packages/sfp-cli/messages/promote.json b/packages/sfp-cli/messages/promote.json new file mode 100644 index 000000000..f231de543 --- /dev/null +++ b/packages/sfp-cli/messages/promote.json @@ -0,0 +1,7 @@ +{ + "commandDescription": "Promotes validated unlocked packages with code coverage greater than 75%", + "artifactDirectoryFlagDescription": "The directory where artifacts are located", + "outputDirectoryFlagDescription": "Output directory where promoted artifacts are written", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." +} diff --git a/packages/sfp-cli/messages/publish.json b/packages/sfp-cli/messages/publish.json new file mode 100644 index 000000000..3ef3c9acc --- /dev/null +++ b/packages/sfp-cli/messages/publish.json @@ -0,0 +1,17 @@ +{ + "commandDescription": "Publish packages to an artifact registry, using a user-provided script that is responsible for authenticating & uploading to the registry.", + "artifactDirectoryFlagDescription": "The directory containing artifacts to be published", + "publishPromotedOnlyFlagDescription": "Only publish unlocked packages that have been promoted", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated", + "scriptPathFlagDescription": "Path to script that authenticates and uploaded artifacts to the registry", + "tagFlagDescription": "Tag the publish with a label, useful for identification in metrics", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "gitPushTagFlagDescription": "Pushes the git tags created by this command to the repo, ensure you have access to the repo", + "npmFlagDescription": "Upload artifacts to a pre-authenticated private npm registry", + "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", + "npmTagFlagDescription": "Add an optional distribution tag to NPM packages. If not provided, the 'latest' tag is set to the published version.", + "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "gitTagAgeFlagDescription": "Specifies the number of days,for a tag to be retained,any tags older the provided number will be deleted", + "gitTagLimitFlagDescription": "Specifies the minimum number of tags to be retained for a package" +} diff --git a/packages/sfp-cli/messages/quickbuild.json b/packages/sfp-cli/messages/quickbuild.json new file mode 100644 index 000000000..700b8dcbc --- /dev/null +++ b/packages/sfp-cli/messages/quickbuild.json @@ -0,0 +1,17 @@ +{ + "commandDescription": "Build packages (unlocked/source/data) in a repo in parallel, without validating depenencies or coverage in the case of unlocked packages", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", + "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", + "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", + "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", + "buildNumberFlagDescription": "The build number to be used for source packages, Unlocked Packages will be assigned the buildnumber from Saleforce directly if using .NEXT", + "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", + "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", + "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", + "waitTimeFlagDescription": "Wait time for command to finish in minutes", + "executorCountFlagDescription": "Number of parallel package task schedulors", + "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", + "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "releaseConfigFileFlagDescription":"Path to the release config file which determines what packages should be built" +} diff --git a/packages/sfp-cli/messages/release.json b/packages/sfp-cli/messages/release.json new file mode 100644 index 000000000..dfe21fdc9 --- /dev/null +++ b/packages/sfp-cli/messages/release.json @@ -0,0 +1,19 @@ +{ + "commandDescription": "Release a collection of artifacts as defined in the release definition file", + "releaseDefinitionFlagDescription": "Path to release definiton yaml, Multiple paths can be seperated by commas", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", + "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", + "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", + "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "tagFlagDescription": "Tag the release with a label, useful for identification in metrics", + "dryRunFlagDescription": "Perform dry-run of release. No artifacts are deployed to the target org.", + "waitTimeFlagDescription": "Wait time for package installation", + "keysFlagDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", + "generateChangelogFlagDescription": "Create a release changelog", + "allowUnpromotedPackagesFlagDescription": "Allow un-promoted packages to be installed in production", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg", + "directoryFlagDescription": "Relative path to directory to which the changelog should be generated, if the directory doesnt exist, it will be created", + "branchNameFlagDescription": "Repository branch in which the changelog files are located" +} diff --git a/packages/sfp-cli/messages/releasedefinition_generate.json b/packages/sfp-cli/messages/releasedefinition_generate.json new file mode 100644 index 000000000..c8f314871 --- /dev/null +++ b/packages/sfp-cli/messages/releasedefinition_generate.json @@ -0,0 +1,10 @@ +{ + "commandDescription": "Generates release definition based on the artifacts installed from a commit reference", + "configFileFlagDescription":"Path to the config file which determines how the release definition should be generated", + "releaseNameFlagDescription": "Set a release name on the release definition file created", + "commitFlagDescription": "Utilize the tags on the source branch to generate release definiton", + "directoryFlagDescription": "Relative path to directory to which the release definition file should be generated, if the directory doesnt exist, it will be created", + "branchNameFlagDescription": "Repository branch in which the release definition files are to be written", + "noPushFlagDescription":"Do not push the changelog to a repository to the provided branch", + "forcePushFlagDescription": "Force push changes to the repository branch" +} diff --git a/packages/sfp-cli/messages/scratchorg_poolFetch.json b/packages/sfp-cli/messages/scratchorg_poolFetch.json new file mode 100644 index 000000000..c147fc7db --- /dev/null +++ b/packages/sfp-cli/messages/scratchorg_poolFetch.json @@ -0,0 +1,9 @@ +{ + "commandDescription": "Gets an active/unused scratch org from the scratch org pool", + "tagDescription": "(required) tag used to identify the scratch org pool", + "mypoolDescription": "Filter the tag for any additions created by the executor of the command", + "sendToUserDescription": "Send the credentials of the fetched scratchorg to another DevHub user, Useful for situations when pool is only limited to certain users", + "aliasDescription": "Fetch and set an alias for the org", + "setdefaultusernameDescription": "set the authenticated org as the default username that all commands run against", + "noSourceTrackingDescription": "Do not set source tracking while fetching the scratch org" +} diff --git a/packages/sfp-cli/messages/scratchorg_pool_metrics_publish.json b/packages/sfp-cli/messages/scratchorg_pool_metrics_publish.json new file mode 100644 index 000000000..7d1e92a5a --- /dev/null +++ b/packages/sfp-cli/messages/scratchorg_pool_metrics_publish.json @@ -0,0 +1,3 @@ +{ + "commandDescription": "Publish metrics about scratch org pools to your observability platform, via StatsD or direct APIs for supported platforms" +} diff --git a/packages/sfp-cli/messages/scratchorg_pool_org_delete.json b/packages/sfp-cli/messages/scratchorg_pool_org_delete.json new file mode 100644 index 000000000..76473d692 --- /dev/null +++ b/packages/sfp-cli/messages/scratchorg_pool_org_delete.json @@ -0,0 +1,4 @@ +{ + "commandDescription": "Deletes a particular scratch org in the pool, This command is to be used in a pipeline with correct permissions to delete any active scratch org record or to be used by an adminsitrator", + "userNameFlagDescription": "Username of the scratchOrg to be deleted, not aliases" +} diff --git a/packages/sfp-cli/messages/scratchorg_poollist.json b/packages/sfp-cli/messages/scratchorg_poollist.json new file mode 100644 index 000000000..f6ef11702 --- /dev/null +++ b/packages/sfp-cli/messages/scratchorg_poollist.json @@ -0,0 +1,6 @@ +{ + "commandDescription": "Retrieves a list of active scratch org and details from any pool. If this command is run with -m|--mypool, the command will retrieve the passwords for the pool created by the user who is executing the command.", + "tagDescription": "tag used to identify the scratch org pool", + "mypoolDescription": "Filter the tag for any additions created by the executor of the command", + "allscratchorgsDescription": "Gets all used and unused Scratch orgs from pool" +} diff --git a/packages/sfp-cli/messages/trigger_apex_test.json b/packages/sfp-cli/messages/trigger_apex_test.json new file mode 100644 index 000000000..515045ad7 --- /dev/null +++ b/packages/sfp-cli/messages/trigger_apex_test.json @@ -0,0 +1,13 @@ +{ + "commandDescription": "Triggers Apex unit test in an org. Supports test level RunAllTestsInPackage, which optionally allows validation of individual class code coverage", + "targetOrgFlagDescription": "username or alias for the target org; overrides default target org", + "testLevelFlagDescription": "The test level of the test that need to be executed when the code is to be deployed", + "packageFlagDescription": "Name of the package to run tests. Required when test level is RunAllTestsInPackage", + "synchronousFlagDescription": "Select an option if the tests are to be run synchronously", + "specifiedTestsFlagDescription": "comma-separated list of Apex test class names or IDs and, if applicable, test methods to run", + "apexTestSuiteFlagDescription": "comma-separated list of Apex test suite names to run", + "validateIndividualClassCoverageFlagDescription": "Validate that individual classes have a coverage greater than the minimum required percentage coverage, only available when test level is RunAllTestsInPackage", + "validatePackageCoverageFlagDescription": "Validate that the package coverage is greater than the minimum required percentage coverage, only available when test level is RunAllTestsInPackage", + "coveragePercentFlagDescription": "Minimum required percentage coverage, when validating code coverage", + "waitTimeFlagDescription": "wait time for command to finish in minutes" +} diff --git a/packages/sfp-cli/messages/validate.json b/packages/sfp-cli/messages/validate.json new file mode 100644 index 000000000..d39050221 --- /dev/null +++ b/packages/sfp-cli/messages/validate.json @@ -0,0 +1,26 @@ +{ + "commandDescription": "Validate the incoming change against an earlier prepared scratchorg", + "devhubUsernameFlagDescription": "Authentication username for Dev Hub", + "poolsFlagDescription": "Fetch scratch-org validation environment from one of listed pools, sequentially", + "configFileFlagDescription":"(Required if the release modes are ff-relese-config or thorough-release-config), Path to the config file which determines how the release defintion should be generated", + "jwtKeyFileFlagDescription": "Path to a file containing the private key", + "clientIdFlagDescription": "OAuth client ID, also known as the consumer key", + "shapeFileFlagDescription": "Path to .zip file of scratch org shape / metadata to deploy", + "coveragePercentFlagDescription": "Minimum required percentage coverage for validating code coverage of packages with Apex classes", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "deleteScratchOrgFlagDescription": "Delete scratch-org validation environment, after the command has finished running", + "keysFlagDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", + "visualizeChangesAgainstFlagDescription": "Branch to conduct change analysis against. Enables visualization of changes and the components affected", + "baseBranchFlagDescription": "The pull request base branch", + "enableImpactAnalysisFlagDescription": "Visualize components impacted by changes in pull request", + "enableDependencyValidation": "Validate dependencies between packages for changed components", + "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", + "disableDiffCheckFlagDescription": "Disables diff check while validating, this will validate all the packages in the repository", + "disableArtifactUpdateFlagDescription": "Do not update information about deployed artifacts to the org", + "fastfeedbackFlagDescription": "Enable validation in fast feedback mode, In fast feedback mode, validation will only do selective deployment of and selective tests", + "orgInfoFlagDescription": "Display info about the org that is used for validation", + "installDepsFlagDescription":"Install dependencies during fast feedback", + "disableSourcePackageOverride": "Disables overriding unlocked package installation as source package installation during validate", + "disableParallelTestingFlagDescription": "Disable test execution in parallel, this will execute apex tests in serial" + +} diff --git a/packages/sfp-cli/messages/validateAgainstOrg.json b/packages/sfp-cli/messages/validateAgainstOrg.json new file mode 100644 index 000000000..395d98d4f --- /dev/null +++ b/packages/sfp-cli/messages/validateAgainstOrg.json @@ -0,0 +1,16 @@ +{ + "commandDescription": "Validate the incoming change against target org", + "targetOrgFlagDescription": "Alias/User Name of the target environment", + "coveragePercentFlagDescription": "Minimum required percentage coverage for validating code coverage of packages with Apex classes", + "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", + "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", + "disableArtifactUpdateFlagDescription": "Do not update information about deployed artifacts to the org", + "baseBranchFlagDescription": "The pull request base branch", + "fastfeedbackFlagDescription": "Enable validation in fast feedback mode, In fast feedback mode, validation will only do selective deployment of changed components and selective tests", + "configFileFlagDescription":"(Required if the release modes are ff-relese-config or thorough-release-config), Path to the config file which determines how the release defintion should be generated", + "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, used for installing or updating dependency in individual/thorough modes", + "disableSourcePackageOverride": "Disables overriding unlocked package installation as source package installation during validate", + "disableParallelTestingFlagDescription": "Disable test execution in parallel, this will execute apex tests in serial", + "installDepsFlagDescription":"Install dependencies during fast feedback", + "orgInfoFlagDescription": "Display info about the org that is used for validation" +} diff --git a/packages/sfp-cli/messages/validate_apex_coverage.json b/packages/sfp-cli/messages/validate_apex_coverage.json new file mode 100644 index 000000000..3ba698ad0 --- /dev/null +++ b/packages/sfp-cli/messages/validate_apex_coverage.json @@ -0,0 +1,5 @@ +{ + "commandDescription": "Validates apex test coverage in the org, Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task.", + "targetOrgFlagDescription": "Alias or username of the target org", + "testCoverageFlagDescription": "The percentage of test coverage for apex clasess, that should be as per the last test run status" +} diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json new file mode 100644 index 000000000..c65d9f6bb --- /dev/null +++ b/packages/sfp-cli/package.json @@ -0,0 +1,177 @@ +{ + "name": "@flxblio/sfp", + "description": "Flxbl Toolkit", + "version": "1.0.0", + "license": "MIT", + "author": "flxblio", + "release": "January 24", + "bin": { + "sfp": "./bin/run" + }, + "bugs": "https://github.com/flxblio/sfp/issues", + "dependencies": { + "@flxblio/apexlink": "^1.0.2", + "@newrelic/telemetry-sdk": "^0.6.0", + "@salesforce/apex-node": "2.1.0", + "@salesforce/packaging": "2.3.3", + "@salesforce/source-deploy-retrieve": "9.7.24", + "@salesforce/source-tracking": "4.2.16", + "apex-parser": "2.13.0", + "axios": "^1.4.0", + "datadog-metrics": "^0.9.3", + "fast-xml-parser": "4.2.7", + "hot-shots": "^8.5.0", + "ignore": "^5.1.6", + "tar": "^6.1.9", + "tmp": "^0.2.1", + "xml2js": "^0.6.0", + "@flxblio/sfdx-process-wrapper": "^1.0.2", + "@flxblio/sfp-logger": "^2.1.2", + "@flxblio/sfprofiles": "^2.0.8", + "@oclif/core": "2.11.8", + "@oclif/plugin-commands": "^3.0.3", + "@oclif/plugin-help": "5.2.17", + "@salesforce/core": "5.3.9", + "@salesforce/kit": "3.0.13", + "adm-zip": "^0.5.10", + "ajv": "8.11.0", + "async-retry": "^1.3.1", + "bottleneck": "^2.19.5", + "chalk": "^4.1.2", + "cli-table": "0.3.11", + "dotenv": "16.3.1", + "fs-extra": "^11.1.1", + "glob": "^10.3.3", + "handlebars": "^4.7.7", + "js-yaml": "^4.0.0", + "jsforce": "2.0.0-beta.27", + "lodash": "^4.17.21", + "markdown-table": "^2.0.0", + "markdown-table-ts": "^1.0.3", + "marked": "4.0.16", + "marked-terminal": "5.1.1", + "neverthrow": "4.4.2", + "object-hash": "^2.1.1", + "rimraf": "^5.0.1", + "semver": "7.5.2", + "simple-git": "3.19.1" + }, + "devDependencies": { + "@babel/core": "7.18.2", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", + "@babel/plugin-proposal-optional-chaining": "7.17.12", + "@jest/globals": "^29.6.1", + "@oclif/plugin-command-snapshot": "^3", + "@oclif/test": "^2", + "@salesforce/dev-config": "3.0.1", + "@salesforce/ts-sinon": "^1.3.21", + "@salesforce/ts-types": "2.0.5", + "@types/adm-zip": "^0.4.33", + "@types/jest": "^29.5.3", + "@types/js-yaml": "^4.0.5", + "@types/marked": "4.0.2", + "jest": "^29.6.1", + "oclif": "^3.10.0", + "ts-jest": "29.1.1", + "ts-node": "10.7.0", + "@types/fs-extra": "11.0.4", + "typescript": "^5" + }, + "engines": { + "node": ">=16.0.0" + }, + "files": [ + "/lib", + "/messages", + "/npm-shrinkwrap.json", + "/scripts", + "/resources", + "/oclif.manifest.json" + ], + "homepage": "https://github.com/flxblio/sfp", + "keywords": [ + "flxblio", + "sfp-cli", + "sfdx", + "salesforce", + "sf", + "orchestrator" + ], + "oclif": { + "commands": "./lib/commands", + "topics": { + "releasedefinition": { + "description": "Commands around release definition" + }, + "orchestrator": { + "description": "Orchestrate packages from a monorepo through its lifecycle, driven by descriptors in your sfdx-project.json" + }, + "pool": { + "description": "Manage the pooled orgs created by the sfp orchestrator in prepare stage" + }, + "changelog": { + "description": "Track your artifacts & user stories as they progress through different environments, with release changelogs" + }, + "package": { + "description": "Work with various types of packages such as unlocked/source/data/delta individually", + "subtopics": { + "data": { + "description": "Commands to create and install data packages (sfdmu)" + }, + "unlocked": { + "description": "Commands to create and install unlocked packages" + }, + "source": { + "description": "Commands to create and install sfp source packages" + } + } + }, + "impact": { + "description": "Figures out the impact of various components of sfp", + "external": true + }, + "analyze": { + "description": "Analyze your projects using static analysis tools such as PMD", + "external": true + }, + "apextests": { + "description": "Trigger Apex Tests and validate apex tests in a package" + }, + "repo": { + "description": "Commands to help with maintaing repository" + }, + "dependency": { + "description": "Commands to help with dependency management of a project", + "subtopics": { + "expand": { + "description": "Expand the dependency list in sfdx-project.json file for each package, fix the gap of dependencies from its dependent packages" + }, + "shrink": { + "description": "Shrink the dependency list in sfdx-project.json file for each package, remove duplicate dependencies that already exist in its dependent packages" + }, + "install": { + "description": "Install all the external dependencies of a given project" + } + } + } + }, + "plugins": [ + "@oclif/plugin-help", + "@oclif/plugin-commands" + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/flxblio/sfp.git", + "directory": "packages/sfp-cli" + }, + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "manifest": "oclif manifest", + "clean": "rimraf ./lib && rimraf tsconfig.tsbuildinfo", + "compile": "tsc -b tsconfig.json", + "snyk-protect": "snyk protect", + "test": "FORCE_COLOR=true jest --silent --verbose --coverage --detectOpenHandles" + }, + "snyk": true +} diff --git a/packages/sfp-cli/resources/metadatainfo.json b/packages/sfp-cli/resources/metadatainfo.json new file mode 100644 index 000000000..abcbaba65 --- /dev/null +++ b/packages/sfp-cli/resources/metadatainfo.json @@ -0,0 +1,1075 @@ +{ + "metadataObjects": [ + { + "directoryName": "installedPackages", + "inFolder": false, + "metaFile": false, + "suffix": "installedPackage", + "xmlName": "InstalledPackage" + }, + { + "childXmlNames": ["CustomLabel"], + "directoryName": "labels", + "inFolder": false, + "metaFile": false, + "suffix": "labels", + "xmlName": "CustomLabels" + }, + { + "directoryName": "staticresources", + "inFolder": false, + "metaFile": true, + "suffix": "resource", + "xmlName": "StaticResource" + }, + { + "directoryName": "scontrols", + "inFolder": false, + "metaFile": true, + "suffix": "scf", + "xmlName": "Scontrol" + }, + { + "directoryName": "certs", + "inFolder": false, + "metaFile": true, + "suffix": "crt", + "xmlName": "Certificate" + }, + { + "directoryName": "messageChannels", + "inFolder": false, + "metaFile": false, + "suffix": "messageChannel", + "xmlName": "LightningMessageChannel" + }, + { + "directoryName": "aura", + "inFolder": false, + "metaFile": false, + "xmlName": "AuraDefinitionBundle" + }, + { + "directoryName": "lwc", + "inFolder": false, + "metaFile": false, + "xmlName": "LightningComponentBundle" + }, + { + "directoryName": "components", + "inFolder": false, + "metaFile": true, + "suffix": "component", + "xmlName": "ApexComponent" + }, + { + "directoryName": "pages", + "inFolder": false, + "metaFile": true, + "suffix": "page", + "xmlName": "ApexPage" + }, + { + "directoryName": "queues", + "inFolder": false, + "metaFile": false, + "suffix": "queue", + "xmlName": "Queue" + }, + { + "directoryName": "CaseSubjectParticles", + "inFolder": false, + "metaFile": false, + "suffix": "CaseSubjectParticle", + "xmlName": "CaseSubjectParticle" + }, + { + "directoryName": "dataSources", + "inFolder": false, + "metaFile": false, + "suffix": "dataSource", + "xmlName": "ExternalDataSource" + }, + { + "directoryName": "namedCredentials", + "inFolder": false, + "metaFile": false, + "suffix": "namedCredential", + "xmlName": "NamedCredential" + }, + { + "directoryName": "externalServiceRegistrations", + "inFolder": false, + "metaFile": false, + "suffix": "externalServiceRegistration", + "xmlName": "ExternalServiceRegistration" + }, + { + "directoryName": "roles", + "inFolder": false, + "metaFile": false, + "suffix": "role", + "xmlName": "Role" + }, + { + "directoryName": "groups", + "inFolder": false, + "metaFile": false, + "suffix": "group", + "xmlName": "Group" + }, + { + "directoryName": "globalValueSets", + "inFolder": false, + "metaFile": false, + "suffix": "globalValueSet", + "xmlName": "GlobalValueSet" + }, + { + "directoryName": "standardValueSets", + "inFolder": false, + "metaFile": false, + "suffix": "standardValueSet", + "xmlName": "StandardValueSet" + }, + { + "directoryName": "customPermissions", + "inFolder": false, + "metaFile": false, + "suffix": "customPermission", + "xmlName": "CustomPermission" + }, + { + "childXmlNames": [ + "CustomField", + "Index", + "BusinessProcess", + "RecordType", + "CompactLayout", + "WebLink", + "ValidationRule", + "SharingReason", + "ListView", + "FieldSet" + ], + "directoryName": "objects", + "inFolder": false, + "metaFile": false, + "suffix": "object", + "xmlName": "CustomObject" + }, + { + "directoryName": "reportTypes", + "inFolder": false, + "metaFile": false, + "suffix": "reportType", + "xmlName": "ReportType" + }, + { + "directoryName": "reports", + "inFolder": true, + "metaFile": false, + "suffix": "report", + "xmlName": "Report" + }, + { + "directoryName": "dashboards", + "inFolder": true, + "metaFile": false, + "suffix": "dashboard", + "xmlName": "Dashboard" + }, + { + "directoryName": "analyticSnapshots", + "inFolder": false, + "metaFile": false, + "suffix": "snapshot", + "xmlName": "AnalyticSnapshot" + }, + { + "directoryName": "feedFilters", + "inFolder": false, + "metaFile": false, + "suffix": "feedFilter", + "xmlName": "CustomFeedFilter" + }, + { + "directoryName": "layouts", + "inFolder": false, + "metaFile": false, + "suffix": "layout", + "xmlName": "Layout" + }, + { + "directoryName": "documents", + "inFolder": true, + "metaFile": true, + "suffix": "document", + "xmlName": "Document" + }, + { + "directoryName": "weblinks", + "inFolder": false, + "metaFile": false, + "suffix": "weblink", + "xmlName": "CustomPageWebLink" + }, + { + "directoryName": "letterhead", + "inFolder": false, + "metaFile": false, + "suffix": "letter", + "xmlName": "Letterhead" + }, + { + "directoryName": "email", + "inFolder": true, + "metaFile": true, + "suffix": "email", + "xmlName": "EmailTemplate" + }, + { + "directoryName": "quickActions", + "inFolder": false, + "metaFile": false, + "suffix": "quickAction", + "xmlName": "QuickAction" + }, + { + "directoryName": "flexipages", + "inFolder": false, + "metaFile": false, + "suffix": "flexipage", + "xmlName": "FlexiPage" + }, + { + "directoryName": "tabs", + "inFolder": false, + "metaFile": false, + "suffix": "tab", + "xmlName": "CustomTab" + }, + { + "directoryName": "customApplicationComponents", + "inFolder": false, + "metaFile": false, + "suffix": "customApplicationComponent", + "xmlName": "CustomApplicationComponent" + }, + { + "directoryName": "applications", + "inFolder": false, + "metaFile": false, + "suffix": "app", + "xmlName": "CustomApplication" + }, + { + "directoryName": "customMetadata", + "inFolder": false, + "metaFile": false, + "suffix": "md", + "xmlName": "CustomMetadata" + }, + { + "directoryName": "flows", + "inFolder": false, + "metaFile": false, + "suffix": "flow", + "xmlName": "Flow" + }, + { + "directoryName": "flowDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "flowDefinition", + "xmlName": "FlowDefinition" + }, + { + "childXmlNames": [ + "WorkflowFieldUpdate", + "WorkflowKnowledgePublish", + "WorkflowTask", + "WorkflowAlert", + "WorkflowSend", + "WorkflowOutboundMessage", + "WorkflowRule" + ], + "directoryName": "workflows", + "inFolder": false, + "metaFile": false, + "suffix": "workflow", + "xmlName": "Workflow" + }, + { + "childXmlNames": ["AssignmentRule"], + "directoryName": "assignmentRules", + "inFolder": false, + "metaFile": false, + "suffix": "assignmentRules", + "xmlName": "AssignmentRules" + }, + { + "childXmlNames": ["AutoResponseRule"], + "directoryName": "autoResponseRules", + "inFolder": false, + "metaFile": false, + "suffix": "autoResponseRules", + "xmlName": "AutoResponseRules" + }, + { + "childXmlNames": ["EscalationRule"], + "directoryName": "escalationRules", + "inFolder": false, + "metaFile": false, + "suffix": "escalationRules", + "xmlName": "EscalationRules" + }, + { + "directoryName": "postTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "postTemplate", + "xmlName": "PostTemplate" + }, + { + "directoryName": "approvalProcesses", + "inFolder": false, + "metaFile": false, + "suffix": "approvalProcess", + "xmlName": "ApprovalProcess" + }, + { + "directoryName": "homePageComponents", + "inFolder": false, + "metaFile": false, + "suffix": "homePageComponent", + "xmlName": "HomePageComponent" + }, + { + "directoryName": "homePageLayouts", + "inFolder": false, + "metaFile": false, + "suffix": "homePageLayout", + "xmlName": "HomePageLayout" + }, + { + "directoryName": "objectTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "objectTranslation", + "xmlName": "CustomObjectTranslation" + }, + { + "directoryName": "objectTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "fieldTranslation", + "xmlName": "CustomFieldTranslation" + }, + { + "directoryName": "translations", + "inFolder": false, + "metaFile": false, + "suffix": "translation", + "xmlName": "Translations" + }, + { + "directoryName": "globalValueSetTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "globalValueSetTranslation", + "xmlName": "GlobalValueSetTranslation" + }, + { + "directoryName": "standardValueSetTranslations", + "inFolder": false, + "metaFile": false, + "suffix": "standardValueSetTranslation", + "xmlName": "StandardValueSetTranslation" + }, + { + "directoryName": "classes", + "inFolder": false, + "metaFile": true, + "suffix": "cls", + "xmlName": "ApexClass" + }, + { + "directoryName": "triggers", + "inFolder": false, + "metaFile": true, + "suffix": "trigger", + "xmlName": "ApexTrigger" + }, + { + "directoryName": "testSuites", + "inFolder": false, + "metaFile": false, + "suffix": "testSuite", + "xmlName": "ApexTestSuite" + }, + { + "directoryName": "profiles", + "inFolder": false, + "metaFile": false, + "suffix": "profile", + "xmlName": "Profile" + }, + { + "directoryName": "permissionsets", + "inFolder": false, + "metaFile": false, + "suffix": "permissionset", + "xmlName": "PermissionSet" + }, + { + "directoryName": "mutingpermissionsets", + "inFolder": false, + "metaFile": false, + "suffix": "mutingpermissionset", + "xmlName": "MutingPermissionSet" + }, + { + "directoryName": "permissionsetgroups", + "inFolder": false, + "metaFile": false, + "suffix": "permissionsetgroup", + "xmlName": "PermissionSetGroup" + }, + { + "directoryName": "profilePasswordPolicies", + "inFolder": false, + "metaFile": false, + "suffix": "profilePasswordPolicy", + "xmlName": "ProfilePasswordPolicy" + }, + { + "directoryName": "profileSessionSettings", + "inFolder": false, + "metaFile": false, + "suffix": "profileSessionSetting", + "xmlName": "ProfileSessionSetting" + }, + { + "directoryName": "myDomainDiscoverableLogins", + "inFolder": false, + "metaFile": false, + "suffix": "myDomainDiscoverableLogin", + "xmlName": "MyDomainDiscoverableLogin" + }, + { + "directoryName": "oauthcustomscopes", + "inFolder": false, + "metaFile": false, + "suffix": "oauthcustomscope", + "xmlName": "OauthCustomScope" + }, + { + "directoryName": "datacategorygroups", + "inFolder": false, + "metaFile": false, + "suffix": "datacategorygroup", + "xmlName": "DataCategoryGroup" + }, + { + "directoryName": "remoteSiteSettings", + "inFolder": false, + "metaFile": false, + "suffix": "remoteSite", + "xmlName": "RemoteSiteSetting" + }, + { + "directoryName": "cspTrustedSites", + "inFolder": false, + "metaFile": false, + "suffix": "cspTrustedSite", + "xmlName": "CspTrustedSite" + }, + { + "directoryName": "redirectWhitelistUrls", + "inFolder": false, + "metaFile": false, + "suffix": "redirectWhitelistUrl", + "xmlName": "RedirectWhitelistUrl" + }, + { + "childXmlNames": ["MatchingRule"], + "directoryName": "matchingRules", + "inFolder": false, + "metaFile": false, + "suffix": "matchingRule", + "xmlName": "MatchingRules" + }, + { + "directoryName": "duplicateRules", + "inFolder": false, + "metaFile": false, + "suffix": "duplicateRule", + "xmlName": "DuplicateRule" + }, + { + "directoryName": "cleanDataServices", + "inFolder": false, + "metaFile": false, + "suffix": "cleanDataService", + "xmlName": "CleanDataService" + }, + { + "directoryName": "skills", + "inFolder": false, + "metaFile": false, + "suffix": "skill", + "xmlName": "Skill" + }, + { + "directoryName": "serviceChannels", + "inFolder": false, + "metaFile": false, + "suffix": "serviceChannel", + "xmlName": "ServiceChannel" + }, + { + "directoryName": "queueRoutingConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "queueRoutingConfig", + "xmlName": "QueueRoutingConfig" + }, + { + "directoryName": "servicePresenceStatuses", + "inFolder": false, + "metaFile": false, + "suffix": "servicePresenceStatus", + "xmlName": "ServicePresenceStatus" + }, + { + "directoryName": "presenceDeclineReasons", + "inFolder": false, + "metaFile": false, + "suffix": "presenceDeclineReason", + "xmlName": "PresenceDeclineReason" + }, + { + "directoryName": "presenceUserConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "presenceUserConfig", + "xmlName": "PresenceUserConfig" + }, + { + "directoryName": "authproviders", + "inFolder": false, + "metaFile": false, + "suffix": "authprovider", + "xmlName": "AuthProvider" + }, + { + "directoryName": "eclair", + "inFolder": false, + "metaFile": true, + "suffix": "geodata", + "xmlName": "EclairGeoData" + }, + { + "directoryName": "sites", + "inFolder": false, + "metaFile": false, + "suffix": "site", + "xmlName": "CustomSite" + }, + { + "directoryName": "channelLayouts", + "inFolder": false, + "metaFile": false, + "suffix": "channelLayout", + "xmlName": "ChannelLayout" + }, + { + "directoryName": "contentassets", + "inFolder": false, + "metaFile": true, + "suffix": "asset", + "xmlName": "ContentAsset" + }, + { + "directoryName": "sites", + "inFolder": false, + "metaFile": false, + "suffix": "site", + "xmlName": "CustomSite" + }, + { + "childXmlNames": ["SharingOwnerRule", "SharingCriteriaRule"], + "directoryName": "sharingRules", + "inFolder": false, + "metaFile": false, + "suffix": "sharingRules", + "xmlName": "SharingRules" + }, + { + "directoryName": "sharingSets", + "inFolder": false, + "metaFile": false, + "suffix": "sharingSet", + "xmlName": "SharingSet" + }, + { + "directoryName": "communities", + "inFolder": false, + "metaFile": false, + "suffix": "community", + "xmlName": "Community" + }, + { + "directoryName": "ChatterExtensions", + "inFolder": false, + "metaFile": false, + "suffix": "ChatterExtension", + "xmlName": "ChatterExtension" + }, + { + "directoryName": "platformEventChannels", + "inFolder": false, + "metaFile": false, + "suffix": "platformEventChannel", + "xmlName": "PlatformEventChannel" + }, + { + "directoryName": "platformEventChannelMembers", + "inFolder": false, + "metaFile": false, + "suffix": "platformEventChannelMember", + "xmlName": "PlatformEventChannelMember" + }, + { + "directoryName": "callCenters", + "inFolder": false, + "metaFile": false, + "suffix": "callCenter", + "xmlName": "CallCenter" + }, + { + "directoryName": "milestoneTypes", + "inFolder": false, + "metaFile": false, + "suffix": "milestoneType", + "xmlName": "MilestoneType" + }, + { + "directoryName": "entitlementProcesses", + "inFolder": false, + "metaFile": false, + "suffix": "entitlementProcess", + "xmlName": "EntitlementProcess" + }, + { + "directoryName": "entitlementTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "entitlementTemplate", + "xmlName": "EntitlementTemplate" + }, + { + "directoryName": "timeSheetTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "timeSheetTemplate", + "xmlName": "TimeSheetTemplate" + }, + { + "directoryName": "Canvases", + "inFolder": false, + "metaFile": false, + "suffix": "Canvas", + "xmlName": "CanvasMetadata" + }, + { + "directoryName": "MobileApplicationDetails", + "inFolder": false, + "metaFile": false, + "suffix": "MobileApplicationDetail", + "xmlName": "MobileApplicationDetail" + }, + { + "directoryName": "notificationtypes", + "inFolder": false, + "metaFile": false, + "suffix": "notiftype", + "xmlName": "CustomNotificationType" + }, + { + "directoryName": "connectedApps", + "inFolder": false, + "metaFile": false, + "suffix": "connectedApp", + "xmlName": "ConnectedApp" + }, + { + "directoryName": "appMenus", + "inFolder": false, + "metaFile": false, + "suffix": "appMenu", + "xmlName": "AppMenu" + }, + { + "directoryName": "notificationTypeConfig", + "inFolder": false, + "metaFile": false, + "suffix": "config", + "xmlName": "NotificationTypeConfig" + }, + { + "directoryName": "delegateGroups", + "inFolder": false, + "metaFile": false, + "suffix": "delegateGroup", + "xmlName": "DelegateGroup" + }, + { + "directoryName": "siteDotComSites", + "inFolder": false, + "metaFile": true, + "suffix": "site", + "xmlName": "SiteDotCom" + }, + { + "directoryName": "experiences", + "inFolder": false, + "metaFile": false, + "xmlName": "ExperienceBundle" + }, + { + "directoryName": "networks", + "inFolder": false, + "metaFile": false, + "suffix": "network", + "xmlName": "Network" + }, + { + "directoryName": "networkBranding", + "inFolder": false, + "metaFile": true, + "suffix": "networkBranding", + "xmlName": "NetworkBranding" + }, + { + "directoryName": "audience", + "inFolder": false, + "metaFile": false, + "suffix": "audience", + "xmlName": "Audience" + }, + { + "directoryName": "brandingSets", + "inFolder": false, + "metaFile": false, + "suffix": "brandingSet", + "xmlName": "BrandingSet" + }, + { + "directoryName": "communityThemeDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "communityThemeDefinition", + "xmlName": "CommunityThemeDefinition" + }, + { + "directoryName": "communityTemplateDefinitions", + "inFolder": false, + "metaFile": false, + "suffix": "communityTemplateDefinition", + "xmlName": "CommunityTemplateDefinition" + }, + { + "directoryName": "navigationMenus", + "inFolder": false, + "metaFile": false, + "suffix": "navigationMenu", + "xmlName": "NavigationMenu" + }, + { + "directoryName": "flowCategories", + "inFolder": false, + "metaFile": false, + "suffix": "flowCategory", + "xmlName": "FlowCategory" + }, + { + "directoryName": "lightningBolts", + "inFolder": false, + "metaFile": false, + "suffix": "lightningBolt", + "xmlName": "LightningBolt" + }, + { + "directoryName": "lightningExperienceThemes", + "inFolder": false, + "metaFile": false, + "suffix": "lightningExperienceTheme", + "xmlName": "LightningExperienceTheme" + }, + { + "directoryName": "lightningOnboardingConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "lightningOnboardingConfig", + "xmlName": "LightningOnboardingConfig" + }, + { + "directoryName": "customHelpMenuSections", + "inFolder": false, + "metaFile": false, + "suffix": "customHelpMenuSection", + "xmlName": "CustomHelpMenuSection" + }, + { + "directoryName": "prompts", + "inFolder": false, + "metaFile": false, + "suffix": "prompt", + "xmlName": "Prompt" + }, + { + "childXmlNames": ["ManagedTopic"], + "directoryName": "managedTopics", + "inFolder": false, + "metaFile": false, + "suffix": "managedTopics", + "xmlName": "ManagedTopics" + }, + { + "directoryName": "moderation", + "inFolder": false, + "metaFile": false, + "suffix": "keywords", + "xmlName": "KeywordList" + }, + { + "directoryName": "userCriteria", + "inFolder": false, + "metaFile": false, + "suffix": "userCriteria", + "xmlName": "UserCriteria" + }, + { + "directoryName": "moderation", + "inFolder": false, + "metaFile": false, + "suffix": "rule", + "xmlName": "ModerationRule" + }, + { + "directoryName": "cmsConnectSource", + "inFolder": false, + "metaFile": false, + "suffix": "cmsConnectSource", + "xmlName": "CMSConnectSource" + }, + { + "directoryName": "managedContentTypes", + "inFolder": false, + "metaFile": false, + "suffix": "managedContentType", + "xmlName": "ManagedContentType" + }, + { + "directoryName": "samlssoconfigs", + "inFolder": false, + "metaFile": false, + "suffix": "samlssoconfig", + "xmlName": "SamlSsoConfig" + }, + { + "directoryName": "corsWhitelistOrigins", + "inFolder": false, + "metaFile": false, + "suffix": "corsWhitelistOrigin", + "xmlName": "CorsWhitelistOrigin" + }, + { + "directoryName": "actionLinkGroupTemplates", + "inFolder": false, + "metaFile": false, + "suffix": "actionLinkGroupTemplate", + "xmlName": "ActionLinkGroupTemplate" + }, + { + "directoryName": "liveChatDeployments", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatDeployment", + "xmlName": "LiveChatDeployment" + }, + { + "directoryName": "liveChatButtons", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatButton", + "xmlName": "LiveChatButton" + }, + { + "directoryName": "liveChatAgentConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatAgentConfig", + "xmlName": "LiveChatAgentConfig" + }, + { + "directoryName": "liveChatSensitiveDataRule", + "inFolder": false, + "metaFile": false, + "suffix": "liveChatSensitiveDataRule", + "xmlName": "LiveChatSensitiveDataRule" + }, + { + "directoryName": "transactionSecurityPolicies", + "inFolder": false, + "metaFile": false, + "suffix": "transactionSecurityPolicy", + "xmlName": "TransactionSecurityPolicy" + }, + { + "directoryName": "synonymDictionaries", + "inFolder": false, + "metaFile": false, + "suffix": "synonymDictionary", + "xmlName": "SynonymDictionary" + }, + { + "directoryName": "pathAssistants", + "inFolder": false, + "metaFile": false, + "suffix": "pathAssistant", + "xmlName": "PathAssistant" + }, + { + "directoryName": "animationRules", + "inFolder": false, + "metaFile": false, + "suffix": "animationRule", + "xmlName": "AnimationRule" + }, + { + "directoryName": "LeadConvertSettings", + "inFolder": false, + "metaFile": false, + "suffix": "LeadConvertSetting", + "xmlName": "LeadConvertSettings" + }, + { + "directoryName": "cachePartitions", + "inFolder": false, + "metaFile": false, + "suffix": "cachePartition", + "xmlName": "PlatformCachePartition" + }, + { + "directoryName": "topicsForObjects", + "inFolder": false, + "metaFile": false, + "suffix": "topicsForObjects", + "xmlName": "TopicsForObjects" + }, + { + "directoryName": "recommendationStrategies", + "inFolder": false, + "metaFile": false, + "suffix": "recommendationStrategy", + "xmlName": "RecommendationStrategy" + }, + { + "directoryName": "emailservices", + "inFolder": false, + "metaFile": false, + "suffix": "xml", + "xmlName": "EmailServicesFunction" + }, + { + "directoryName": "recordActionDeployments", + "inFolder": false, + "metaFile": false, + "suffix": "deployment", + "xmlName": "RecordActionDeployment" + }, + { + "directoryName": "salesAgreementSettings", + "inFolder": false, + "metaFile": false, + "suffix": "salesAgreementSetting", + "xmlName": "SalesAgreementSettings" + }, + { + "directoryName": "AccountForecastSettings", + "inFolder": false, + "metaFile": false, + "suffix": "accountForecastSetting", + "xmlName": "AccountForecastSettings" + }, + { + "directoryName": "icons", + "inFolder": false, + "metaFile": false, + "suffix": "icon", + "xmlName": "Icon" + }, + { + "directoryName": "EmbeddedServiceLiveAgent", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceLiveAgent", + "xmlName": "EmbeddedServiceLiveAgent" + }, + { + "directoryName": "EmbeddedServiceConfig", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceConfig", + "xmlName": "EmbeddedServiceConfig" + }, + { + "directoryName": "EmbeddedServiceBranding", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceBranding", + "xmlName": "EmbeddedServiceBranding" + }, + { + "directoryName": "EmbeddedServiceFlowConfig", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceFlowConfig", + "xmlName": "EmbeddedServiceFlowConfig" + }, + { + "directoryName": "EmbeddedServiceMenuSettings", + "inFolder": false, + "metaFile": false, + "suffix": "EmbeddedServiceMenuSettings", + "xmlName": "EmbeddedServiceMenuSettings" + }, + { + "directoryName": "uiObjectRelationConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "uiObjectRelationConfig", + "xmlName": "UIObjectRelationConfig" + }, + { + "directoryName": "careProviderSearchConfigs", + "inFolder": false, + "metaFile": false, + "suffix": "careProviderSearchConfig", + "xmlName": "CareProviderSearchConfig" + }, + { + "directoryName": "settings", + "inFolder": false, + "metaFile": false, + "suffix": "settings", + "xmlName": "Settings" + } + ], + "organizationNamespace": "", + "partialSaveAllowed": false, + "testRequired": true +} diff --git a/packages/sfp-cli/resources/schemas/pooldefinition.schema.json b/packages/sfp-cli/resources/schemas/pooldefinition.schema.json new file mode 100644 index 000000000..b3102e17d --- /dev/null +++ b/packages/sfp-cli/resources/schemas/pooldefinition.schema.json @@ -0,0 +1,147 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json", + "title": "pool definition", + "description": "The definition for creating a pool of scratch orgs in sfp", + "type": "object", + "required": ["tag", "maxAllocation"], + "additionalProperties": false, + "properties": { + "$schema": { + "description": "Support editors like vscode to help with IntelliSense", + "type": "string", + "default": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json" + }, + "tag": { + "title": "Tag of the pool", + "description": "Tag or name to identify the scratch org pool", + "type": "string" + }, + "waitTime": { + "title": "wait time", + "description": "Time to wait for scratch org creation in minutes (default:6 mins)", + "type": "integer", + "default": 6 + }, + "expiry": { + "title": "expiry", + "description": "Duration of the scratch org (in days) (default:2)", + "type": "integer", + "default": 2 + }, + "maxAllocation": { + "title": "Max number of scratch orgs to be allocated", + "description": "Maximum number of scratch orgs to be allocated in the pool", + "type": "integer" + }, + "batchSize": { + "title": "Batch Size", + "description": "Control the parallelism of the pool creation (default:5)", + "type": "integer", + "default": 5 + }, + "configFilePath": { + "title": "Path to config file", + "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition.", + "type": "string", + "default": "config/project-scratch-def.json" + }, + "releaseConfigFile": { + "title": "Path to release config file", + "description": "Path to the config file which determines how a release defintion should be generated, enable this for pools to use this release config to only utilize artifacts described the releae config", + "type": "string" + }, + "succeedOnDeploymentErrors": { + "title": "Succeed on Deployment Errors", + "description": "In case of a deployment error, whether to keep that scratch org in the pool", + "type": "boolean", + "default": true + }, + "installAll": { + "title": "Install all packages", + "description": "Install all package artifacts, in addition to the managed package dependencies", + "type": "boolean", + "default": false + }, + "enableVlocity": { + "title": "Enable vlocity config deployment", + "description": "[alpha] Enable vlocity settings and config deployment. Please note it doesnt install vlocity managed package", + "type": "boolean", + "default": "false" + }, + "enableSourceTracking": { + "title": "Enable source tracking", + "description": "Enable source tracking by deploying packages using source:push , and persisting local source tracking files", + "type": "boolean", + "default": true + }, + "relaxAllIPRanges": { + "title": "Relax all IP Ranges", + "description": "Relax all IP addresses to enable developers to login to scratch orgs", + "type": "boolean", + "default": "false" + }, + "ipRangesToBeRelaxed": { + "title": "IP ranges to be relaxed", + "description": "Relax IP address of developers to allow access to scratch orgs", + "type": "array" + }, + "retryOnFailure": { + "title": "Retry on failure", + "description": "Retry installation of packages on failed deployment", + "type": "boolean", + "default": "false" + }, + "maxRetryCount": { + "title": "Max Retry Count", + "description": "Maximum number of attempts sfp should retry installation of packages on failed deployment", + "type": "number", + "default": "2" + }, + "snapshotPool": { + "title": "Snapshot Pool", + "description": "Use a pre-prepared pool to further add packages on top of it", + "type": "string" + }, + "postDeploymentScriptPath": { + "title": "Post Script", + "description": "Execute a custom script after all the artifacts are deployed into a particular org", + "type": "string" + }, + "preDependencyInstallationScriptPath": { + "title": "Pre Script", + "description": "Execute a custom script before denpendencies install into a particular org", + "type": "string" + }, + "disableSourcePackageOverride": { + "title": "Disable installation of unlocked packages as source package", + "description": "Prepare by default utilizes source package for installing unlocked packages to the scratchorg, disabling this flag will allow to install it ", + "type": "boolean", + "default":false + }, + "fetchArtifacts": { + "title": "Fetch Artifacts using below mechanism", + "description": "Fetch artifacts from artifact registry using below mechanism", + "type": "object", + "oneOf": [{ "required": ["artifactFetchScript"] }, { "required": ["npm"] }], + "properties": { + "artifactFetchScript": { + "title": "Path to the script for fetching artifacts", + "description": "Path to Shell script that handles fetching artifacts from a registry", + "type": "string" + }, + "npm": { + "type": "object", + "required": ["scope"], + "properties": { + "scope": { + "title": "Scope of NPM packages", + "description": "Scope of NPM packages", + "type": "string" + } + } + } + } + } + } +} diff --git a/packages/sfp-cli/resources/schemas/releasedefinition.schema.json b/packages/sfp-cli/resources/schemas/releasedefinition.schema.json new file mode 100644 index 000000000..7a9071925 --- /dev/null +++ b/packages/sfp-cli/resources/schemas/releasedefinition.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", + "title": "release definition", + "description": "The definition for a release using sfp orchestrator", + "type": "object", + "required": ["release", "artifacts"], + "additionalProperties": false, + "dependencies": { + "baselineOrg": ["skipIfAlreadyInstalled"] + }, + "properties": { + "release": { + "type": "string" + }, + "skipIfAlreadyInstalled": { + "type": "boolean" + }, + "skipArtifactUpdate": { + "type": "boolean" + }, + "baselineOrg": { + "type": "string" + }, + "artifacts": { + "type": "object", + "patternProperties": { + ".+": { + "type": "string" + } + } + }, + "packageDependencies": { + "type": "object", + "patternProperties": { + ".+": { + "type": "string", + "pattern": "^04t([a-zA-Z0-9]{15}|[a-zA-Z0-9]{12})$" + } + } + }, + "promotePackagesBeforeDeploymentToOrg": { + "type": "string" + }, + "changelog": { + "type": "object", + "properties": { + "workItemFilter": { + "type": "string", + "title": "Support legacy workItemFilter which supports only one single regex pattern" + }, + "workItemFilters": { + "type": "array", + "title": "Regex to filter workitems from commit messages", + "items": { + "type": "string" + } + }, + "workItemUrl": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "showAllArtifacts": { + "type": "boolean" + } + }, + "oneOf": [{ "required": ["workItemFilter"] }, { "required": ["workItemFilters"] }], + "additionalProperties": false + } + } +} diff --git a/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json b/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json new file mode 100644 index 000000000..9b9c4372d --- /dev/null +++ b/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json @@ -0,0 +1,101 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", + "title": "release definition generator", + "description": "The definition for generating a release defintion using generator command", + "type": "object", + "additionalProperties": true, + "dependencies": { + "baselineOrg": ["skipIfAlreadyInstalled"] + }, + "properties": { + "excludeArtifacts": { + "type": "array", + "title": "Exclude the below artifacts while creating a release definition", + "items": { + "type": "string" + } + }, + "includeOnlyArtifacts": { + "type": "array", + "title": "Include the below artifacts while creating a release definition", + "items": { + "type": "string" + } + }, + "excludeArtifactsWithTag": { + "type": "array", + "title": "Exclude any artifacts that have the following tags", + "items": { + "type": "string" + } + }, + "excludePackageDependencies": { + "type": "array", + "title": "Exclude the below external package dependencies while creating a release definition", + "items": { + "type": "string" + } + }, + "excludeAllPackageDependencies": { + "type": "boolean", + "title": "Exclude all external package dependencies while creating a release definition" + }, + "includeOnlyPackageDependencies": { + "type": "array", + "title": "Include only the below external package dependencies while creating a release definition", + "items": { + "type": "string" + } + }, + "dependencyOn": { + "type": "array", + "title": "Include the below artifacts as dependencies of this release definition,usefor for validation", + "items": { + "type": "string" + } + }, + "releasedefinitionProperties":{ + "type": "object", + "title": "Properties that need to be set in the generated definition file", + "additionalProperties": true, + "properties": { + "skipIfAlreadyInstalled": { + "type": "boolean" + }, + "skipArtifactUpdate": { + "type": "boolean" + }, + "baselineOrg": { + "type": "string" + }, + "promotePackagesBeforeDeploymentToOrg": { + "type": "string" + }, + "changelog": { + "type": "object", + "properties": { + "workItemFilters": { + "type": "array", + "title": "Regex to filter workitems from commit messages", + "items": { + "type": "string" + } + }, + "workItemUrl": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "showAllArtifacts": { + "type": "boolean" + } + }, + "required": ["workItemFilters"], + "additionalProperties": false + } + } + } + } +} diff --git a/packages/sfp-cli/resources/schemas/sfdx-project.schema.json b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json new file mode 100644 index 000000000..db002e40b --- /dev/null +++ b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json @@ -0,0 +1,654 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/sfdx-project.schema.json", + "title": "sfp DX Project File", + "description": "The properties and shape of the SFDX project enhanced for sfp", + "type": "object", + "additionalProperties": true, + "required": [ + "packageDirectories" + ], + "properties": { + "$schema": { + "description": "Support editors like vscode to help with IntelliSense", + "type": "string", + "default": "https://raw.githubusercontent.com/flxblio/sfp/main/packages/sfp-cli/resources/schemas/sfdx-project.schema.json" + }, + "packageDirectories": { + "title": "Package Directories", + "type": "array", + "description": "Package directories indicate which directories to target when syncing source to and from the scratch org. These directories can contain source from your managed package, unmanaged package, or unpackaged source, for example, ant tool or change set.", + "$comment": "The properties ancestorId & ancestorVersion cannot be included together, but this schema optimizes for VS Code code completion rather than pure validation.", + "minItems": 1, + "items": { + "type": "object", + "dependencies": { + "ancestorId": [ + "package", + "versionNumber" + ], + "ancestorVersion": [ + "package", + "versionNumber" + ], + "apexTestAccess": [ + "package", + "versionNumber" + ], + "definitionFile": [ + "package", + "versionNumber" + ], + "dependencies": [ + "package", + "versionNumber" + ], + "package": [ + "versionNumber" + ], + "postInstallUrl": [ + "package", + "versionNumber" + ], + "unpackagedMetadata": [ + "package", + "versionNumber" + ], + "releaseNotesUrl": [ + "package", + "versionNumber" + ], + "seedMetadata": [ + "package", + "versionNumber" + ], + "versionDescription": [ + "package", + "versionNumber" + ], + "versionName": [ + "package", + "versionNumber" + ], + "versionNumber": [ + "package" + ], + "branch": [ + "package" + ] + }, + "required": [ + "path" + ], + "additionalProperties": false, + "properties": { + "ancestorId": { + "$ref": "#/definitions/packageDirectory.ancestorId" + }, + "ancestorVersion": { + "$ref": "#/definitions/packageDirectory.ancestorVersion" + }, + "apexTestAccess": { + "$ref": "#/definitions/packageDirectory.apexTestAccess" + }, + "default": { + "$ref": "#/definitions/packageDirectory.default" + }, + "definitionFile": { + "$ref": "#/definitions/packageDirectory.definitionFile" + }, + "dependencies": { + "$ref": "#/definitions/packageDirectory.dependencies" + }, + "includeProfileUserLicenses": { + "$ref": "#/definitions/packageDirectory.includeProfileUserLicenses" + }, + "package": { + "$ref": "#/definitions/packageDirectory.package" + }, + "path": { + "$ref": "#/definitions/packageDirectory.path" + }, + "postInstallUrl": { + "$ref": "#/definitions/packageDirectory.postInstallUrl" + }, + "unpackagedMetadata": { + "$ref": "#/definitions/packageDirectory.unpackagedMetadata" + }, + "releaseNotesUrl": { + "$ref": "#/definitions/packageDirectory.releaseNotesUrl" + }, + "seedMetadata": { + "$ref": "#/definitions/packageDirectory.seedMetadata" + }, + "versionDescription": { + "$ref": "#/definitions/packageDirectory.versionDescription" + }, + "versionName": { + "$ref": "#/definitions/packageDirectory.versionName" + }, + "versionNumber": { + "$ref": "#/definitions/packageDirectory.versionNumber" + }, + "aliasfy": { + "$ref": "#/definitions/packageDirectory.aliasfy" + }, + "alwaysDeploy": { + "$ref": "#/definitions/packageDirectory.alwaysDeploy" + }, + "assignPermSetsPreDeployment": { + "$ref": "#/definitions/packageDirectory.assignPermSetsPreDeployment" + }, + "assignPermSetsPostDeployment": { + "$ref": "#/definitions/packageDirectory.assignPermSetsPostDeployment" + }, + "buildCollection": { + "$ref": "#/definitions/packageDirectory.buildCollection" + }, + "destructiveChangePath": { + "$ref": "#/definitions/packageDirectory.destructiveChangePath" + }, + "isOptimizedDeployment": { + "$ref": "#/definitions/packageDirectory.isOptimizedDeployment" + }, + "ignoreOnStage": { + "$ref": "#/definitions/packageDirectory.ignoreOnStage" + }, + "postDeploymentScript": { + "$ref": "#/definitions/packageDirectory.postDeploymentScript" + }, + "preDeploymentScript": { + "$ref": "#/definitions/packageDirectory.preDeploymentScript" + }, + "reconcileProfiles": { + "$ref": "#/definitions/packageDirectory.reconcileProfiles" + }, + "type": { + "$ref": "#/definitions/packageDirectory.type" + }, + "skipCoverageValidation": { + "$ref": "#/definitions/packageDirectory.skipCoverageValidation" + }, + "tags": { + "$ref": "#/definitions/packageDirectory.tags" + }, + "testSynchronous": { + "$ref": "#/definitions/packageDirectory.testSynchronous" + }, + "skipDeployOnOrgs": { + "$ref": "#/definitions/packageDirectory.skipDeployOnOrgs" + }, + "skipTesting": { + "$ref": "#/definitions/packageDirectory.skipTesting" + }, + "checkpointForPrepare": { + "$ref": "#/definitions/packageDirectory.checkpointForPrepare" + }, + "enableFHT": { + "$ref": "#/definitions/packageDirectory.enableFHT" + }, + "enablePicklist": { + "$ref": "#/definitions/packageDirectory.enablePicklist" + }, + "branch": { + "$ref": "#/definitions/packageDirectory.branch" + } + } + } + }, + "name": { + "title": "name", + "type": "string", + "description": "The name of your Salesforce project." + }, + "namespace": { + "title": "Namespace", + "type": "string", + "description": "The global namespace that is used with a package. The namespace must be registered with an org that is associated with your Dev Hub org. This namespace is assigned to scratch orgs created with the org:create command. If you’re creating an unlocked package, you have the option to create a package with no namespace." + }, + "sourceApiVersion": { + "title": "Source API Version", + "type": "string", + "description": "The API version that the source is compatible with. The default is the same version as the Salesforce CLI.", + "default": "48.0" + }, + "sfdcLoginUrl": { + "title": "SFDC Login URL", + "type": "string", + "description": "The login URL that the force:auth commands use. If not specified, the default is login.salesforce.com. Override the default value if you want users to authorize to a specific Salesforce instance. For example, if you want to authorize into a sandbox org, set this parameter to test.salesforce.com.", + "default": "https://login.salesforce.com" + }, + "signupTargetLoginUrl": { + "type": "string", + "description": "The url that is used when creating new scratch orgs. This is typically only used for testing prerelease environments." + }, + "oauthLocalPort": { + "type": "number", + "description": "By default, the OAuth port is 1717. However, change this port if this port is already in use, and you plan to create a connected app in your Dev Hub org to support JWT-based authorization." + }, + "pushPackageDirectoriesSequentially": { + "type": "boolean", + "description": "Whether to push package directories sequentially. If true, the package directories are pushed in the order they are listed in the project file. By default, the package directories are pushed in one deployment." + }, + "plugins": { + "title": "CLI Plugins custom settings", + "type": "object", + "description": "Salesforce CLI plugin configurations used with this project.", + "additionalProperties": true, + "properties": { + "sfp": { + "$ref": "#/definitions/plugins.sfp" + } + } + }, + "packageAliases": { + "title": "Aliases for packaging ids", + "type": "object", + "description": "The Salesforce CLI updates this file with the aliases when you create a package or package version. You can also manually update this section for existing packages or package versions. You can use the alias instead of the cryptic package ID when running CLI force:package commands.", + "patternProperties": { + "^[ -~]+$": { + "type": "string", + "pattern": "^(0Ho|033|05i|04t)([a-zA-Z0-9]{15}|[a-zA-Z0-9]{12})$" + } + } + } + }, + "definitions": { + "packageDirectory.path": { + "type": "string", + "description": "If you don’t specify a path, the Salesforce CLI uses a placeholder when you create a package." + }, + "packageDirectory.default": { + "title": "Default", + "type": "boolean", + "description": "If you have specified more than one path, include this parameter for the default path to indicate which is the default package directory.", + "default": true + }, + "packageDirectory.package": { + "title": "Package Identifier", + "type": "string", + "description": "The package name you specified when creating the package." + }, + "packageDirectory.versionName": { + "title": "Version Name", + "type": "string", + "description": "If not specified, the CLI uses versionNumber as the version name." + }, + "packageDirectory.versionDescription": { + "title": "Version Description", + "type": "string", + "description": "Human readable version information, format not specified." + }, + "packageDirectory.versionNumber": { + "title": "Version Number", + "type": "string", + "description": "Version numbers are formatted as major.minor.patch.build. For example, 1.2.1.8." + }, + "packageDirectory.definitionFile": { + "title": "Definition File", + "type": "string", + "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition." + }, + "packageDirectory.dependencies": { + "type": "array", + "description": "To specify dependencies for 2GP within the same Dev Hub, use either the package version alias or a combination of the package name and the version number.", + "items": { + "type": "object", + "required": [ + "package" + ], + "properties": { + "package": { + "type": "string" + }, + "versionNumber": { + "type": "string" + }, + "branch": { + "type": "string" + } + } + } + }, + "packageDirectory.ancestorId": { + "title": "Ancestor ID", + "type": "string", + "description": "The ancestor that’s the immediate parent of the version that you’re creating. The package version ID to supply starts with '05i'." + }, + "packageDirectory.ancestorVersion": { + "title": "Ancestor Version", + "type": "string", + "description": "The ancestor that’s the immediate parent of the version that you’re creating. The ancestor version uses the format major.minor.patch.build." + }, + "packageDirectory.releaseNotesUrl": { + "type": "string", + "title": "Release Notes Url", + "description": "The release notes url." + }, + "packageDirectory.postInstallUrl": { + "type": "string", + "title": "Post Install Url", + "description": "The post install url." + }, + "packageDirectory.seedMetadata": { + "type": "object", + "title": "Seed Metadata", + "description": "Metadata not meant to be packaged, but deployed before deploying packaged metadata", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string", + "title": "Path", + "description": "The path name of the package directory containing the seed metadata" + } + } + }, + "packageDirectory.unpackagedMetadata": { + "type": "object", + "title": "Unpackaged Metadata", + "description": "Metadata not meant to be packaged, but deployed when testing packaged metadata", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string", + "title": "Path", + "description": "The path name of the package directory containing the unpackaged metadata" + } + } + }, + "packageDirectory.includeProfileUserLicenses": { + "type": "boolean", + "title": "Include Profile User Licenses", + "description": "Whether to include elements in profile metadata " + }, + "packageDirectory.apexTestAccess": { + "type": "object", + "title": "Apex Test Access", + "description": "Additional access that should be granted to the user when running package Apex tests", + "properties": { + "permissionSets": { + "title": "Permission Sets", + "description": "The list of permission sets to enable while running Apex tests", + "oneOf": [ + { + "type": "string", + "title": "Permission Set String", + "description": "The list of permission set to enable while running Apex tests as a string" + }, + { + "type": "array", + "title": "Permission Set Array", + "description": "The list of permission set to enable while running Apex tests as an array", + "items": { + "type": "string", + "title": "Permission Set Name", + "description": "Name of the permission set to enable while running Apex tests" + } + } + ] + }, + "permissionSetLicenses": { + "title": "Permission Set License", + "description": "The list of permission sets licenses to enable while running Apex tests", + "oneOf": [ + { + "type": "string", + "title": "Permission Set Licenses String", + "description": "The list of permission set licenses to enable while running Apex tests as a string" + }, + { + "type": "array", + "title": "Permission Set Licenses Array", + "description": "The list of permission set licenses to enable while running Apex tests as an array", + "items": { + "type": "string", + "title": "Permission Set Licenses Developer Name", + "description": "Name of the permission set to enable while running Apex tests" + } + } + ] + } + } + }, + "packageDirectory.aliasfy": { + "type": "boolean", + "title": "Aliasfy the package", + "description": "Deploy a subfolder in a source package that matches the alias of the org" + }, + "packageDirectory.alwaysDeploy": { + "type": "boolean", + "title": "Always deploy the package", + "description": "Deploys package, even if it's installed already in the org. The artifact has to be present in the artifact directory for this particular option to work" + }, + "packageDirectory.assignPermSetsPreDeployment": { + "type": "array", + "title": "Apply Perm Sets Pre Deployment", + "description": "Apply permsets before deploying a package", + "items": { + "type": "string" + } + }, + "packageDirectory.assignPermSetsPostDeployment": { + "type": "array", + "title": "Apply Perm Sets Post Deployment", + "description": "Apply permsets after deploying a package", + "items": { + "type": "string" + } + }, + "packageDirectory.buildCollection": { + "type": "array", + "title": "Build Packages in a Collection", + "description": "Utilize this to build packages in unison, it will build all packages in the collection, even if only one of them changes", + "items": { + "type": "string" + } + }, + "packageDirectory.destructiveChangePath": { + "type": "string", + "title": "Path to Destructive Changes", + "description": "Apply destructive changes during deployment" + }, + "packageDirectory.isOptimizedDeployment": { + "type": "boolean", + "title": "Use optimized deployment", + "description": "Detects test classes in a source package automatically and utilize it to deploy the provided package" + }, + "packageDirectory.ignoreOnStage": { + "type": "array", + "title": "Ignore this package on a stage", + "description": "Ignore this package on any provided stage", + "items": { + "type": "string", + "enum": [ + "prepare", + "build", + "deploy", + "validate", + "release", + "quickbuild" + ] + } + }, + "packageDirectory.postDeploymentScript": { + "type": "string", + "title": "PostDeployment Script", + "description": "Run an executable script after deploying a package. User need to provide a path to the script file" + }, + "packageDirectory.preDeploymentScript": { + "type": "string", + "title": "PreDeployment Script", + "description": "Run an executable script before deploying a package. User need to provide a path to the script file" + }, + "packageDirectory.reconcileProfiles": { + "type": "boolean", + "title": "Reconcile Profiles", + "description": "Reconcile Profiles during a deployment of source packages" + }, + "packageDirectory.type": { + "type": "string", + "title": "Type of the Package", + "enum": [ + "unlocked", + "source", + "data", + "diff" + ], + "description": "Denotes the type of the package, accepted values are \"source\",\"data\",\"unlocked\" and \"diff\"" + }, + "packageDirectory.skipCoverageValidation": { + "type": "boolean", + "title": "Skip Test Coverage Validation", + "description": "Skip the coverage validation of a package (unlocked/source)" + }, + "packageDirectory.tags": { + "type": "array", + "title": "Annotate a package with tags", + "description": "Utilize this to annotate a package with tags", + "items": { + "type": "string" + } + }, + "packageDirectory.testSynchronous": { + "type": "boolean", + "title": "Trigger tests synchronously", + "description": "This will disable parallel testing in the org and tests packages", + "default": false + }, + "packageDirectory.skipDeployOnOrgs": { + "type": "array", + "title": "Skip Deployment of the Package", + "description": "Skip deployment on a particular org or org(s). Take an array of aliases as the input", + "items": { + "type": "string" + } + }, + "packageDirectory.skipTesting": { + "type": "boolean", + "title": "Skip Unit testing", + "description": "Skip unit testing during validate or deployment (source packages)" + }, + "packageDirectory.checkpointForPrepare": { + "type": "boolean", + "title": "Is an Checkpoint Package?", + "description": "Fail the scratch org,if the any of the checkpoint package fails to deploy on prepare" + }, + "packageDirectory.enableFHT": { + "type": "boolean", + "default": true, + "title": "Enable Field History Tracking support?", + "description": "Enable automated update of field history tracking in the target org upon deployment" + }, + "packageDirectory.enableFT": { + "type": "boolean", + "default": true, + "title": "Enable Feed Tracking support?", + "description": "Enable automated update of feed tracking in the target org upon deployment" + }, + "packageDirectory.enablePicklist": { + "type": "boolean", + "default": true, + "title": "Enable Picklist patching for Unlocked Packages", + "description": "Enable automated patching of picklist for unlocked packages as unlocked packages ignore changes" + }, + "packageDirectory.branch": { + "type": "string", + "title": "Package branch", + "description": "branched package for the specific dev team" + }, + "plugins.sfp": { + "type": "object", + "title": "sfp plugin configuration", + "description": "Configuration for sfp plugin", + "additionalProperties": false, + "properties": { + "ignoreFiles": { + "type": "object", + "title": "Ignore Files", + "description": "Map of stages to forceignore filepaths", + "additionalProperties": false, + "properties": { + "prepare": { + "type": "string", + "title": "Prepare stage", + "description": "Path to forceignore for prepare stage" + }, + "validate": { + "type": "string", + "title": "Validate stage", + "description": "Path to forceignore for validate stage" + }, + "quickbuild": { + "type": "string", + "title": "Quickbuild stage", + "description": "Path to forceignore for quickbuild stage" + }, + "build": { + "type": "string", + "title": "Build stage", + "description": "Path to forceignore for build stage" + } + } + }, + "scratchOrgDefFilePaths": { + "type": "object", + "title": "Scratch Org Definition Files", + "description": "Map of packages to scratch org definition files filepaths", + "properties": { + "enableMultiDefinitionFiles": { + "type": "boolean", + "title": "Enable Multi Definition Files", + "description": "Enable multi definition files for different packages" + }, + "packages": { + "type": "object", + "title": "Packages with filepaths", + "description": "Path to scratch org definition for packages" + } + } + }, + "disableEntitlementFilter": { + "title": "Disable Entitlment filter", + "type": "boolean", + "description": "Disable Entitlement filtering in source package,which skips entitlements that are already in the target org", + "default": false + }, + "disableTransitiveDependencyResolver": { + "title": "Disable Transitive Dependency Resolver", + "type": "boolean", + "description": "Enable transitive dependency resolver to fix the missing dependencies through transitive relationship", + "default": false + }, + "externalDependencyMap": { + "title": "Map of external package and its dependencies", + "type": "object", + "description": "Use this map to define dependencies of unlocked packages built elsewhere, This information will be used by sfp while expanding package dependencies", + "patternProperties": { + ".*": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "package" + ], + "properties": { + "package": { + "type": "string" + }, + "versionNumber": { + "type": "string" + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/BuildBase.ts b/packages/sfp-cli/src/BuildBase.ts new file mode 100644 index 000000000..97a5abb19 --- /dev/null +++ b/packages/sfp-cli/src/BuildBase.ts @@ -0,0 +1,273 @@ +import ArtifactGenerator from './core/artifacts/generators/ArtifactGenerator'; + +import { EOL } from 'os'; +import sfpCommand from './SfpCommand'; +import { Messages } from '@salesforce/core'; +import fs = require('fs'); +import SFPStatsSender from './core/stats/SFPStatsSender'; +import BuildImpl, { BuildProps } from './impl/parallelBuilder/BuildImpl'; +import ProjectConfig from './core/project/ProjectConfig'; +import { Stage } from './impl/Stage'; +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_INFO, + COLOR_TIME, + COLOR_SUCCESS, + COLOR_KEY_MESSAGE, + Logger, + ConsoleLogger, + LoggerLevel, + COLOR_KEY_VALUE, +} from '@flxblio/sfp-logger'; +import getFormattedTime from './core/utils/GetFormattedTime'; +import SfpPackage from './core/package/SfpPackage'; +import ReleaseConfig from './impl/release/ReleaseConfig'; +import { Flags } from '@oclif/core'; +import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from './flags/sfdxflags'; + + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'build'); + +export default abstract class BuildBase extends sfpCommand { + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + protected static requiresProject = true; + + public static flags = { + loglevel, + 'apiversion': orgApiVersionFlagSfdxStyle, + 'devhubalias': targetdevhubusername, + diffcheck: Flags.boolean({ + description: messages.getMessage('diffCheckFlagDescription'), + default: false, + }), + gittag: Flags.boolean({ + description: messages.getMessage('gitTagFlagDescription'), + hidden: true, + deprecated: { + message:'--gittag is deprecated, Please utilize git tags on publish stage', + }, + }), + repourl: Flags.string({ + char: 'r', + description: messages.getMessage('repoUrlFlagDescription'), + }), + configfilepath: Flags.file({ + char: 'f', + description: messages.getMessage('configFilePathFlagDescription'), + default: 'config/project-scratch-def.json', + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + waittime: Flags.integer({ + description: messages.getMessage('waitTimeFlagDescription'), + default: 120, + }), + buildnumber: Flags.integer({ + description: messages.getMessage('buildNumberFlagDescription'), + default: 1, + }), + executorcount: Flags.integer({ + description: messages.getMessage('executorCountFlagDescription'), + default: 5, + }), + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + required: true, + }), + tag: Flags.string({ + description: messages.getMessage('tagFlagDescription'), + }), + releaseconfig: Flags.string({ + description: messages.getMessage('releaseConfigFileFlagDescription'), + }) + }; + + public async execute() { + const {flags} = await this.parse(); + let buildExecResult: { + generatedPackages: SfpPackage[]; + failedPackages: string[]; + }; + let totalElapsedTime: number; + let artifactCreationErrors: string[] = []; + + let tags = { + is_diffcheck_enabled: String(flags.diffcheck), + stage: this.getStage(), + branch: flags.branch, + }; + + try { + const artifactDirectory: string = flags.artifactdir; + const diffcheck: boolean = flags.diffcheck; + const branch: string = flags.branch; + // Read Manifest + let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(this.getStage())}`)); + SFPLogger.log(COLOR_HEADER(`Build Packages Only Changed: ${flags.diffcheck}`)); + if(projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles){ + SFPLogger.log(COLOR_HEADER(`Multiple Config Files Mode: enabled`)); + }else{ + SFPLogger.log(COLOR_HEADER(`Config File Path: ${flags.configfilepath}`)); + } + SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${flags.artifactdir}`)); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + let executionStartTime = Date.now(); + + + if (!(flags.tag == null || flags.tag == undefined)) { + tags['tag'] = flags.tag; + } + + + + SFPStatsSender.logCount('build.scheduled', tags); + + let buildProps = this.getBuildProps(); + + //Filter Build Props by ReleaseConfig + buildProps = this.includeOnlyPackagesAsPerReleaseConfig(flags.releaseconfig, buildProps, new ConsoleLogger()); + buildExecResult = await this.getBuildImplementer(buildProps).exec(); + + if ( + diffcheck && + buildExecResult.generatedPackages.length === 0 && + buildExecResult.failedPackages.length === 0 + ) { + SFPLogger.log(`${EOL}${EOL}`); + SFPLogger.log(COLOR_INFO('No packages found to be built.. Exiting.. ')); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + return; + } + + SFPLogger.log(`${EOL}${EOL}`); + SFPLogger.log('Generating Artifacts and Tags....'); + + for (let generatedPackage of buildExecResult.generatedPackages) { + try { + await ArtifactGenerator.generateArtifact(generatedPackage, process.cwd(), artifactDirectory); + } catch (error) { + SFPLogger.log(error.message); + artifactCreationErrors.push(generatedPackage.packageName); + } + } + + totalElapsedTime = Date.now() - executionStartTime; + + if (artifactCreationErrors.length > 0 || buildExecResult.failedPackages.length > 0) + throw new Error('Build Failed'); + + SFPStatsSender.logGauge('build.duration', Date.now() - executionStartTime, tags); + + SFPStatsSender.logCount('build.succeeded', tags); + } catch (error) { + SFPStatsSender.logCount('build.failed', tags); + SFPLogger.log(COLOR_ERROR(error)); + process.exitCode = 1; + } finally { + if (buildExecResult?.generatedPackages?.length > 0 || buildExecResult?.failedPackages?.length > 0) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `${buildExecResult.generatedPackages.length} packages created in ${COLOR_TIME( + getFormattedTime(totalElapsedTime) + )} minutes with ${COLOR_ERROR(buildExecResult.failedPackages.length)} errors` + ) + ); + + if (buildExecResult.failedPackages.length > 0) + SFPLogger.log(COLOR_ERROR(`Packages Failed To Build`, buildExecResult.failedPackages)); + + if (artifactCreationErrors.length > 0) + SFPLogger.log(COLOR_ERROR(`Failed To Create Artifacts`, artifactCreationErrors)); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + const buildResult: BuildResult = { + packages: [], + summary: { + scheduled_packages: null, + elapsed_time: null, + succeeded: null, + failed: null, + }, + }; + + for (let generatedPackage of buildExecResult.generatedPackages) { + buildResult['packages'].push({ + name: generatedPackage['packageName'], + version: generatedPackage['package_version_number'], + elapsed_time: generatedPackage['creation_details']?.creation_time, + status: 'succeeded', + }); + } + + for (let failedPackage of buildExecResult.failedPackages) { + buildResult['packages'].push({ + name: failedPackage, + version: null, + elapsed_time: null, + status: 'failed', + }); + } + + buildResult['summary'].scheduled_packages = + buildExecResult.generatedPackages.length + buildExecResult.failedPackages.length; + buildResult['summary'].elapsed_time = totalElapsedTime; + buildResult['summary'].succeeded = buildExecResult.generatedPackages.length; + buildResult['summary'].failed = buildExecResult.failedPackages.length; + + fs.writeFileSync(`buildResult.json`, JSON.stringify(buildResult, null, 4)); + } + } + } + + private includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { + if (releaseConfigFilePath) { + let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); + buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); + printIncludeOnlyPackages(buildProps.includeOnlyPackages); + } + return buildProps; + + + function printIncludeOnlyPackages(includeOnlyPackages: string[]) { + SFPLogger.log( + COLOR_KEY_MESSAGE(`Build will include the below packages as per inclusive filter`), + LoggerLevel.INFO + ); + SFPLogger.log(COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), LoggerLevel.INFO); + } + } + + abstract getBuildProps(): BuildProps; + + abstract getStage(): Stage; + + abstract getBuildImplementer(buildProps:BuildProps): BuildImpl; +} + +interface BuildResult { + packages: { + name: string; + version: string; + elapsed_time: number; + status: string; + }[]; + summary: { + scheduled_packages: number; + elapsed_time: number; + succeeded: number; + failed: number; + }; +} diff --git a/packages/sfp-cli/src/InstallPackageCommand.ts b/packages/sfp-cli/src/InstallPackageCommand.ts new file mode 100644 index 000000000..835a574cd --- /dev/null +++ b/packages/sfp-cli/src/InstallPackageCommand.ts @@ -0,0 +1,91 @@ +import sfpCommand from './SfpCommand'; +import { Messages } from '@salesforce/core'; +import ArtifactFetcher, { Artifact } from './core/artifacts/ArtifactFetcher'; +import * as rimraf from 'rimraf'; +import SfpPackage from './core/package/SfpPackage'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from './core/package/SfpPackageBuilder'; +import SFPOrg from './core/org/SFPOrg'; +import { Flags } from '@oclif/core'; +import { requiredUserNameFlag } from './flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_package_command'); + +/** + * Base class providing common functionality for package installation + * + * @extends sfpCommand + */ +export default abstract class InstallPackageCommand extends sfpCommand { + protected sfpPackage: SfpPackage; + protected sfpOrg: SFPOrg; + /** + * Flags that are common/required on all package installation commands + */ + public static flags = { + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + required: true, + }), + targetorg: requiredUserNameFlag, + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + }; + + protected artifact: Artifact; + + /** + * Procedures unique to the type of package installation + */ + abstract install(): Promise; + + /** + * Entry point for package installation commands + * + */ + async execute(): Promise { + await this.preInstall(); + + await this.install(); + + this.postInstall(); + } + + /** + * Procedures common to all install commands, and to be run BEFORE + * the primary install + */ + private async preInstall(): Promise { + let artifacts = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir, this.flags.package, null); + if (artifacts.length === 0) { + if (!this.flags.skiponmissingartifact) { + throw new Error( + `${this.flags.package} artifact not found at ${this.flags.artifactdir}...Please check the inputs` + ); + } else if (this.flags.skiponmissingartifact) { + console.log( + `Skipping task as artifact is missing, and 'SkipOnMissingArtifact' ${this.flags.skiponmissingartifact}` + ); + process.exit(0); + } + } else this.artifact = artifacts[0]; + + this.sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(this.artifact, new ConsoleLogger()); + + //Create SfP Org + this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); + } + + /** + * Procedures common to all install commands, and to be run AFTER + * the primary install + */ + private postInstall(): void { + // Delete temp directory containing unzipped artifacts + rimraf.sync('.sfp/unzippedArtifacts'); + } +} diff --git a/packages/sfp-cli/src/PackageCreateCommand.ts b/packages/sfp-cli/src/PackageCreateCommand.ts new file mode 100644 index 000000000..da1d88fad --- /dev/null +++ b/packages/sfp-cli/src/PackageCreateCommand.ts @@ -0,0 +1,198 @@ +import ArtifactGenerator from './core/artifacts/generators/ArtifactGenerator'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageDiffImpl from './core/package/diff/PackageDiffImpl'; +import { Messages } from '@salesforce/core'; +import { EOL } from 'os'; +import sfpCommand from './SfpCommand'; +import SfpPackage, { PackageType } from './core/package/SfpPackage'; +import getFormattedTime from './core/utils/GetFormattedTime'; +const fs = require('fs-extra'); +import Git from './core/git/Git'; +import { Flags } from '@oclif/core'; +import { loglevel } from './flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'create-package'); + +export default abstract class PackageCreateCommand extends sfpCommand { + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + protected static requiresProject = true; + + public static flags = { + package: Flags.string({ + required: true, + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + diffcheck: Flags.boolean({ + description: messages.getMessage('diffCheckFlagDescription'), + }), + gittag: Flags.boolean({ + description: messages.getMessage('gitTagFlagDescription'), + }), + repourl: Flags.string({ + char: 'r', + description: messages.getMessage('repoUrlFlagDescription'), + }), + versionnumber: Flags.string({ + description: messages.getMessage('versionNumberFlagDescription'), + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + }), + refname: Flags.string({ + description: messages.getMessage('refNameFlagDescription'), + }), + loglevel + }; + + protected sfdxPackage: string; + protected versionNumber: string; + protected artifactDirectory: string; + protected refname: string; + protected branch: string; + protected commitId: string; + protected repositoryURL: string; + + /** + * Entry point for package installation commands + * + */ + async execute(): Promise { + let isToCreatePackage = await this.preCreate(); + if (isToCreatePackage) { + try { + let packageMetadata = await this.create(); + await this.postCreate(packageMetadata); + } catch (err) { + console.log(err); + process.exit(1); + } + } + } + + private async preCreate(): Promise { + this.sfdxPackage = this.flags.package; + this.versionNumber = this.flags.versionnumber; + this.artifactDirectory = this.flags.artifactdir; + this.refname = this.flags.refname; + this.branch = this.flags.branch; + + if (this.hubOrg) await this.hubOrg.refreshAuth(); + + let isToRunBuild; + + if (this.flags.diffcheck) { + let packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), this.sfdxPackage, null); + + let isToRunBuild = (await packageDiffImpl.exec()).isToBeBuilt; + + if (isToRunBuild) console.log(`Detected changes to ${this.sfdxPackage} package...proceeding\n`); + else console.log(`No changes detected for ${this.sfdxPackage} package...skipping\n`); + } else isToRunBuild = true; + + if (isToRunBuild) { + let git = await Git.initiateRepo(new ConsoleLogger()); + this.repositoryURL = await git.getRemoteOriginUrl(this.flags.repourl); + this.commitId = await git.getHeadCommit(); + } + return isToRunBuild; + } + + protected abstract getConfigFilePath(): string; + + protected abstract create(): Promise; + + private async postCreate(sfpPackage: SfpPackage) { + this.printPackageDetails(sfpPackage); + + if (this.flags.gittag) { + + let git = await Git.initiateRepo(new ConsoleLogger()); + let tagname = `${this.sfdxPackage}_v${sfpPackage.package_version_number}`; + await git.addAnnotatedTag(tagname, `${sfpPackage.packageName} sfp package ${sfpPackage.package_version_number}`) + + sfpPackage.tag = tagname; + } + + //Generate Artifact + let artifactFilepath: string = await ArtifactGenerator.generateArtifact( + sfpPackage, + process.cwd(), + this.artifactDirectory + ); + + this.generateEnvironmentVariables(artifactFilepath, sfpPackage); + } + + private generateEnvironmentVariables(artifactFilepath: string, sfpPackage: SfpPackage) { + let prefix = 'sfp'; + if (this.refname != null) prefix = `${this.refname}_${prefix}`; + + console.log('\nOutput variables:'); + + fs.writeFileSync('.env', `${prefix}_artifact_directory=${artifactFilepath}\n`, { flag: 'a' }); + console.log(`${prefix}_artifact_directory=${artifactFilepath}`); + fs.writeFileSync('.env', `${prefix}_package_version_number=${sfpPackage.package_version_number}\n`, { + flag: 'a', + }); + console.log(`${prefix}_package_version_number=${sfpPackage.package_version_number}`); + + if (sfpPackage.package_version_id) { + fs.writeFileSync('.env', `${prefix}_package_version_id=${sfpPackage.package_version_id}\n`, { + flag: 'a', + }); + console.log(`${prefix}_package_version_id=${sfpPackage.package_version_id}`); + } + } + + protected printPackageDetails(sfpPackage: SfpPackage) { + console.log( + COLOR_HEADER( + `${EOL}${sfpPackage.packageName} package created in ${getFormattedTime( + sfpPackage.creation_details.creation_time + )}` + ) + ); + console.log(COLOR_HEADER(`-- Package Details:--`)); + console.log( + COLOR_HEADER(`-- Package Version Number: `), + COLOR_KEY_MESSAGE(sfpPackage.package_version_number) + ); + + if (sfpPackage.package_type !== PackageType.Data) { + if (sfpPackage.package_type == PackageType.Unlocked) { + if (sfpPackage.package_version_id) + console.log( + COLOR_HEADER(`-- Package Version Id: `), + COLOR_KEY_MESSAGE(sfpPackage.package_version_id) + ); + if (sfpPackage.test_coverage) + console.log( + COLOR_HEADER(`-- Package Test Coverage: `), + COLOR_KEY_MESSAGE(sfpPackage.test_coverage) + ); + if (sfpPackage.has_passed_coverage_check) + console.log( + COLOR_HEADER(`-- Package Coverage Check Passed: `), + COLOR_KEY_MESSAGE(sfpPackage.has_passed_coverage_check) + ); + } + + console.log( + COLOR_HEADER(`-- Apex In Package: `), + COLOR_KEY_MESSAGE(sfpPackage.isApexFound ? 'Yes' : 'No') + ); + console.log( + COLOR_HEADER(`-- Profiles In Package: `), + COLOR_KEY_MESSAGE(sfpPackage.isProfilesFound ? 'Yes' : 'No') + ); + console.log(COLOR_HEADER(`-- Metadata Count: `), COLOR_KEY_MESSAGE(sfpPackage.metadataCount)); + } + } +} diff --git a/packages/sfp-cli/src/ProjectValidation.ts b/packages/sfp-cli/src/ProjectValidation.ts new file mode 100644 index 000000000..ba957611a --- /dev/null +++ b/packages/sfp-cli/src/ProjectValidation.ts @@ -0,0 +1,87 @@ +import ProjectConfig from './core/project/ProjectConfig'; +import Ajv from 'ajv'; +import path = require('path'); +import * as fs from 'fs-extra'; +import { PackageType } from './core/package/SfpPackage'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +export default class ProjectValidation { + private readonly projectConfig; + private ajv: Ajv; + resourcesDir: string; + + constructor() { + this.projectConfig = ProjectConfig.getSFDXProjectConfig(null); + this.ajv = new Ajv({ allErrors: true }); + this.resourcesDir = path.join(__dirname, '..', 'resources', 'schemas'); + } + + public validateSFDXProjectJSON() { + let schema = fs.readJSONSync(path.join(this.resourcesDir, `sfdx-project.schema.json`), { encoding: 'UTF-8' }); + let validator = this.ajv.compile(schema); + let isSchemaValid = validator(this.projectConfig); + if (!isSchemaValid) { + let errorMsg: string = `The sfdx-project.json is invalid, Please fix the following errors\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + + SFPLogger.log(`The following attributes are not recognized by sfp, You might need to remove them`,LoggerLevel.WARN) + SFPLogger.log(errorMsg, LoggerLevel.WARN); + } + } + + public validatePackageNames() { + ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => { + let name = pkg.package; + if ( name.length > 38) { + throw new Error( + 'sfdx-project.json validation failed for package "' + + pkg['package'] + + '".' + + `Package name exceed maximum length of 38 characters.` + ) + }else if( name.match(/^[a-zA-Z0-9-._~]+$/) === null ){ + throw new Error( + 'sfdx-project.json validation failed for package "' + + pkg['package'] + + '".' + + `Package names can only contain alphanumeric characters and the symbols - . _ ~.` + ) + } + }); + } + + + public validatePackageBuildNumbers() { + ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => { + let packageType = ProjectConfig.getPackageType(this.projectConfig, pkg.package); + + let pattern: RegExp = /NEXT$|LATEST$/i; + if ( + pkg.versionNumber.match(pattern) && + (packageType === PackageType.Source || packageType === PackageType.Data) + ) { + throw new Error( + 'sfdx-project.json validation failed for package "' + + pkg['package'] + + '".' + + ' Build-number keywords "NEXT" & "LATEST" are not supported for ' + + packageType + + ' packages.' + + '\nTry the following:' + + '\n - If package should be built as a ' + + packageType + + ' package, use 0 instead of NEXT/LATEST' + + '\n - If package should be built as an Unlocked package, ensure the package has been created in the Devhub and the ID included in packageAliases of sfdx-project.json' + ); + } + }); + } +} diff --git a/packages/sfp-cli/src/SfpCommand.ts b/packages/sfp-cli/src/SfpCommand.ts new file mode 100644 index 000000000..cff888a9a --- /dev/null +++ b/packages/sfp-cli/src/SfpCommand.ts @@ -0,0 +1,177 @@ +import SFPStatsSender from './core/stats/SFPStatsSender'; +import * as rimraf from 'rimraf'; +import ProjectValidation from './ProjectValidation'; +import SFPLogger, { COLOR_HEADER, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import GroupConsoleLogs from './ui/GroupConsoleLogs'; +import { Command, Flags, ux } from '@oclif/core'; +import { FlagOutput } from '@oclif/core/lib/interfaces/parser'; +import { Org } from '@salesforce/core'; + + +/** + * A base class that provides common funtionality for sfp commands + * + * @extends SfdxCommand + */ +export default abstract class sfpCommand extends Command { + + protected static requiresProject: boolean; + + protected hubOrg:Org; + protected org:Org; + public flags: FlagOutput & { json: boolean; }; + + + private isSfpowerkitFound: boolean; + private sfpConfig; + private isSfdmuFound: boolean; + protected static requiresUsername: boolean=false; + protected static requiresDevhubUsername: boolean=false; + + + /** + * Command run code goes here + */ + abstract execute(): Promise; + + /** + * Entry point of all commands + */ + async run(): Promise { + //Always enable color by default + if (process.env.sfp_NOCOLOR) SFPLogger.disableColor(); + else SFPLogger.enableColor(); + + + + this.flags = (await this.parse()).flags; + + if(this.statics.flags.targetusername && this.statics.requiresUsername) + { + this.org = await Org.create({aliasOrUsername:this.flags.targetusername}); + } + + + if(this.statics.flags.targetdevhubusername && this.statics.requiresDevhubUsername) + { + this.hubOrg = await Org.create({aliasOrUsername:this.flags.targetdevhubusername}); + } + + + this.setLogLevel(this.flags); + if (this.statics.flags.logsgroupsymbol) { + GroupConsoleLogs.setLogGroupsSymbol(this.flags.logsgroupsymbol); + } + + + // Setting the environment variable for disabling sfpowerkit header + + if (SFPLogger.logLevel > LoggerLevel.DEBUG) process.env.SFPOWERKIT_NOHEADER = 'true'; + + //Set Query Limit to max + process.env.SF_ORG_MAX_QUERY_LIMIT = '50000'; + + + this.validateFlags(); + + + + //Clear temp directory before every run + rimraf.sync('.sfp'); + + + //Initialise StatsD + this.initializeStatsD(); + + + if (!this.jsonEnabled()) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_HEADER( + `sfp -- The DX@Scale CLI -Version:${this.config.version} -Release:${this.config.pjson.release}` + ) + ); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + else + { + //Disable pretty printing in json mode + const chalk = require('chalk') + chalk.level = 0; + } + + if (this.statics.requiresProject) { + let projectValidation = new ProjectValidation(); + projectValidation.validateSFDXProjectJSON(); + projectValidation.validatePackageNames(); + } + + + // Execute command run code + return await this.execute(); + } + + /** + * Optional method for programmatically validating flags. + * Useful for complex flag behaviours that cannot be adequately defined using flag props + * e.g. making a flag required only if another flag that it depends on is passed + */ + protected validateFlags(): void { } + + + private initializeStatsD() { + if (process.env.sfp_STATSD) { + SFPStatsSender.initialize( + process.env.sfp_STATSD_PORT, + process.env.sfp_STATSD_HOST, + process.env.sfp_STATSD_PROTOCOL + ); + } + if (process.env.sfp_DATADOG) { + SFPStatsSender.initializeNativeMetrics( + 'DataDog', + process.env.sfp_DATADOG_HOST, + process.env.sfp_DATADOG_API_KEY, + new ConsoleLogger() + ); + } else if (process.env.sfp_NEWRELIC) { + SFPStatsSender.initializeNativeMetrics( + 'NewRelic', + null, + process.env.sfp_NEWRELIC_API_KEY, + new ConsoleLogger() + ); + } else if (process.env.sfp_SPLUNK) { + SFPStatsSender.initializeNativeMetrics( + 'Splunk', + process.env.sfp_SPLUNK_HOST, + process.env.sfp_SPLUNK_API_KEY, + new ConsoleLogger() + ); + } + + SFPStatsSender.initializeLogBasedMetrics(); + } + + private setLogLevel(flags:FlagOutput) { + if (flags.loglevel === 'trace' || flags.loglevel === 'TRACE') SFPLogger.logLevel = LoggerLevel.TRACE; + else if (flags.loglevel === 'debug' || flags.loglevel === 'DEBUG') + SFPLogger.logLevel = LoggerLevel.DEBUG; + else if (flags.loglevel === 'info' || flags.loglevel === 'INFO') + SFPLogger.logLevel = LoggerLevel.INFO; + else if (flags.loglevel === 'warn' || flags.loglevel === 'WARN') + SFPLogger.logLevel = LoggerLevel.WARN; + else if (flags.loglevel === 'error' || flags.loglevel === 'ERROR') + SFPLogger.logLevel = LoggerLevel.ERROR; + else if (flags.loglevel === 'fatal' || flags.loglevel === 'FATAL') + SFPLogger.logLevel = LoggerLevel.FATAL; + else SFPLogger.logLevel = LoggerLevel.INFO; + } + + + protected get statics(): typeof sfpCommand { + return this.constructor as typeof sfpCommand; + } + +} diff --git a/packages/sfp-cli/src/commands/apextests/trigger.ts b/packages/sfp-cli/src/commands/apextests/trigger.ts new file mode 100644 index 000000000..53e600e87 --- /dev/null +++ b/packages/sfp-cli/src/commands/apextests/trigger.ts @@ -0,0 +1,162 @@ +import { + RunAllTestsInOrg, + RunApexTestSuitesOption, + RunLocalTests, + RunSpecifiedTestsOption, + TestLevel, + TestOptions, + RunAllTestsInPackageOptions, +} from '../../core/apextest/TestOptions'; +import TriggerApexTests from '../../core/apextest/TriggerApexTests'; +import sfpCommand from '../../SfpCommand'; +import { Messages } from '@salesforce/core'; +import SfpPackage from '../../core/package/SfpPackage'; + +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { CoverageOptions } from '../../core/apex/coverage/IndividualClassCoverage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import { PackageType } from '../../core/package/SfpPackage'; +import { Flags } from '@oclif/core'; +import { loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; +const path = require('path'); + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'trigger_apex_test'); + +export default class TriggerApexTest extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp apextests:trigger -u scratchorg -l RunLocalTests -s`, + `$ sfp apextests:trigger -u scratchorg -l RunAllTestsInPackage -n -c`, + ]; + + public static flags = { + loglevel, + 'apiversion': orgApiVersionFlagSfdxStyle, + 'targetusername': requiredUserNameFlag, + testlevel: Flags.string({ + char: 'l', + description: messages.getMessage('testLevelFlagDescription'), + options: [ + 'RunSpecifiedTests', + 'RunApexTestSuite', + 'RunLocalTests', + 'RunAllTestsInOrg', + 'RunAllTestsInPackage', + ], + default: 'RunLocalTests', + }), + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + required: false, + }), + validateindividualclasscoverage: Flags.boolean({ + char: 'c', + description: messages.getMessage('validateIndividualClassCoverageFlagDescription'), + default: false, + }), + validatepackagecoverage: Flags.boolean({ + description: messages.getMessage('validatePackageCoverageFlagDescription'), + default: false, + }), + specifiedtests: Flags.string({ + description: messages.getMessage('specifiedTestsFlagDescription'), + }), + apextestsuite: Flags.string({ + description: messages.getMessage('apexTestSuiteFlagDescription'), + }), + coveragepercent: Flags.integer({ + char: 'p', + description: messages.getMessage('coveragePercentFlagDescription'), + default: 75, + }), + waittime: Flags.integer({ + char: 'w', + description: messages.getMessage('waitTimeFlagDescription'), + default: 60, + }), + }; + + public async execute() { + try { + + let testOptions: TestOptions; + let coverageOptions: CoverageOptions; + let outputdir = path.join('.testresults'); + + if (this.flags.testlevel === TestLevel.RunAllTestsInOrg.toString()) { + testOptions = new RunAllTestsInOrg(this.flags.waittime, outputdir, this.flags.synchronous); + } else if (this.flags.testlevel === TestLevel.RunAllTestsInPackage.toString()) { + if (this.flags.package === null) { + throw new Error('Package name must be specified when test level is RunAllTestsInPackage'); + } + let pkg: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + new ConsoleLogger(), + null, + this.flags.package, + { + overridePackageTypeWith: PackageType.Source, + } + ); + testOptions = new RunAllTestsInPackageOptions(pkg, this.flags.waittime, outputdir); + } else if (this.flags.testlevel === TestLevel.RunApexTestSuite.toString()) { + testOptions = new RunApexTestSuitesOption( + this.flags.waittime, + outputdir, + this.flags.apextestsuite, + this.flags.synchronous + ); + } else if (this.flags.testlevel === TestLevel.RunLocalTests.toString()) { + testOptions = new RunLocalTests(this.flags.waittime, outputdir, this.flags.synchronous); + } else if (this.flags.testlevel === TestLevel.RunSpecifiedTests.toString()) { + testOptions = new RunSpecifiedTestsOption( + this.flags.waittime, + outputdir, + this.flags.specifiedtests, + this.flags.synchronous + ); + } else { + throw new Error('Unimplemented Option, please check the option'); + } + + if ( + (this.flags.validateindividualclasscoverage || this.flags.validatepackagecoverage) && + this.flags.testlevel !== TestLevel.RunAllTestsInPackage.toString() + ) { + throw new Error('Code coverage validation is only available for test level RunAllTestsInPackage'); + } else { + coverageOptions = { + isPackageCoverageToBeValidated: this.flags.validatepackagecoverage, + isIndividualClassCoverageToBeValidated: this.flags.validateindividualclasscoverage, + coverageThreshold: this.flags.coveragepercent, + }; + } + + + const triggerApexTests: TriggerApexTests = new TriggerApexTests( + this.flags.targetusername, + testOptions, + coverageOptions, + null, + null + ); + let result = await triggerApexTests.exec(); + + if (!result.result) { + throw new Error(`Error: ${result.message}`); + } else { + console.log(`\n ${result.message ? result.message : ''}`); + } + } catch (err) { + console.log('\n'); + console.error(err.message); + process.exitCode = 1; + } + } +} diff --git a/packages/sfp-cli/src/commands/artifacts/fetch.ts b/packages/sfp-cli/src/commands/artifacts/fetch.ts new file mode 100644 index 000000000..1a8854edd --- /dev/null +++ b/packages/sfp-cli/src/commands/artifacts/fetch.ts @@ -0,0 +1,109 @@ +import sfpCommand from '../../SfpCommand'; +import { LoggerLevel, Messages } from '@salesforce/core'; +import FetchImpl, { ArtifactVersion } from '../../impl/artifacts/FetchImpl'; +import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import FetchArtifactsError from '../../impl/artifacts/FetchArtifactsError'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import SFPLogger from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'fetch'); + +export default class Fetch extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp artifacts:fetch -p myreleasedefinition.yaml -f myscript.sh`, + `$ sfp artifacts:fetch -p myreleasedefinition.yaml --npm --scope myscope --npmrcpath path/to/.npmrc`, + ]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + + public static flags = { + releasedefinition: Flags.file({ + char: 'p', + description: messages.getMessage('releaseDefinitionFlagDescription'), + }), + artifactdir: Flags.directory({ + required: true, + char: 'd', + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + scriptpath: Flags.file({ + char: 'f', + description: messages.getMessage('scriptPathFlagDescription'), + }), + npm: Flags.boolean({ + description: messages.getMessage('npmFlagDescription'), + exclusive: ['scriptpath'], + }), + scope: Flags.string({ + description: messages.getMessage('scopeFlagDescription'), + dependsOn: ['npm'], + parse: async (scope) => scope.replace(/@/g, '').toLowerCase() + }), + npmrcpath: Flags.file({ + description: messages.getMessage('npmrcPathFlagDescription'), + dependsOn: ['npm'], + required: false, + }), + loglevel + }; + + public async execute() { + this.validateFlags(); + + let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(this.flags.releasedefinition)).releaseDefinition; + let result: { + success: ArtifactVersion[]; + failed: ArtifactVersion[]; + }; + + let executionStartTime = Date.now(); + try { + let fetchImpl: FetchImpl = new FetchImpl( + this.flags.artifactdir, + this.flags.scriptpath, + this.flags.scope, + this.flags.npmrcpath, + new ConsoleLogger() + ); + + result = await fetchImpl.fetchArtifacts([releaseDefinition]); + } catch (err) { + if (err instanceof FetchArtifactsError) { + result = err.data; + } else { + console.log(err.message); + } + + process.exitCode = 1; + } finally { + let totalElapsedTime: number = Date.now() - executionStartTime; + + if (result) this.printSummary(result, totalElapsedTime); + } + } + + private printSummary( + result: { success: ArtifactVersion[]; failed:ArtifactVersion[] }, + totalElapsedTime: number + ) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log(`Fetched ${result.success.length} artifacts`); + + if (result.failed.length > 0) console.log(`Failed to fetch ${result.failed.length} artifacts`); + + SFPLogger.log(`Elapsed Time: ${new Date(totalElapsedTime).toISOString().substr(11, 8)}`); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + + protected validateFlags() { + if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); + } +} diff --git a/packages/sfp-cli/src/commands/artifacts/query.ts b/packages/sfp-cli/src/commands/artifacts/query.ts new file mode 100644 index 000000000..7c0ed8ba7 --- /dev/null +++ b/packages/sfp-cli/src/commands/artifacts/query.ts @@ -0,0 +1,57 @@ +import sfpCommand from '../../SfpCommand'; +import { LoggerLevel, Messages } from '@salesforce/core'; +import SFPOrg from '../../core/org/SFPOrg'; +import SFPLogger, { ConsoleLogger } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; +const Table = require('cli-table'); + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'artifacts_query'); + +export default class Query extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp artifacts:query -u `]; + public static enableJsonFlag = true + protected static requiresUsername = true; + protected static requiresDevhubUsername = false; + + public static flags = { + loglevel, + 'targetusername': requiredUserNameFlag, + }; + + public async execute() { + await this.org.refreshAuth(); + + let sfpOrg: SFPOrg = await SFPOrg.create({ connection: this.org.getConnection() }); + let installedArtifacts = await sfpOrg.getAllInstalledArtifacts(); + if (!this.flags.json) { + let minTable = new Table({ + head: [ + 'Package', + 'Version in org', + 'Commmit Id', + 'Subcriber Version', + 'Type', + 'Is sfp Installed', + ], + chars: ZERO_BORDER_TABLE + }); + installedArtifacts.forEach((installedArtifact) => { + minTable.push([ + installedArtifact.name, + installedArtifact.version, + installedArtifact.commitId.substring(0,8), + installedArtifact.subscriberVersion, + installedArtifact.type, + installedArtifact.isInstalledBysfp, + ]); + }); + SFPLogger.log(minTable.toString(), LoggerLevel.INFO, new ConsoleLogger()); + } else { + return installedArtifacts; + } + } +} diff --git a/packages/sfp-cli/src/commands/changelog/generate.ts b/packages/sfp-cli/src/commands/changelog/generate.ts new file mode 100644 index 000000000..bc94d8ce8 --- /dev/null +++ b/packages/sfp-cli/src/commands/changelog/generate.ts @@ -0,0 +1,110 @@ +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; +import sfpCommand from '../../SfpCommand'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'generate_changelog'); + +export default class GenerateChangelog extends sfpCommand { + + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp changelog:generate -n -d path/to/artifact/directory -w -r -b `, + ]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + + public static flags = { + limit: Flags.integer({ + description: messages.getMessage('limitFlagDescription'), + }), + artifactdir: Flags.directory({ + required: true, + char: 'd', + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + releasename: Flags.string({ + required: true, + char: 'n', + description: messages.getMessage('releaseNameFlagDescription'), + }), + workitemfilter: Flags.string({ + required: true, + char: 'w', + description: messages.getMessage('workItemFilterFlagDescription'), + }), + workitemurl: Flags.string({ + required: false, + description: messages.getMessage('workItemUrlFlagDescription'), + }), + repourl: Flags.string({ + required: false, + char: 'r', + description: messages.getMessage('repoUrlFlagDescription'), + deprecated: {message:'--repourl has been deprecated'} + }), + directory: Flags.string({ + required: false, + description: messages.getMessage('directoryFlagDescription'), + }), + branchname: Flags.string({ + required: true, + char: 'b', + description: messages.getMessage('branchNameFlagDescription'), + }), + nopush: Flags.boolean({ + description: messages.getMessage('noPushFlagDescription'), + dependsOn: ['branchname'], + default: false + }), + showallartifacts: Flags.boolean({ + required: false, + description: messages.getMessage('showAllArtifactsFlagDescription'), + }), + forcepush: Flags.boolean({ + description: messages.getMessage('forcePushFlagDescription'), + hidden: true, + default: false, + }), + loglevel, + }; + + async execute() { + try { + let changelogImpl: ChangelogImpl = new ChangelogImpl( + new ConsoleLogger(), + this.flags.artifactdir, + this.flags.releasename, + this.flags.workitemfilter.split(':'), + this.flags.limit, + this.flags.workitemurl, + this.flags.showallartifacts, + this.flags.directory, + this.flags.forcepush, + this.flags.branchname, + this.flags.nopush, + null + ); + + await changelogImpl.exec(); + } catch (err) { + let errorMessage: string = ''; + if (err instanceof Array) { + for (let e of err) { + errorMessage += e.message + `\n`; + } + } else { + errorMessage = err.message; + } + console.log(errorMessage); + + process.exit(1); + } + } +} diff --git a/packages/sfp-cli/src/commands/dependency/expand.ts b/packages/sfp-cli/src/commands/dependency/expand.ts new file mode 100644 index 000000000..87070e906 --- /dev/null +++ b/packages/sfp-cli/src/commands/dependency/expand.ts @@ -0,0 +1,74 @@ +import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import path = require('path'); +import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; +import { Flags } from '@oclif/core'; +import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_expand'); + +export default class Expand extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + + protected static requiresDevhubUsername = true; + protected static requiresProject = true; + + public static flags = { + targetdevhubusername, + overwrite: Flags.boolean({ + char: 'o', + description: messages.getMessage('overWriteProjectConfigFlagDescription'), + default: false, + }), + loglevel + }; + + public async execute() { + let defaultProjectConfigPath = './project-config'; + let projectConfigFilePath: string; + try { + //Validate dependencies in sfdx-project.json // Read Manifest + let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); + const transitiveDependencyResolver = new TransitiveDependencyResolver( + projectConfig + ); + + + let resolvedDependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies(); + projectConfig = await ProjectConfig.updateProjectConfigWithDependencies(projectConfig,resolvedDependencyMap); + projectConfig = await (new UserDefinedExternalDependency()).addDependencyEntries(projectConfig, this.hubOrg.getConnection()); + + //Clean up temp directory + if (!fs.existsSync(defaultProjectConfigPath)) fs.mkdirpSync(defaultProjectConfigPath); + + if(this.flags.overwrite){ + SFPLogger.log(`Overwriting sfdx-project.json with expanded project config file`,LoggerLevel.INFO) + projectConfigFilePath = `sfdx-project.json`; + + let backupFilePath: string = path.join(defaultProjectConfigPath, `sfdx-project.json.bak`); + SFPLogger.log(`Saving a backup to ${backupFilePath}`,LoggerLevel.INFO) + fs.copySync(projectConfigFilePath, backupFilePath); + + fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); + SFPLogger.log('sfdx-project.json has been updated.',LoggerLevel.INFO) + }else{ + projectConfigFilePath = path.join(defaultProjectConfigPath, `sfdx-project.exp.json`); + fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); + SFPLogger.log(`Generated project config file has been saved to ${projectConfigFilePath}`,LoggerLevel.INFO) + } + + } catch (error) { + throw new Error('Unable to generate project config file:' + error); + } + } +} diff --git a/packages/sfp-cli/src/commands/dependency/install.ts b/packages/sfp-cli/src/commands/dependency/install.ts new file mode 100644 index 000000000..9d275a225 --- /dev/null +++ b/packages/sfp-cli/src/commands/dependency/install.ts @@ -0,0 +1,67 @@ +import sfpCommand from '../../SfpCommand'; +import { Messages } from '@salesforce/core'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; +import SFPOrg from '../../core/org/SFPOrg'; +import { Flags } from '@oclif/core'; +import { loglevel, targetdevhubusername, requiredUserNameFlag } from '../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_install'); + +export default class Install extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + protected static requiresUsername = true; + protected static requiresDevhubUsername = true; + protected static requiresProject = true; + + public static flags = { + 'targetusername': requiredUserNameFlag, + targetdevhubusername, + installationkeys: Flags.string({ + char: 'k', + required: false, + description: messages.getMessage('installationkeysFlagDescription'), + }), + loglevel + }; + + public async execute(): Promise { + // this.org is guaranteed because requiresUsername=true, as opposed to supportsUsername + const username = this.org.getUsername(); + + //Resolve external package dependencies + let externalPackageResolver = new ExternalPackage2DependencyResolver( + this.hubOrg.getConnection(), + ProjectConfig.getSFDXProjectConfig(null), + this.flags.installationkeys + ); + let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); + + SFPLogger.log( + `Installing external package dependencies of this project in ${username}`, + LoggerLevel.INFO, + new ConsoleLogger() + ); + //Display resolved dependenencies + let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, new ConsoleLogger()); + externalDependencyDisplayer.display(); + + let packageCollectionInstaller = new InstallUnlockedPackageCollection( + await SFPOrg.create({ aliasOrUsername: username }), + new ConsoleLogger() + ); + await packageCollectionInstaller.install(externalPackage2s, true, true); + + SFPLogger.log( + COLOR_KEY_MESSAGE(`Successfully completed external dependencies of this ${username} in ${username}`) + ); + } +} diff --git a/packages/sfp-cli/src/commands/dependency/shrink.ts b/packages/sfp-cli/src/commands/dependency/shrink.ts new file mode 100644 index 000000000..c6aa0ced2 --- /dev/null +++ b/packages/sfp-cli/src/commands/dependency/shrink.ts @@ -0,0 +1,69 @@ +import ShrinkImpl from '../../impl/dependency/ShrinkImpl'; +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import * as fs from 'fs-extra'; +import path = require('path'); +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; + + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_shrink'); + +export default class Shrink extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + protected static requiresProject = true; + + public static flags = { + overwrite: Flags.boolean({ + char: 'o', + description: messages.getMessage('overWriteProjectConfigFlagDescription'), + default: false, + }), + targetdevhubusername, + loglevel + }; + + public async execute() { + let defaultProjectConfigPath = './project-config'; + let projectConfigFilePath: string; + try { + //Validate dependencies in sfdx-project.json // Read Manifest + let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); + const shrinkImpl = new ShrinkImpl( + this.hubOrg.getConnection(), + ); + projectConfig = await shrinkImpl.shrinkDependencies(projectConfig); + + //Create temp directory if not exist + if (!fs.existsSync(defaultProjectConfigPath)) fs.mkdirpSync(defaultProjectConfigPath); + + if(this.flags.overwrite){ + SFPLogger.log(`Overwriting sfdx-project.json with shrunk project config file`,LoggerLevel.INFO) + projectConfigFilePath = `sfdx-project.json`; + + let backupFilePath: string = path.join(defaultProjectConfigPath, `sfdx-project.json.bak`); + SFPLogger.log(`Saving a backup to ${backupFilePath}`,LoggerLevel.INFO) + fs.copySync(projectConfigFilePath, backupFilePath); + + fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); + SFPLogger.log('sfdx-project.json has been updated.',LoggerLevel.INFO) + }else{ + projectConfigFilePath = path.join(defaultProjectConfigPath, `sfdx-project.min.json`); + fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); + SFPLogger.log(`Shrunk project config file has been saved to ${projectConfigFilePath}`,LoggerLevel.INFO) + } + + } catch (error) { + throw new Error('Unable to shrink project config file:' + error); + } + } +} diff --git a/packages/sfp-cli/src/commands/impact/package.ts b/packages/sfp-cli/src/commands/impact/package.ts new file mode 100644 index 000000000..4b803d1a1 --- /dev/null +++ b/packages/sfp-cli/src/commands/impact/package.ts @@ -0,0 +1,80 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import { Stage } from '../../impl/Stage'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import ImpactedPackageResolver, { ImpactedPackageProps } from '../../impl/impact/ImpactedPackagesResolver'; +const Table = require('cli-table'); +import path from 'path'; +import * as fs from 'fs-extra'; + + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'impact_package'); + +export default class Package extends sfpCommand { + public static flags = { + loglevel, + basebranch: Flags.string({ + description: messages.getMessage('baseCommitOrBranchFlagDescription'), + required: true, + }) + }; + + public static description = messages.getMessage('commandDescription'); + private props: ImpactedPackageProps; + + async execute(): Promise { + // Read Manifest + + this.props = { + currentStage: Stage.BUILD, + baseBranch: this.flags.basebranch, + diffOptions: { + useLatestGitTags: true, + skipPackageDescriptorChange: false, + }, + }; + + const impactedPackageResolver = new ImpactedPackageResolver(this.props, new ConsoleLogger()); + + let packagesToBeBuiltWithReasons = await impactedPackageResolver.getImpactedPackages(); + let packageDiffTable = this.createDiffPackageScheduledDisplayedAsATable(packagesToBeBuiltWithReasons); + const packagesToBeBuilt = Array.from(packagesToBeBuiltWithReasons.keys()); + + //Log Packages to be built + SFPLogger.log(COLOR_KEY_MESSAGE('Packages impacted...')); + SFPLogger.log(packageDiffTable.toString()); + + + const outputPath = path.join(process.cwd(), 'impacted-package.json'); + if (packagesToBeBuilt && packagesToBeBuilt.length > 0) + fs.writeFileSync(outputPath, JSON.stringify(packagesToBeBuilt, null, 2)); + else fs.writeFileSync(outputPath, JSON.stringify([], null, 2)); + SFPLogger.log(`Impacted packages if any written to ${outputPath}`); + + + return packagesToBeBuilt; + } + + private createDiffPackageScheduledDisplayedAsATable(packagesToBeBuilt: Map) { + let tableHead = ['Package', 'Reason', 'Last Known Tag']; + let table = new Table({ + head: tableHead, + chars: ZERO_BORDER_TABLE, + }); + for (const pkg of packagesToBeBuilt.keys()) { + let item = [ + pkg, + packagesToBeBuilt.get(pkg).reason, + packagesToBeBuilt.get(pkg).tag ? packagesToBeBuilt.get(pkg).tag : '', + ]; + table.push(item); + } + return table; + } + + +} diff --git a/packages/sfp-cli/src/commands/impact/releaseconfig.ts b/packages/sfp-cli/src/commands/impact/releaseconfig.ts new file mode 100644 index 000000000..b8e7bec9c --- /dev/null +++ b/packages/sfp-cli/src/commands/impact/releaseconfig.ts @@ -0,0 +1,133 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import { Stage } from '../../impl/Stage'; +import * as fs from 'fs-extra'; +import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import path from 'path'; +import ImpactedPackageResolver, { ImpactedPackageProps } from '../../impl/impact/ImpactedPackagesResolver'; +import ImpactedRelaseConfigResolver from '../../impl/impact/ImpactedReleaseConfig'; +const Table = require('cli-table'); + + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'impact_release_config'); + +export default class ReleaseConfig extends sfpCommand { + public static flags = { + loglevel, + basebranch: Flags.string({ + description: messages.getMessage('baseCommitOrBranchFlagDescription'), + required: true, + }), + releaseconfig: Flags.string({ + description: messages.getMessage('releaseConfigFileFlagDescription'), + default: 'config', + }), + explictDependencyCheck: Flags.boolean({ + description: messages.getMessage('explictDependencyCheckFlagDescription'), + default: false, + }), + filterBy: Flags.string({ + description: messages.getMessage('filterByFlagDescription'), + }), + }; + + public static description = messages.getMessage('commandDescription'); + private props: ImpactedPackageProps; + isMultiConfigFilesEnabled: boolean; + + async execute(): Promise { + // Read Manifest + + this.props = { + branch: this.flags.branch, + currentStage: Stage.VALIDATE, + baseBranch: this.flags.basebranch, + diffOptions: { + useLatestGitTags: true, + skipPackageDescriptorChange: false, + }, + }; + + const impactedPackageResolver = new ImpactedPackageResolver(this.props, new ConsoleLogger()); + + let packagesToBeBuiltWithReasons = await impactedPackageResolver.getImpactedPackages(); + let packageDiffTable = this.createDiffPackageScheduledDisplayedAsATable(packagesToBeBuiltWithReasons); + const packagesToBeBuilt = Array.from(packagesToBeBuiltWithReasons.keys()); + + //Log Packages to be built + SFPLogger.log(COLOR_KEY_MESSAGE('Packages impacted...')); + SFPLogger.log(packageDiffTable.toString()); + + const impactedReleaseConfigResolver = new ImpactedRelaseConfigResolver(); + + let impactedReleaseConfigs = impactedReleaseConfigResolver.getImpactedReleaseConfigs( + packagesToBeBuilt, + this.flags.releaseconfig, + this.flags.explictDependencyCheck, + this.flags.filterBy + ); + + let impactedReleaseConfigTable = this.createImpactedReleaseConfigsAsATable(impactedReleaseConfigs.include); + //Log Packages to be built + SFPLogger.log(COLOR_KEY_MESSAGE('Release Configs impacted...')); + SFPLogger.log(impactedReleaseConfigTable.toString()); + + const outputPath = path.join(process.cwd(), 'impacted-release-configs.json'); + if (impactedReleaseConfigs && impactedReleaseConfigs.include.length > 0) + fs.writeFileSync(outputPath, JSON.stringify(impactedReleaseConfigs, null, 2)); + else fs.writeFileSync(outputPath, JSON.stringify([], null, 2)); + if (!this.flags.filterBy) SFPLogger.log(`Impacted release configs written to ${outputPath}`); + else + SFPLogger.log( + `Impacted release configs written to ${outputPath},${ + impactedReleaseConfigs.include[0]?.releaseName + ? `filtered impacted release config found for ${impactedReleaseConfigs.include[0]?.releaseName}` + : `no impacted release config found for ${this.flags.filterBy}` + }` + ); + + return impactedReleaseConfigs.include; + } + + private createDiffPackageScheduledDisplayedAsATable(packagesToBeBuilt: Map) { + let tableHead = ['Package', 'Reason', 'Last Known Tag']; + if (this.isMultiConfigFilesEnabled && this.props.currentStage == Stage.BUILD) { + tableHead.push('Scratch Org Config File'); + } + let table = new Table({ + head: tableHead, + chars: ZERO_BORDER_TABLE, + }); + for (const pkg of packagesToBeBuilt.keys()) { + let item = [ + pkg, + packagesToBeBuilt.get(pkg).reason, + packagesToBeBuilt.get(pkg).tag ? packagesToBeBuilt.get(pkg).tag : '', + ]; + + table.push(item); + } + return table; + } + + private createImpactedReleaseConfigsAsATable(impacatedReleaseConfigs: any[]) { + let tableHead = ['Release/Domain Name', 'Pools', 'ReleaseConfig Path']; + let table = new Table({ + head: tableHead, + chars: ZERO_BORDER_TABLE, + }); + for (const impactedReleaseConfig of impacatedReleaseConfigs) { + let item = [ + impactedReleaseConfig.releaseName, + impactedReleaseConfig.pool, + impactedReleaseConfig.filePath, + ]; + table.push(item); + } + return table; + } +} diff --git a/packages/sfp-cli/src/commands/metrics/report.ts b/packages/sfp-cli/src/commands/metrics/report.ts new file mode 100644 index 000000000..6b5b0a3a7 --- /dev/null +++ b/packages/sfp-cli/src/commands/metrics/report.ts @@ -0,0 +1,88 @@ +import sfpCommand from '../../SfpCommand'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'metrics_report'); + +export default class Report extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = false; + protected static requiresProject = false; + + public static examples = ['$ sfp metrics:report -m -t -v ']; + + public static flags = { + metric: Flags.string({ + description: 'metrics to publish', + required: true, + char: 'm', + }), + type: Flags.string({ + options: [ + 'gauge', + 'counter', + 'timer', + ], + description: 'type of metric', + required: true, + char: 't', + }), + value: Flags.string({ + description: 'value of metric', + char: 'v', + }), + tags: Flags.string({ + description: 'tags for metric', + required: false, + char: 'g', + }), + loglevel + }; + + public async execute(): Promise { + this.validateEnvVars(); + + switch (this.flags.type) { + case 'gauge': + SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Gauge Metric ${this.flags.metric} with value ${this.flags.value}`)); + SFPStatsSender.logGauge(this.flags.metric, this.flags.value, this.flags.tags?JSON.parse(this.flags.tags):undefined); + break; + case 'counter': + SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Count Metric ${this.flags.metric}`)); + SFPStatsSender.logCount(this.flags.metric, this.flags.tags?JSON.parse(this.flags.tags):undefined); + break; + case 'timer': + SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Elapsed Metric ${this.flags.metric} with value ${this.flags.value}`)); + SFPStatsSender.logElapsedTime(this.flags.metric, Number.parseInt(this.flags.value), this.flags.tags?JSON.parse(this.flags.tags):undefined); + break; + default: + throw new Error('Invalid Metric Type'); + }; + + + } + + + private validateEnvVars() { + if ( + !( + process.env.sfp_STATSD || + process.env.sfp_DATADOG || + process.env.sfp_NEWRELIC || + process.env.sfp_SPLUNK + ) + ) { + throw new Error('Environment variable not set for metrics. No metrics will be published.'); + } + } +} + diff --git a/packages/sfp-cli/src/commands/orchestrator/build.ts b/packages/sfp-cli/src/commands/orchestrator/build.ts new file mode 100644 index 000000000..6cbcfb656 --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/build.ts @@ -0,0 +1,45 @@ +import BuildImpl, { BuildProps } from '../../impl/parallelBuilder/BuildImpl'; +import { Stage } from '../../impl/Stage'; +import BuildBase from '../../BuildBase'; +import { Messages } from '@salesforce/core'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'build'); + +export default class Build extends BuildBase { + public static description = messages.getMessage('commandDescription'); + + getStage() { + return Stage.BUILD; + } + + getBuildProps(): BuildProps { + let buildProps: BuildProps = { + configFilePath: this.flags.configfilepath, + devhubAlias: this.flags.devhubalias, + repourl: this.flags.repourl, + waitTime: this.flags.waittime, + isQuickBuild: false, + isDiffCheckEnabled: this.flags.diffcheck, + buildNumber: this.flags.buildnumber, + executorcount: this.flags.executorcount, + branch: this.flags.branch, + currentStage: Stage.BUILD, + isBuildAllAsSourcePackages: false, + diffOptions: { + useLatestGitTags: true, + skipPackageDescriptorChange: false, + }, + }; + return buildProps; + } + + getBuildImplementer(buildProps: BuildProps): BuildImpl { + let buildImpl = new BuildImpl(buildProps); + return buildImpl; + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/deploy.ts b/packages/sfp-cli/src/commands/orchestrator/deploy.ts new file mode 100644 index 000000000..18844663b --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/deploy.ts @@ -0,0 +1,168 @@ +import sfpCommand from '../../SfpCommand'; +import { Messages } from '@salesforce/core'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../../impl/deploy/DeployImpl'; +import { Stage } from '../../impl/Stage'; +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_KEY_MESSAGE, + COLOR_SUCCESS, +} from '@flxblio/sfp-logger'; +import { COLOR_TIME } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import { Flags } from '@oclif/core'; +import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { LoggerLevel } from '@flxblio/sfp-logger'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'deploy'); + +export default class Deploy extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp orchestrator:deploy -u `]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + protected static requiresProject = false; + + public static flags = { + targetorg: requiredUserNameFlag, + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + waittime: Flags.integer({ + description: messages.getMessage('waitTimeFlagDescription'), + default: 120, + }), + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagFlagDescription'), + }), + skipifalreadyinstalled: Flags.boolean({ + required: false, + default: false, + description: messages.getMessage('skipIfAlreadyInstalled'), + }), + baselineorg: Flags.string({ + char: 'b', + description: messages.getMessage('baselineorgFlagDescription'), + required: false, + dependsOn: ['skipifalreadyinstalled'], + }), + allowunpromotedpackages: Flags.boolean({ + description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), + deprecated: { + message: '--allowunpromotedpackages is deprecated, All packages are allowed' + }, + hidden: true, + }), + retryonfailure: Flags.boolean({ + description: messages.getMessage('retryOnFailureFlagDescription'), + hidden: true, + }), + releaseconfig: Flags.string({ + description: messages.getMessage('configFileFlagDescription'), + }), + enablesourcetracking: Flags.boolean({ + description: messages.getMessage('enableSourceTrackingFlagDescription'), + }), + logsgroupsymbol, + loglevel + }; + + public async execute() { + let executionStartTime = Date.now(); + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`deploy`)}`)); + SFPLogger.log(COLOR_HEADER(`Skip Packages If Already Installed: ${this.flags.skipifalreadyinstalled}`)); + SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); + SFPLogger.log(COLOR_HEADER(`Target Environment: ${this.flags.targetorg}`)); + if(this.flags.releaseconfig) SFPLogger.log(COLOR_HEADER(`Filter according to: ${this.flags.releaseconfig}`)); + if (this.flags.baselineorg) SFPLogger.log(COLOR_HEADER(`Baselined Against Org: ${this.flags.baselineorg}`)); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + let deploymentResult: DeploymentResult; + + let tags = { + targetOrg: this.flags.targetorg, + }; + + if (this.flags.tag != null) { + tags['tag'] = this.flags.tag; + } + + let deployProps: DeployProps = { + targetUsername: this.flags.targetorg, + artifactDir: this.flags.artifactdir, + waitTime: this.flags.waittime, + tags: tags, + isTestsToBeTriggered: false, + deploymentMode: this.flags.enablesourcetracking? DeploymentMode.SOURCEPACKAGES_PUSH: DeploymentMode.NORMAL, + skipIfPackageInstalled: this.flags.skipifalreadyinstalled, + logsGroupSymbol: this.flags.logsgroupsymbol, + currentStage: Stage.DEPLOY, + baselineOrg: this.flags.baselineorg, + isRetryOnFailure: this.flags.retryonfailure, + releaseConfigPath: this.flags.releaseconfig, + }; + + try { + let deployImpl: DeployImpl = new DeployImpl(deployProps); + + deploymentResult = await deployImpl.exec(); + + if (deploymentResult.failed.length > 0 || deploymentResult.error) { + process.exitCode = 1; + } + } catch (error) { + SFPLogger.log(COLOR_ERROR(error)); + process.exitCode = 1; + } finally { + let totalElapsedTime: number = Date.now() - executionStartTime; + + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `${deploymentResult.deployed.length} packages deployed in ${COLOR_TIME( + getFormattedTime(totalElapsedTime) + )} with {${deploymentResult.failed.length}} errors` + ) + ); + + if (deploymentResult.failed.length > 0) { + SFPLogger.log( + COLOR_ERROR( + `\nPackages Failed to Deploy`, + deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) + ) + ); + } + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + + SFPStatsSender.logCount('deploy.scheduled', tags); + + SFPStatsSender.logGauge('deploy.packages.scheduled', deploymentResult.scheduled, tags); + + SFPStatsSender.logGauge('deploy.duration', totalElapsedTime, tags); + + SFPStatsSender.logGauge('deploy.succeeded.packages', deploymentResult.deployed.length, tags); + + SFPStatsSender.logGauge('deploy.failed.packages', deploymentResult.failed.length, tags); + + if (deploymentResult.failed.length > 0) { + SFPStatsSender.logCount('deploy.failed', tags); + } else { + SFPStatsSender.logCount('deploy.succeeded', tags); + } + } + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/prepare.ts b/packages/sfp-cli/src/commands/orchestrator/prepare.ts new file mode 100644 index 000000000..18aa7daa9 --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/prepare.ts @@ -0,0 +1,222 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import PrepareImpl from '../../impl/prepare/PrepareImpl'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import { Stage } from '../../impl/Stage'; +import * as fs from 'fs-extra'; +import ScratchOrgInfoFetcher from '../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher'; +import Ajv from 'ajv'; +import path = require('path'); +import { PoolErrorCodes } from '../../core/scratchorg/pool/PoolError'; +import SFPLogger, { + LoggerLevel, + COLOR_ERROR, + COLOR_HEADER, + COLOR_SUCCESS, + COLOR_TIME, + COLOR_KEY_MESSAGE, +} from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +import SFPOrg from '../../core/org/SFPOrg'; +import { Flags } from '@oclif/core'; +import { loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'prepare'); + +export default class Prepare extends sfpCommand { + protected static requiresDevhubUsername = true; + protected static requiresProject = true; + + public static flags = { + targetdevhubusername, + poolconfig: Flags.file({ + required: false, + default: 'config/poolconfig.json', + char: 'f', + description: messages.getMessage('poolConfigFlagDescription'), + }), + npmrcpath: Flags.file({ + description: messages.getMessage('npmrcPathFlagDescription'), + required: false, + }), + keys: Flags.string({ + required: false, + description: messages.getMessage('keysDescription'), + }), + logsgroupsymbol, + loglevel + }; + + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp orchestrator:prepare -f config/mypoolconfig.json -v `]; + + public async execute(): Promise { + let executionStartTime = Date.now(); + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`prepare`)}`)); + + //Read pool config + try { + let poolConfig: PoolConfig = fs.readJSONSync(this.flags.poolconfig); + this.validatePoolConfig(poolConfig); + //Assign Keys to the config + if (this.flags.keys) poolConfig.keys = this.flags.keys; + + this.displayHeader(poolConfig); + + //Assign npmrcPath to the config + if (this.flags.npmrcpath) { + if (poolConfig.fetchArtifacts?.npm) poolConfig.fetchArtifacts.npm.npmrcPath = this.flags.npmrcpath; + else + SFPLogger.log( + COLOR_WARNING( + 'npmrcPath found in flag, however the configuration doesnt seem to use npm, Are you sure your schema is good?' + ) + ); + } + + let tags = { + stage: Stage.PREPARE, + poolName: poolConfig.tag, + }; + + await this.hubOrg.refreshAuth(); + const hubConn = this.hubOrg.getConnection(); + + this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); + + let hubOrgAsSfPOrg = await SFPOrg.create({ connection: this.hubOrg.getConnection() }); + let prepareImpl = new PrepareImpl(hubOrgAsSfPOrg, poolConfig, this.flags.loglevel); + + let results = await prepareImpl.exec(); + if (results.isOk()) { + let totalElapsedTime = Date.now() - executionStartTime; + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `Provisioned {${results.value.scratchOrgs.length}} scratchorgs out of ${ + results.value.to_allocate + } requested with ${COLOR_ERROR(results.value.failedToCreate)} failed in ${COLOR_TIME( + getFormattedTime(totalElapsedTime) + )} ` + ) + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + await this.getCurrentRemainingNumberOfOrgsInPoolAndReport(poolConfig); + + SFPStatsSender.logGauge('prepare.succeededorgs', results.value.scratchOrgs.length, tags); + if (results.value.scratchOrgs.length > 0) + SFPStatsSender.logGauge('prepare.duration', Date.now() - executionStartTime, tags); + } else if (results.isErr()) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log(COLOR_ERROR(results.error.message), LoggerLevel.ERROR); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + switch (results.error.errorCode) { + case PoolErrorCodes.Max_Capacity: + process.exitCode = 0; + break; + case PoolErrorCodes.No_Capacity: + process.exitCode = 0; + break; + case PoolErrorCodes.PrerequisiteMissing: + process.exitCode = 1; + break; + case PoolErrorCodes.UnableToProvisionAny: + SFPStatsSender.logGauge('prepare.failedorgs', results.error.failed, tags); + process.exitCode = 1; + break; + } + } + } catch (err) { + throw new Error('Unable to execute command .. ' + err); + } + } + + private displayHeader(poolConfig: PoolConfig) { + SFPLogger.log(COLOR_HEADER(`Pool Name: ${poolConfig.tag}`)); + SFPLogger.log(COLOR_HEADER(`Requested Count of Orgs: ${poolConfig.maxAllocation}`)); + SFPLogger.log( + COLOR_HEADER( + `Scratch Orgs to be submitted to pool in case of failures: ${ + poolConfig.succeedOnDeploymentErrors ? 'true' : 'false' + }` + ) + ); + + SFPLogger.log( + COLOR_HEADER(`All packages in the repo to be installed: ${poolConfig.installAll ? 'true' : 'false'}`) + ); + + SFPLogger.log( + COLOR_HEADER( + `Enable Source Tracking: ${ + poolConfig.enableSourceTracking || poolConfig.enableSourceTracking === undefined ? 'true' : 'false' + }` + ) + ); + + if (poolConfig.enableVlocity) SFPLogger.log(COLOR_HEADER(`Enable Vlocity Config: true`)); + + if (poolConfig.fetchArtifacts) { + if (poolConfig.fetchArtifacts.artifactFetchScript) + SFPLogger.log( + COLOR_HEADER(`Script provided to fetch artifacts: ${poolConfig.fetchArtifacts.artifactFetchScript}`) + ); + if (poolConfig.fetchArtifacts.npm) { + SFPLogger.log(COLOR_HEADER(`Fetch artifacts from pre-authenticated NPM registry: true`)); + } + } + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + + private async getCurrentRemainingNumberOfOrgsInPoolAndReport(poolConfig: PoolConfig) { + try { + const results = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.flags.tag, + false, + true + ); + + let tags = { + stage: Stage.PREPARE, + poolName: poolConfig.tag, + }; + + let availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); + + SFPStatsSender.logGauge('pool.available', availableSo.length, tags); + } catch (error) { + //do nothing, we are not reporting anything if anything goes wrong here + } + } + + public validatePoolConfig(poolConfig: any) { + let ajv = new Ajv({ allErrors: true }); + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'pooldefinition.schema.json'), + { encoding: 'UTF-8' } + ); + let validator = ajv.compile(schema); + let isSchemaValid = validator(poolConfig); + if (!isSchemaValid) { + let errorMsg: string = `The pool configuration is invalid, Please fix the following errors\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/promote.ts b/packages/sfp-cli/src/commands/orchestrator/promote.ts new file mode 100644 index 000000000..205acb622 --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/promote.ts @@ -0,0 +1,115 @@ +import sfpCommand from '../../SfpCommand'; +import { Messages } from '@salesforce/core'; +import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl' +import ArtifactFetcher from '../../core/artifacts/ArtifactFetcher'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import { PackageType } from '../../core/package/SfpPackage'; +import { Flags, ux } from '@oclif/core'; +import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import SFPLogger from '@flxblio/sfp-logger'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'promote'); + +export default class Promote extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp orchestrator:promote -d path/to/artifacts -v `]; + + protected static requiresDevhubUsername = true; + + public static flags = { + targetdevhubusername, + artifactdir: Flags.directory({ + required: true, + char: 'd', + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + outputdir: Flags.directory({ + required: false, + char: 'o', + description: messages.getMessage('outputDirectoryFlagDescription'), + hidden: true, + deprecated: { + message: '--outputdir is deprecated, Artifacts are no longer modified after promote', + }, + }), + loglevel + }; + + public async execute() { + SFPLogger.log(COLOR_HEADER('command: promote')); + SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + //Refresh HubOrg Authentication + await this.hubOrg.refreshAuth(); + + let unpromotedPackages: { name: string; error: string }[] = []; + try { + let artifacts = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); + + if (artifacts.length === 0) { + throw new Error(`No artifacts found at ${this.flags.artifactdir}`); + } + + let result: boolean = true; + let promotedPackages: string[] = []; + for (let artifact of artifacts) { + let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); + try { + if (sfpPackage.package_type === PackageType.Unlocked) { + let promoteUnlockedPackageImpl = new PromoteUnlockedPackageImpl( + artifact.sourceDirectoryPath, + sfpPackage.package_version_id, + this.hubOrg.getUsername() + ); + await promoteUnlockedPackageImpl.promote(); + } + + promotedPackages.push(sfpPackage.packageName); + } catch (err) { + result = false; + + unpromotedPackages.push({ + name: sfpPackage.packageName, + error: err.message, + }); + } + } + console.log(`Promoted packages:`, promotedPackages); + + // Overall exit status is 1 if a package failed to promote + if (!result) { + throw new Error(); + } + } catch (err) { + console.log(err.message); + + // Print unpromoted packages with reason for failure + if (unpromotedPackages.length > 0) { + ux.table(unpromotedPackages, { name: {}, error: {} }); + } + + // Fail the task when an error occurs + process.exitCode = 1; + } + } + + private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { + let segments = packageVersionNumber.split('.'); + + if (segments.length === 4) { + packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { + if (segmentsIdx === 3) return version + '-' + segment; + else return version + '.' + segment; + }); + } + + return packageVersionNumber; + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/publish.ts b/packages/sfp-cli/src/commands/orchestrator/publish.ts new file mode 100644 index 000000000..1ceb82900 --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/publish.ts @@ -0,0 +1,460 @@ +import sfpCommand from '../../SfpCommand'; +import { Messages } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import path = require('path'); +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_KEY_MESSAGE, + COLOR_SUCCESS, + COLOR_TIME, +} from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import defaultShell from '../../core/utils/DefaultShell'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import Git from '../../core/git/Git'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import PackageVersionLister from '../../core/package/version/PackageVersionLister'; +import SFPOrg from '../../core/org/SFPOrg'; +import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import GitTags from '../../core/git/GitTags'; +import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'publish'); + +export default class Promote extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp orchestrator:publish -f path/to/script`, + `$ sfp orchestrator:publish --npm`, + `$ sfp orchestrator:publish -f path/to/script -p -v HubOrg`, + `$ sfp orchestrator:publish -f path/to/script --gittag --pushgittag`, + ]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + + public static flags = { + artifactdir: Flags.directory({ + required: true, + char: 'd', + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + publishpromotedonly: Flags.boolean({ + char: 'p', + description: messages.getMessage('publishPromotedOnlyFlagDescription'), + dependsOn: ['devhubalias'], + }), + 'devhubalias':optionalDevHubFlag, + scriptpath: Flags.file({ + char: 'f', + description: messages.getMessage('scriptPathFlagDescription'), + }), + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagFlagDescription'), + }), + gittag: Flags.boolean({ + description: messages.getMessage('gitTagFlagDescription'), + default: false, + }), + gittaglimit: Flags.integer({ + description: messages.getMessage('gitTagLimitFlagDescription'), + }), + gittagage: Flags.integer({ + description: messages.getMessage('gitTagAgeFlagDescription'), + }), + pushgittag: Flags.boolean({ + description: messages.getMessage('gitPushTagFlagDescription'), + default: false, + }), + npm: Flags.boolean({ + description: messages.getMessage('npmFlagDescription'), + exclusive: ['scriptpath'], + }), + scope: Flags.string({ + description: messages.getMessage('scopeFlagDescription'), + dependsOn: ['npm'], + parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), + }), + npmtag: Flags.string({ + description: messages.getMessage('npmTagFlagDescription'), + dependsOn: ['npm'], + required: false, + deprecated: { + message: + '--npmtag is deprecated, sfp will automatically tag the artifact with the branch name', + }, + }), + npmrcpath: Flags.file({ + description: messages.getMessage('npmrcPathFlagDescription'), + dependsOn: ['npm'], + required: false, + }), + logsgroupsymbol, + loglevel + }; + private git: Git; + + public async execute() { + let nPublishedArtifacts: number = 0; + let failedArtifacts: string[] = []; + + let executionStartTime = Date.now(); + + let succesfullyPublishedPackageNamesForTagging: { + name: string; + version: string; + type: string; + tag: string; + commitId: string; + }[] = []; + + let npmrcFilesToCleanup: string[] = []; + this.git = await Git.initiateRepo(new ConsoleLogger()); + + try { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`publish`)}`)); + SFPLogger.log(COLOR_HEADER(`target: ${this.flags.scriptpath ? this.flags.scriptpath : 'NPM'}`)); + SFPLogger.log( + COLOR_HEADER(`Publish promoted artifacts only: ${this.flags.publishpromotedonly ? true : false}`) + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + let packageVersionList: any; + if (this.flags.publishpromotedonly) { + let hubOrg = await SFPOrg.create({ aliasOrUsername: this.flags.devhubalias }); + let packageVersionLister: PackageVersionLister = new PackageVersionLister(hubOrg); + packageVersionList = await packageVersionLister.listAllReleasedVersions(process.cwd()); + } + + let artifacts = ArtifactFetcher.findArtifacts(this.flags.artifactdir); + let artifactFilePaths = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); + + // Pattern captures two named groups, the "package" name and "version" number + let pattern = new RegExp('(?^.*)(?:_sfp_artifact_)(?.*)(?:\\.zip)'); + for (let artifact of artifacts) { + let packageName: string; + let packageVersionNumber: string; + + let match: RegExpMatchArray = path.basename(artifact).match(pattern); + + if (match !== null) { + packageName = match.groups.package; + packageVersionNumber = match.groups.version; + } else { + // artifact filename doesn't match pattern + continue; + } + + let sfpPackage = await this.getPackageInfo(artifactFilePaths, packageName, packageVersionNumber); + + let packageType = sfpPackage.package_type; + let packageVersionId = sfpPackage.package_version_id; + + if (this.flags.publishpromotedonly && packageType === PackageType.Unlocked) { + let isReleased = this.isPackageVersionIdReleased(packageVersionList, packageVersionId); + + if (!isReleased) { + failedArtifacts.push(`${packageName} v${packageVersionNumber}`); + SFPLogger.log( + `Skipping ${packageName} Version ${packageVersionNumber}. Package Version Id ${packageVersionId} has not been promoted.` + ); + process.exitCode = 1; + continue; + } + } + + try { + if (this.flags.npm) { + await this.publishUsingNpm(sfpPackage, packageVersionNumber, npmrcFilesToCleanup); + } else { + await this.publishUsingScript(packageName, packageVersionNumber, artifact); + } + + succesfullyPublishedPackageNamesForTagging.push({ + name: packageName, + version: packageVersionNumber.replace('-', '.'), + type: packageType, + tag: `${packageName}_v${packageVersionNumber.replace('-', '.')}`, + commitId: sfpPackage.sourceVersion + }); + + nPublishedArtifacts++; + } catch (err) { + failedArtifacts.push(`${packageName} v${packageVersionNumber}`); + SFPLogger.log(err.message); + process.exitCode = 1; + } + } + + if (this.flags.gittag) { + await this.createGitTags(succesfullyPublishedPackageNamesForTagging); + await this.pushGitTags(succesfullyPublishedPackageNamesForTagging); + } + + + if (this.flags.gittagage && this.flags.gittaglimit) { + await this.deleteGitTagsOlderThan(succesfullyPublishedPackageNamesForTagging, this.flags.gittagage, this.flags.gittaglimit); + } else if (this.flags.gittagage) { + await this.deleteGitTagsOlderThan(succesfullyPublishedPackageNamesForTagging, this.flags.gittagage); + } else if (this.flags.gittaglimit) { + await this.deleteExcessGitTags(succesfullyPublishedPackageNamesForTagging, this.flags.gittaglimit); + } + + + } catch (err) { + SFPLogger.log(err.message); + + // Fail the task when an error occurs + process.exitCode = 1; + } finally { + if (npmrcFilesToCleanup.length > 0) { + npmrcFilesToCleanup.forEach((npmrcFile) => { + fs.unlinkSync(npmrcFile); + }); + } + + let totalElapsedTime: number = Date.now() - executionStartTime; + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `${nPublishedArtifacts} artifacts published in ${COLOR_TIME( + getFormattedTime(totalElapsedTime) + )} with {${COLOR_ERROR(failedArtifacts.length)}} errors` + ) + ); + + if (failedArtifacts.length > 0) { + SFPLogger.log(COLOR_ERROR(`Packages Failed to Publish`, failedArtifacts)); + } + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + let tags = { + publish_promoted_only: this.flags.publishpromotedonly ? 'true' : 'false', + }; + + if (this.flags.tag != null) { + tags['tag'] = this.flags.tag; + } + + SFPStatsSender.logGauge('publish.duration', totalElapsedTime, tags); + + SFPStatsSender.logGauge('publish.succeeded', nPublishedArtifacts, tags); + + if (failedArtifacts.length > 0) { + SFPStatsSender.logGauge('publish.failed', failedArtifacts.length, tags); + } + } + } + + private async publishUsingNpm(sfpPackage: SfpPackage, packageVersionNumber: string, npmrcFilesToCleanup: string[]) { + let publishGroupSection = new GroupConsoleLogs(`Publishing ${sfpPackage.packageName}`).begin(); + let artifactRootDirectory = path.dirname(sfpPackage.sourceDir); + + // NPM does not accept packages with uppercase characters + let name: string = sfpPackage.packageName.toLowerCase() + '_sfp_artifact'; + + //Check whether the user has already passed in @ + + if (this.flags.scope) { + let scope: string = this.flags.scope.replace(/@/g, '').toLowerCase(); + name = `@${scope}/` + name; + } + + let packageJson = { + name: name, + version: packageVersionNumber, + repository: sfpPackage.repository_url, + }; + + fs.writeFileSync(path.join(artifactRootDirectory, 'package.json'), JSON.stringify(packageJson, null, 4)); + + if (this.flags.npmrcpath) { + fs.copyFileSync(this.flags.npmrcpath, path.join(artifactRootDirectory, '.npmrc')); + + npmrcFilesToCleanup.push(path.join(artifactRootDirectory, '.npmrc')); + } + + let cmd = `npm publish`; + + //Do a tag based on the branch + if (sfpPackage.branch) { + cmd += ` --tag ${sfpPackage.branch}`; + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Publishing ${sfpPackage.packageName} Version ${packageVersionNumber} with tag ${sfpPackage.branch}...` + ) + ); + } + + let npmPublishExecutor: ExecuteCommand = new ExecuteCommand(new ConsoleLogger(), LoggerLevel.INFO, true); + await npmPublishExecutor.execCommand(cmd, artifactRootDirectory); + + publishGroupSection.end(); + } + + private async publishUsingScript(packageName: string, packageVersionNumber: string, artifact: string) { + let publishGroupSection = new GroupConsoleLogs(`Publishing ${packageName}`).begin(); + let cmd: string; + if (process.platform !== 'win32') { + cmd = `${defaultShell()} -e ${this.flags.scriptpath} ${packageName} ${packageVersionNumber} ${artifact} ${ + this.flags.publishpromotedonly ? true : false + }`; + } else { + cmd = `cmd.exe /c ${this.flags.scriptpath} ${packageName} ${packageVersionNumber} ${artifact} ${ + this.flags.publishpromotedonly ? true : false + }`; + } + + SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing ${packageName} Version ${packageVersionNumber}...`)); + + let scriptExecutor: ExecuteCommand = new ExecuteCommand(new ConsoleLogger(), LoggerLevel.INFO, true); + await scriptExecutor.execCommand(cmd, process.cwd()); + publishGroupSection.end(); + } + + protected validateFlags() { + if (this.flags.scriptpath === undefined && this.flags.npm === undefined) + throw new Error('Either --scriptpath or --npm flag must be provided'); + + if (this.flags.scriptpath && !fs.existsSync(this.flags.scriptpath)) + throw new Error(`Script path ${this.flags.scriptpath} does not exist`); + + if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); + } + + private async pushGitTags( + sucessfullyPublishedPackages: { + name: string; + version: string; + type: string; + tag: string; + commitId: string; + }[] + ) { + + if (this.flags.pushgittag) { + let tagsForPushing:string[]=[]; + for (let succesfullyPublishedPackage of sucessfullyPublishedPackages) { + SFPLogger.log(COLOR_KEY_MESSAGE(`Pushing Git Tags to Repo ${succesfullyPublishedPackage.tag}`)); + tagsForPushing.push(succesfullyPublishedPackage.tag); + } + await this.git.pushTags(tagsForPushing) + } + } + + private async createGitTags( + sucessfullyPublishedPackages: { + name: string; + version: string; + type: string; + tag: string; + commitId: string; + }[] + ) { + + for (let sucessFullyPublishedPackage of sucessfullyPublishedPackages) { + SFPLogger.log(COLOR_KEY_MESSAGE(`Creating Git Tags in Repo ${sucessFullyPublishedPackage.tag}`)); + await this.git.addAnnotatedTag( + sucessFullyPublishedPackage.tag, + `${sucessFullyPublishedPackage.name} ${sucessFullyPublishedPackage.type} Package ${sucessFullyPublishedPackage.version}`, + sucessFullyPublishedPackage.commitId + ); + } + } + + //Exclude the latest git tag up to a specified number of tags, and then deletes the excess tags that exceed that limit. + private async deleteExcessGitTags( tags: { + name: string; + version: string; + type: string; + tag: string; + commitId: string; + }[], limit: number) { + //const pkgs = ProjectConfig.getAllPackages(this.git.getRepositoryPath()); + const tagsToDelete: string[] = []; + + await Promise.all(tags.map(async (tag) => { + const gitTags = new GitTags(this.git, tag.name); + const tags = await gitTags.limitTags(limit); + tagsToDelete.push(...tags); + })); + + if (tagsToDelete.length > 0) { + SFPLogger.log(COLOR_KEY_MESSAGE('Removing the following Git tag(s):')); + for (let tag of tagsToDelete) { + SFPLogger.log(COLOR_KEY_MESSAGE(tag)); + } + await this.git.deleteTags(tagsToDelete); + } + } + + //Deletes Git tags that are older than a specified number of days. + private async deleteGitTagsOlderThan( tags: { + name: string; + version: string; + type: string; + tag: string; + commitId: string; + }[], daysToKeep: number + , limit?: number) { + + const tagsToDelete: string[] = []; + + await Promise.all(tags.map(async (tag) => { + const gitTags = new GitTags(this.git, tag.name); + const tags = await gitTags.filteredOldTags(daysToKeep, limit); + tagsToDelete.push(...tags); + })); + + if (tagsToDelete.length > 0) { + SFPLogger.log(COLOR_KEY_MESSAGE('Removing the following Git tag(s):')); + for (let tag of tagsToDelete) { + SFPLogger.log(COLOR_KEY_MESSAGE(tag)); + } + await this.git.deleteTags(tagsToDelete); + } + + } + + + private isPackageVersionIdReleased(packageVersionList: any, packageVersionId: string): boolean { + let packageVersion = packageVersionList.find((pkg) => { + return pkg.SubscriberPackageVersionId === packageVersionId; + }); + + if (packageVersion) return true; + else return false; + } + + /** + * Get sourceDirectory and packageMetadata of artifact with package name and version + * @param artifacts + * @param packageName + * @param packageVersionNumber + */ + private async getPackageInfo(artifacts: Artifact[], packageName, packageVersionNumber): Promise { + for (let artifact of artifacts) { + let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); + if ( + sfpPackage.packageName === packageName && + sfpPackage.versionNumber === packageVersionNumber.replace('-', '.') + ) { + return sfpPackage; + } + } + + throw new Error( + `Unable to find artifact metadata for ${packageName} Version ${packageVersionNumber.replace('-', '.')}` + ); + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/quickbuild.ts b/packages/sfp-cli/src/commands/orchestrator/quickbuild.ts new file mode 100644 index 000000000..0ff13dabb --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/quickbuild.ts @@ -0,0 +1,44 @@ +import { Messages } from '@salesforce/core'; +import BuildImpl, { BuildProps } from '../../impl/parallelBuilder/BuildImpl'; +import { Stage } from '../../impl/Stage'; +import BuildBase from '../../BuildBase'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'quickbuild'); + +export default class QuickBuild extends BuildBase { + public static description = messages.getMessage('commandDescription'); + + getStage() { + return Stage.QUICKBUILD; + } + + getBuildProps(): BuildProps { + let buildProps: BuildProps = { + configFilePath: this.flags.configfilepath, + devhubAlias: this.flags.devhubalias, + repourl: this.flags.repourl, + waitTime: this.flags.waittime, + isQuickBuild: true, + isDiffCheckEnabled: this.flags.diffcheck, + buildNumber: this.flags.buildnumber, + executorcount: this.flags.executorcount, + branch: this.flags.branch, + currentStage: Stage.QUICKBUILD, + isBuildAllAsSourcePackages: false, + diffOptions: { + useLatestGitTags: true, + skipPackageDescriptorChange: false, + }, + }; + return buildProps; + } + getBuildImplementer(buildProps: BuildProps): BuildImpl { + let buildImpl = new BuildImpl(buildProps); + return buildImpl; + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/release.ts b/packages/sfp-cli/src/commands/orchestrator/release.ts new file mode 100644 index 000000000..57f8d913b --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/release.ts @@ -0,0 +1,256 @@ +import sfpCommand from '../../SfpCommand'; +import { LoggerLevel, Messages } from '@salesforce/core'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import ReleaseImpl, { ReleaseProps, ReleaseResult } from '../../impl/release/ReleaseImpl'; +import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import ReleaseError from '../../errors/ReleaseError'; +import path = require('path'); +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_TIME, + COLOR_SUCCESS, + COLOR_WARNING, + COLOR_KEY_MESSAGE, + ConsoleLogger, +} from '@flxblio/sfp-logger'; +import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; +import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'release'); + +export default class Release extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `sfp orchestrator:release -p path/to/releasedefinition.yml -u myorg --npm --scope myscope --generatechangelog`, + ]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + protected static requiresProject = false; + + public static flags = { + releasedefinition: arrayFlagSfdxStyle({ + char: 'p', + description: messages.getMessage('releaseDefinitionFlagDescription'), + required: true, + }), + targetorg: requiredUserNameFlag, + scriptpath: Flags.file({ + char: 'f', + description: messages.getMessage('scriptPathFlagDescription'), + }), + npm: Flags.boolean({ + description: messages.getMessage('npmFlagDescription'), + exclusive: ['scriptpath'], + }), + scope: Flags.string({ + description: messages.getMessage('scopeFlagDescription'), + dependsOn: ['npm'], + parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), + }), + npmrcpath: Flags.file({ + description: messages.getMessage('npmrcPathFlagDescription'), + dependsOn: ['npm'], + required: false, + }), + logsgroupsymbol, + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagFlagDescription'), + }), + dryrun: Flags.boolean({ + description: messages.getMessage('dryRunFlagDescription'), + default: false, + hidden: true, + }), + waittime: Flags.integer({ + description: messages.getMessage('waitTimeFlagDescription'), + default: 120, + }), + keys: Flags.string({ + required: false, + description: messages.getMessage('keysFlagDescription'), + }), + generatechangelog: Flags.boolean({ + default: false, + description: messages.getMessage('generateChangelogFlagDescription'), + }), + directory: Flags.string({ + char: 'd', + description: messages.getMessage('directoryFlagDescription'), + }), + branchname: Flags.string({ + dependsOn: ['generatechangelog'], + char: 'b', + description: messages.getMessage('branchNameFlagDescription'), + }), + allowunpromotedpackages: Flags.boolean({ + description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), + hidden: true, + deprecated: { + message: '--allowunpromotedpackages is deprecated, All packages are allowed', + }, + }), + devhubalias: optionalDevHubFlag, + loglevel + }; + + public async execute() { + this.validateFlags(); + + let tags = { + targetOrg: this.flags.targetorg, + }; + + if (this.flags.tag != null) { + tags['tag'] = this.flags.tag; + } + + let executionStartTime = Date.now(); + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`release`)}`)); + SFPLogger.log(COLOR_HEADER(`Target Org: ${this.flags.targetorg}`)); + SFPLogger.log(COLOR_HEADER(`Release Definitions: ${this.flags.releasedefinition}`)); + SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${path.resolve('artifacts')}`)); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + let releaseDefinitions: ReleaseDefinitionSchema[] = []; + for (const pathToReleaseDefintion of this.flags.releasedefinition) { + let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)).releaseDefinition; + + //Support Legacy by taking the existing single workItemFilter and pushing it to the new model + if(releaseDefinition.changelog?.workItemFilter) + { + releaseDefinition.changelog.workItemFilters = new Array(); + releaseDefinition.changelog.workItemFilters.push(releaseDefinition.changelog?.workItemFilter); + } + + if (this.flags.isGenerateChangelog && !releaseDefinition.changelog) + throw new Error('changelog parameters must be specified in release definition to generate changelog'); + + if ( + releaseDefinition.promotePackagesBeforeDeploymentToOrg && + this.flags.targetorg == releaseDefinition.promotePackagesBeforeDeploymentToOrg && + !this.flags.devhubalias + ) + throw new Error('DevHub is mandatory when promote is used within release defintion'); + + releaseDefinitions.push(releaseDefinition); + } + + let releaseResult: ReleaseResult; + try { + let props: ReleaseProps = { + releaseDefinitions: releaseDefinitions, + targetOrg: this.flags.targetorg, + fetchArtifactScript: this.flags.scriptpath, + isNpm: this.flags.npm, + scope: this.flags.scope, + npmrcPath: this.flags.npmrcpath, + logsGroupSymbol: this.flags.logsgroupsymbol, + tags: tags, + isDryRun: this.flags.dryrun, + waitTime: this.flags.waittime, + keys: this.flags.keys, + isGenerateChangelog: this.flags.generatechangelog, + devhubUserName: this.flags.devhubalias, + branch: this.flags.branchname, + directory:this.flags.directory, + }; + + let releaseImpl: ReleaseImpl = new ReleaseImpl(props,new ConsoleLogger()); + + releaseResult = await releaseImpl.exec(); + if(!this.flags.dryrun) + SFPStatsSender.logCount('release.succeeded', tags); + } catch (err) { + if (err instanceof ReleaseError) { + releaseResult = err.data; + } else SFPLogger.log(err.message); + + if(!this.flags.dryrun) + SFPStatsSender.logCount('release.failed', tags); + + // Fail the task when an error occurs + process.exitCode = 1; + } finally { + let totalElapsedTime: number = Date.now() - executionStartTime; + + if (releaseResult) { + this.printReleaseSummary(releaseResult, totalElapsedTime); + this.sendMetrics(releaseResult, tags, totalElapsedTime); + } + } + } + + private sendMetrics(releaseResult: ReleaseResult, tags: any, totalElapsedTime: number) { + if(!this.flags.dryrun) + { + SFPStatsSender.logCount('release.scheduled', tags); + + SFPStatsSender.logGauge('release.duration', totalElapsedTime, tags); + + let packagesScheduled = 0; + let packagesSucceeded = 0; + let packagesFailed = 0; + + for (const deploymentResults of releaseResult.succeededDeployments) { + packagesScheduled += deploymentResults.result.scheduled; + packagesSucceeded += deploymentResults.result.deployed.length; + } + + for (const deploymentResults of releaseResult.failedDeployments) { + packagesScheduled += deploymentResults.result.scheduled; + packagesSucceeded += deploymentResults.result.deployed.length; + packagesFailed += deploymentResults.result.failed.length; + } + + SFPStatsSender.logGauge('release.packages.scheduled', packagesScheduled, tags); + SFPStatsSender.logGauge('release.packages.succeeded', packagesSucceeded, tags); + SFPStatsSender.logGauge('release.packages.failed', packagesFailed, tags); + } + } + + private printReleaseSummary(releaseResult: ReleaseResult, totalElapsedTime: number): void { + if (this.flags.logsgroupsymbol?.[0]) + SFPLogger.log(COLOR_HEADER(this.flags.logsgroupsymbol[0], 'Release Summary')); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + if (releaseResult.installDependenciesResult) { + SFPLogger.log(COLOR_HEADER(`\nPackage Dependencies`)); + SFPLogger.log(COLOR_SUCCESS(` ${releaseResult.installDependenciesResult.success.length} succeeded`)); + SFPLogger.log(COLOR_WARNING(` ${releaseResult.installDependenciesResult.skipped.length} skipped`)); + SFPLogger.log(COLOR_ERROR(` ${releaseResult.installDependenciesResult.failed.length} failed`)); + } + + for (const succeededDeployment of releaseResult.succeededDeployments) { + SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${succeededDeployment.releaseDefinition.release}`)); + SFPLogger.log(COLOR_SUCCESS(` ${succeededDeployment.result.deployed.length} succeeded`)); + SFPLogger.log(COLOR_ERROR(` ${succeededDeployment.result.failed.length} failed`)); + } + + for (const failedDeployment of releaseResult.failedDeployments) { + SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${failedDeployment.releaseDefinition.release}`)); + SFPLogger.log(COLOR_SUCCESS(` ${failedDeployment.result.deployed.length} succeeded`)); + SFPLogger.log( + COLOR_ERROR( + `\nPackages Failed to Deploy`, + failedDeployment.result.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) + ) + ); + } + + SFPLogger.log(COLOR_TIME(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substr(11, 8)}`)); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + + protected validateFlags() { + if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); + + } +} diff --git a/packages/sfp-cli/src/commands/orchestrator/validate.ts b/packages/sfp-cli/src/commands/orchestrator/validate.ts new file mode 100644 index 000000000..45dc3ffcb --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/validate.ts @@ -0,0 +1,221 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import ValidateError from '../../errors/ValidateError'; +import ValidateResult from '../../impl/validate/ValidateResult'; +import * as fs from 'fs-extra'; +import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; +import { LoggerLevel } from '@flxblio/sfp-logger'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'validate'); + +export default class Validate extends sfpCommand { + protected static requiresProject = true; + + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + + public static examples = [ + `$ sfp orchestrator:validate -p "POOL_TAG_1,POOL_TAG_2" -v `, + ]; + + //Fix Typo + public static flags = { + pools: arrayFlagSfdxStyle({ + char: 'p', + description: messages.getMessage('poolsFlagDescription'), + required: true, + }), + targetdevhubusername, + mode: Flags.string({ + description: 'validation mode', + default: 'thorough', + required: true, + options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], + }), + installdeps: Flags.boolean({ + description: messages.getMessage('installDepsFlagDescription'), + default: false, + }), + releaseconfig: Flags.string({ + description: messages.getMessage('configFileFlagDescription'), + }), + coveragepercent: Flags.integer({ + description: messages.getMessage('coveragePercentFlagDescription'), + default: 75, + }), + disablesourcepkgoverride: Flags.boolean({ + description: messages.getMessage('disableSourcePackageOverride'), + default: false, + }), + deletescratchorg: Flags.boolean({ + char: 'x', + description: messages.getMessage('deleteScratchOrgFlagDescription'), + default: false, + }), + orginfo: Flags.boolean({ + description: messages.getMessage('orgInfoFlagDescription'), + default: false, + }), + keys: Flags.string({ + required: false, + description: messages.getMessage('keysFlagDescription'), + }), + basebranch: Flags.string({ + description: messages.getMessage('baseBranchFlagDescription'), + }), + enableimpactanalysis: Flags.boolean({ + description: messages.getMessage('enableImpactAnalysisFlagDescription'), + dependsOn: ['basebranch'], + }), + enabledependencyvalidation: Flags.boolean({ + description: messages.getMessage('enableDependencyValidation'), + dependsOn: ['basebranch'], + }), + tag: Flags.string({ + description: messages.getMessage('tagFlagDescription'), + }), + disableparalleltesting: Flags.boolean({ + description: messages.getMessage('disableParallelTestingFlagDescription'), + default: false, + }), + disablediffcheck: Flags.boolean({ + description: messages.getMessage('disableDiffCheckFlagDescription'), + default: false, + }), + disableartifactupdate: Flags.boolean({ + description: messages.getMessage('disableArtifactUpdateFlagDescription'), + default: false, + }), + logsgroupsymbol, + loglevel + }; + + async execute(): Promise { + let executionStartTime = Date.now(); + + await this.hubOrg.refreshAuth(); + + let tags: { [p: string]: string }; + tags = { + tag: this.flags.tag != null ? this.flags.tag : undefined, + validation_mode: this.flags.mode, + releaseConfig: this.flags.releaseconfig, + }; + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`validate`)}`)); + SFPLogger.log(COLOR_HEADER(`Pools being used: ${this.flags.pools}`)); + SFPLogger.log( + COLOR_HEADER( + `Validation Mode: ${COLOR_KEY_MESSAGE( + `${ + ValidationMode[ + Object.keys(ValidationMode)[ + (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) + ] + ] + }` + )}` + ) + ); + if (this.flags.mode != ValidationMode.FAST_FEEDBACK) { + SFPLogger.log(COLOR_HEADER(`Coverage Percentage: ${this.flags.coveragepercent}`)); + } + SFPLogger.log( + COLOR_HEADER(`Dependency Validation: ${this.flags.enabledependencyvalidation ? 'true' : 'false'}`) + ); + + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + let validateResult: ValidateResult; + try { + let validateProps: ValidateProps = { + validateAgainst: ValidateAgainst.PRECREATED_POOL, + validationMode: + ValidationMode[ + Object.keys(ValidationMode)[ + (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) + ] + ], + coverageThreshold: this.flags.coveragepercent, + logsGroupSymbol: this.flags.logsgroupsymbol, + pools: this.flags.pools, + hubOrg: this.hubOrg, + shapeFile: this.flags.shapefile, + isDeleteScratchOrg: this.flags.deletescratchorg, + keys: this.flags.keys, + baseBranch: this.flags.basebranch, + diffcheck: !this.flags.disablediffcheck, + disableArtifactCommit: this.flags.disableartifactupdate, + orgInfo: this.flags.orginfo, + disableSourcePackageOverride : this.flags.disablesourcepkgoverride, + disableParallelTestExecution: this.flags.disableparalleltesting, + installExternalDependencies: this.flags.installdeps, + }; + + setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig,validateProps); + + let validateImpl: ValidateImpl = new ValidateImpl(validateProps); + + validateResult = await validateImpl.exec(); + + SFPStatsSender.logCount('validate.succeeded', tags); + } catch (error) { + if (error instanceof ValidateError) { + validateResult = error.data; + } else SFPLogger.log(error.message); + + SFPStatsSender.logCount('validate.failed', tags); + + process.exitCode = 1; + } finally { + let totalElapsedTime: number = Date.now() - executionStartTime; + + SFPStatsSender.logGauge('validate.duration', totalElapsedTime, tags); + + SFPStatsSender.logCount('validate.scheduled', tags); + + if (validateResult) { + SFPStatsSender.logGauge( + 'validate.packages.scheduled', + validateResult.deploymentResult?.scheduled, + tags + ); + + SFPStatsSender.logGauge( + 'validate.packages.succeeded', + validateResult.deploymentResult?.deployed?.length, + tags + ); + + SFPStatsSender.logGauge( + 'validate.packages.failed', + validateResult.deploymentResult?.failed?.length, + tags + ); + } + } + + function setReleaseConfigForReleaseBasedModes(releaseconfigPath:string,validateProps: ValidateProps) { + if (validateProps.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + validateProps.validationMode == ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) { + if (releaseconfigPath && fs.existsSync(releaseconfigPath)) { + validateProps.releaseConfigPath = releaseconfigPath; + } + + else { + if (!releaseconfigPath) + throw new Error(`Release config is required when using validation by release config`); + else if (!fs.existsSync(releaseconfigPath)) + throw new Error(`Release config at ${releaseconfigPath} doesnt exist, Please check the path`); + } + } + } + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts b/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts new file mode 100644 index 000000000..0b9b1f2ec --- /dev/null +++ b/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts @@ -0,0 +1,184 @@ +import { LoggerLevel, Messages, Org } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import ValidateError from '../../errors/ValidateError'; +import ValidateResult from '../../impl/validate/ValidateResult'; +import { loglevel, logsgroupsymbol, requiredUserNameFlag, targetdevhubusername } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'validateAgainstOrg'); + +export default class ValidateAgainstOrg extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp orchestrator:validateAgainstOrg -u `]; + + public static flags = { + targetorg: requiredUserNameFlag, + mode: Flags.string({ + description: 'validation mode', + default: 'thorough', + required: true, + options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], + }), + releaseconfig: Flags.string({ + description: messages.getMessage('configFileFlagDescription'), + }), + coveragepercent: Flags.integer({ + description: messages.getMessage('coveragePercentFlagDescription'), + default: 75, + }), + diffcheck: Flags.boolean({ + description: messages.getMessage('diffCheckFlagDescription'), + default: false, + }), + disableartifactupdate: Flags.boolean({ + description: messages.getMessage('disableArtifactUpdateFlagDescription'), + default: false, + }), + logsgroupsymbol, + basebranch: Flags.string({ + description: messages.getMessage('baseBranchFlagDescription'), + }), + orginfo: Flags.boolean({ + description: messages.getMessage('orgInfoFlagDescription'), + default: false, + }), + installdeps: Flags.boolean({ + description: messages.getMessage('installDepsFlagDescription'), + default: false, + }), + devhubalias: targetdevhubusername, + disablesourcepkgoverride: Flags.boolean({ + description: messages.getMessage('disableSourcePackageOverride'), + dependsOn:['devhubalias'] + }), + disableparalleltesting: Flags.boolean({ + description: messages.getMessage('disableParallelTestingFlagDescription'), + default: false, + }), + loglevel + }; + + async execute(): Promise { + let executionStartTime = Date.now(); + + let tags: { [p: string]: string }; + tags = { + tag: this.flags.tag != null ? this.flags.tag : undefined, + validation_mode: this.flags.mode, + releaseConfig: this.flags.releaseconfig, + }; + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`validateAgainstOrg`)}`)); + SFPLogger.log(COLOR_HEADER(`Target Org: ${this.flags.targetorg}`)); + SFPLogger.log( + COLOR_HEADER( + `Validation Mode: ${COLOR_KEY_MESSAGE( + `${ + ValidationMode[ + Object.keys(ValidationMode)[ + (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) + ] + ] + }` + )}` + ) + ); + if (this.flags.mode != ValidationMode.FAST_FEEDBACK) { + SFPLogger.log(COLOR_HEADER(`Coverage Percentage: ${this.flags.coveragepercent}`)); + } + + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + + let validateResult: ValidateResult; + try { + let validateProps: ValidateProps = { + validateAgainst: ValidateAgainst.PROVIDED_ORG, + validationMode: ValidationMode[ + Object.keys(ValidationMode)[ + (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) + ] + ], + coverageThreshold: this.flags.coveragepercent, + logsGroupSymbol: this.flags.logsgroupsymbol, + targetOrg: this.flags.targetorg, + diffcheck: this.flags.diffcheck, + baseBranch: this.flags.basebranch, + disableArtifactCommit: this.flags.disableartifactupdate, + disableSourcePackageOverride: this.flags.disablesourcepkgoverride, + disableParallelTestExecution: this.flags.disableparalleltesting, + orgInfo: this.flags.orginfo, + installExternalDependencies: this.flags.installdeps, + }; + + + //Add check for devhub + if(this.flags.devhubalias) + { + validateProps.hubOrg = await Org.create({aliasOrUsername:this.flags.devhubalias}); + } + + setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig,validateProps); + let validateImpl: ValidateImpl = new ValidateImpl(validateProps); + validateResult = await validateImpl.exec(); + } catch (error) { + if (error instanceof ValidateError) { + validateResult = error.data; + } + + SFPStatsSender.logCount('validate.failed', tags); + + process.exitCode = 1; + } finally { + let totalElapsedTime: number = Date.now() - executionStartTime; + + SFPStatsSender.logGauge('validate.duration', totalElapsedTime, tags); + + SFPStatsSender.logCount('validate.scheduled', tags); + + if (validateResult) { + SFPStatsSender.logGauge( + 'validate.packages.scheduled', + validateResult.deploymentResult?.scheduled, + tags + ); + + SFPStatsSender.logGauge( + 'validate.packages.succeeded', + validateResult.deploymentResult?.deployed?.length, + tags + ); + + SFPStatsSender.logGauge( + 'validate.packages.failed', + validateResult.deploymentResult?.failed?.length, + tags + ); + } + } + + function setReleaseConfigForReleaseBasedModes(releaseconfigPath:string,validateProps: ValidateProps) { + if (validateProps.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + validateProps.validationMode == ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) { + if (releaseconfigPath && fs.existsSync(releaseconfigPath)) { + validateProps.releaseConfigPath = releaseconfigPath; + } + + else { + if (!releaseconfigPath) + throw new Error(`Release config is required when using validation by release config`); + else if (!fs.existsSync(releaseconfigPath)) + throw new Error(`Release config at ${releaseconfigPath} doesnt exist, Please check the path`); + } + } + } + } +} diff --git a/packages/sfp-cli/src/commands/package/data/create.ts b/packages/sfp-cli/src/commands/package/data/create.ts new file mode 100644 index 000000000..4631d2c51 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/data/create.ts @@ -0,0 +1,80 @@ +import { Messages } from '@salesforce/core'; +import ProjectConfig from '../../../core/project/ProjectConfig' +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageCreateCommand from '../../../PackageCreateCommand'; +import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'create_data_package'); + +export default class CreateDataPackage extends PackageCreateCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp package:data:create -n mypackage -v `, + `$ sfp package:data:create -n -v --diffcheck --gittag`, + ]; + + public static flags = { + package: Flags.string({ + required: true, + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + versionnumber: Flags.string({ + required: true, + char: 'v', + description: messages.getMessage('versionNumberFlagDescription'), + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + diffcheck: Flags.boolean({ + description: messages.getMessage('diffCheckFlagDescription'), + }), + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + }), + gittag: Flags.boolean({ + description: messages.getMessage('gitTagFlagDescription'), + }), + repourl: Flags.string({ + char: 'r', + description: messages.getMessage('repoUrlFlagDescription'), + }), + refname: Flags.string({ + description: messages.getMessage('refNameFlagDescription'), + }), + loglevel + }; + + protected async create(): Promise { + let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(null, this.sfdxPackage); + if (packageDescriptor.type?.toLowerCase() !== PackageType.Data) { + throw new Error("Data packages must have 'type' property of PackageType.Data defined in sfdx-project.json"); + } + + let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + new ConsoleLogger(), + null, + this.sfdxPackage, + { + packageVersionNumber: this.versionNumber, + sourceVersion: this.commitId, + repositoryUrl: this.repositoryURL, + branch: this.branch, + } + ); + + console.log(COLOR_SUCCESS(`Created data package ${sfpPackage.packageName}`)); + return sfpPackage; + } + + protected getConfigFilePath(): string { + return null; + } +} diff --git a/packages/sfp-cli/src/commands/package/data/install.ts b/packages/sfp-cli/src/commands/package/data/install.ts new file mode 100644 index 000000000..51827ebb6 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/data/install.ts @@ -0,0 +1,76 @@ +import { Messages } from '@salesforce/core'; +import InstallPackageCommand from '../../../InstallPackageCommand'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; +import { Flags } from '@oclif/core'; +import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; + + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'install_data_package'); + +export default class InstallDataPackage extends InstallPackageCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp package:data:install -n mypackage -u `]; + + public static deprecated:boolean = true; + + public static flags = { + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + required: true, + }), + targetorg: requiredUserNameFlag, + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + skiponmissingartifact: Flags.boolean({ + char: 's', + description: messages.getMessage('skipOnMissingArtifactFlagDescription'), + }), + skipifalreadyinstalled: Flags.boolean({ description: messages.getMessage('skipIfAlreadyInstalled') }), + loglevel + }; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + + public async install() { + try { + + SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) + + + const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; + let options: SfpPackageInstallationOptions = { + skipIfPackageInstalled: skipIfAlreadyInstalled + }; + + + let result = await SfpPackageInstaller.installPackage( + new ConsoleLogger(), + this.sfpPackage, + this.sfpOrg, + options + ); + + + + if (result.result === PackageInstallationStatus.Failed) { + throw new Error(result.message); + } + } catch (err) { + console.log(err); + process.exitCode = 1; + } + } +} diff --git a/packages/sfp-cli/src/commands/package/install.ts b/packages/sfp-cli/src/commands/package/install.ts new file mode 100644 index 000000000..7dd37751d --- /dev/null +++ b/packages/sfp-cli/src/commands/package/install.ts @@ -0,0 +1,136 @@ +import { Messages } from '@salesforce/core'; +import InstallPackageCommand from '../../InstallPackageCommand'; +import { PackageInstallationStatus } from '../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; +import { Flags } from '@oclif/core'; +import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { PackageType } from '../../core/package/SfpPackage'; + + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'install_package'); + +export default class Install extends InstallPackageCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp package:install -n packagename -u sandboxalias -i`]; + + public static flags = { + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + targetorg: requiredUserNameFlag, + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + securitytype: Flags.string({ + description: messages.getMessage('securityTypeFlagDescription'), + options: ['full', 'none'], + default: 'none', + }), + skipifalreadyinstalled: Flags.boolean({ + char: 'f', + description: messages.getMessage('skipIfAlreadyInstalled'), + }), + upgradetype: Flags.string({ + description: messages.getMessage('upgradeTypeFlagDescription'), + options: ['delete-only', 'deprecate-only', 'mixed-mode'], + default: 'mixed-mode', + }), + optimizedeployment: Flags.boolean({ + char: 'o', + description: messages.getMessage('optimizedeployment'), + default: false, + required: false, + }), + skiptesting: Flags.boolean({ + char: 't', + description: messages.getMessage('skiptesting'), + default: false, + required: false, + }), + waittime: Flags.string({ + description: messages.getMessage('waitTimeFlagDescription'), + default: '120', + }), + publishwaittime: Flags.string({ + description: messages.getMessage('publishWaitTimeFlagDescription'), + default: '10', + }), + loglevel + }; + + protected static requiresUsername = true; + protected static requiresDevhubUsername = false; + + public async install() { + try { + const installationkey = this.flags.installationkey; + const security_type = this.flags.securitytype; + const upgrade_type = this.flags.upgradetype; + const waitTime = this.flags.waittime; + const publishWaitTime = this.flags.publishwaittime; + const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; + const optimizeDeployment: boolean = this.flags.optimizedeployment; + const skipTesting: boolean = this.flags.skiptesting; + + + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`install`)}`)); + SFPLogger.log(COLOR_HEADER(`Package Name: ${this.sfpPackage.packageName}`)); + SFPLogger.log(COLOR_HEADER(`Package Type: ${this.sfpPackage.packageType}`)); + SFPLogger.log(COLOR_HEADER(`Skip Packages If Already Installed: ${this.flags.skipifalreadyinstalled?`true`:`false`}`)); + SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); + SFPLogger.log(COLOR_HEADER(`Target Environment: ${this.flags.targetorg}`)); + + + if(this.sfpPackage.packageType == PackageType.Unlocked) + { + + SFPLogger.log(COLOR_HEADER(`Security Type: ${this.flags.securitytype}`)); + SFPLogger.log(COLOR_HEADER(`Upgrade Type: ${this.flags.upgradetype}`)); + SFPLogger.log(COLOR_HEADER(`Apex Compile Mode: package`)); + } + else if(this.sfpPackage.packageType == PackageType.Source) + { + SFPLogger.log(COLOR_HEADER(`Optimize Deployment: ${this.flags.optimizedeployment}`)); + SFPLogger.log(COLOR_HEADER(`Skip Testing: ${this.flags.skiptesting}`)); + } + + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + + let options: SfpPackageInstallationOptions = { + installationkey: installationkey, + apexcompile: `package`, + securitytype: security_type, + optimizeDeployment: optimizeDeployment, + skipTesting: skipTesting, + upgradetype: upgrade_type, + waitTime: waitTime, + publishWaitTime: publishWaitTime, + disableArtifactCommit: false, + skipIfPackageInstalled: skipIfAlreadyInstalled, + apiVersion: this.sfpPackage.apiVersion + }; + + let result = await SfpPackageInstaller.installPackage( + new ConsoleLogger(), + this.sfpPackage, + this.sfpOrg, + options + ); + + if (result.result === PackageInstallationStatus.Failed) { + throw new Error(result.message); + } + } catch (err) { + console.log(err); + process.exitCode = 1; + } + } +} diff --git a/packages/sfp-cli/src/commands/package/source/create.ts b/packages/sfp-cli/src/commands/package/source/create.ts new file mode 100644 index 000000000..0c2817fd6 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/source/create.ts @@ -0,0 +1,71 @@ +import { Messages } from '@salesforce/core'; +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageCreateCommand from '../../../PackageCreateCommand'; +import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'create_source_package'); + +export default class CreateSourcePackage extends PackageCreateCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp package:source:create -n mypackage -v `, + `$ sfp package:source:create -n -v --diffcheck --gittag` + ]; + + protected static requiresUsername = false; + protected static requiresDevhubUsername = false; + protected static requiresProject = true; + + public static flags = { + package: Flags.string({ + required: true, + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + versionnumber: Flags.string({ + required: true, + char: 'v', + description: messages.getMessage('versionNumberFlagDescription'), + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + diffcheck: Flags.boolean({ description: messages.getMessage('diffCheckFlagDescription') }), + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + }), + gittag: Flags.boolean({ description: messages.getMessage('gitTagFlagDescription') }), + repourl: Flags.string({ char: 'r', description: messages.getMessage('repoUrlFlagDescription') }), + refname: Flags.string({ description: messages.getMessage('refNameFlagDescription') }), + loglevel + }; + + protected async create(): Promise { + let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + new ConsoleLogger(), + null, + this.sfdxPackage, + { + overridePackageTypeWith: PackageType.Source, + packageVersionNumber: this.versionNumber, + sourceVersion: this.commitId, + repositoryUrl: this.repositoryURL, + branch: this.branch, + } + ); + + console.log(COLOR_SUCCESS(`Created source package ${sfpPackage.packageName}`)); + + return sfpPackage; + } + + protected getConfigFilePath(): string { + return null; + } +} diff --git a/packages/sfp-cli/src/commands/package/source/install.ts b/packages/sfp-cli/src/commands/package/source/install.ts new file mode 100644 index 000000000..14746c316 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/source/install.ts @@ -0,0 +1,130 @@ +import { Messages } from '@salesforce/core'; +import InstallPackageCommand from '../../../InstallPackageCommand'; +import * as fs from 'fs-extra'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { DeploymentType } from '../../../core/deployers/DeploymentExecutor'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; +import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'install_source_package'); + +export default class InstallSourcePackage extends InstallPackageCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp package:source:install -n mypackage -u `]; + + public static deprecated:boolean = true; + + public static flags = { + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + required: true, + }), + targetorg: requiredUserNameFlag, + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + skipifalreadyinstalled: Flags.boolean({ + description: messages.getMessage('skipIfAlreadyInstalled'), + }), + skiponmissingartifact: Flags.boolean({ + char: 's', + description: messages.getMessage('skipOnMissingArtifactFlagDescription'), + }), + optimizedeployment: Flags.boolean({ + char: 'o', + description: messages.getMessage('optimizedeployment'), + default: false, + required: false, + }), + skiptesting: Flags.boolean({ + char: 't', + description: messages.getMessage('skiptesting'), + default: false, + required: false, + }), + waittime: Flags.string({ + description: messages.getMessage('waitTimeFlagDescription'), + default: '120', + }), + refname: Flags.string({ + description: messages.getMessage('refNameFlagDescription'), + }), + loglevel + }; + + public async install(): Promise { + + SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) + + + const sfdx_package: string = this.flags.package; + const optimizeDeployment: boolean = this.flags.optimizedeployment; + const skipTesting: boolean = this.flags.skiptesting; + const wait_time: string = this.flags.waittime; + const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; + + console.log('sfp.Install Source Package To Org'); + + try { + let options: SfpPackageInstallationOptions = { + optimizeDeployment: optimizeDeployment, + skipTesting: skipTesting, + waitTime: wait_time, + deploymentType: DeploymentType.MDAPI_DEPLOY, + apiVersion: this.sfpPackage.apiVersion || this.sfpPackage.payload.Package.version, // Use package.xml version for backwards compat with old artifacts + disableArtifactCommit: false, + skipIfPackageInstalled : skipIfAlreadyInstalled + }; + + + let result = await SfpPackageInstaller.installPackage( + new ConsoleLogger(), + this.sfpPackage, + this.sfpOrg, + options + ); + + + if (result.result == PackageInstallationStatus.Failed) { + throw new Error(result.message); + } else { + console.log(`Succesfully Installed source package ${sfdx_package}`); + + console.log('\n\nOutput variables:'); + if (result.deploy_id) { + if (this.flags.refname) { + fs.writeFileSync( + '.env', + `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, + { flag: 'a' } + ); + console.log( + `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}` + ); + } else { + fs.writeFileSync( + '.env', + `sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, + { flag: 'a' } + ); + console.log(`sfp_installsourcepackage_deployment_id=${result.deploy_id}`); + } + } + } + } catch (error) { + console.log(error.message); + process.exitCode = 1; + } + } +} diff --git a/packages/sfp-cli/src/commands/package/unlocked/create.ts b/packages/sfp-cli/src/commands/package/unlocked/create.ts new file mode 100644 index 000000000..81972d059 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/unlocked/create.ts @@ -0,0 +1,132 @@ +import { Messages } from '@salesforce/core'; +import PackageCreateCommand from '../../../PackageCreateCommand'; +import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; +import SfpPackage from '../../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; +import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'create_unlocked_package'); + +export default class CreateUnlockedPackage extends PackageCreateCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresUsername = false; + protected static requiresDevhubUsername = true; + protected static requiresProject = true; + + public static examples = [ + `$ sfp package:unlocked:create -n -b -x -v --refname `, + `$ sfp package:unlocked:create -n -b -x -v --diffcheck --gittag`, + ]; + + public static flags = { + package: Flags.string({ + required: true, + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + installationkey: Flags.string({ + char: 'k', + description: messages.getMessage('installationKeyFlagDescription'), + exclusive: ['installationkeybypass'], + }), + installationkeybypass: Flags.boolean({ + char: 'x', + description: messages.getMessage('installationKeyBypassFlagDescription'), + exclusive: ['installationkey'], + }), + diffcheck: Flags.boolean({ + description: messages.getMessage('diffCheckFlagDescription'), + }), + gittag: Flags.boolean({ + description: messages.getMessage('gitTagFlagDescription'), + }), + targetdevhubusername, + repourl: Flags.string({ + char: 'r', + description: messages.getMessage('repoUrlFlagDescription'), + }), + versionnumber: Flags.string({ + description: messages.getMessage('versionNumberFlagDescription'), + }), + configfilepath: Flags.file({ + char: 'f', + description: messages.getMessage('configFilePathFlagDescription'), + default: 'config/project-scratch-def.json', + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + enablecoverage: Flags.boolean({ + description: messages.getMessage('enableCoverageFlagDescription'), + }), + isvalidationtobeskipped: Flags.boolean({ + char: 's', + description: messages.getMessage('isValidationToBeSkippedFlagDescription'), + }), + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + }), + tag: Flags.string({ + description: messages.getMessage('tagFlagDescription'), + }), + waittime: Flags.string({ + description: messages.getMessage('waitTimeFlagDescription'), + default: '120', + }), + refname: Flags.string({ + description: messages.getMessage('refNameFlagDescription'), + }), + loglevel + }; + + public async create(): Promise { + //TODO: Use tag info + let tag: string = this.flags.tag; + let installationkeybypass = this.flags.installationkeybypass; + let isCoverageEnabled: boolean = this.flags.enablecoverage; + let isSkipValidation: boolean = this.flags.isvalidationtobeskipped; + let installationkey = this.flags.installationkey; + let waitTime = this.flags.waittime; + + //Handle Installation Keys + if (installationkey === null || installationkey === undefined) { + installationkeybypass = true; + } + + let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + new ConsoleLogger(), + null, + this.sfdxPackage, + { + packageVersionNumber: this.versionNumber, + sourceVersion: this.commitId, + repositoryUrl: this.repositoryURL, + branch: this.branch, + configFilePath: this.flags.configfilepath, + }, + { + devHub: this.hubOrg.getUsername(), + installationkeybypass: installationkeybypass as boolean, + breakBuildIfEmpty: true, + waitTime: waitTime as string, + isCoverageEnabled: isCoverageEnabled as boolean, + isSkipValidation: isSkipValidation as boolean, + } + ); + + console.log(COLOR_SUCCESS(`Created unlocked package ${sfpPackage.packageName}`)); + return sfpPackage; + } + + protected getConfigFilePath(): string { + return this.flags.configfilepath; + } +} diff --git a/packages/sfp-cli/src/commands/package/unlocked/install.ts b/packages/sfp-cli/src/commands/package/unlocked/install.ts new file mode 100644 index 000000000..001e06743 --- /dev/null +++ b/packages/sfp-cli/src/commands/package/unlocked/install.ts @@ -0,0 +1,116 @@ +import { Messages } from '@salesforce/core'; +import InstallPackageCommand from '../../../InstallPackageCommand'; +import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; +import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; +import { Flags } from '@oclif/core'; +import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; + + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'install_unlocked_package'); + +export default class InstallUnlockedPackage extends InstallPackageCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp package:unlocked:install -n packagename -u sandboxalias -i`]; + + public static deprecated:boolean = true; + + public static flags = { + package: Flags.string({ + char: 'n', + description: messages.getMessage('packageFlagDescription'), + }), + targetorg: requiredUserNameFlag, + installationkey: Flags.string({ + char: 'k', + description: messages.getMessage('installationKeyFlagDescription'), + }), + apexcompileonlypackage: Flags.boolean({ + char: 'a', + description: messages.getMessage('apexCompileOnlyPackageFlagDescription'), + }), + artifactdir: Flags.directory({ + description: messages.getMessage('artifactDirectoryFlagDescription'), + default: 'artifacts', + }), + securitytype: Flags.string({ + description: messages.getMessage('securityTypeFlagDescription'), + options: ['Custom', 'Full', 'None'], + default: 'Full', + }), + skipifalreadyinstalled: Flags.boolean({ + char: 'f', + description: messages.getMessage('skipIfAlreadyInstalled'), + }), + skiponmissingartifact: Flags.boolean({ + char: 's', + description: messages.getMessage('skipOnMissingArtifactFlagDescription'), + dependsOn: ['packageinstalledfrom'], + }), + upgradetype: Flags.string({ + description: messages.getMessage('upgradeTypeFlagDescription'), + options: ['delete-only', 'deprecate-only', 'mixed-mode'], + default: 'mixed-mode', + }), + waittime: Flags.string({ + description: messages.getMessage('waitTimeFlagDescription'), + default: '120', + }), + publishwaittime: Flags.string({ + description: messages.getMessage('publishWaitTimeFlagDescription'), + default: '10', + }), + loglevel + }; + + protected static requiresUsername = true; + protected static requiresDevhubUsername = false; + + public async install() { + + SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) + + try { + const installationkey = this.flags.installationkey; + const apexcompileonlypackage = this.flags.apexcompileonlypackage; + const security_type = this.flags.securitytype; + const upgrade_type = this.flags.upgradetype; + const waitTime = this.flags.waittime; + const publishWaitTime = this.flags.publishwaittime; + const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; + + let options: SfpPackageInstallationOptions = { + installationkey: installationkey, + apexcompile: apexcompileonlypackage ? `package` : `all`, + securitytype: security_type, + upgradetype: upgrade_type, + waitTime: waitTime, + publishWaitTime: publishWaitTime, + disableArtifactCommit: false, + skipIfPackageInstalled: skipIfAlreadyInstalled, + apiVersion: this.sfpPackage.apiVersion || this.sfpPackage.payload.Package.version, // Use package.xml version for backwards compat with old artifacts + }; + + let result = await SfpPackageInstaller.installPackage( + new ConsoleLogger(), + this.sfpPackage, + this.sfpOrg, + options + ); + + if (result.result === PackageInstallationStatus.Failed) { + throw new Error(result.message); + } + } catch (err) { + console.log(err); + process.exitCode = 1; + } + } +} diff --git a/packages/sfp-cli/src/commands/pool/delete.ts b/packages/sfp-cli/src/commands/pool/delete.ts new file mode 100644 index 000000000..8ef6856d3 --- /dev/null +++ b/packages/sfp-cli/src/commands/pool/delete.ts @@ -0,0 +1,125 @@ +import { Messages } from '@salesforce/core'; +import PoolDeleteImpl from '../../core/scratchorg/pool/PoolDeleteImpl'; +import OrphanedOrgsDeleteImpl from '../../core/scratchorg/pool/OrphanedOrgsDeleteImpl'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import sfpCommand from '../../SfpCommand'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; +const Table = require('cli-table'); + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'pool_delete'); + +export default class Delete extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + + public static examples = [ + `$ sfp pool:delete -t core `, + `$ sfp pool:delete -t core -v devhub`, + `$ sfp pool:delete --orphans -v devhub`, + ]; + + public static flags = { + targetdevhubusername, + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagDescription'), + required: false, + }), + allscratchorgs: Flags.boolean({ + char: 'a', + description: messages.getMessage('allscratchorgsDescription'), + required: false, + }), + inprogressonly: Flags.boolean({ + char: 'i', + description: messages.getMessage('inprogressonlyDescription'), + required: false, + exclusive: ['allscratchorgs'], + }), + orphans: Flags.boolean({ + char: 'o', + description: messages.getMessage('recoverOrphanedScratchOrgsDescription'), + required: false, + }), + 'apiversion': orgApiVersionFlagSfdxStyle, + loglevel, + }; + + public async execute(): Promise<{ orgId: string; username: string; operation: string }[]> { + await this.hubOrg.refreshAuth(); + const hubConn = this.hubOrg.getConnection(); + + this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); + + let scratchOrgOperationResults: { orgId: string; username: string; operation: string }[] = []; + //User want to delete orphans only + if (this.flags.orphans && !this.flags.tag) { + let orphanedOrgsDeleteImpl = new OrphanedOrgsDeleteImpl(this.hubOrg, new ConsoleLogger()); + let recoveredScratchOrgs = (await orphanedOrgsDeleteImpl.execute()) as ScratchOrg[]; + this.pushToResults('recovered', recoveredScratchOrgs, scratchOrgOperationResults); + } else { + let poolDeleteImpl = new PoolDeleteImpl( + this.hubOrg, + this.flags.tag, + this.flags.mypool, + this.flags.allscratchorgs, + this.flags.inprogressonly, + new ConsoleLogger() + ); + + let deletedOrgs = (await poolDeleteImpl.execute()) as ScratchOrg[]; + this.pushToResults('deleted', deletedOrgs, scratchOrgOperationResults); + + let orphanedOrgsDeleteImpl = new OrphanedOrgsDeleteImpl(this.hubOrg, new ConsoleLogger()); + let recoverdScratchOrgs = (await orphanedOrgsDeleteImpl.execute()) as ScratchOrg[]; + this.pushToResults('recovered', recoverdScratchOrgs, scratchOrgOperationResults); + } + this.displayScrathOrgOperationsAsTable(scratchOrgOperationResults); + return scratchOrgOperationResults; + } + + private pushToResults( + operation: string, + scratchOrgs: ScratchOrg[], + result: { orgId: string; username: string; operation: string }[] + ) { + for (const scratchOrg of scratchOrgs) { + result.push({ orgId: scratchOrg.orgId, username: scratchOrg.username, operation: operation }); + } + } + + private displayScrathOrgOperationsAsTable( + scratchOrgOperationResults: { orgId: string; username: string; operation: string }[] + ) { + const table = new Table({ + head: ['Operation', 'OrgId', 'Username'], + chars: ZERO_BORDER_TABLE, + }); + + if (scratchOrgOperationResults.length > 0) { + scratchOrgOperationResults.forEach((scratchOrgOperation) => { + table.push([COLOR_KEY_MESSAGE(scratchOrgOperation.operation), scratchOrgOperation.orgId, scratchOrgOperation.username]); + }); + + SFPLogger.log(`The command resulted in the following operation`, LoggerLevel.INFO, new ConsoleLogger()); + SFPLogger.log(table.toString(), LoggerLevel.INFO, new ConsoleLogger()); + } else { + SFPLogger.log( + `${COLOR_WARNING(`No Scratch Orgs were found to be operated upon, The command will now exit`)}`, + LoggerLevel.INFO, + new ConsoleLogger() + ); + } + } +} diff --git a/packages/sfp-cli/src/commands/pool/fetch.ts b/packages/sfp-cli/src/commands/pool/fetch.ts new file mode 100644 index 000000000..02baaa0d8 --- /dev/null +++ b/packages/sfp-cli/src/commands/pool/fetch.ts @@ -0,0 +1,163 @@ +import { Messages } from '@salesforce/core'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import { AnyJson } from '@salesforce/ts-types'; +import PoolFetchImpl from '../../core/scratchorg/pool/PoolFetchImpl'; +import * as fs from 'fs-extra'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import InstalledArtifactsDisplayer from '../../core/display/InstalledArtifactsDisplayer'; +import InstalledPackageDisplayer from '../../core/display/InstalledPackagesDisplayer'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import SFPOrg from '../../core/org/SFPOrg'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; +import { COLOR_TIME } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../core/utils/GetFormattedTime'; +import sfpCommand from '../../SfpCommand'; +import { Flags, ux } from '@oclif/core'; +import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poolFetch'); + +export default class Fetch extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + public static enableJsonFlag = true; + + public static examples = [ + `$ sfp pool:fetch -t core `, + `$ sfp pool:fetch -t core -v devhub`, + `$ sfp pool:fetch -t core -v devhub -m`, + `$ sfp pool:fetch -t core -v devhub -s testuser@test.com`, + ]; + + public static flags = { + targetdevhubusername, + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagDescription'), + required: true, + }), + alias: Flags.string({ + char: 'a', + description: messages.getMessage('aliasDescription'), + required: false, + }), + sendtouser: Flags.string({ + char: 's', + description: messages.getMessage('sendToUserDescription'), + required: false, + }), + setdefaultusername: Flags.boolean({ + char: 'd', + description: messages.getMessage('setdefaultusernameDescription'), + required: false, + }), + nosourcetracking: Flags.boolean({ + default: false, + description: messages.getMessage('noSourceTrackingDescription'), + required: false, + }), + 'apiversion': orgApiVersionFlagSfdxStyle, + loglevel + }; + + public async execute(): Promise { + const fetchStartTime: number = Date.now(); + + + await this.hubOrg.refreshAuth(); + const hubConn = this.hubOrg.getConnection(); + + if (this.flags.json) SFPLogger.logLevel = LoggerLevel.HIDE; + + SFPLogger.log( + COLOR_KEY_MESSAGE(`Fetching a scratch org from pool ${this.flags.tag} in Org ${this.hubOrg.getOrgId()}`), + LoggerLevel.INFO + ); + + this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); + + let fetchImpl = new PoolFetchImpl( + this.hubOrg, + this.flags.tag, + false, + false, + this.flags.sendtouser, + this.flags.alias, + this.flags.setdefaultusername + ); + + if (!this.flags.nosourcetracking) { + SFPLogger.log( + COLOR_KEY_MESSAGE(`Enabling source tracking, this will take a bit of time, please hang on`) + ); + fetchImpl.setSourceTrackingOnFetch(); + } + + let result = (await fetchImpl.execute()) as ScratchOrg; + + if (!this.flags.json && !this.flags.sendtouser) { + await this.displayOrgContents(result); + + ux.log(`======== Scratch org details ========`); + let list = []; + for (let [key, value] of Object.entries(result)) { + if (value) { + list.push({ key: key, value: value }); + } + } + //add alias info + if (this.flags.alias) list.push({ key: 'alias', value: this.flags.alias }); + + ux.table(list, {key:{},value:{}}); + this.printFetchSummary(!this.flags.nosourcetracking, Date.now() - fetchStartTime); + } + + return result as AnyJson; + } + + /** + * Display artifacts and managed packages installed in the org + * @param soDetail + */ + private async displayOrgContents(soDetail: ScratchOrg) { + try { + let scratchOrgAsSFPOrg = await SFPOrg.create({ aliasOrUsername: soDetail.username }); + let installedManagedPackages = await scratchOrgAsSFPOrg.getAllInstalledManagedPackages(); + SFPLogger.log('Installed managed packages:', LoggerLevel.INFO); + InstalledPackageDisplayer.printInstalledPackages(installedManagedPackages, null); + + let installedArtifacts = await scratchOrgAsSFPOrg.getInstalledArtifacts(); + InstalledArtifactsDisplayer.printInstalledArtifacts(installedArtifacts, null); + } catch (error) { + SFPLogger.log( + 'Failed to query packages/artifacts installed in the org due to \n' + error.message, + LoggerLevel.ERROR + ); + } + } + + private printFetchSummary(isSourceTrackingEnabled: boolean, totalElapsedTime: number): void { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + if (!isSourceTrackingEnabled) { + SFPLogger.log( + COLOR_SUCCESS(`Succesfully fetched a scratch org in ${COLOR_TIME(getFormattedTime(totalElapsedTime))}`) + ); + } else { + SFPLogger.log( + COLOR_SUCCESS( + `Succesfully fetched a scratch org and enabled source tracking in ${COLOR_TIME( + getFormattedTime(totalElapsedTime) + )}` + ) + ); + } + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } +} diff --git a/packages/sfp-cli/src/commands/pool/list.ts b/packages/sfp-cli/src/commands/pool/list.ts new file mode 100644 index 000000000..e4761f392 --- /dev/null +++ b/packages/sfp-cli/src/commands/pool/list.ts @@ -0,0 +1,129 @@ + +import { AnyJson } from '@salesforce/ts-types'; +import poolListImpl from '../../core/scratchorg/pool/PoolListImpl'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import { Flags, ux } from '@oclif/core'; +import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poollist'); + +export default class List extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + public static enableJsonFlag = true + + public static examples = [ + `$ sfp pool:list -t core `, + `$ sfp pool:list -t core -v devhub`, + `$ sfp pool:list -t core -v devhub -m`, + `$ sfp pool:list -t core -v devhub -m -a`, + ]; + + public static flags = { + targetdevhubusername, + 'apiversion': orgApiVersionFlagSfdxStyle, + tag: Flags.string({ + char: 't', + description: messages.getMessage('tagDescription'), + required: false, + }), + mypool: Flags.boolean({ + char: 'm', + description: messages.getMessage('mypoolDescription'), + required: false, + }), + allscratchorgs: Flags.boolean({ + char: 'a', + description: messages.getMessage('allscratchorgsDescription'), + required: false, + }), + loglevel + }; + + public async execute(): Promise { + await this.hubOrg.refreshAuth(); + const hubConn = this.hubOrg.getConnection(); + + this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); + + let listImpl = new poolListImpl(this.hubOrg, this.flags.tag, this.flags.allscratchorgs); + + let result = (await listImpl.execute()) as ScratchOrg[]; + + if (!this.flags.mypool && result.length > 0) { + result.forEach((element) => { + delete element.password; + }); + } + + let scratchOrgInuse = result.filter((element) => element.status === 'In use'); + let scratchOrgNotInuse = result.filter((element) => element.status === 'Available'); + let scratchOrgInProvision = result.filter((element) => element.status === 'Provisioning in progress'); + + if (!this.flags.json) { + if (result.length > 0) { + ux.log(`======== Scratch org Details ========`); + + if (!this.flags.tag) { + ux.log(`List of all the pools in the org`); + + this.logTagCount(result); + ux.log('==================================='); + } + + if (this.flags.allscratchorgs) { + ux.log(`Used Scratch Orgs in the pool: ${scratchOrgInuse.length}`); + } + ux.log(`Unused Scratch Orgs in the Pool : ${scratchOrgNotInuse.length} \n`); + if (scratchOrgInProvision.length && scratchOrgInProvision.length > 0) { + ux.log(`Scratch Orgs being provisioned in the Pool : ${scratchOrgInProvision.length} \n`); + } + + if (this.flags.mypool) { + // ux.table(result, {'tag':{}, 'orgId':{}, 'username':{}, 'password':{}, 'expiryDate':{}, 'status':{}, 'loginURL':{}}); + } else { + //ux.table(result, ['tag', 'orgId', 'username', 'expiryDate', 'status', 'loginURL']); + } + } else { + SFPLogger.log(`No Scratch orgs available, time to create your pool.`, LoggerLevel.ERROR); + } + } + + let output = { + total: scratchOrgInuse.length + scratchOrgNotInuse.length + scratchOrgInProvision.length, + inuse: scratchOrgInuse.length, + unused: scratchOrgNotInuse.length, + inprovision: scratchOrgInProvision.length, + scratchOrgDetails: result, + }; + + return output; + } + + private logTagCount(result: ScratchOrg[]) { + let tagCounts: any = result.reduce(function (obj, v) { + obj[v.tag] = (obj[v.tag] || 0) + 1; + return obj; + }, {}); + + let tagArray = new Array(); + + Object.keys(tagCounts).forEach(function (key) { + tagArray.push({ + tag: key, + count: tagCounts[key], + }); + }); + + ux.table(tagArray, {'tag':{}, 'count':{}}); + } +} diff --git a/packages/sfp-cli/src/commands/pool/metrics/publish.ts b/packages/sfp-cli/src/commands/pool/metrics/publish.ts new file mode 100644 index 000000000..6a0251f65 --- /dev/null +++ b/packages/sfp-cli/src/commands/pool/metrics/publish.ts @@ -0,0 +1,133 @@ +import sfpCommand from '../../../SfpCommand'; +import SFPStatsSender from '../../../core/stats/SFPStatsSender'; +import PoolListImpl from '../../../core/scratchorg/pool/PoolListImpl'; +import ScratchOrg from '../../../core/scratchorg/ScratchOrg'; +import LimitsFetcher from '../../../core/limits/LimitsFetcher'; +const Table = require('cli-table'); +import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_metrics_publish'); + +export default class Publish extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + protected static requiresProject = false; + + public static examples = ['$ sfp pool:metrics:publish -v ']; + + public static flags = { + targetdevhubusername, + loglevel + }; + + public async execute(): Promise { + this.validateEnvVars(); + + let nPooledScratchOrgs: number = 0; + let pools: { [p: string]: poolMetrics }; + + try { + const listOfScratchOrgs = (await new PoolListImpl(this.hubOrg, null, true).execute()) as ScratchOrg[]; + + nPooledScratchOrgs = listOfScratchOrgs.length ? listOfScratchOrgs.length : 0; + pools = this.getMetricsForEachPool(listOfScratchOrgs); + } catch (err) { + SFPLogger.log( + `Failed to get metrics for scratch org pools. Ensure prerequisites are installed for pooling.`, + LoggerLevel.TRACE + ); + } + + const table = new Table({ + head: ['Metric', 'Value', 'Tag'], + }); + + const limits = await new LimitsFetcher(this.hubOrg.getConnection()).getApiLimits(); + const remainingActiveScratchOrgs = limits.find((limit) => limit.name === 'ActiveScratchOrgs').remaining; + const remainingDailyScratchOrgs = limits.find((limit) => limit.name === 'DailyScratchOrgs').remaining; + const devhubUserName = this.hubOrg.getUsername() + + SFPStatsSender.logGauge(`scratchorgs.active.remaining`, remainingActiveScratchOrgs, {target_org: devhubUserName}); + SFPStatsSender.logGauge(`scratchorgs.daily.remaining`, remainingDailyScratchOrgs, {target_org: devhubUserName}); + + table.push(['sfp.scratchorgs.active.remaining', remainingActiveScratchOrgs, devhubUserName]); + table.push(['sfp.scratchorgs.daily.remaining', remainingDailyScratchOrgs, devhubUserName]); + + SFPStatsSender.logGauge(`pool.footprint`, nPooledScratchOrgs); + table.push(['sfp.pool.footprint', nPooledScratchOrgs, '']); + + if (pools) { + for (let pool of Object.entries(pools)) { + SFPStatsSender.logGauge('pool.total', pool[1].nTotal, { poolName: pool[0] }); + SFPStatsSender.logGauge('pool.available', pool[1].nAvailable, { poolName: pool[0] }); + SFPStatsSender.logGauge('pool.inuse', pool[1].nInUse, { poolName: pool[0] }); + SFPStatsSender.logGauge('pool.provisioning', pool[1].nProvisioningInProgress, { poolName: pool[0] }); + + table.push(['sfp.pool.total', pool[1].nTotal, pool[0]]); + table.push(['sfp.pool.available', pool[1].nAvailable, pool[0]]); + table.push(['sfp.pool.inuse', pool[1].nInUse, pool[0]]); + table.push(['sfp.pool.provisioning', pool[1].nProvisioningInProgress, pool[0]]); + } + } + + SFPLogger.log(COLOR_KEY_MESSAGE('Metrics published:'), LoggerLevel.INFO); + SFPLogger.log(table.toString(), LoggerLevel.INFO); + } + + private getMetricsForEachPool(listOfScratchOrgs: ScratchOrg[]) { + const pools: { [p: string]: poolMetrics } = {}; + + listOfScratchOrgs.forEach((scratchOrg) => { + if (!pools[scratchOrg.tag]) { + pools[scratchOrg.tag] = { + nTotal: 0, + nAvailable: 0, + nInUse: 0, + nProvisioningInProgress: 0, + }; + } + if (scratchOrg.status === 'Available') { + pools[scratchOrg.tag].nAvailable++; + } else if (scratchOrg.status === 'In use') { + pools[scratchOrg.tag].nInUse++; + } else if (scratchOrg.status === 'Provisioning in progress') { + pools[scratchOrg.tag].nProvisioningInProgress++; + } + + pools[scratchOrg.tag].nTotal = + pools[scratchOrg.tag].nAvailable + + pools[scratchOrg.tag].nInUse + + pools[scratchOrg.tag].nProvisioningInProgress; + }); + + return pools; + } + + private validateEnvVars() { + if ( + !( + process.env.sfp_STATSD || + process.env.sfp_DATADOG || + process.env.sfp_NEWRELIC || + process.env.sfp_SPLUNK + ) + ) { + throw new Error('Environment variable not set for metrics. No metrics will be published.'); + } + } +} + +interface poolMetrics { + nTotal: number; + nAvailable: number; + nInUse: number; + nProvisioningInProgress: number; +} diff --git a/packages/sfp-cli/src/commands/pool/org/delete.ts b/packages/sfp-cli/src/commands/pool/org/delete.ts new file mode 100644 index 000000000..98916f405 --- /dev/null +++ b/packages/sfp-cli/src/commands/pool/org/delete.ts @@ -0,0 +1,57 @@ +import { AnyJson } from '@salesforce/ts-types'; +import sfpCommand from '../../../SfpCommand'; +import PoolOrgDeleteImpl from '../../../core/scratchorg/pool/PoolOrgDeleteImpl'; +import SFPLogger from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import { + loglevel, + orgApiVersionFlagSfdxStyle, + targetdevhubusername, + requiredUserNameFlag, +} from '../../../flags/sfdxflags'; +import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_org_delete'); + +export default class Delete extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + protected static requiresDevhubUsername = true; + + public static examples = [`$ sfp pool:org:delete -u test-xasdasd@example.com -v devhub`]; + + public static flags = { + apiversion: orgApiVersionFlagSfdxStyle, + targetusername: requiredUserNameFlag, + targetdevhubusername, + loglevel, + }; + + public async execute(): Promise { + await this.hubOrg.refreshAuth(); + const hubConn = this.hubOrg.getConnection(); + + this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); + + let aliasAccessor = await AliasAccessor.create(); + let resolvedAliasOrUserName:string; + if (aliasAccessor.resolveAlias(this.flags.targetusername)) { + resolvedAliasOrUserName = aliasAccessor.resolveUsername(this.flags.targetusername); + } else { + resolvedAliasOrUserName = this.flags.targetusername; + } + + let poolOrgDeleteImpl = new PoolOrgDeleteImpl(this.hubOrg, resolvedAliasOrUserName); + + await poolOrgDeleteImpl.execute(); + if (!this.flags.json) + SFPLogger.log(`Scratch org with username or alias ${this.flags.targetusername} is deleted successfully`); + + return { username: this.flags.username, messages: 'Scratch Org deleted Succesfully' } as AnyJson; + } +} diff --git a/packages/sfp-cli/src/commands/profile/merge.ts b/packages/sfp-cli/src/commands/profile/merge.ts new file mode 100644 index 000000000..1955a40d1 --- /dev/null +++ b/packages/sfp-cli/src/commands/profile/merge.ts @@ -0,0 +1,157 @@ +import { Messages, Org } from '@salesforce/core'; +import { isNil } from 'lodash'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import ProfileRetriever from '@flxblio/sfprofiles/lib/impl/metadata/retriever/profileRetriever'; +import ProfileMerge from '@flxblio/sfprofiles/lib/impl/source/profileMerge'; +import sfpCommand from '../../SfpCommand'; +import Table from 'cli-table'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; + +Messages.importMessagesDirectory(__dirname); + +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_merge'); + +export default class Merge extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp profile:merge -u sandbox`, + `$ sfp profile:merge -f force-app -n "My Profile" -u sandbox`, + `$ sfp profile:merge -f "module1, module2, module3" -n "My Profile1, My profile2" -u sandbox`, + ]; + + public static flags = { + folder: arrayFlagSfdxStyle({ + char: 'f', + description: messages.getMessage('folderFlagDescription'), + required: false, + }), + profilelist: arrayFlagSfdxStyle({ + char: 'n', + description: messages.getMessage('profileListFlagDescription'), + required: false, + }), + metadata: arrayFlagSfdxStyle({ + char: 'm', + description: messages.getMessage('metadataFlagDescription'), + required: false, + }), + delete: Flags.boolean({ + char: 'd', + description: messages.getMessage('deleteFlagDescription'), + required: false, + }), + targetorg: requiredUserNameFlag, + 'apiversion': orgApiVersionFlagSfdxStyle, + loglevel, + }; + + // Comment this out if your command does not require an org username + protected static requiresUsername = true + + // Set this to true if your command requires a project workspace; 'requiresProject' is false by default + protected static requiresProject = true; + + public async execute(): Promise { + let argFolder = this.flags.folder; + let argProfileList = this.flags.profilelist; + let argMetadatas = this.flags.metadata; + + // argMetadatas = (val: string) => { + // let parts = val.split(':'); + // return { + // MetadataType: parts[0].trim(), + // ApiName: parts.length >= 2 ? parts[1].trim() : '*', + // }; + // }; + + Sfpowerkit.initCache(); + + let metadatas = undefined; + let invalidArguments = []; + + if (argMetadatas !== undefined) { + metadatas = {}; + ProfileRetriever.supportedMetadataTypes.forEach((val) => { + metadatas[val] = []; + }); + for (let i = 0; i < argMetadatas.length; i++) { + if (ProfileRetriever.supportedMetadataTypes.includes(argMetadatas[i].MetadataType)) { + metadatas[argMetadatas[i].MetadataType].push(argMetadatas[i].ApiName); + } else { + invalidArguments.push(argMetadatas[i].MetadataType); + } + } + if (invalidArguments.length > 0) { + throw new Error( + 'Metadata(s) ' + invalidArguments.join(', ') + ' is/are not supported.' + ); + } + } + + if (!isNil(argFolder) && argFolder.length !== 0) { + Sfpowerkit.setDefaultFolder(argFolder[0]); + } + ``; + + + this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); + const profileUtils = new ProfileMerge(this.org); + + let mergedProfiles = await profileUtils.merge(argFolder, argProfileList || [], metadatas, this.flags.delete); + + const table = new Table({ + head: ['State', 'Full Name', 'Type', 'Path'], + chars: ZERO_BORDER_TABLE, + }); + if (mergedProfiles.added) { + mergedProfiles.added.forEach((profile) => { + table.push({ + state: 'Add', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + if (mergedProfiles.updated) { + mergedProfiles.updated.forEach((profile) => { + table.push({ + state: 'Merged', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + if (this.flags.delete) { + if (mergedProfiles.deleted) { + mergedProfiles.deleted.forEach((profile) => { + table.push({ + state: 'Deleted', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + } else { + if (mergedProfiles.deleted) { + mergedProfiles.deleted.forEach((profile) => { + table.push({ + state: 'Skipped', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + } + SFPLogger.log(table.toString(), LoggerLevel.INFO); + + return mergedProfiles; + } +} diff --git a/packages/sfp-cli/src/commands/profile/reconcile.ts b/packages/sfp-cli/src/commands/profile/reconcile.ts new file mode 100644 index 000000000..571af5b55 --- /dev/null +++ b/packages/sfp-cli/src/commands/profile/reconcile.ts @@ -0,0 +1,123 @@ +import { Messages, Org } from '@salesforce/core'; +import * as _ from 'lodash'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { METADATA_INFO } from '@flxblio/sfprofiles/lib/impl/metadata/metadataInfo'; +import * as path from 'path'; +import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; +import MetadataFiles from '@flxblio/sfprofiles/lib/impl/metadata/metadataFiles'; +import sfpCommand from '../../SfpCommand'; +const Table = require('cli-table'); +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import { Flags } from '@oclif/core'; +import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); + + +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_reconcile'); + +export default class Reconcile extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp profile:reconcile --folder force-app -d destfolder -s`, + `$ sfp profile:reconcile --folder force-app,module2,module3 -u sandbox -d destfolder`, + `$ sfp profile:reconcile -u myscratchorg -d destfolder`, + ]; + + + + public static flags = { + folder:arrayFlagSfdxStyle({ + char: 'f', + description: messages.getMessage('folderFlagDescription'), + required: false, + }), + profilelist: arrayFlagSfdxStyle({ + char: 'n', + description: messages.getMessage('nameFlagDescription'), + required: false, + }), + destfolder: Flags.directory({ + char: 'd', + description: messages.getMessage('destFolderFlagDescription'), + required: false, + }), + sourceonly: Flags.boolean({ + char: 's', + description: messages.getMessage('sourceonlyFlagDescription'), + required: false, + }), + targetorg: requiredUserNameFlag, + 'apiversion': orgApiVersionFlagSfdxStyle, + loglevel, + + }; + + // Comment this out if your command does not require an org username + protected static requiresUsername = false; + + // Comment this out if your command does not support a hub org username + //protected static supportsDevhubUsername = true; + + // Set this to true if your command requires a project workspace; 'requiresProject' is false by default + protected static requiresProject = true; + + public async execute(): Promise> { + let argFolder = this.flags.folder; + let argProfileList = this.flags.profilelist; + + if (!this.flags.sourceonly) { + if (_.isNil(this.flags.targetorg)) { + throw new Error('Either set sourceonly flag or provide and org for reconcile'); + } else { + this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); + } + } + + MetadataFiles.sourceOnly = this.flags.sourceonly; + + if (!_.isNil(argFolder) && argFolder.length !== 0) { + Sfpowerkit.setDefaultFolder(argFolder[0]); + } + + let result = []; + + try { + let profileReconciler = new ProfileReconcile(this.org); + let reconcileProfiles = await profileReconciler.reconcile( + argFolder, + argProfileList || [], + this.flags.destfolder + ); + + // Return an object to be displayed with --json + + reconcileProfiles.forEach((file) => { + result.push({ + state: 'Cleaned', + fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), + type: 'Profile', + path: path.relative(process.cwd(), file), + }); + }); + } catch (err) { + SFPLogger.log(err, LoggerLevel.ERROR); + + SFPLogger.log( + 'An error occured during profile reconcile. You can rerun the command after a moment.', + LoggerLevel.ERROR + ); + } + const table = new Table({ + head: ['State', 'Full Name', 'Type', 'Path'], + chars: ZERO_BORDER_TABLE, + }); + for (let res of result) { + table.push([res.state, res.fullName, res.type, res.path]); + } + SFPLogger.log(table.toString(), LoggerLevel.INFO); + return result; + } +} diff --git a/packages/sfp-cli/src/commands/profile/retrieve.ts b/packages/sfp-cli/src/commands/profile/retrieve.ts new file mode 100644 index 000000000..d1b1853e0 --- /dev/null +++ b/packages/sfp-cli/src/commands/profile/retrieve.ts @@ -0,0 +1,128 @@ +import { Messages, Org } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import { isNil } from 'lodash'; +import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; +import ProfileSync from '@flxblio/sfprofiles/lib/impl/source/profileSync'; +import sfpCommand from '../../SfpCommand'; +import Table from 'cli-table'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { Flags } from '@oclif/core'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; + + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'profile_retrieve'); + +export default class Retrieve extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp profile:retrieve -u prod`, + `$ sfp profile:retrieve -f force-app -n "My Profile" -u prod`, + `$ sfp profile:retrieve -f "module1, module2, module3" -n "My Profile1, My profile2" -u prod`, + ]; + + + public static flags = { + folder: arrayFlagSfdxStyle({ + char: 'f', + description: messages.getMessage('folderFlagDescription'), + required: false, + }), + profilelist: arrayFlagSfdxStyle({ + char: 'n', + description: messages.getMessage('profileListFlagDescription'), + required: false, + }), + delete: Flags.boolean({ + char: 'd', + description: messages.getMessage('deleteFlagDescription'), + required: false, + }), + targetorg: requiredUserNameFlag, + 'apiversion': orgApiVersionFlagSfdxStyle, + loglevel, + }; + + // Comment this out if your command does not require an org username + protected static requiresUsername = true; + + // Set this to true if your command requires a project workspace; 'requiresProject' is false by default + protected static requiresProject = true; + + public async execute(): Promise { + let argFolder: string = this.flags.folder; + let argProfileList: string[] = this.flags.profilelist; + + let folders: string[] = []; + if (!isNil(argFolder) && argFolder.length !== 0) { + for (let dir of argFolder) { + if (!fs.existsSync(dir)) { + throw new Error(`The profile path ${dir} does not exist.`); + } + } + folders.push(...argFolder); + } + + Sfpowerkit.initCache(); + + SFPLogger.log(COLOR_WARNING(messages.getMessage('retriveDelayWarning')),LoggerLevel.INFO); + SFPLogger.log(COLOR_KEY_MESSAGE(`Retrieving profiles from ${this.flags.targetorg}`),LoggerLevel.INFO ); + + this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); + const profileUtils = new ProfileSync(this.org); + + let syncProfiles = await profileUtils.sync(folders, argProfileList || [], this.flags.delete); + + const table = new Table({ + head: ['State', 'Full Name', 'Type', 'Path'], + chars: ZERO_BORDER_TABLE, + }); + if (syncProfiles.added) { + syncProfiles.added.forEach((profile) => { + table.push({ + state: 'Add', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + if (syncProfiles.updated) { + syncProfiles.updated.forEach((profile) => { + table.push({ + state: 'Updated', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + if (this.flags.delete) { + if (syncProfiles.deleted) { + syncProfiles.deleted.forEach((profile) => { + table.push({ + state: 'Deleted', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + } else { + if (syncProfiles.deleted) { + syncProfiles.deleted.forEach((profile) => { + table.push({ + state: 'Skipped', + fullName: profile.name, + type: 'Profile', + path: profile.path, + }); + }); + } + } + + return syncProfiles; + } +} diff --git a/packages/sfp-cli/src/commands/releasedefinition/generate.ts b/packages/sfp-cli/src/commands/releasedefinition/generate.ts new file mode 100644 index 000000000..0bad08e90 --- /dev/null +++ b/packages/sfp-cli/src/commands/releasedefinition/generate.ts @@ -0,0 +1,83 @@ +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { Messages } from '@salesforce/core'; +import ReleaseDefinitionGenerator from '../../impl/release/ReleaseDefinitionGenerator'; +import sfpCommand from '../../SfpCommand'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'releasedefinition_generate'); + +export default class Generate extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [ + `$ sfp releasedefinition:generate -n -c -f `, + ]; + + protected static requiresProject = true; + protected static requiresDevhubUsername = false; + + public static flags = { + gitref: Flags.string({ + char: 'c', + description: messages.getMessage('commitFlagDescription'), + required: true + }), + configfile: Flags.string({ + char: 'f', + required: true, + description: messages.getMessage('configFileFlagDescription'), + }), + releasename: Flags.string({ + char: 'n', + required: true, + description: messages.getMessage('releaseNameFlagDescription'), + }), + branchname: Flags.string({ + char: 'b', + description: messages.getMessage('branchNameFlagDescription'), + }), + directory: Flags.string({ + char: 'd', + description: messages.getMessage('directoryFlagDescription'), + }), + nopush: Flags.boolean({ + description: messages.getMessage('noPushFlagDescription'), + default:false + }), + forcepush: Flags.boolean({ + description: messages.getMessage('forcePushFlagDescription'), + dependsOn: ['push'], + }), + loglevel + }; + + async execute(): Promise { + try { + let releaseDefinitionGenerator: ReleaseDefinitionGenerator = new ReleaseDefinitionGenerator( + new ConsoleLogger(), + this.flags.gitref, + this.flags.configfile, + this.flags.releasename, + this.flags.branchname, + this.flags.directory, + this.flags.nopush, + this.flags.forcepush + ); + return await releaseDefinitionGenerator.exec(); + } catch (err) { + let errorMessage: string = ''; + if (err instanceof Array) { + for (let e of err) { + errorMessage += e.message + `\n`; + } + } else { + errorMessage = err.message; + } + console.log(errorMessage); + + process.exit(1); + } + } +} diff --git a/packages/sfp-cli/src/commands/repo/patch.ts b/packages/sfp-cli/src/commands/repo/patch.ts new file mode 100644 index 000000000..1781b3286 --- /dev/null +++ b/packages/sfp-cli/src/commands/repo/patch.ts @@ -0,0 +1,309 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import FetchImpl from '../../impl/artifacts/FetchImpl'; +import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; +import path = require('path'); +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import SFPLogger, { ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; +import Git from '../../core/git/Git'; +import * as fs from 'fs-extra'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol } from '../../flags/sfdxflags'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'patch'); + +export default class Patch extends sfpCommand { + public static description = messages.getMessage('commandDescription'); + + public static examples = [`$ sfp repo:patch -n `]; + + protected static requiresProject = true; + protected static requiresDevhubUsername = false; + + public static flags = { + releasedefinitions: arrayFlagSfdxStyle({ + char: 'p', + required: true, + description: messages.getMessage('releaseDefinitionFlagDescription'), + }), + sourcebranchname: Flags.string({ + char: 's', + required: true, + description: messages.getMessage('sourcebranchNameFlagDescription'), + }), + targetbranchname: Flags.string({ + char: 't', + required: true, + description: messages.getMessage('targetbranchNameFlagDescription'), + }), + scriptpath: Flags.file({ + char: 'f', + description: messages.getMessage('scriptPathFlagDescription'), + }), + npm: Flags.boolean({ + description: messages.getMessage('npmFlagDescription'), + exclusive: ['scriptpath'], + }), + scope: Flags.string({ + description: messages.getMessage('scopeFlagDescription'), + dependsOn: ['npm'], + parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), + }), + npmrcpath: Flags.file({ + description: messages.getMessage('npmrcPathFlagDescription'), + dependsOn: ['npm'], + required: false, + }), + logsgroupsymbol, + loglevel + }; + + async execute(): Promise { + let git; + try { + let logger: Logger = new ConsoleLogger(); + + SFPLogger.log( + COLOR_HEADER(`Source Branch: ${this.flags.sourcebranchname}`), + LoggerLevel.INFO, + logger + ); + SFPLogger.log( + COLOR_HEADER(`Release Defintion: ${this.flags.releasedefinitions}`), + LoggerLevel.INFO, + logger + ); + SFPLogger.log( + COLOR_HEADER(`Target Branch: ${this.flags.targetbranchname}`), + LoggerLevel.INFO, + logger + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + //Load release definition + let releaseDefinitions = await this.loadReleaseDefintions(this.flags.releasedefinitions); + + SFPLogger.log(EOL, LoggerLevel.INFO, logger); + SFPLogger.log(COLOR_WARNING('This process may take a bit of time'), LoggerLevel.INFO, logger); + + //Create temporary git rep + git = await Git.initiateRepoAtTempLocation(logger, null, this.flags.sourcebranchname); + await git.createBranch(this.flags.targetbranchname); + + //Fetch artifacts + await this.fetchArtifacts( + releaseDefinitions, + this.flags.scriptpath, + this.flags.scope, + this.flags.npmrcpath, + logger + ); + + //overwrite modules + await this.overwriteModules(releaseDefinitions, git, logger); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Patching of Branch ${this.flags.targetbranchname} with release ${this.flags.releasedefinitions} completed` + ), + LoggerLevel.INFO + ); + SFPLogger.log(COLOR_KEY_MESSAGE(`New Branch with patches created ${this.flags.targetbranchname}`), LoggerLevel.INFO); + } finally { + if (git) await git.deleteTempoRepoIfAny(); + } + } + + + private async fetchArtifacts( + releaseDefintions: ReleaseDefinitionSchema[], + fetchArtifactScript: string, + scope: string, + npmrcPath: string, + logger: Logger + ) { + let groupSection = new GroupConsoleLogs('Fetching artifacts').begin(); + SFPLogger.log(COLOR_KEY_MESSAGE('Fetching artifacts'), LoggerLevel.INFO, logger); + let fetchImpl: FetchImpl = new FetchImpl('artifacts', fetchArtifactScript, scope, npmrcPath, logger); + await fetchImpl.fetchArtifacts(releaseDefintions); + groupSection.end(); + } + + private async loadReleaseDefintions(releaseDefinitionPaths: []): Promise { + let releaseDefinitions: ReleaseDefinitionSchema[] = []; + for (const pathToReleaseDefintion of releaseDefinitionPaths) { + let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)) + .releaseDefinition; + releaseDefinitions.push(releaseDefinition); + } + return releaseDefinitions; + } + + private async overwriteModules(releaseDefinitions: ReleaseDefinitionSchema[], git: Git, logger: Logger) { + let temporaryWorkingDirectory = git.getRepositoryPath(); + let revisedProjectConfig = ProjectConfig.getSFDXProjectConfig(temporaryWorkingDirectory); + for (const releaseDefinition of releaseDefinitions) { + let revisedArtifactDirectory = path.join( + 'artifacts', + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + + let artifacts = ArtifactFetcher.fetchArtifacts(revisedArtifactDirectory, null, logger); + + if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${revisedArtifactDirectory}`); + + //Convert artifacts to SfpPackages + let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts, logger); + + //Grab the latest projectConfig from Packages + let sfpPackageInquirer: SfpPackageInquirer = new SfpPackageInquirer(sfpPackages, logger); + let sfdxProjectConfigFromLeadingArtifact = sfpPackageInquirer.getLatestProjectConfig(); + + + let idx = 0; + for (const sfpPackage of sfpPackages) { + SFPLogger.log(`Processing package ${sfpPackage.packageName}`); + + let packageDescriptorFromArtifact=ProjectConfig.getPackageDescriptorFromConfig( + sfpPackage.packageName, + sfdxProjectConfigFromLeadingArtifact + ); + + + //Retrieve the project directory path from the current working directory and remove it + try { + //Find path + let pathToPackageInSourceBranch = ProjectConfig.getPackageDescriptorFromConfig( + sfpPackage.packageName, + revisedProjectConfig + ).path; + //Remove the path mentioned in the target path + fs.removeSync(path.join(temporaryWorkingDirectory, pathToPackageInSourceBranch)); + } catch (error) { + //Package not found, do nothing + } + + //Create new path as mentioned in artifact + fs.mkdirpSync(path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory)); + + + //Copy from artifacts to each package directory + //If diff, artifact will only contain delta, so use the version control to checkout the entire reference + if(sfpPackage.packageType==PackageType.Diff) + { + + await git.checkoutPath(sfpPackage.commitSHATo, sfpPackage.packageDirectory); + } + else + { + fs.copySync( + path.join(sfpPackage.sourceDir, sfpPackage.packageDirectory), + path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory) + ); + } + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Succesfully copied from artifact ${sfpPackage.packageName} ${sfpPackage.package_version_number} to target directory` + ), + LoggerLevel.INFO + ); + + //Find package index and replace the descriptor from the artifact + let packageIndex = this.getPackageIndex(sfpPackage.packageName, revisedProjectConfig); + if (packageIndex != -1) { + revisedProjectConfig.packageDirectories = revisedProjectConfig.packageDirectories.map( + (sfdxPackage) => { + if (sfdxPackage.package == sfpPackage.packageName) { + delete packageDescriptorFromArtifact.default; + return packageDescriptorFromArtifact; + } else { + return sfdxPackage; + } + } + ); + } else { + //Package is not in the source branch, so find an anchor package + let currentIdx = idx--; + while (true) { + if ((currentIdx = -1)) { + //There is no package above me to anchor. so just add it 0 + revisedProjectConfig.packageDirectories.splice( + 0, + 0, + packageDescriptorFromArtifact + ); + } else { + packageIndex = this.getPackageIndex( + sfpPackages[currentIdx].packageName, + revisedProjectConfig + ); + if (packageIndex >= 0) { + revisedProjectConfig.packageDirectories.splice( + packageIndex, + 0, + packageDescriptorFromArtifact + ); + } else currentIdx--; + } + } + } + //Write sfdx project.json immediately + fs.writeJSONSync( + path.join(temporaryWorkingDirectory, 'sfdx-project.json'), + revisedProjectConfig, + { + spaces: 4, + } + ); + + //Commit to git + try { + await git.commitFile( + [sfpPackage.packageDescriptor.path, 'sfdx-project.json'], + `Reset ${sfpPackage.packageName} to ${sfpPackage.package_version_number}` + ); + await git.addAnnotatedTag(`${sfpPackage.packageName}_v${sfpPackage.package_version_number}-ALIGN`, + `${sfpPackage.packageName} ${sfpPackage.packageType} Package ${sfpPackage.package_version_number}`); + } catch (error) { + //Ignore + } + + SFPLogger.log( + COLOR_KEY_MESSAGE(`Processed ${sfpPackage.packageName} to ${sfpPackage.package_version_number}`), + LoggerLevel.INFO + ); + + idx++; + } + SFPLogger.log('Packages' + sfpPackages.length, LoggerLevel.TRACE, logger); + } + //Push back + await git.pushToRemote(this.flags.targetbranchname, true); + await git.pushTags(); + } + + private async generateSfpPackageFromArtifacts(artifacts: Artifact[], logger: Logger): Promise { + let sfpPackages: SfpPackage[] = []; + for (const artifact of artifacts) { + let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, logger); + sfpPackages.push(sfpPackage); + } + return sfpPackages; + } + + private getPackageIndex(sfdxPackage: string, projectConfig: any) { + return projectConfig.packageDirectories.find((packageDescriptor) => packageDescriptor.package == sfdxPackage); + } +} diff --git a/packages/sfp-cli/src/core/apex/ApexClassFetcher.ts b/packages/sfp-cli/src/core/apex/ApexClassFetcher.ts new file mode 100644 index 000000000..b7e20ea49 --- /dev/null +++ b/packages/sfp-cli/src/core/apex/ApexClassFetcher.ts @@ -0,0 +1,28 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from "../queryHelper/ChunkCollection"; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ApexClassFetcher { + constructor(private conn: Connection) {} + + /** + * Query Apex Classes by Name + * + * @param classNames + * @returns + */ + public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> { + let result: {Id: string; Name: string}[] = []; + + const chunks = chunkCollection(classNames); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query + const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); + result = result.concat(records); + } + + return result; + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/apex/ApexTriggerFetcher.ts b/packages/sfp-cli/src/core/apex/ApexTriggerFetcher.ts new file mode 100644 index 000000000..9b17c3d4d --- /dev/null +++ b/packages/sfp-cli/src/core/apex/ApexTriggerFetcher.ts @@ -0,0 +1,28 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from '../queryHelper/ChunkCollection'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ApexTriggerFetcher { + constructor(private conn: Connection) {} + + /** + * Query Triggers by Name + * + * @param triggerNames + * @returns + */ + public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> { + let result: {Id: string, Name: string}[] = []; + + const chunks = chunkCollection(triggerNames); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query + const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); + result = result.concat(records); + } + + return result; + } +} diff --git a/packages/sfp-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts b/packages/sfp-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts new file mode 100644 index 000000000..f1f543365 --- /dev/null +++ b/packages/sfp-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts @@ -0,0 +1,42 @@ +import { Connection } from '@salesforce/core'; +import chunkCollection from '../../queryHelper/ChunkCollection'; +import QueryHelper from '../../queryHelper/QueryHelper'; + +export default class ApexCodeCoverageAggregateFetcher { + constructor(private conn: Connection) {} + + /** + * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId + * @param listOfApexClassOrTriggerId + * @returns + */ + public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{ + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }[]> { + let result: { + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }[] = []; + + const chunks = chunkCollection(listOfApexClassOrTriggerId); + for (const chunk of chunks) { + const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); + let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`; + + const records = await QueryHelper.query<{ + ApexClassOrTriggerId: string; + NumLinesCovered: number; + NumLinesUncovered: number; + Coverage: any; + }>(query, this.conn, true); + result = result.concat(records); + } + + return result; + } +} diff --git a/packages/sfp-cli/src/core/apex/coverage/IndividualClassCoverage.ts b/packages/sfp-cli/src/core/apex/coverage/IndividualClassCoverage.ts new file mode 100644 index 000000000..978361887 --- /dev/null +++ b/packages/sfp-cli/src/core/apex/coverage/IndividualClassCoverage.ts @@ -0,0 +1,76 @@ +import SFPLogger, { Logger, LoggerLevel } from "@flxblio/sfp-logger" + +export default class IndividualClassCoverage { + public constructor(private codeCoverage: any, private logger: Logger) {} + + public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] { + let individualClassCoverage: { + name: string; + coveredPercent: number; + }[] = []; + + // Return every class in coverage json if test level is not RunAllTestsInPackage + individualClassCoverage = this.codeCoverage.map((cls) => { + return { name: cls.name, coveredPercent: cls.coveredPercent }; + }); + + // Filter individualClassCoverage based on classesToBeValidated + if(classesToBeValidated && classesToBeValidated.length > 0) + individualClassCoverage = individualClassCoverage.filter((cls) => { + return classesToBeValidated.includes(cls.name); + }); + + + return individualClassCoverage; + } + + public validateIndividualClassCoverage( + individualClassCoverage: ClassCoverage[], + coverageThreshold?: number + ): { + result: boolean; + message: string; + classesCovered?: ClassCoverage[]; + classesWithInvalidCoverage?: ClassCoverage[]; + } { + if (coverageThreshold < 75) { + SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger); + coverageThreshold = 75; + } + + SFPLogger.log( + `Validating individual classes for code coverage greater than ${coverageThreshold} percent`, + LoggerLevel.INFO, + this.logger + ); + let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => { + return cls.coveredPercent < coverageThreshold; + }); + + if (classesWithInvalidCoverage.length > 0) { + return { + result: false, + message: 'There are classes which do not satisfy the individual coverage requirements', + classesCovered: individualClassCoverage, + classesWithInvalidCoverage: classesWithInvalidCoverage, + }; + } else + return { + result: true, + message: 'All classes in this test run meet the required coverage threshold', + classesCovered: individualClassCoverage, + }; + } +} + +export type CoverageOptions = { + isPackageCoverageToBeValidated: boolean; + isIndividualClassCoverageToBeValidated: boolean; + coverageThreshold: number; + classesToBeValidated?: string[]; +}; + +export type ClassCoverage = { + name: string; + coveredPercent: number; +}; diff --git a/packages/sfp-cli/src/core/apex/parser/ApexTypeFetcher.ts b/packages/sfp-cli/src/core/apex/parser/ApexTypeFetcher.ts new file mode 100644 index 000000000..a4d7eb57e --- /dev/null +++ b/packages/sfp-cli/src/core/apex/parser/ApexTypeFetcher.ts @@ -0,0 +1,134 @@ +import * as fs from 'fs-extra'; +const path = require('path'); +const { globSync } = require('glob'); + +import ApexTypeListener from './listeners/ApexTypeListener'; + +import { + ApexLexer, + ApexParser, + ApexParserListener, + CaseInsensitiveInputStream, + ThrowingErrorListener, + CommonTokenStream, + ParseTreeWalker, +} from 'apex-parser'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { ApexClasses } from '../../package/SfpPackage'; + +/** + * Get Apex type of cls files in a search directory. + * Sorts files into classes, test classes and interfaces. + */ +export default class ApexTypeFetcher { + private apexSortedByType: ApexSortedByType = { + class: [], + testClass: [], + interface: [], + parseError: [], + }; + + constructor(private searchDir: string) {} + + public getClassesClassifiedByType(): ApexSortedByType { + let clsFiles: string[]; + if (fs.existsSync(this.searchDir)) { + clsFiles = globSync(`**/*.cls`, { + cwd: this.searchDir, + absolute: true, + }); + } else { + throw new Error(`Search directory does not exist`); + } + + for (let clsFile of clsFiles) { + let clsPayload: string = fs.readFileSync(clsFile, 'utf8'); + let fileDescriptor: FileDescriptor = { + name: path.basename(clsFile, '.cls'), + filepath: clsFile, + }; + + // Parse cls file + let compilationUnitContext; + try { + let lexer = new ApexLexer(new CaseInsensitiveInputStream(clsFile, clsPayload)); + let tokens: CommonTokenStream = new CommonTokenStream(lexer); + + let parser = new ApexParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(new ThrowingErrorListener()); + + compilationUnitContext = parser.compilationUnit(); + } catch (err) { + SFPLogger.log(`Failed to parse ${clsFile} in ${this.searchDir}`, LoggerLevel.WARN); + SFPLogger.log(err.message, LoggerLevel.WARN); + + fileDescriptor.error = err; + this.apexSortedByType.parseError.push(fileDescriptor); + + continue; + } + + let apexTypeListener: ApexTypeListener = new ApexTypeListener(); + + // Walk parse tree to determine Apex type + ParseTreeWalker.DEFAULT.walk(apexTypeListener as ApexParserListener, compilationUnitContext); + + let apexType = apexTypeListener.getApexType(); + + if (apexType.class) { + this.apexSortedByType.class.push(fileDescriptor); + if (apexType.testClass) { + this.apexSortedByType.testClass.push(fileDescriptor); + } + } else if (apexType.interface) { + this.apexSortedByType.interface.push(fileDescriptor); + } else { + fileDescriptor.error = { message: 'Unknown Apex Type' }; + this.apexSortedByType.parseError.push(fileDescriptor); + } + } + return this.apexSortedByType; + } + + public getTestClasses(): ApexClasses { + let testClassNames: ApexClasses = this.apexSortedByType.testClass.map((fileDescriptor) => fileDescriptor.name); + return testClassNames; + } + + public getClassesOnlyExcludingTestsAndInterfaces(): ApexClasses { + let packageClasses: ApexClasses = this.apexSortedByType.class.map((fileDescriptor) => fileDescriptor.name); + + if (packageClasses != null) { + let testClassesInPackage: ApexClasses = this.apexSortedByType.testClass.map( + (fileDescriptor) => fileDescriptor.name + ); + if (testClassesInPackage != null && testClassesInPackage.length > 0) + packageClasses = packageClasses.filter((item) => !testClassesInPackage.includes(item)); + + let interfacesInPackage: ApexClasses = this.apexSortedByType.testClass.map( + (fileDescriptor) => fileDescriptor.name + ); + if (interfacesInPackage != null && interfacesInPackage.length > 0) + packageClasses = packageClasses.filter((item) => !interfacesInPackage.includes(item)); + + let parseError: ApexClasses = this.apexSortedByType.parseError.map((fileDescriptor) => fileDescriptor.name); + if (parseError != null && parseError.length > 0) + packageClasses = packageClasses.filter((item) => !parseError.includes(item)); + } + return packageClasses; + } +} + +export type ApexSortedByType = { + class: FileDescriptor[]; + testClass: FileDescriptor[]; + interface: FileDescriptor[]; + parseError: FileDescriptor[]; +}; + +export type FileDescriptor = { + name: string; + filepath: string; + error?: any; +}; diff --git a/packages/sfp-cli/src/core/apex/parser/listeners/ApexTypeListener.ts b/packages/sfp-cli/src/core/apex/parser/listeners/ApexTypeListener.ts new file mode 100644 index 000000000..12e6e2181 --- /dev/null +++ b/packages/sfp-cli/src/core/apex/parser/listeners/ApexTypeListener.ts @@ -0,0 +1,38 @@ +import { + ApexParserListener, + AnnotationContext, + InterfaceDeclarationContext, + ClassDeclarationContext, +} from 'apex-parser'; + +export default class ApexTypeListener implements ApexParserListener { + private apexType: ApexType = { + class: false, + testClass: false, + interface: false, + }; + + enterAnnotation(ctx: AnnotationContext): void { + if (ctx.text.toUpperCase().startsWith('@ISTEST')) { + this.apexType.testClass= true; + } + } + + enterInterfaceDeclaration(ctx: InterfaceDeclarationContext): void { + this.apexType.interface = true; + } + + enterClassDeclaration(ctx: ClassDeclarationContext): void { + this.apexType.class = true; + } + + public getApexType(): ApexType { + return this.apexType; + } +} + +interface ApexType { + class: boolean; + testClass: boolean; + interface: boolean; +} diff --git a/packages/sfp-cli/src/core/apextest/ApexTestSuite.ts b/packages/sfp-cli/src/core/apextest/ApexTestSuite.ts new file mode 100644 index 000000000..ca2dbd0e0 --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/ApexTestSuite.ts @@ -0,0 +1,30 @@ + +const fs = require('fs-extra'); +import path from 'path'; +import xml2json from '../utils/xml2json'; +import { globSync } from 'glob'; + +export default class ApexTestSuite { + public constructor(private sourceDir: string, private suiteName: string) {} + + public async getConstituentClasses(): Promise { + let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, { + cwd: this.sourceDir, + absolute: true, + }); + + console.log('testSuitePaths',testSuitePaths); + + if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`); + + let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0]))); + + if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) { + return apex_test_suite.ApexTestSuite.testClassName; + } else { + let testClassess = new Array(); + testClassess.push(apex_test_suite.ApexTestSuite.testClassName); + return testClassess; + } + } +} diff --git a/packages/sfp-cli/src/core/apextest/ClearCodeCoverage.ts b/packages/sfp-cli/src/core/apextest/ClearCodeCoverage.ts new file mode 100644 index 000000000..bd6fb7712 --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/ClearCodeCoverage.ts @@ -0,0 +1,53 @@ +import { Connection, Org } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { chunkArray } from '../utils/ChunkArray'; +const CODECOV_AGGREGATE_QUERY = `SELECT Id FROM ApexCodeCoverageAggregate`; +const APEX_TEST_RESULT_QUERY = `SELECT Id FROM ApexTestResult`; +import { delay } from '../utils/Delay'; + +export default class ClearTestResults { + private conn: Connection; + + public constructor(private org: Org, private logger: Logger) {} + /** + * Clear coverage and test results + */ + public async clear() { + this.conn = this.org.getConnection(); + + SFPLogger.log(`Clearing Coverage Results`, LoggerLevel.DEBUG, this.logger); + let codeCoverageAggregate = await QueryHelper.query(CODECOV_AGGREGATE_QUERY, this.conn, true); + await this.deleteRecords('ApexCodeCoverageAggregate', codeCoverageAggregate); + SFPLogger.log(`Cleared Coverage Results`, LoggerLevel.DEBUG, this.logger); + + SFPLogger.log(`Clearing Test Results`, LoggerLevel.DEBUG, this.logger); + let testResults = await QueryHelper.query(APEX_TEST_RESULT_QUERY, this.conn, true); + await this.deleteRecords('ApexTestResult', testResults); + SFPLogger.log(`Cleared Test Results`, LoggerLevel.DEBUG, this.logger); + + SFPLogger.log(`Cleared Existing Coverage and Test Results`, LoggerLevel.INFO, this.logger); + + //allow org to catchup + await delay(10000); + } + + private async deleteRecords(objectType: string, records: any[]) { + if (records && records.length > 0) { + let idsList: string[] = records.map((elem) => elem.Id); + let errors = []; + for (let idsToDelete of chunkArray(2000, idsList)) { + const deleteResults: any = await this.conn.tooling.destroy(objectType, idsToDelete); + deleteResults.forEach((elem) => { + if (!elem.success) { + errors = errors.concat(elem.errors); + } + }); + } + + if (errors.length > 0) { + throw new Error(JSON.stringify(errors)); + } + } + } +} diff --git a/packages/sfp-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts b/packages/sfp-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts new file mode 100644 index 000000000..a271a79b7 --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts @@ -0,0 +1,90 @@ +import * as _ from 'lodash'; +import ApexDepedencyCheckImpl from "@flxblio/apexlink/lib/ApexDepedencyCheckImpl" +import Component from '../dependency/Component'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SfpPackage, { PackageType } from '../package/SfpPackage'; +import path from 'path'; + +export default class ImpactedApexTestClassFetcher { + public constructor( + private sfpPackage: SfpPackage, + private changedComponents: Component[], + private logger: Logger, + private loglevel?: LoggerLevel + ) {} + + public async getImpactedTestClasses(): Promise { + + let invalidatedClasses = []; + let invalidatedTestClasses = []; + + try + { + let validatedChangedComponents = this.changedComponents.filter( + (component) => component.package == this.sfpPackage.packageName + ); + + SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger); + + + + let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory)); + let dependencies = (await apexLinkImpl.execute()).dependencies; + + if(dependencies.length==0) + { + //go for another attempt + SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger); + apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory); + dependencies = (await apexLinkImpl.execute()).dependencies; + } + + SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger); + + //compute invalidated apex classes + for (const changedComponent of validatedChangedComponents) { + //If the component is a permset or profile, add every test class + //There is a change in security model, add all test classes as invalidated + // Temoorarily disabled this check as it is not working as expected + if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) { + SFPLogger.log( + COLOR_WARNING(`Change in Security Model, pushing all test classes through`), + LoggerLevel.INFO, + this.logger + ); + invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses); + break; + } + + for (const apexClass of dependencies) { + // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class + if (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name); + + // push any apex class or test class who is dependent on the changed entity + for (const dependsOn of apexClass.dependencies) { + if (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name); + } + } + } + + SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger); + //Filter all apex classes by means of whats is detected in test classes list + invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses); + SFPLogger.log( + `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`, + LoggerLevel.INFO, + this.logger + ); + }catch(error) + { + SFPLogger.log( + `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`, + LoggerLevel.ERROR, + this.logger + ); + invalidatedClasses = this.sfpPackage.apexTestClassses; + } + return invalidatedTestClasses; + } +} diff --git a/packages/sfp-cli/src/core/apextest/JSONReporter.ts b/packages/sfp-cli/src/core/apextest/JSONReporter.ts new file mode 100644 index 000000000..315f3d47a --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/JSONReporter.ts @@ -0,0 +1,174 @@ +/* + * 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 + */ +import { ApexTestResultData, ApexTestResultOutcome, TestResult } from '@salesforce/apex-node'; + +export type CliJsonFormat = { + summary: object; + tests: CliTestResult[]; + coverage?: CliCoverageResult; +}; + +type CliTestResult = { + Id: string; + QueueItemId: string; + StackTrace: string; + Message: string; + AsyncApexJobId: string; + MethodName: string; + Outcome: ApexTestResultOutcome; + ApexClass: { Id: string; Name: string; NamespacePrefix: string }; + RunTime: number; + FullName: string; +}; + +type ClassCoverage = { + id: string; + name: string; + totalLines: number; + lines: {}; + totalCovered: number; + coveredPercent: number; +}; + +type PerClassCoverage = { + ApexTestClass: { + Id: string; + Name: string; + }; + Coverage?: { coveredLines: number[]; uncoveredLines: number[] }; + TestMethodName: string; + NumLinesCovered: number; + ApexClassOrTrigger: { + Id: string; + Name: string; + }; + NumLinesUncovered: number; +}; + +type CliCoverageResult = { + coverage: ClassCoverage[]; + records: PerClassCoverage[]; + summary: { + totalLines: number; + coveredLines: number; + testRunCoverage: string; + orgWideCoverage: string; + }; +}; + +const skippedProperties = ['skipRate', 'coveredLines', 'totalLines']; +const timeProperties = ['testExecutionTimeInMs', 'testTotalTimeInMs', 'commandTimeInMs']; + +export class JsonReporter { + public format( + result: TestResult + ): { + summary: object; + tests: CliTestResult[]; + coverage?: CliCoverageResult; + } { + return { + summary: this.formatSummary(result), + tests: this.formatTestResults(result.tests), + ...(result.codecoverage + ? { + coverage: this.formatCoverage(result), + } + : {}), + }; + } + + private formatSummary(testResult: TestResult): object { + const summary = {}; + + Object.entries(testResult.summary).forEach(([key, value]) => { + if (skippedProperties.includes(key)) { + return; + } + + if (timeProperties.includes(key)) { + key = key.replace('InMs', ''); + value = `${value} ms`; + } + + Object.assign(summary, { [key]: value }); + }); + + return summary; + } + + private formatTestResults(testResults: ApexTestResultData[]): CliTestResult[] { + return testResults.map((test) => { + return { + Id: test.id, + QueueItemId: test.queueItemId, + StackTrace: test.stackTrace, + Message: test.message, + AsyncApexJobId: test.asyncApexJobId, + MethodName: test.methodName, + Outcome: test.outcome, + ApexClass: { + Id: test.apexClass.id, + Name: test.apexClass.name, + NamespacePrefix: test.apexClass.namespacePrefix, + }, + RunTime: test.runTime, + FullName: test.fullName, + }; + }) as CliTestResult[]; + } + + private formatCoverage(testResult: TestResult): CliCoverageResult { + const formattedCov = { + coverage: [], + records: [], + summary: { + totalLines: testResult.summary.totalLines, + coveredLines: testResult.summary.coveredLines, + orgWideCoverage: testResult.summary.orgWideCoverage, + testRunCoverage: testResult.summary.testRunCoverage, + }, + } as CliCoverageResult; + + if (testResult.codecoverage) { + formattedCov.coverage = testResult.codecoverage.map((cov) => { + const lines: { [key: number]: number } = {}; + cov.coveredLines.forEach((covLine) => (lines[covLine] = 1)); + cov.uncoveredLines.forEach((uncovLine) => (lines[uncovLine] = 0)); + + return { + id: cov.apexId, + name: cov.name, + totalLines: cov.numLinesCovered + cov.numLinesUncovered, + lines, + totalCovered: cov.numLinesCovered, + coveredPercent: parseInt(cov.percentage), + } as ClassCoverage; + }); + + testResult.tests.forEach((test) => { + if (test.perClassCoverage) { + test.perClassCoverage.forEach((perClassCov) => { + formattedCov.records.push({ + ApexTestClass: { Id: test.id, Name: test.apexClass.name }, + ...(perClassCov.coverage ? { Coverage: perClassCov.coverage } : {}), + TestMethodName: test.methodName, + NumLinesCovered: perClassCov.numLinesCovered, + ApexClassOrTrigger: { + Id: perClassCov.apexClassOrTriggerId, + Name: perClassCov.apexClassOrTriggerName, + }, + NumLinesUncovered: perClassCov.numLinesUncovered, + } as PerClassCoverage); + }); + } + }); + } + + return formattedCov; + } +} diff --git a/packages/sfp-cli/src/core/apextest/TestOptions.ts b/packages/sfp-cli/src/core/apextest/TestOptions.ts new file mode 100644 index 000000000..15faf1fcd --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/TestOptions.ts @@ -0,0 +1,73 @@ +import * as _ from 'lodash'; +import SfpPackage from '../package/SfpPackage'; + +export class TestOptions { + synchronous?: boolean; + wait_time: number; + outputdir: string; + testLevel: TestLevel; +} + +export class RunSpecifiedTestsOption extends TestOptions { + specifiedTests: string; + constructor(wait_time: number, outputdir: string, specifiedTests: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.specifiedTests = specifiedTests; + this.testLevel = TestLevel.RunSpecifiedTests; + } +} + +export class RunApexTestSuitesOption extends TestOptions { + suiteNames: string; + constructor(wait_time: number, outputdir: string, suiteNames: string, pkg?: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.suiteNames = suiteNames; + this.testLevel = TestLevel.RunApexTestSuite; + } +} + +export class RunLocalTests extends TestOptions { + constructor(wait_time: number, outputdir: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.testLevel = TestLevel.RunLocalTests; + } +} + +export class RunAllTestsInOrg extends TestOptions { + constructor(wait_time: number, outputdir: string, synchronous?: boolean) { + super(); + this.synchronous = synchronous ? synchronous : false; + this.wait_time = wait_time ? wait_time : 60; + this.outputdir = outputdir; + this.testLevel = TestLevel.RunAllTestsInOrg; + } +} + +export class RunAllTestsInPackageOptions extends RunSpecifiedTestsOption { + public constructor(private _sfppackage: SfpPackage, wait_time: number, outputdir: string) { + super(wait_time, outputdir, _sfppackage.apexTestClassses.toString(), false); + this.synchronous = _sfppackage.packageDescriptor.testSynchronous == true ? true : false; + } + + public get sfppackage() { + return this._sfppackage; + } +} + +export enum TestLevel { + RunNoTests = 'NoTestRun', + RunSpecifiedTests = 'RunSpecifiedTests', + RunApexTestSuite = 'RunApexTestSuite', + RunLocalTests = 'RunLocalTests', + RunAllTestsInOrg = 'RunAllTestsInOrg', + RunAllTestsInPackage = 'RunAllTestsInPackage', +} diff --git a/packages/sfp-cli/src/core/apextest/TestReportDisplayer.ts b/packages/sfp-cli/src/core/apextest/TestReportDisplayer.ts new file mode 100644 index 000000000..a66e55dc3 --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/TestReportDisplayer.ts @@ -0,0 +1,118 @@ +import { RunAllTestsInPackageOptions, RunApexTestSuitesOption, TestOptions } from './TestOptions'; +import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from '../display/TableConstants'; + +const Table = require('cli-table'); + +export class TestReportDisplayer { + constructor(private apexTestReport: any, private testOptions: TestOptions, private fileLogger?: any) {} + + public printTestSummary(packageCoverage?: number): string { + let apexTestReport = { ...this.apexTestReport }; + SFPLogger.log('\n\n\n=== Test Summary', LoggerLevel.INFO, this.fileLogger); + let table = new Table({ + head: ['Name', 'Value'], + chars: ZERO_BORDER_TABLE + }); + + if ( + this.testOptions instanceof RunAllTestsInPackageOptions || + this.testOptions instanceof RunApexTestSuitesOption || + this.testOptions instanceof RunAllTestsInPackageOptions + ) { + delete apexTestReport.summary.testRunCoverage; + delete apexTestReport.summary.orgWideCoverage; + + if (this.testOptions instanceof RunAllTestsInPackageOptions) + apexTestReport.summary.packageCoverage = packageCoverage; + } + + Object.entries(apexTestReport.summary).forEach((keyValuePair) => { + keyValuePair[1] = keyValuePair[1] || ''; + table.push(keyValuePair); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } + + public printTestResults(): string { + SFPLogger.log('=== Test Results', LoggerLevel.INFO, this.fileLogger); + + let table = new Table({ + head: ['Test Name', 'Outcome', 'Message', 'Runtime (ms)'], + chars: ZERO_BORDER_TABLE + }); + + this.apexTestReport.tests.forEach((test) => { + if (test.Outcome === 'Pass') { + table.push([ + COLOR_SUCCESS(test.FullName || ''), + COLOR_SUCCESS(test.Outcome), + COLOR_SUCCESS(test.Message || ''), + COLOR_SUCCESS(test.RunTime || ''), + ]); + } else { + table.push([ + COLOR_ERROR(test.FullName || ''), + COLOR_ERROR(test.Outcome || ''), + COLOR_ERROR(test.Message || ''), + COLOR_ERROR(test.RunTime || ''), + ]); + } + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } + + public printCoverageReport( + coverageThreshold: number, + classesCovered?: { name: string; coveredPercent: number }[], + classesWithInvalidCoverage?: { name: string; coveredPercent: number }[] + ): { classesCoveredTable: string; classInvalidCoverageTable?: string } { + SFPLogger.log('\n\n=== Test Coverage', LoggerLevel.INFO, this.fileLogger); + let classesCoveredTable; + if (classesCovered) { + classesCoveredTable = this.printIndividualClassCoverage(classesCovered); + } + if (classesWithInvalidCoverage) { + let classInvalidCoverageTable = this.printClassesWithInvalidCoverage( + classesWithInvalidCoverage, + coverageThreshold + ); + return { classesCoveredTable, classInvalidCoverageTable }; + } else return { classesCoveredTable }; + } + + private printClassesWithInvalidCoverage( + classesWithInvalidCoverage: { name: string; coveredPercent: number }[], + coverageThreshold: number + ): string { + SFPLogger.log( + `The following classes do not satisfy the ${coverageThreshold}% code coverage requirement:`, + LoggerLevel.INFO, + this.fileLogger + ); + + return this.printIndividualClassCoverage(classesWithInvalidCoverage); + } + + private printIndividualClassCoverage(individualClassCoverage: { name: string; coveredPercent: number }[]): string { + let table = new Table({ + head: ['Class', 'Coverage Percent'], + chars: ZERO_BORDER_TABLE + }); + + individualClassCoverage.forEach((cls) => { + if (cls.coveredPercent !== null && cls.coveredPercent < 75) { + table.push([COLOR_ERROR(cls.name || ''), COLOR_ERROR(cls.coveredPercent)]); + } else if (cls.coveredPercent !== null && cls.coveredPercent >= 75) { + table.push([COLOR_SUCCESS(cls.name || ''), COLOR_SUCCESS(cls.coveredPercent)]); + } else table.push([cls.name || '', 'N/A']); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); + return table.toString(); + } +} diff --git a/packages/sfp-cli/src/core/apextest/TriggerApexTests.ts b/packages/sfp-cli/src/core/apextest/TriggerApexTests.ts new file mode 100644 index 000000000..18c45aff5 --- /dev/null +++ b/packages/sfp-cli/src/core/apextest/TriggerApexTests.ts @@ -0,0 +1,767 @@ +const fs = require('fs-extra'); +import path = require('path'); +import { + RunSpecifiedTestsOption, + TestOptions, + RunApexTestSuitesOption, + RunLocalTests, + RunAllTestsInOrg, + RunAllTestsInPackageOptions, +} from './TestOptions'; +import IndividualClassCoverage, { CoverageOptions } from '../apex/coverage/IndividualClassCoverage'; +import { TestReportDisplayer } from './TestReportDisplayer'; +import PackageTestCoverage from '../package/coverage/PackageTestCoverage'; +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPStatsSender from '../stats/SFPStatsSender'; +import { Connection, Org } from '@salesforce/core'; +import { + TestLevel, + TestResult, + TestService, + JUnitReporter, + Progress, + ApexTestProgressValue, + CancellationTokenSource, + ApexTestResultOutcome, + ApexTestResultData, + CodeCoverageResult, +} from '@salesforce/apex-node'; +import { CliJsonFormat, JsonReporter } from './JSONReporter'; +import { Duration } from '@salesforce/kit'; +import ClearCodeCoverage from './ClearCodeCoverage'; +import _ from 'lodash'; +const retry = require('async-retry'); + +export default class TriggerApexTests { + private conn: Connection; + protected cancellationTokenSource = new CancellationTokenSource(); + + public constructor( + private target_org: string, + private testOptions: TestOptions, + private coverageOptions: CoverageOptions, + private project_directory: string, + private fileLogger?: any + ) {} + + public async exec(): Promise<{ + id: string; + result: boolean; + message: string; + }> { + let org = await Org.create({ aliasOrUsername: this.target_org }); + this.conn = org.getConnection(); + + // graceful shutdown + const exitHandler = async (): Promise => { + await this.cancellationTokenSource.asyncCancel(); + process.exit(); + }; + process.on('SIGINT', exitHandler); + process.on('SIGTERM', exitHandler); + + let startTime = Date.now(); + let testExecutionResult: boolean = false; + let testsRan: number; + let commandTime: number; + + try { + const testService = new TestService(this.conn); + + //Clear Code Coverage before triggering tests + try { + let clearCodeCoverage = new ClearCodeCoverage(org, this.fileLogger); + await clearCodeCoverage.clear(); + } catch (error) { + SFPLogger.log( + `Ignoring error in clearing code coverage attributed to ${error}.`, + LoggerLevel.DEBUG, + this.fileLogger + ); + } + + //Translate Tests to test levels used by apex-node + let translatedTestLevel: TestLevel; + //Fetch tests passed in the testOptions + let tests: string = null; + let suites: string = null; + let isCoverageToBeFetched: boolean = + this.coverageOptions.isIndividualClassCoverageToBeValidated || + this.coverageOptions.isPackageCoverageToBeValidated; + + //Translate Test Option + ({ translatedTestLevel, tests, suites } = await this.translateTestOptionToAPIVars(this.testOptions)); + //Trigger tests asynchronously + let testRunResult: TestResult; + try { + testRunResult = (await this.triggerTestAsynchronously( + testService, + translatedTestLevel, + isCoverageToBeFetched, + tests, + suites + )) as TestResult; + } catch (error) { + return { + result: false, + id: null, + message: error.message, + }; + } + + //Fetch Test Results + let testResult = await retry( + async (bail) => { + return await testService.reportAsyncResults( + testRunResult.summary.testRunId, + isCoverageToBeFetched, + this.cancellationTokenSource.token + ); + }, + { retries: 2, minTimeout: 3000 } + ); + + testResult = this.fixBadNamespaceClassFullNames(testResult); + + //Collect Failed Tests only if Parallel + testResult = await this.triggerSecondRunInSerialForParallelFailedTests( + testResult, + testService, + translatedTestLevel, + isCoverageToBeFetched + ); + + //Filter testResult for duplicate test listing + testResult = this.removeDuplicateTestListing(testResult); + + //Write Test Results to file + let jsonOutput = undefined; + try + { + jsonOutput = this.writeTestOutput(testResult); + }catch(error) + { + SFPLogger.log( + `Unable to write test results to file due to ${error}`, + LoggerLevel.DEBUG, + this.fileLogger + ); + return { + result: false, + id: testResult.summary.testRunId, + message: 'Unable to fetch test execution results, Please retry', + }; + } + + //Print tests result to screen + let testReportDisplayer = new TestReportDisplayer(jsonOutput, this.testOptions, this.fileLogger); + testReportDisplayer.printTestResults(); + + commandTime = testResult.summary.commandTimeInMs; + + if (testResult.summary.outcome == 'Failed') { + testExecutionResult = false; + + return { + result: false, + id: testResult.summary.testRunId, + message: 'Test Execution failed', + }; + } else { + if (isCoverageToBeFetched) { + let coverageResults = await this.validateForApexCoverage(jsonOutput.coverage.coverage); + testReportDisplayer.printCoverageReport( + this.coverageOptions.coverageThreshold, + coverageResults.classesCovered, + coverageResults.classesWithInvalidCoverage + ); + + testsRan = testResult.summary.testsRan; + testReportDisplayer.printTestSummary(coverageResults.packageTestCoverage); + + testExecutionResult = coverageResults.result; + SFPStatsSender.logGauge('apextest.testcoverage', coverageResults.packageTestCoverage, { + package: + this.testOptions instanceof RunAllTestsInPackageOptions + ? this.testOptions.sfppackage.packageName + : null, + }); + return { + result: coverageResults.result, + id: testResult.summary.testRunId, + message: coverageResults.message, + }; + } else { + testExecutionResult = true; + SFPStatsSender.logGauge( + 'apextest.testcoverage', + Number.parseInt(testResult.summary.testRunCoverage), + { + package: + this.testOptions instanceof RunAllTestsInPackageOptions + ? this.testOptions.sfppackage.packageName + : null, + } + ); + return { + result: true, + id: testResult.summary.testRunId, + message: `Test execution succesfully completed`, + }; + } + } + } finally { + this.reportMetrics(this.testOptions, { + targetOrg: this.target_org, + startTime, + testExecutionResult, + testsRan, + commandTime, + }); + } + } + + private async translateTestOptionToAPIVars( + testOptions: TestOptions + ): Promise<{ translatedTestLevel: TestLevel; tests: string; suites: string }> { + let translatedTestLevel: TestLevel; + let tests: string; + let suites: string; + if (testOptions instanceof RunAllTestsInPackageOptions) { + ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForAllTestInPackageOptions(testOptions)); + } else if (testOptions instanceof RunSpecifiedTestsOption) { + ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForSpecifiedTests(testOptions)); + } else if (testOptions instanceof RunApexTestSuitesOption) { + translatedTestLevel = TestLevel.RunSpecifiedTests; + suites = (testOptions as RunApexTestSuitesOption).suiteNames; + SFPLogger.log( + `Test Suites to be executed: ${COLOR_KEY_MESSAGE(suites)}`, + LoggerLevel.INFO, + this.fileLogger + ); + } else if (testOptions instanceof RunLocalTests) { + translatedTestLevel = TestLevel.RunLocalTests; + SFPLogger.log( + `Triggering all ${COLOR_KEY_MESSAGE(`local tests`)}in the org`, + LoggerLevel.INFO, + this.fileLogger + ); + } else if (testOptions instanceof RunAllTestsInOrg) { + SFPLogger.log( + `Triggering all ${COLOR_KEY_MESSAGE(`all tests`)}in the org`, + LoggerLevel.INFO, + this.fileLogger + ); + translatedTestLevel = TestLevel.RunAllTestsInOrg; + } + return { translatedTestLevel, tests, suites }; + } + + private removeDuplicateTestListing(testResult: any): any { + let modifiedTestResult = _.cloneDeep(testResult); + + let toEliminateIndices = []; + for (let index = 0; index < modifiedTestResult.tests.length; index++) { + let idx = index; + let duplicateIndices = [index]; + while (idx != -1) { + idx = _.findIndex( + modifiedTestResult.tests, + (elem: any) => { + return elem.methodName == modifiedTestResult.tests[index].methodName + && elem.apexClass.name == modifiedTestResult.tests[index].apexClass.name; + }, + idx + 1 + ); + if (idx != -1) duplicateIndices.push(idx); + } + if (duplicateIndices.length > 1) { + for (const idx of duplicateIndices) { + if (modifiedTestResult.tests[idx].outcome != 'Pass') toEliminateIndices.push(idx); + } + } + } + + modifiedTestResult.tests = modifiedTestResult.tests.filter(function (value, index, arr) { + return !toEliminateIndices.includes(index); + }); + + if (toEliminateIndices.length > 0) modifiedTestResult = this.combineTestResult(modifiedTestResult); + + return modifiedTestResult; + } + + private async getTranslatedOptionsForSpecifiedTests(testOptions: RunSpecifiedTestsOption) { + let translatedTestLevel = TestLevel.RunSpecifiedTests; + let tests = testOptions.specifiedTests; + SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); + SFPLogger.log( + `Test Mode: ${COLOR_KEY_MESSAGE(this.testOptions.synchronous == true ? 'serial' : 'parallel')}`, + LoggerLevel.INFO, + this.fileLogger + ); + //Toggle to serial + await this.toggleParallelApexTesting( + this.conn, + this.fileLogger, + this.testOptions.synchronous == true ? true : false + ); + return { translatedTestLevel, tests }; + } + + private async getTranslatedOptionsForAllTestInPackageOptions(testOptions: RunAllTestsInPackageOptions) { + SFPLogger.log( + `Test Mode Descriptor in Package 'testSynchronous': ${ + testOptions.sfppackage.packageDescriptor.testSynchronous + ? testOptions.sfppackage.packageDescriptor.testSynchronous + : false + }`, + LoggerLevel.TRACE, + this.fileLogger + ); + SFPLogger.log( + `Test Mode: ${COLOR_KEY_MESSAGE(testOptions.synchronous == true ? 'serial' : 'parallel')}`, + LoggerLevel.INFO, + this.fileLogger + ); + await this.toggleParallelApexTesting( + this.conn, + this.fileLogger, + testOptions.synchronous == true ? true : false + ); + let translatedTestLevel = TestLevel.RunSpecifiedTests; + let tests = testOptions.specifiedTests; + SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); + return { translatedTestLevel, tests }; + } + + private async triggerSecondRunInSerialForParallelFailedTests( + testResult: TestResult, + testService: TestService, + translatedTestLevel: TestLevel, + isCoverageToBeFetched: boolean + ) { + let modifiedTestResult = _.cloneDeep(testResult); + if (!this.testOptions.synchronous) { + let parallelFailedTestClasses: string[] = []; + let testClassesThatDonotContributedCoverage: string[] = []; + + let testToBeTriggered: string[] = []; + for (const test of modifiedTestResult.tests) { + if (test.outcome == ApexTestResultOutcome.Fail) { + //Check for messages + if ( + test.message.includes(`Your request exceeded the time limit for processing`) || + test.message.includes(`UNABLE_TO_LOCK_ROW`) || + test.message.includes(`Internal Salesforce Error`) || + test.message.includes(`LIMIT_EXCEEDED`) || + test.message.includes(`Too many concurrent Apex compilations during resource mitigation`) + ) { + if (!testToBeTriggered.includes(test.apexClass.fullName)) { + parallelFailedTestClasses.push(test.apexClass.fullName); + testToBeTriggered.push(test.apexClass.fullName); + } + } + } + + if (test.outcome == ApexTestResultOutcome.Pass) { + if ( + !test.perClassCoverage && + (this.coverageOptions.isPackageCoverageToBeValidated || + this.coverageOptions.isIndividualClassCoverageToBeValidated) + ) { + if (!testToBeTriggered.includes(test.apexClass.fullName)) { + testClassesThatDonotContributedCoverage.push(test.apexClass.fullName); + if (!testToBeTriggered.includes(test.apexClass.fullName)) + testToBeTriggered.push(test.apexClass.fullName); + } + } + } + } + + if (parallelFailedTestClasses.length > 0) { + SFPLogger.log( + `Failed Tests while triggered in parallel: ${COLOR_KEY_MESSAGE( + parallelFailedTestClasses.toString() + )}`, + LoggerLevel.INFO, + this.fileLogger + ); + } + + if (testClassesThatDonotContributedCoverage.length > 0) { + SFPLogger.log( + `Test Classes that were not able to contribute coverage: ${COLOR_KEY_MESSAGE( + testClassesThatDonotContributedCoverage.toString() + )}`, + LoggerLevel.INFO, + this.fileLogger + ); + } + + if (testToBeTriggered.length > 0) { + SFPLogger.log( + `Triggering tests synchronously: ${COLOR_KEY_MESSAGE(testToBeTriggered.toString())}`, + LoggerLevel.INFO, + this.fileLogger + ); + //Trigger Second Test Run + //Convert to sequential + await this.toggleParallelApexTesting(this.conn, this.fileLogger, true); + + //Trigger tests asynchronously + let secondRuntestRunResult: TestResult; + secondRuntestRunResult = await retry( + async (bail) => { + return (await this.triggerTestAsynchronously( + testService, + translatedTestLevel, + isCoverageToBeFetched, + testToBeTriggered.toString(), + null + )) as TestResult; + }, + { retries: 2, minTimeout: 3000 } + ); + + secondRuntestRunResult = this.fixBadNamespaceClassFullNames(secondRuntestRunResult); + + //Fetch Test Results + const secondTestResult = this.fixBadNamespaceClassFullNames( + await testService.reportAsyncResults( + secondRuntestRunResult.summary.testRunId, + true, + this.cancellationTokenSource.token + ) + ); + + this.writeTestOutput(secondTestResult); + + //Merge original test results with second run + const mergedTestResults: ApexTestResultData[] = modifiedTestResult.tests; + for (const testObject of secondTestResult.tests){ + const index = mergedTestResults.findIndex((test) => test.fullName === testObject.fullName); + if (index !== -1) { + mergedTestResults[index] = testObject; + }else{ + mergedTestResults.push(testObject); + } + } + modifiedTestResult.tests = mergedTestResults; + + //Merge original code coverage with second run + if (isCoverageToBeFetched) { + const mergedCodecoverage: CodeCoverageResult[] = modifiedTestResult.codecoverage; + for (const codeCoverageObject of secondTestResult.codecoverage){ + + const index = mergedCodecoverage.findIndex((codeCoverage) => codeCoverage.name === codeCoverageObject.name); + if (index !== -1) { + mergedCodecoverage[index] = codeCoverageObject; + }else{ + mergedCodecoverage.push(codeCoverageObject); + } + } + modifiedTestResult.codecoverage = mergedCodecoverage; + } + + //Now redo the math + modifiedTestResult = this.combineTestResult(modifiedTestResult, secondRuntestRunResult); + } + } + + return modifiedTestResult; + } + + private fixBadNamespaceClassFullNames(testResult: any): any { + let modifiedTestResult = _.cloneDeep(testResult); + + try + { + modifiedTestResult.tests = modifiedTestResult.tests.map((test) => { + return { + ...test, + ...{ + fullName: test.fullName?.replace('__', '.'), + apexClass: { + ...test.apexClass, + ...{ + fullName: test.apexClass?.fullName?.replace('__', '.'), + }, + }, + }, + }; + }); + }catch(error) + { + SFPLogger.log( + `Unable to fix bad namespace class full names due to ${error}`, + LoggerLevel.DEBUG, + this.fileLogger + ); + modifiedTestResult = _.cloneDeep(testResult); + } + + return modifiedTestResult; + } + + private combineTestResult(testResult: TestResult, testResultSecondRun?: TestResult) { + testResult.summary.failing = 0; + testResult.summary.passing = 0; + testResult.summary.skipped = 0; + + for (const test of testResult.tests) { + if (test.outcome === ApexTestResultOutcome.Pass) testResult.summary.passing++; + else if (test.outcome === ApexTestResultOutcome.Fail) testResult.summary.failing++; + else if (test.outcome === ApexTestResultOutcome.Skip) testResult.summary.skipped++; + } + + if (testResult.summary.failing > 0) testResult.summary.outcome = 'Failed'; + else testResult.summary.outcome = 'Passed'; + + testResult.summary.passRate = (testResult.summary.passing / testResult.summary.testsRan) * 100 + '%'; + testResult.summary.failRate = (testResult.summary.failing / testResult.summary.testsRan) * 100 + '%'; + testResult.summary.commandTimeInMs = + testResult.summary.commandTimeInMs + testResultSecondRun?.summary.commandTimeInMs; + testResult.summary.testExecutionTimeInMs = + testResult.summary.testExecutionTimeInMs + testResultSecondRun?.summary.testExecutionTimeInMs; + testResult.summary.testTotalTimeInMs = + testResult.summary.testTotalTimeInMs + testResultSecondRun?.summary.testTotalTimeInMs; + + delete testResult.summary.testRunCoverage; + delete testResult.summary.orgWideCoverage; + delete testResult.summary.totalLines; + delete testResult.summary.coveredLines; + + if (testResultSecondRun) + testResult.summary.testRunId = testResult.summary.testRunId.concat( + '_', + testResultSecondRun.summary.testRunId + ); + return testResult; + } + + /** + * Trigger tests asynchronously + * @param {TestService} testService + * @param {TestLevel} testLevel + * @param {string} tests? + * @param {string} suites? + */ + private async triggerTestAsynchronously( + testService: TestService, + testLevel: TestLevel, + isCoverageToBeFetched: boolean, + tests?: string, + suites?: string + ) { + const payload = await testService.buildAsyncPayload(testLevel, null, tests, suites); + + let result = await testService.runTestAsynchronous( + payload, + isCoverageToBeFetched, + false, + new ProgressReporter(this.fileLogger), + this.cancellationTokenSource.token + ); + + if (this.cancellationTokenSource.token.isCancellationRequested) { + throw new Error(`A previous run is being cancelled.. Please try after some time`); + } + + return result; + } + + private async validateForApexCoverage( + coverageReport: any + ): Promise<{ + result: boolean; + message?: string; + packageTestCoverage?: number; + classesCovered?: { + name: string; + coveredPercent: number; + }[]; + classesWithInvalidCoverage?: { + name: string; + coveredPercent: number; + }[]; + }> { + if (this.testOptions instanceof RunAllTestsInPackageOptions) { + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + this.testOptions.sfppackage, + coverageReport, + this.fileLogger, + this.conn + ); + + return packageTestCoverage.validateTestCoverage(this.coverageOptions.coverageThreshold); + } else { + if (this.coverageOptions.isIndividualClassCoverageToBeValidated) { + let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( + coverageReport, + this.fileLogger + ); + return coverageValidator.validateIndividualClassCoverage( + coverageValidator.getIndividualClassCoverage(this.coverageOptions.classesToBeValidated), + this.coverageOptions.coverageThreshold + ); + } else { + let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( + coverageReport, + this.fileLogger + ); + return coverageValidator.validateIndividualClassCoverage( + coverageValidator.getIndividualClassCoverage() + ); + } + } + } + + private writeJUnit(testResult: TestResult) { + SFPLogger.log( + `Junit Report file available at ${path.join( + this.testOptions.outputdir, + `test-result-${testResult.summary.testRunId}-junit.xml` + )}` + ); + let reportAsJUnitReport = new JUnitReporter().format(testResult); + fs.writeFileSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-junit.xml`), + reportAsJUnitReport + ); + } + + private writeTestOutput(testResult: TestResult): CliJsonFormat { + const jsonOutput = this.formatResultInJson(testResult); + + //write output files + fs.ensureDirSync(this.testOptions.outputdir); + + //Write files + fs.writeJSONSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}.json`), + testResult, + { spaces: 4 } + ); + + if (jsonOutput.coverage) + fs.writeJSONSync( + path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-coverage.json`), + jsonOutput.coverage?.coverage, + { spaces: 4 } + ); + + //Write Junit Result no matter what + this.writeJUnit(testResult); + + return jsonOutput; + } + + private formatResultInJson(result: TestResult): CliJsonFormat { + try { + const reporter = new JsonReporter(); + return reporter.format(result); + } catch (error) { + return null; + } + } + + //Enable Synchronus Compile on Deploy + private async toggleParallelApexTesting(conn: Connection, logger: Logger, toEnable: boolean) { + try { + SFPLogger.log(`Set enableDisableParallelApexTesting:${toEnable}`, LoggerLevel.TRACE, logger); + let apexSettingMetadata = { fullName: 'ApexSettings', enableDisableParallelApexTesting: toEnable }; + let result = await conn.metadata.upsert('ApexSettings', apexSettingMetadata); + if (result.success) { + SFPLogger.log(`Successfully updated apex testing setting`, LoggerLevel.INFO, logger); + } + } catch (error) { + SFPLogger.log( + `Skipping toggling of enableDisableParallelApexTesting due to ${error}..`, + LoggerLevel.INFO, + logger + ); + } + } + + private reportMetrics( + testOptions: TestOptions, + testMetrics: { + targetOrg: string; + startTime: number; + testExecutionResult: boolean; + testsRan: number; + commandTime?: number; + } + ) { + let elapsedTime = Date.now() - testMetrics.startTime; + + if (testMetrics.testExecutionResult) + SFPStatsSender.logGauge('apextest.tests.ran', testMetrics.testsRan, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + + SFPStatsSender.logGauge('apextest.testtotal.time', elapsedTime, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions['testlevel'], + target_org: testMetrics.targetOrg, + }); + + if (testMetrics.commandTime) + SFPStatsSender.logGauge('apextest.command.time', testMetrics.commandTime, { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + + SFPStatsSender.logCount('apextests.triggered', { + test_result: String(testMetrics.testExecutionResult), + package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, + type: testOptions.testLevel, + target_org: testMetrics.targetOrg, + }); + } +} +export class ProgressReporter implements Progress { + private lastExecutedTime; + constructor(private logger: Logger) { + this.lastExecutedTime = Date.now(); + } + + report(value: ApexTestProgressValue): void { + try { + let count = {}; + //Limit printing an update to 30 seconds + if (Date.now() - this.lastExecutedTime > Duration.seconds(30).milliseconds) { + if (value.type == 'TestQueueProgress') { + for (const elem of value.value.records) { + if (elem?.Status) { + if (!count[elem.Status]) { + count[elem.Status] = 1; + } else count[elem.Status]++; + } + } + let statusString = ''; + + //Compute total + let total: number = 0; + for (const [key, value] of Object.entries(count)) { + total += value as number; + } + statusString = `Completed:${count['Completed'] ? count['Completed'] : 0}/${total} Queued(${ + count['Queued'] ? count['Queued'] : 0 + }) Failed(${COLOR_ERROR(count['Failed'] ? count['Failed'] : 0)}) `; + SFPLogger.log(`Test Status: ` + COLOR_KEY_MESSAGE(statusString), LoggerLevel.INFO, this.logger); + this.lastExecutedTime = Date.now(); + } + } + } catch (error) { + //Ignore any results during reporting + } + } +} diff --git a/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts new file mode 100644 index 000000000..fd0c94644 --- /dev/null +++ b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts @@ -0,0 +1,224 @@ +import path = require('path'); +import * as fs from 'fs-extra'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { globSync } from 'glob'; +import AdmZip = require('adm-zip'); +import semver = require('semver'); +import tar = require('tar'); + +export default class ArtifactFetcher { + /** + * Decider for which artifact retrieval method to use + * Returns empty array if no artifacts are found + * @param artifactDirectory + * @param sfdx_package + */ + public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] { + let result: Artifact[] = []; + + if (!fs.existsSync(artifactDirectory)) { + throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`); + } + + let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package); + + SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger); + + for (let artifact of artifacts) { + let artifactFilePaths: Artifact; + if (path.extname(artifact) === '.zip') { + artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact); + } else if (path.extname(artifact) === '.tgz') { + artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact); + } else { + throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`); + } + result.push(artifactFilePaths); + } + + return result; + } + + /** + * Helper method for retrieving the ArtifactFilePaths of an artifact folder + * @param packageMetadataFilePath + */ + private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact { + let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`); + + let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Helper method for retrieving ArtifactFilePaths of an artifact zip + * @param artifact + */ + private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact { + let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + + fs.mkdirpSync(unzippedArtifactsDirectory); + let zip = new AdmZip(artifact); + + // Overwrite existing files + zip.extractAllTo(unzippedArtifactsDirectory, true); + + let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0]; + if (artifactName == null) { + throw new Error(`Failed to fetch artifact file paths for ${artifact}`); + } + + let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json'); + + let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`); + + let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Helper method for retrieving ArtifactFilePaths of a tarball + * @param artifact + */ + private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact { + let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + fs.mkdirpSync(unzippedArtifactsDirectory); + + tar.x({ + file: artifact, + cwd: unzippedArtifactsDirectory, + sync: true, + }); + + let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json'); + + let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`); + + let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`); + + let artifactFilePaths: Artifact = { + packageMetadataFilePath: packageMetadataFilePath, + sourceDirectoryPath: sourceDirectory, + changelogFilePath: changelogFilePath, + }; + + ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); + + return artifactFilePaths; + } + + /** + * Find zip and tarball artifacts + * Artifact format/s: + * sfp_artifact_.zip, + * [sfdx_package]_sfp_artifact_[version].zip, + * [sfdx_package]_sfp_artifact_[version].tgz + */ + public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] { + let pattern: string; + if (sfdx_package) { + pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`; + } else { + pattern = `**/*sfp_artifact*.@(zip|tgz)`; + } + + let artifacts: string[] = globSync(pattern, { + cwd: artifactDirectory, + absolute: true, + }); + + if (sfdx_package && artifacts.length > 1) { + SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO); + let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts); + SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO); + return [latestArtifact]; + } else return artifacts; + } + + /** + * Get the artifact with the latest semantic version + * @param artifacts + */ + private static getLatestArtifact(artifacts: string[]) { + // Consider zip & tarball artifacts only + artifacts = artifacts.filter((artifact) => { + let ext: string = path.extname(artifact); + return ext === '.zip' || ext === '.tgz'; + }); + + let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); + let versions: string[] = artifacts.map((artifact) => { + let match: RegExpMatchArray = path.basename(artifact).match(pattern); + let version = match?.groups.version; + + if (version) return version; + else throw new Error('Corrupted artifact detected with no version number'); + }); + + // Pick artifact with latest semantic version + let sortedVersions: string[] = semver.sort(versions); + let latestVersion: string = sortedVersions.pop(); + + return artifacts.find((artifact) => artifact.includes(latestVersion)); + } + + /** + * Verify that artifact filepaths exist on the file system + * @param artifactFilePaths + */ + private static existsArtifactFilepaths(artifactFilePaths: Artifact): void { + Object.values(artifactFilePaths).forEach((filepath) => { + if (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`); + }); + } + + /** + * Decider for task outcome if the artifact cannot be found + * @param artifacts_filepaths + * @param isToSkipOnMissingArtifact + */ + public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean { + if (artifacts.length === 0 && !isToSkipOnMissingArtifact) { + throw new Error(`Artifact not found, Please check the inputs`); + } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) { + SFPLogger.log( + `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}` + ); + return true; + } + } + + private static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} + +export interface Artifact { + packageMetadataFilePath: string; + sourceDirectoryPath?: string; + changelogFilePath?: string; +} diff --git a/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts b/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts new file mode 100644 index 000000000..6ce94ec2d --- /dev/null +++ b/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts @@ -0,0 +1,105 @@ +import path = require('path'); +import * as fs from 'fs-extra'; +import GeneratePackageChangelog from '../../changelog/GeneratePackageChangelog'; +import { Changelog } from '../../changelog/interfaces/GenericChangelogInterfaces'; +import * as rimraf from 'rimraf'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import AdmZip = require('adm-zip'); +import SfpPackage from '../../package/SfpPackage'; + +export default class ArtifactGenerator { + //Generates the universal artifact used by the CLI and AZP + public static async generateArtifact( + sfpPackage: SfpPackage, + project_directory: string, + artifact_directory: string + ): Promise { + try { + // Artifact folder consisting of artifact metadata, changelog & source + let artifactFolder: string = `${sfpPackage.packageName}_sfp_artifact`; + + // Absolute filepath of artifact + let artifactFilepath: string; + + if (artifact_directory != null) { + artifactFilepath = path.resolve(artifact_directory, artifactFolder); + } else { + artifactFilepath = path.resolve(artifactFolder); + } + + fs.mkdirpSync(artifactFilepath); + + let sourcePackage: string = path.join(artifactFilepath, `source`); + fs.mkdirpSync(sourcePackage); + + //Clean up temp directory + if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfp'))) + rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfp')); + if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfdx'))) + rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfdx')); + + fs.copySync(sfpPackage.workingDirectory, sourcePackage); + rimraf.sync(sfpPackage.workingDirectory); + + //Modify Source Directory to the new source directory inside the artifact + sfpPackage.sourceDir = `source`; + + let artifactMetadataFilePath: string = path.join(artifactFilepath, `artifact_metadata.json`); + + fs.writeFileSync(artifactMetadataFilePath, JSON.stringify(sfpPackage, null, 4)); + + // Generate package changelog + // Doesnt need a from version number, as it always generate from start + let generatePackageChangelog: GeneratePackageChangelog = new GeneratePackageChangelog( + sfpPackage.packageName, + undefined, + sfpPackage.sourceVersion, + project_directory + ); + + let packageChangelog: Changelog = await generatePackageChangelog.exec(); + + let changelogFilepath: string = path.join(artifactFilepath, `changelog.json`); + + fs.writeFileSync(changelogFilepath, JSON.stringify(packageChangelog, null, 4)); + + SFPLogger.log('Artifact Copy Completed', LoggerLevel.DEBUG); + + let zip = new AdmZip(); + zip.addLocalFolder(artifactFilepath, artifactFolder); + SFPLogger.log(`Zipping ${artifactFolder}`, LoggerLevel.DEBUG); + + let packageVersionNumber: string = ArtifactGenerator.substituteBuildNumberWithPreRelease( + sfpPackage.versionNumber + ); + + let zipArtifactFilepath: string = artifactFilepath + `_` + packageVersionNumber + `.zip`; + zip.writeZip(zipArtifactFilepath); + + SFPLogger.log( + `Artifact Generation Completed for ${sfpPackage.packageType} to ${zipArtifactFilepath}`, + LoggerLevel.INFO + ); + + // Cleanup unzipped artifact + rimraf.sync(artifactFilepath); + + return zipArtifactFilepath; + } catch (error) { + throw new Error('Unable to create artifact' + error); + } + } + + private static substituteBuildNumberWithPreRelease(packageVersionNumber: string) { + let segments = packageVersionNumber.split('.'); + + if (segments.length === 4) { + packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { + if (segmentsIdx === 3) return version + '-' + segment; + else return version + '.' + segment; + }); + } + + return packageVersionNumber; + } +} diff --git a/packages/sfp-cli/src/core/changelog/GeneratePackageChangelog.ts b/packages/sfp-cli/src/core/changelog/GeneratePackageChangelog.ts new file mode 100644 index 000000000..d4c04424d --- /dev/null +++ b/packages/sfp-cli/src/core/changelog/GeneratePackageChangelog.ts @@ -0,0 +1,76 @@ +import ProjectConfig from '../project/ProjectConfig'; +import simplegit, { SimpleGit, LogOptions } from 'simple-git'; +import { Changelog } from './interfaces/GenericChangelogInterfaces'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +/** + * A class for generating a changelog between two commits + * for a single package + */ +export default class GeneratePackageChangelog { + constructor( + private readonly sfdx_package: string, + private readonly revFrom: string, + private readonly revTo: string, + private readonly project_directory: string + ) {} + + public async exec(): Promise { + let git: SimpleGit; + if (this.project_directory != null) { + git = simplegit(this.project_directory); + } else { + git = simplegit(); + } + + let packageDescriptor; + try { + packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(this.project_directory, this.sfdx_package); + } catch (err) { + SFPLogger.log(`Unable to find descriptor for package ${this.sfdx_package}`, LoggerLevel.WARN); + SFPLogger.log(err.message, LoggerLevel.WARN); + } + + let revFrom: string; + if (this.revFrom) { + revFrom = await git.revparse(['--short', `${this.revFrom}^{}`]); + } + + + let revTo: string = await git.revparse(['--short', `${this.revTo}^{}`]); + + let options: LogOptions = { + file: packageDescriptor ? `${packageDescriptor['path']}*` : packageDescriptor, + }; + if(revFrom) + { + options.from = revFrom; + options.to = revTo; + } + + const gitLogResult = await git.log(options); + + let changelog: Changelog = { + name: undefined, + from: undefined, + to: undefined, + commits: [], + }; + + changelog['name'] = this.sfdx_package; + changelog['from'] = revFrom; + changelog['to'] = revTo; + + for (let commit of gitLogResult.all) { + changelog['commits'].push({ + commitId: commit.hash.slice(0, 8), + date: commit.date, + author: commit.author_name, + message: commit.message, + body: commit.body, + }); + } + + return changelog; + } +} diff --git a/packages/sfp-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts b/packages/sfp-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts new file mode 100644 index 000000000..d9929d0ad --- /dev/null +++ b/packages/sfp-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts @@ -0,0 +1,30 @@ +export interface Changelog { + /** + * Name of the package + */ + name: string; + + /** + * Backwards-compatibility for delta package + */ + from: string; + + /** + * Commit Id from which package was created + * May not necessarily be the first element in commits + */ + to: string; + + /** + * Commits that modified the package + */ + commits: Commit[]; +} + +export interface Commit { + commitId: string; + date: string; + author: string; + message: string; + body: string; +} diff --git a/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts b/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts new file mode 100644 index 000000000..253b64313 --- /dev/null +++ b/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts @@ -0,0 +1,93 @@ +import Git from '../git/Git'; +import IgnoreFiles from '../ignore/IgnoreFiles'; +import ProjectConfig from '../project/ProjectConfig'; +import MetadataFiles from '../metadata/MetadataFiles'; +import Component from './Component'; +import * as fs from 'fs-extra'; +import path = require('path'); +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +export default class ChangedComponentsFetcher { + constructor(private baseBranch: string) {} + + async fetch(): Promise { + const components: Component[] = []; + + let git: Git = await Git.initiateRepo(); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(null); + + if (!this.baseBranch.includes('origin')) { + // for user convenience, use full ref name to avoid errors involving missing local refs + this.baseBranch = `remotes/origin/${this.baseBranch}`; + } + + let diff: string[] = await git.diff([this.baseBranch, `HEAD`, `--no-renames`, `--name-only`]); + + // Filter diff to package directories + diff = diff.filter((filepath) => + projectConfig.packageDirectories.find((pkg) => + // TODO: make comparison more robust + filepath.includes(pkg.path) + ) + ); + + // Apply root forceignore to the diff + let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync('.forceignore', 'utf8')); + diff = ignoreFiles.filter(diff); + + let componentSuccesses = this.getComponentSuccessesFromReports(); + + if (diff.length > 0) { + for (const filepath of diff) { + const fullApiName = MetadataFiles.getFullApiName(filepath); + + // find package that file belongs to + const indexOfPackage = projectConfig.packageDirectories.findIndex((pkg) => filepath.includes(pkg.path)); + + const packageName = projectConfig.packageDirectories[indexOfPackage].package; + + const componentSuccess = componentSuccesses.find( + (component) => component.fullName === fullApiName && component.id + ); + + if (componentSuccess) { + const component: Component = { + id: componentSuccess.id, + fullName: componentSuccess.fullName, + type: componentSuccess.componentType, + files: [filepath], + package: packageName, + packageType: ProjectConfig.getPackageType(projectConfig, packageName), + indexOfPackage: indexOfPackage, + }; + + components.push(component); + } else { + SFPLogger.log(`Unable to find ID for ${fullApiName} in deployment reports`, LoggerLevel.DEBUG); + // Ignore file if it's not an identifiable component + continue; + } + } + } + + return components; + } + + /** + * Aggregates component successes from MDAPI deploy reports + */ + private getComponentSuccessesFromReports(): any[] { + let componentSuccesses: any[] = []; + + const reportsDir: string = '.sfp/mdapiDeployReports'; + if (fs.existsSync(reportsDir)) { + let reports = fs.readdirSync(reportsDir); + reports.forEach((report) => { + let data = JSON.parse(fs.readFileSync(path.join(reportsDir, report), 'utf8')); + componentSuccesses = componentSuccesses.concat(data.result.details.componentSuccesses); + }); + } + return componentSuccesses; + } +} diff --git a/packages/sfp-cli/src/core/dependency/Component.ts b/packages/sfp-cli/src/core/dependency/Component.ts new file mode 100644 index 000000000..7fe64298b --- /dev/null +++ b/packages/sfp-cli/src/core/dependency/Component.ts @@ -0,0 +1,16 @@ +import { PackageType } from "../package/SfpPackage"; + +/** + * Component details and package it belongs to + */ +export default interface Component { + id: string; + fullName: string; + type: string; + files?: string[]; + package?: string; + packageType?: PackageType; + indexOfPackage?: number; + namespace?: string; + dependencies?: Component[]; +} diff --git a/packages/sfp-cli/src/core/dependency/DependencyViolation.ts b/packages/sfp-cli/src/core/dependency/DependencyViolation.ts new file mode 100644 index 000000000..80493b56e --- /dev/null +++ b/packages/sfp-cli/src/core/dependency/DependencyViolation.ts @@ -0,0 +1,7 @@ +import Component from './Component'; + +export default interface DependencyViolation { + component: Component; + dependency: any; + description: string; +} diff --git a/packages/sfp-cli/src/core/dependency/Entrypoint.ts b/packages/sfp-cli/src/core/dependency/Entrypoint.ts new file mode 100644 index 000000000..008ec7b59 --- /dev/null +++ b/packages/sfp-cli/src/core/dependency/Entrypoint.ts @@ -0,0 +1,20 @@ +import Component from './Component'; + +/** + * Used by sfdc-soup API calls + */ +export default interface Entrypoint { + name: string; + type: string; + id: string; +} + +export function component2entrypoint(components: Component[]): Entrypoint[] { + return components.map((component) => { + return { + name: component.fullName, + type: component.type, + id: component.id, + } as Entrypoint; + }); +} diff --git a/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts b/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts new file mode 100644 index 000000000..ea9f2c3d4 --- /dev/null +++ b/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts @@ -0,0 +1,230 @@ +import SFPLogger, { + COLOR_ERROR, + COLOR_HEADER, + COLOR_KEY_MESSAGE, + COLOR_SUCCESS, + Logger, + LoggerLevel, +} from '@flxblio/sfp-logger'; + +import { Duration } from '@salesforce/kit'; +import DeploymentExecutor, { DeploySourceResult } from './DeploymentExecutor'; +import { + ComponentSet, + DeployMessage, + DeployResult, + MetadataApiDeployOptions, + RequestStatus, +} from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import path from 'path'; +import SFPOrg from '../org/SFPOrg'; +import getFormattedTime from '../utils/GetFormattedTime'; +import { TestLevel } from '../apextest/TestOptions'; +import { SfProject } from '@salesforce/core'; +import { SourceTracking } from '@salesforce/source-tracking'; + +export default class DeploySourceToOrgImpl implements DeploymentExecutor { + public constructor( + private org: SFPOrg, + private projectDir: string, + private componentSet: ComponentSet, + private deploymentOptions: DeploymentOptions, + private logger?: Logger + ) {} + + public async exec(): Promise { + let deploySourceResult = {} as DeploySourceResult; + + if (this.deploymentOptions.apiVersion) this.componentSet.sourceApiVersion = this.deploymentOptions.apiVersion; + + //Get Deploy ID + let result = await this.deploy(this.componentSet); + + this.writeResultToReport(result); + + if (this.deploymentOptions.sourceTracking) { + await this.handleSourceTracking(this.org, this.logger, this.projectDir, result); + } + + //Handle Responses + if (result.response.status == RequestStatus.Succeeded) { + deploySourceResult.message = `Successfully deployed`; + deploySourceResult.result = result.response.success; + deploySourceResult.deploy_id = result.response.id; + } else { + if (result.response.status == RequestStatus.Canceled) { + deploySourceResult.message = `The deployment request ${result.response.id} was cancelled by ${result.response.canceledByName}`; + } else { + deploySourceResult.message = this.handlErrorMesasge(result); + } + deploySourceResult.response = result.response; + deploySourceResult.result = false; + deploySourceResult.deploy_id = result.response.id; + } + return deploySourceResult; + } + + private handlErrorMesasge(result: DeployResult): string { + if (result.response.numberComponentErrors == 0) { + return 'Unable to fetch report, Check your org for details'; + } else if (result.response.numberComponentErrors > 0) { + return this.constructComponentErrorMessage(result.response.details.componentFailures, this.logger); + } else if (result.response.details.runTestResult) { + return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; + } else { + return 'Unable to fetch report, Check your org for details'; + } + } + + private constructComponentErrorMessage(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { + let errorMessage = `Unable to deploy due to failure in some components, check log for details`; + + if (componentFailures === null || componentFailures === undefined) return; + + if (componentFailures instanceof Array) { + //Search for other scenarios and if background Job is being executed, override the error message + for (let failure of componentFailures) { + let scenario = classifyErrorScenarios(failure); + if (scenario == `BackgroundJob`) { + errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; + break; + } + } + } else { + let failure = componentFailures; + let scenario = classifyErrorScenarios(failure); + if (scenario == `BackgroundJob`) { + errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; + } + } + + function classifyErrorScenarios(failure: DeployMessage) { + let scenario = `Component Error`; + //Override if background job is being executed + if (failure.problem.includes(`background job is being executed`)) { + scenario = `BackgroundJob`; + } + return scenario; + } + return errorMessage; + } + + private writeResultToReport(result: DeployResult) { + let deploymentReports = `.sfp/mdapiDeployReports`; + fs.mkdirpSync(deploymentReports); + fs.writeFileSync( + path.join(deploymentReports, `${result.response.id}.json`), + JSON.stringify(this.formatResultAsJSON(result)) + ); + } + + private async buildDeploymentOptions(org: SFPOrg): Promise { + let metdataDeployOptions: MetadataApiDeployOptions = { + usernameOrConnection: org.getConnection(), + apiOptions: {}, + }; + + if (this.deploymentOptions.apiVersion) metdataDeployOptions.apiVersion = this.deploymentOptions.apiVersion; + + if (this.deploymentOptions.testLevel == TestLevel.RunLocalTests) { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunLocalTests; + } else if (this.deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunSpecifiedTests; + metdataDeployOptions.apiOptions.runTests = this.deploymentOptions.specifiedTests.split(`,`); + } else { + metdataDeployOptions.apiOptions.testLevel = TestLevel.RunNoTests; + } + + if (this.deploymentOptions.ignoreWarnings) { + metdataDeployOptions.apiOptions.ignoreWarnings = true; + } + + metdataDeployOptions.apiOptions.rollbackOnError = this.deploymentOptions.rollBackOnError; + + return metdataDeployOptions; + } + + private async deploy(componentSet: ComponentSet) { + let deploymentOptions = await this.buildDeploymentOptions(this.org); + const deploy = await componentSet.deploy(deploymentOptions); + + let startTime = Date.now(); + SFPLogger.log(`Deploying to ${this.org.getUsername()} with id:${deploy.id}`, LoggerLevel.INFO, this.logger); + // Attach a listener to check the deploy status on each poll + deploy.onUpdate((response) => { + const { status, numberComponentsDeployed, numberComponentsTotal } = response; + const progress = `${numberComponentsDeployed}/${numberComponentsTotal}`; + const message = `Status: ${COLOR_KEY_MESSAGE(status)} Progress: ${COLOR_KEY_MESSAGE(progress)}`; + SFPLogger.log(message, LoggerLevel.INFO, this.logger); + }); + + deploy.onFinish((response) => { + let deploymentDuration = Date.now() - startTime; + if (response.response.success) { + SFPLogger.log( + COLOR_SUCCESS( + `Succesfully Deployed ${COLOR_HEADER( + response.response.numberComponentsDeployed + )} components in ${getFormattedTime(deploymentDuration)}` + ), + LoggerLevel.INFO, + this.logger + ); + } else + SFPLogger.log( + COLOR_ERROR(`Failed to deploy after ${getFormattedTime(deploymentDuration)}`), + LoggerLevel.INFO, + this.logger + ); + }); + + // Wait for polling to finish and get the DeployResult object + const hoursInWaitTime = Number(this.deploymentOptions.waitTime) / 60; + const result = await deploy.pollStatus({ frequency: Duration.seconds(30), timeout: Duration.hours(hoursInWaitTime) }); + return result; + } + + //For compatibility with cli output + private formatResultAsJSON(result) { + const response = result?.response ? result.response : {}; + return { + result: { + ...response, + details: { + componentSuccesses: response?.details?.componentSuccesses, + componentFailures: response?.details?.componentFailures, + runTestResult: response?.details?.runTestResult, + }, + }, + }; + } + + private async handleSourceTracking(org: SFPOrg, logger: Logger, projectDir: string, result: DeployResult) { + if (result.response.success) { + try { + const project = await SfProject.resolve(this.projectDir); + const tracking = await SourceTracking.create({ + org: org, + project: project, + }); + await tracking.ensureRemoteTracking(); + tracking.updateTrackingFromDeploy(result); + } catch (error) { + SFPLogger.log(`Unable to update source tracking due to \n ${error}`, LoggerLevel.WARN, logger); + } + } + } +} + +export class DeploymentOptions { + ignoreWarnings: boolean; + waitTime: string; + checkOnly?: boolean; + apiVersion?: string; + testLevel?: TestLevel; + apexTestSuite?: string; + specifiedTests?: string; + sourceTracking?: boolean; + rollBackOnError?: boolean; +} diff --git a/packages/sfp-cli/src/core/deployers/DeploymentExecutor.ts b/packages/sfp-cli/src/core/deployers/DeploymentExecutor.ts new file mode 100644 index 000000000..1e1165abf --- /dev/null +++ b/packages/sfp-cli/src/core/deployers/DeploymentExecutor.ts @@ -0,0 +1,17 @@ +import { MetadataApiDeployStatus } from "@salesforce/source-deploy-retrieve"; + +export default interface DeploymentExecutor { + exec(): Promise; +} + +export interface DeploySourceResult { + deploy_id: string; + result: boolean; + message: string; + response?:MetadataApiDeployStatus +} + +export enum DeploymentType { + SOURCE_PUSH, + MDAPI_DEPLOY, +} diff --git a/packages/sfp-cli/src/core/deployers/DeploymentSettingsService.ts b/packages/sfp-cli/src/core/deployers/DeploymentSettingsService.ts new file mode 100644 index 000000000..2f8c0b0f6 --- /dev/null +++ b/packages/sfp-cli/src/core/deployers/DeploymentSettingsService.ts @@ -0,0 +1,64 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Connection } from '@salesforce/core'; +import { IpRange, SecuritySettings } from 'jsforce/lib/api/metadata'; + +export default class DeploymentSettingsService { + constructor(private conn: Connection) {} + + //Enable Synchronus Compile on Deploy + public async enableSynchronousCompileOnDeploy(logger: Logger) { + try { + let apexSettingMetadata = { fullName: 'ApexSettings', enableCompileOnDeploy: true }; + let result = await this.conn.metadata.upsert('ApexSettings', apexSettingMetadata); + if (result.success) { + SFPLogger.log( + `${COLOR_KEY_MESSAGE( + 'Enabled Synchronous Compile on Org succesfully as this is the last package in queue' + )}`, + LoggerLevel.INFO, + logger + ); + } + } catch (error) { + SFPLogger.log( + `Skipping Synchronous Compile on Org succesfully due to ${error}..`, + LoggerLevel.INFO, + logger + ); + } + } + + public async relaxAllIPRanges(logger: Logger, ipRangesAsStringArray?: string[]) { + let ipRanges: IpRange[] = []; + if (!ipRangesAsStringArray) { + ipRanges = this.getFullRange(); + } else { + ipRanges = []; + //transform to ipRange Array + for (const ipRange of ipRangesAsStringArray) { + ipRanges.push({ start: ipRange, end: ipRange }); + } + } + let securitySettingsMetadata: SecuritySettings = { + fullName: 'SecuritySettings', + networkAccess: { ipRanges: ipRanges }, + }; + try { + let result = await this.conn.metadata.upsert('SecuritySettings', securitySettingsMetadata); + if (result.success) { + SFPLogger.log(`${COLOR_KEY_MESSAGE('Relaxed all ipRanges in the org')}`, LoggerLevel.INFO, logger); + } + } catch (error) { + SFPLogger.log(`Unable to relax IP range in org due to ${error.message}`, LoggerLevel.ERROR, logger); + throw error; + } + } + + private getFullRange(): IpRange[] { + let ipRanges = []; + for (let i = 0; i < 255; i += 2) { + ipRanges.push({ start: `${i}.0.0.0`, end: `${i + 1}.255.255.255` }); + } + return ipRanges; + } +} diff --git a/packages/sfp-cli/src/core/display/DependencyViolationDisplayer.ts b/packages/sfp-cli/src/core/display/DependencyViolationDisplayer.ts new file mode 100644 index 000000000..09c6e54ca --- /dev/null +++ b/packages/sfp-cli/src/core/display/DependencyViolationDisplayer.ts @@ -0,0 +1,31 @@ +const Table = require('cli-table'); +import DependencyViolation from '../dependency/DependencyViolation'; +import SFPLogger from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class DependencyViolationDisplayer { + public static printDependencyViolations(dependencyViolations: DependencyViolation[]) { + if (!dependencyViolations || dependencyViolations.length === 0) return; + + const table = new Table({ + head: ['API Name', 'Type', 'Package', 'Dependency', 'Dependency Type', 'Dependency Package', 'Problem'], + chars: ZERO_BORDER_TABLE + }); + + SFPLogger.log('The following components resulted in failures:'); + + dependencyViolations.forEach((violation) => { + table.push([ + violation.component.fullName, + violation.component.type, + violation.component.package, + violation.dependency.fullName, + violation.dependency.type, + violation.dependency.package, + violation.description, + ]); + }); + + SFPLogger.log(table.toString()); + } +} diff --git a/packages/sfp-cli/src/core/display/DeployErrorDisplayer.ts b/packages/sfp-cli/src/core/display/DeployErrorDisplayer.ts new file mode 100644 index 000000000..8a0ea62d3 --- /dev/null +++ b/packages/sfp-cli/src/core/display/DeployErrorDisplayer.ts @@ -0,0 +1,103 @@ +const Table = require('cli-table'); +import { CodeCoverageWarnings, DeployMessage, Failures, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class DeployErrorDisplayer { + private static printMetadataFailedToDeploy(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { + if (componentFailures === null || componentFailures === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name', 'Problem Type', 'Problem'], + chars: ZERO_BORDER_TABLE + }); + + let pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.componentType, + componentFailure.fullName, + componentFailure.problemType, + componentFailure.problem, + ]; + table.push(item); + }; + + if (componentFailures instanceof Array) { + for (let failure of componentFailures) { + pushComponentFailureIntoTable(failure); + } + } else { + let failure = componentFailures; + pushComponentFailureIntoTable(failure); + } + SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, logger); + SFPLogger.log(table.toString(), LoggerLevel.ERROR, logger); + } + + public static displayErrors(response: MetadataApiDeployStatus, logger: Logger) { + SFPLogger.log(`Gathering Final Deployment Status`, null, logger); + + if (response.numberComponentErrors == 0) { + return 'Unable to fetch report, Check your org for details'; + } else if (response.numberComponentErrors > 0) { + this.printMetadataFailedToDeploy(response.details.componentFailures, logger); + return response.errorMessage; + } else if (response.details.runTestResult) { + if (response.details.runTestResult.codeCoverageWarnings) { + this.displayCodeCoverageWarnings(response.details.runTestResult.codeCoverageWarnings, logger); + } + + if (response.details.runTestResult.failures) { + this.displayTestFailures(response.details.runTestResult.failures, logger); + } + return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; + } else { + return 'Unable to fetch report, Check your org for details'; + } + } + + private static displayCodeCoverageWarnings( + codeCoverageWarnings: CodeCoverageWarnings | CodeCoverageWarnings[], + logger: Logger + ) { + let table = new Table({ + head: ['Name', 'Message'], + }); + + if (Array.isArray(codeCoverageWarnings)) { + codeCoverageWarnings.forEach((coverageWarningElement) => { + table.push([coverageWarningElement['name'], coverageWarningElement.message]); + }); + } else { + table.push([codeCoverageWarnings['name'], codeCoverageWarnings.message]); + } + + if (table.length > 1) { + SFPLogger.log( + 'Unable to deploy due to unsatisfactory code coverage, Check the following classes:', + LoggerLevel.WARN, + logger + ); + SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); + } + } + + private static displayTestFailures(testFailures: Failures | Failures[], logger: Logger) { + let table = new Table({ + head: ['Test Name', 'Method Name', 'Message'], + chars: ZERO_BORDER_TABLE + }); + + if (Array.isArray(testFailures)) { + testFailures.forEach((elem) => { + table.push([elem.name, elem.methodName, elem.message]); + }); + } else { + table.push([testFailures.name, testFailures.methodName, testFailures.message]); + } + if (table.length > 1) { + SFPLogger.log('Unable to deploy due to test failures:', LoggerLevel.WARN, logger); + SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); + } + } +} diff --git a/packages/sfp-cli/src/core/display/DeploymentOptionDisplayer.ts b/packages/sfp-cli/src/core/display/DeploymentOptionDisplayer.ts new file mode 100644 index 000000000..e484e0724 --- /dev/null +++ b/packages/sfp-cli/src/core/display/DeploymentOptionDisplayer.ts @@ -0,0 +1,51 @@ +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { TestLevel } from '../apextest/TestOptions'; +import { DeploymentOptions } from '../deployers/DeploySourceToOrgImpl'; + +export default class DeploymentOptionDisplayer { + public static printDeploymentOptions(deploymentOptions: DeploymentOptions, logger?: Logger) { + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + SFPLogger.log(`${COLOR_HEADER(`Deployment Options`)}`, LoggerLevel.INFO, logger); + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + SFPLogger.log(`TestLevel: ${COLOR_KEY_MESSAGE(deploymentOptions.testLevel)}`, LoggerLevel.INFO, logger); + if (deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) + SFPLogger.log( + `Tests to be triggered: ${COLOR_KEY_MESSAGE(deploymentOptions.specifiedTests)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log( + `Ignore Warnings: ${COLOR_KEY_MESSAGE(deploymentOptions.ignoreWarnings)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log( + `Roll Back on Error: ${COLOR_KEY_MESSAGE(deploymentOptions.rollBackOnError)}`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log(`API Version: ${COLOR_KEY_MESSAGE(deploymentOptions.apiVersion)}`, LoggerLevel.INFO, logger); + SFPLogger.log( + `${COLOR_HEADER( + `=================================================================================================` + )}`, + LoggerLevel.INFO, + logger + ); + } +} diff --git a/packages/sfp-cli/src/core/display/ExternalDependencyDisplayer.ts b/packages/sfp-cli/src/core/display/ExternalDependencyDisplayer.ts new file mode 100644 index 000000000..3227b8695 --- /dev/null +++ b/packages/sfp-cli/src/core/display/ExternalDependencyDisplayer.ts @@ -0,0 +1,30 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import Package2Detail from '../package/Package2Detail'; +import { ZERO_BORDER_TABLE } from './TableConstants'; +const Table = require('cli-table'); + +export default class ExternalDependencyDisplayer { + public constructor(private externalPackage2s: Package2Detail[], private logger: Logger) {} + + public display() { + if (this.externalPackage2s.length > 0) { + let table = new Table({ + head: ['Order', 'Package', 'Version', 'Subscriber Version Id'], + chars: ZERO_BORDER_TABLE + }); + let i = 0; + for (const externalPackage of this.externalPackage2s) { + table.push([ + i++, + externalPackage.name, + externalPackage.versionNumber ? externalPackage.versionNumber : 'N/A', + externalPackage.subscriberPackageVersionId ? externalPackage.subscriberPackageVersionId:'N/A, Could be part of current operation', + ]); + } + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log(COLOR_KEY_MESSAGE(`Resolved external package dependencies:`), LoggerLevel.INFO, this.logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); + } + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/display/InstalledArtifactsDisplayer.ts b/packages/sfp-cli/src/core/display/InstalledArtifactsDisplayer.ts new file mode 100644 index 000000000..d0ef5f96f --- /dev/null +++ b/packages/sfp-cli/src/core/display/InstalledArtifactsDisplayer.ts @@ -0,0 +1,22 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class InstalledArtifactsDisplayer { + public static printInstalledArtifacts(artifacts: any, logger: Logger) { + if (!artifacts) return; + else if(artifacts.length==0) return; + + let table = new Table({ + head: ['Artifact', 'Version', 'Commit Id'], + chars: ZERO_BORDER_TABLE + }); + + artifacts.forEach((artifact) => { + table.push([artifact.Name, artifact.Version__c, artifact.CommitId__c?artifact.CommitId__c:""]); + }); + + SFPLogger.log(COLOR_KEY_MESSAGE('Artifacts installed in org:'), LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfp-cli/src/core/display/InstalledPackagesDisplayer.ts b/packages/sfp-cli/src/core/display/InstalledPackagesDisplayer.ts new file mode 100644 index 000000000..32460d356 --- /dev/null +++ b/packages/sfp-cli/src/core/display/InstalledPackagesDisplayer.ts @@ -0,0 +1,22 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import Package2Detail from '../package/Package2Detail'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class InstalledPackagesDisplayer { + public static printInstalledPackages(packages: Package2Detail[], logger: Logger) { + if (packages == null) return; + + let table = new Table({ + head: ['Package', 'Version', 'Type', 'isOrgDependent'], + chars: ZERO_BORDER_TABLE + }); + + packages.forEach((pkg) => { + table.push([pkg.name, pkg.versionNumber, pkg.type, pkg.isOrgDependent]); + }); + + SFPLogger.log(COLOR_KEY_MESSAGE('Packages installed in org:'), LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfp-cli/src/core/display/PackageComponentPrinter.ts b/packages/sfp-cli/src/core/display/PackageComponentPrinter.ts new file mode 100644 index 000000000..ca2806cc4 --- /dev/null +++ b/packages/sfp-cli/src/core/display/PackageComponentPrinter.ts @@ -0,0 +1,27 @@ +const Table = require('cli-table'); +import { LazyCollection, SourceComponent } from '@salesforce/source-deploy-retrieve'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PackageComponentPrinter { + public static printComponentTable(components: LazyCollection, logger: Logger) { + //If Manifest is null, just return + if (components === null || components === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name'], + chars: ZERO_BORDER_TABLE + }); + + let componentArray = components.toArray(); + componentArray.sort((a, b) => a.type.name.localeCompare(b.type.name)); + + for (const component of componentArray) { + let item = [component.type.name, component.fullName]; + table.push(item); + } + + SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfp-cli/src/core/display/PackageDependencyDisplayer.ts b/packages/sfp-cli/src/core/display/PackageDependencyDisplayer.ts new file mode 100644 index 000000000..e2540aeb9 --- /dev/null +++ b/packages/sfp-cli/src/core/display/PackageDependencyDisplayer.ts @@ -0,0 +1,35 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; +const Table = require('cli-table'); + +export default class PackageDependencyDisplayer { + public static printPackageDependencies( + dependencies: { package: string; versionNumber?: string }[], + projectConfig: any, + logger: Logger + ) { + if (Array.isArray(dependencies)) { + SFPLogger.log('Package Dependencies:', LoggerLevel.INFO, logger); + const table = new Table({ + head: ['Order','Package', 'Version'], + chars: ZERO_BORDER_TABLE, + style: { 'padding-left': 3 }, + }); + let order=1; + for (const dependency of dependencies) { + let versionNumber = 'N/A'; + + if (!dependency.versionNumber) + versionNumber = projectConfig.packageAliases[dependency.package] + ? projectConfig.packageAliases[dependency.package] + : 'N/A'; + else versionNumber = dependency.versionNumber; + + const row = [order,dependency.package, versionNumber]; + table.push(row); + order++; + } + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } + } +} diff --git a/packages/sfp-cli/src/core/display/PackageMetadataPrinter.ts b/packages/sfp-cli/src/core/display/PackageMetadataPrinter.ts new file mode 100644 index 000000000..7703c9cc2 --- /dev/null +++ b/packages/sfp-cli/src/core/display/PackageMetadataPrinter.ts @@ -0,0 +1,38 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PackageMetadataPrinter { + public static printMetadataToDeploy(payload: any, logger: Logger) { + //If Manifest is null, just return + if (payload === null || payload === undefined) return; + + let table = new Table({ + head: ['Metadata Type', 'API Name'], + chars: ZERO_BORDER_TABLE + }); + + let pushTypeMembersIntoTable = (type) => { + if (type['members'] instanceof Array) { + for (let member of type['members']) { + let item = [type.name, member]; + table.push(item); + } + } else { + let item = [type.name, type.members]; + table.push(item); + } + }; + + if (payload['Package']['types'] instanceof Array) { + for (let type of payload['Package']['types']) { + pushTypeMembersIntoTable(type); + } + } else { + let type = payload['Package']['types']; + pushTypeMembersIntoTable(type); + } + SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); + } +} diff --git a/packages/sfp-cli/src/core/display/PushErrorDisplayer.ts b/packages/sfp-cli/src/core/display/PushErrorDisplayer.ts new file mode 100644 index 000000000..3cfc6cf16 --- /dev/null +++ b/packages/sfp-cli/src/core/display/PushErrorDisplayer.ts @@ -0,0 +1,75 @@ +const Table = require('cli-table'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from './TableConstants'; + +export default class PushErrorDisplayer { + public static printMetadataFailedToPush(error: any, packageLogger: Logger) { + if (error == null) return; + + let table; + let pushComponentFailureIntoTable; + if (error.name === 'sourceConflictDetected') { + table = new Table({ + head: ['State', 'API Name', 'Metadata Type', 'File Path'], + chars: ZERO_BORDER_TABLE + }); + + pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.state, + componentFailure.fullName, + componentFailure.type, + componentFailure.filePath, + ]; + + // Replace "undefined" values with "NA". cli-table breaks for undefined cells + item.forEach((elem, idx, item) => { + if (elem === undefined) { + item[idx] = 'NA'; + } + }); + + table.push(item); + }; + } else if (error.name === 'DeployFailed') { + table = new Table({ + head: ['Metadata Type', 'API Name', 'Problem Type', 'FilePath','Problem'], + }); + + pushComponentFailureIntoTable = (componentFailure) => { + let item = [ + componentFailure.type, + componentFailure.fullName, + componentFailure.problemType, + componentFailure.error, + componentFailure.filePath, + ]; + + // Replace "undefined" values with "NA". cli-table breaks for undefined cells + item.forEach((elem, idx, item) => { + if (elem === undefined) { + item[idx] = 'NA'; + } + }); + + table.push(item); + }; + } else { + SFPLogger.log('Unknown error type. Failed to print table.', LoggerLevel.ERROR, packageLogger); + return; + } + + if (error.data instanceof Array) { + for (let componentFailure of error.data) { + pushComponentFailureIntoTable(componentFailure); + } + } else { + let failure = error.data; + pushComponentFailureIntoTable(failure); + } + + SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, packageLogger); + + SFPLogger.log(table.toString(), LoggerLevel.ERROR, packageLogger); + } +} diff --git a/packages/sfp-cli/src/core/display/TableConstants.ts b/packages/sfp-cli/src/core/display/TableConstants.ts new file mode 100644 index 000000000..4caeefcdc --- /dev/null +++ b/packages/sfp-cli/src/core/display/TableConstants.ts @@ -0,0 +1,38 @@ + +export const ZERO_BORDER_TABLE = { + top: ' ', + 'top-mid': ' ', + 'top-left': ' ', + 'top-right': ' ', + bottom: ' ', + 'bottom-mid': ' ', + 'bottom-left': ' ', + 'bottom-right': ' ', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ' ', +}; + + + +export const COLON_MIDDLE_BORDER_TABLE = { + top: '', + 'top-mid': '', + 'top-left': '', + 'top-right': '', + bottom: '', + 'bottom-mid': '', + 'bottom-left': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ':', +}; diff --git a/packages/sfp-cli/src/core/git/Git.ts b/packages/sfp-cli/src/core/git/Git.ts new file mode 100644 index 000000000..97089b71f --- /dev/null +++ b/packages/sfp-cli/src/core/git/Git.ts @@ -0,0 +1,246 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import simplegit, { SimpleGit } from 'simple-git'; +import fs = require('fs-extra'); +import GitIdentity from './GitIdentity'; +const tmp = require('tmp'); + +//Git Abstraction +export default class Git { + private _git: SimpleGit; + private repositoryLocation: string; + private tempRepoLocation: any; + private _isATemporaryRepo: boolean = false; + + private constructor(private projectDir?: string, private logger?: Logger) { + if (this.projectDir) { + this._git = simplegit(this.projectDir); + this.repositoryLocation = this.projectDir; + } else { + this._git = simplegit(); + this.repositoryLocation = process.cwd(); + } + } + + async fetch() { + return this._git.fetch('origin'); + } + + async getHeadCommit(): Promise { + return this._git.revparse(['HEAD']); + } + + async show(options: string[]): Promise { + return this._git.show(options); + } + + async tag(options: string[]): Promise { + let tagResult = await this._git.tag(options); + + let temp: string[] = tagResult.split('\n'); + temp.pop(); + + return temp; + } + + async diff(options: string[]): Promise { + let diffResult = await this._git.diff(options); + + let temp: string[] = diffResult.split('\n'); + temp.pop(); + + return temp; + } + + async log(options: string[]): Promise { + let gitLogResult = await this._git.log(options); + + return gitLogResult['all'][0]['hash'].split('\n'); + } + + public async getRemoteOriginUrl(overrideOriginURL?: string): Promise { + let remoteOriginURL; + if (!overrideOriginURL) { + remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; + if (!remoteOriginURL) { + remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; + } + SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG); + } else remoteOriginURL = overrideOriginURL; + + if (!remoteOriginURL) throw new Error('Remote origin must be set in repository'); + + return remoteOriginURL; + } + + public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) { + try { + await new GitIdentity(this._git).setUsernameAndEmail(); + await this._git.add(pathToFiles); + await this._git.commit(message); + SFPLogger.log(`Committed File ${pathToFiles}`); + } catch (error) { + SFPLogger.log( + `Unable to commit file, probably due to no change or something else,Please try manually`, + LoggerLevel.ERROR + ); + throw error; + } + } + + async pushTags(tags?: string[]) { + if (!tags) await this._git.pushTags(); + else { + for (let tag of tags) { + await this._git.push('origin', tag); + } + } + } + + async deleteTags(tags?: string[]) { + if (tags) await this._git.push('origin', '--delete', tags); + } + + async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) { + try { + await new GitIdentity(this._git).setUsernameAndEmail(); + if (!commitId) { + await this._git.addAnnotatedTag(tagName, annotation); + } else { + const commands = ['tag', tagName, commitId, '-m', annotation]; + await this._git.raw(commands); + } + } catch (error) { + SFPLogger.log( + `Unable to commit file, probably due to no change or something else,Please try manually`, + LoggerLevel.ERROR + ); + throw error; + } + } + + public async isBranchExists(branch: string): Promise { + const listOfBranches = await this._git.branch(['-la']); + + return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false; + } + + static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise { + let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true }); + + SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger); + let repoDir = locationOfCopiedDirectory.name; + + // Copy source directory to temp dir + fs.copySync(process.cwd(), repoDir); + + //Initiate git on new repo on using the abstracted object + let git = new Git(repoDir, logger); + git._isATemporaryRepo = true; + git.tempRepoLocation = locationOfCopiedDirectory; + + await git.addSafeConfig(repoDir); + await git.getRemoteOriginUrl(); + await git.fetch(); + if (branch) { + await git.createBranch(branch); + } + if (commitRef) { + await git.checkout(commitRef, true); + } + + SFPLogger.log( + `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`, + LoggerLevel.INFO, + logger + ); + return git; + } + + static async initiateRepo(logger?: Logger, projectDir?: string) { + let git = new Git(projectDir, logger); + if (projectDir) await git.addSafeConfig(projectDir); + else { + await git.addSafeConfig(process.cwd()); + } + await git.getRemoteOriginUrl(); + return git; + } + + public getRepositoryPath() { + return this.repositoryLocation; + } + + async deleteTempoRepoIfAny() { + if (this.tempRepoLocation) this.tempRepoLocation.removeCallback(); + } + + async addSafeConfig(repoDir: string) { + try + { + //add workaround for safe directory (https://github.com/actions/runner/issues/2033) + await this._git.addConfig('safe.directory', repoDir, false, 'global'); + }catch(error) + { + //ignore error + SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE) + } + } + + async pushToRemote(branch: string, isForce: boolean) { + if (!branch) branch = (await this._git.branch()).current; + SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger); + if (process.env.sfp_OVERRIDE_ORIGIN_URL) { + await this._git.removeRemote('origin'); + await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL); + } + + if (isForce) { + await this._git.push('origin', branch, [`--force`]); + } else { + await this._git.push('origin', branch); + } + } + + isATemporaryRepo(): boolean { + return this._isATemporaryRepo; + } + + async getCurrentCommitId() { + return this._git.revparse(['HEAD']); + } + + async checkout(commitRef: string, isForce?: boolean) { + if (isForce) { + return this._git.checkout(commitRef, [`--force`]); + } else return this._git.checkout(commitRef, {}); + } + + async checkoutPath(commitRef: string, path: string, isForce?: boolean) { + if (isForce) { + return this._git.checkout(commitRef, [path, `--force`]); + } else return this._git.checkout(commitRef, [path]); + } + + async stageChangedFiles(path: string): Promise { + try { + await this._git.add(path); + return true; + } catch (error) { + SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger); + return false; + } + } + async createBranch(branch: string) { + if (await this.isBranchExists(branch)) { + await this._git.checkout(branch, ['-f']); + try { + // For ease-of-use when running locally and local branch exists + await this._git.merge([`refs/remotes/origin/${branch}`]); + } catch (error) { + SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger); + } + } else { + await this._git.checkout(['-b', branch]); + } + } +} diff --git a/packages/sfp-cli/src/core/git/GitDiffUtil.ts b/packages/sfp-cli/src/core/git/GitDiffUtil.ts new file mode 100644 index 000000000..ce904bf9b --- /dev/null +++ b/packages/sfp-cli/src/core/git/GitDiffUtil.ts @@ -0,0 +1,175 @@ +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as _ from 'lodash'; + +import { LoggerLevel } from '@salesforce/core'; +import simplegit, { SimpleGit } from 'simple-git'; +import SFPLogger, { Logger } from '@flxblio/sfp-logger'; +const SEP = /\/|\\/; + +export interface DiffFileStatus { + revisionFrom: string; + revisionTo: string; + path: string; + renamedPath?: string; +} + +export interface DiffFile { + deleted: DiffFileStatus[]; + addedEdited: DiffFileStatus[]; +} + +const git: SimpleGit = simplegit(); + +export default class GitDiffUtils { + private gitTreeRevisionTo: { + revision: string; + path: string; + }[]; + + public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise { + let fileAsString = await git.show(['--raw', diffFile.revisionFrom]); + let result = fileAsString.includes(content); + return result; + } + + public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) { + SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger); + this.gitTreeRevisionTo = []; + let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]); + const sepRegex = /\n|\r/; + let lines = revisionTree.split(sepRegex); + for (let i = 0; i < lines.length; i++) { + if (lines[i] === '') continue; + let fields = lines[i].split(/\t/); + let pathStr = fields[1]; + let revisionSha = fields[0].split(/\s/)[2]; + let fileMetadata = { + revision: revisionSha, + path: path.join('.', pathStr), + }; + this.gitTreeRevisionTo.push(fileMetadata); + } + return this.gitTreeRevisionTo; + } + + public async copyFile(filePath: string, outputFolder: string, logger: Logger) { + SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); + if (fs.existsSync(path.join(outputFolder, filePath))) { + SFPLogger.log(`File ${filePath} already in output folder. `, LoggerLevel.TRACE, logger); + return; + } + + let gitFiles: { + revision: string; + path: string; + }[] = []; + this.gitTreeRevisionTo.forEach((file) => { + if (file.path === filePath) { + gitFiles.push(file); + } + }); + + if(gitFiles.length==0) + throw new Error(`Unable to find the required file ${filePath} in Git.., Did you really commit the file?`) + + let copyOutputFolder = outputFolder; + for (let i = 0; i < gitFiles.length; i++) { + outputFolder = copyOutputFolder; + let gitFile = gitFiles[i]; + + SFPLogger.log( + `Associated file ${i}: ${gitFile.path} Revision: ${gitFile.revision}`, + LoggerLevel.TRACE, + logger + ); + + let outputPath = path.join(outputFolder, gitFile.path); + + let filePathParts = gitFile.path.split(SEP); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + // Create folder structure + for (let i = 0; i < filePathParts.length - 1; i++) { + let folder = filePathParts[i].replace('"', ''); + outputFolder = path.join(outputFolder, folder); + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + let fileContent = await git.binaryCatFile(['-p', gitFile.revision]); + fs.writeFileSync(outputPath, fileContent); + } + } + + public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) { + SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); + if (fs.existsSync(path.join(outputFolder, folderPath))) { + SFPLogger.log(`Folder ${folderPath} already in output folder. `, LoggerLevel.TRACE, logger); + return; + } + + this.gitTreeRevisionTo.forEach((file) => { + let fileToCompare = file.path; + if (fileToCompare.startsWith(folderPath)) { + this.copyFile(fileToCompare, outputFolder, logger); + } + }); + } + + public getChangedOrAdded(list1: any[], list2: any[], key: string) { + let result: any = { + addedEdited: [], + deleted: [], + }; + + //Ensure array + if (!_.isNil(list1) && !Array.isArray(list1)) { + list1 = [list1]; + } + if (!_.isNil(list2) && !Array.isArray(list2)) { + list2 = [list2]; + } + + if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) { + result.addedEdited.push(...list2); + } + + if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) { + result.deleted.push(...list1); + } + + if (!_.isNil(list1) && !_.isNil(list2)) { + list1.forEach((elem1) => { + let found = false; + for (let i = 0; i < list2.length; i++) { + let elem2 = list2[i]; + if (elem1[key] === elem2[key]) { + //check if edited + if (!_.isEqual(elem1, elem2)) { + result.addedEdited.push(elem2); + } + found = true; + break; + } + } + if (!found) { + result.deleted.push(elem1); + } + }); + + //Check for added elements + + let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) { + return element1[key] === element2[key]; + }); + + if (!_.isNil(addedElement)) { + result.addedEdited.push(...addedElement); + } + } + return result; + } +} diff --git a/packages/sfp-cli/src/core/git/GitIdentity.ts b/packages/sfp-cli/src/core/git/GitIdentity.ts new file mode 100644 index 000000000..ecc806d82 --- /dev/null +++ b/packages/sfp-cli/src/core/git/GitIdentity.ts @@ -0,0 +1,34 @@ +import { SimpleGit } from 'simple-git/promise'; + +export default class GitIdentity { + constructor(private git: SimpleGit) {} + + async setUsernameAndEmail(): Promise { + await this.setUsername(); + await this.setEmail(); + } + + private async setUsername(): Promise { + let username: string; + + if (process.env.sfp_GIT_USERNAME) { + username = process.env.sfp_GIT_USERNAME; + } else { + username = 'sfp'; + } + + await this.git.addConfig('user.name', username); + } + + private async setEmail(): Promise { + let email: string; + + if (process.env.sfp_GIT_EMAIL) { + email = process.env.sfp_GIT_EMAIL; + } else { + email = 'sfp@flxblio.io'; + } + + await this.git.addConfig('user.email', email); + } +} diff --git a/packages/sfp-cli/src/core/git/GitTags.ts b/packages/sfp-cli/src/core/git/GitTags.ts new file mode 100644 index 000000000..846585451 --- /dev/null +++ b/packages/sfp-cli/src/core/git/GitTags.ts @@ -0,0 +1,151 @@ +import Git from './Git'; +import child_process = require('child_process'); + +export default class GitTags { + constructor(private git: Git, private sfdx_package: string) {} + + /*** + * Returns list of sorted tags, belonging to package, that are reachable from HEAD and + * follow the first parent on merge commits. + * If there are no tags, returns empty array + * @param sfdx_package + */ + async listTagsOnBranch(): Promise { + let tags: string[] = await this.git.tag([ + `-l`, + `${this.sfdx_package}_v*`, + `--sort=creatordate`, + `--merged`, + ]); + + if (tags.length > 0) return this.filterTagsAgainstBranch(tags); + else return tags; + } + + private async filterTagsAgainstBranch(tags: string[]): Promise { + // Get full-length commit ID's on the current branch, following the first parent on merge commits + let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]); + + // Get the tags' associated commit ID + // Dereference (-d) tags into object IDs + //TODO: Remove this direct usage + let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, { + maxBuffer: 5 * 1024 * 1024, + stdio: 'pipe', + cwd: this.git.getRepositoryPath() + }); + + let gitShowRefTags = gitShowRefTagsBuffer.toString(); + + let refTags: string[] = gitShowRefTags.split('\n'); + refTags.pop(); // Remove last empty element + + // Filter ref tags, only including tags that point to the branch + // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log + let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40))); + + // Only match the name of the tags pointing to the branch + refTagsPointingToBranch = refTagsPointingToBranch.map( + (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1] + ); + + // Filter the sorted tags - only including tags that point to the branch + let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag)); + + return tagsPointingToBranch; + } + + public async getVersionFromLatestTag(): Promise { + let version: string; + + let tags = await this.listTagsOnBranch(); + let latestTag = tags.pop(); + if (latestTag) { + let match: RegExpMatchArray = latestTag.match( + /^.*_v(?[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/ + ); + if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version); + else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`); + } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`); + + return version; + } + + private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { + let segments = packageVersionNumber.split('.'); + //Strip ALIGN + if (segments.length == 4 && segments[3].includes('ALIGN')) { + segments[3] = segments[3].substring(0, segments[3].indexOf('-')); + } + + if (segments.length === 4) { + packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { + if (segmentsIdx === 3) return version + '-' + segment; + else return version + '.' + segment; + }); + } + + return packageVersionNumber; + } + + + public async limitTags(limit: number): Promise{ + let rawTags = await this.listTagsOnBranch(); + + if (rawTags.length <= limit) { + return []; + } + + const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1); + return tags; + } + + + public async filteredOldTags(daysToKeep: number, limit?: number): Promise { + const currentTimestamp = Math.floor(Date.now() / 1000); + + let rawTags: string[]; + if (limit) { + rawTags = await this.limitTags(limit); + } else { + rawTags = await this.listTagsOnBranch(); + } + + if (rawTags.length < 0) { + return []; + } + + let tags: string[] = await this.getTagsWithTimestamps(rawTags); + + const filteredTags = tags + .map(tagStr => { + const [name, timestampStr] = tagStr.split(' '); + const timestamp = parseInt(timestampStr, 10); + return { name, timestamp }; + }) + .filter(tag => { + const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400; + return tag.name && daysSinceTag > daysToKeep; + }); + + return filteredTags.map(tag => tag.name); + } + + private async getTagsWithTimestamps(tags: string[]): Promise { + const timestampPromises: Promise[] = []; + + // Create an array of promises that will get the tagger date for each tag + tags.forEach((tag: string) => { + timestampPromises.push( + this.git.log(['--format=%at', `refs/tags/${tag}`]) + .then((output: string[]) => parseInt(output[0].trim(), 10)) + ); + }); + + // Wait for all promises to resolve and format the output + const timestamps: number[] = await Promise.all(timestampPromises); + const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`); + return tagsWithTimestamp + } + +} diff --git a/packages/sfp-cli/src/core/ignore/IgnoreFiles.ts b/packages/sfp-cli/src/core/ignore/IgnoreFiles.ts new file mode 100644 index 000000000..9a48420f9 --- /dev/null +++ b/packages/sfp-cli/src/core/ignore/IgnoreFiles.ts @@ -0,0 +1,13 @@ +import ignore, { Ignore } from 'ignore'; + +export default class IgnoreFiles { + private _ignore: Ignore; + + constructor(pattern: string) { + this._ignore = ignore().add(pattern); + } + + filter(pathnames: string[]): string[] { + return this._ignore.filter(pathnames); + } +} diff --git a/packages/sfp-cli/src/core/limits/LimitsFetcher.ts b/packages/sfp-cli/src/core/limits/LimitsFetcher.ts new file mode 100644 index 000000000..da4e69186 --- /dev/null +++ b/packages/sfp-cli/src/core/limits/LimitsFetcher.ts @@ -0,0 +1,30 @@ +import { Connection } from '@salesforce/core'; +const retry = require('async-retry'); + +export default class LimitsFetcher { + constructor(private conn: Connection) {} + + public async getApiLimits() { + const limits: { name: string; max: number; remaining: number }[] = []; + const endpoint = `${this.conn.instanceUrl}/services/data/v${this.conn.version}/limits`; + + const result = await retry( + async (bail) => { + return this.conn.request<{ + [p: string]: { Max: number; Remaining: number }; + }>(endpoint); + }, + { retries: 3, minTimeout: 2000 } + ); + + Object.keys(result).forEach((limitName) => { + limits.push({ + name: limitName, + max: result[limitName].Max, + remaining: result[limitName].Remaining, + }); + }); + + return limits; + } +} diff --git a/packages/sfp-cli/src/core/metadata/CustomFieldFetcher.ts b/packages/sfp-cli/src/core/metadata/CustomFieldFetcher.ts new file mode 100644 index 000000000..063dbbbd3 --- /dev/null +++ b/packages/sfp-cli/src/core/metadata/CustomFieldFetcher.ts @@ -0,0 +1,45 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +const fs = require('fs-extra'); +import { XMLParser } from 'fast-xml-parser'; +import MetadataFetcher from './MetadataFetcher'; +import { + ComponentSet, + MetadataConverter, + MetadataResolver, + ZipTreeContainer, +} from '@salesforce/source-deploy-retrieve'; +import path from 'path'; +import { makeRandomId } from '../utils/RandomId'; + +export default class CustomFieldFetcher extends MetadataFetcher { + constructor(logger: Logger) { + super(logger); + } + + public async getCustomFields(org: SFPOrg, fields: string[]) { + SFPLogger.log(`Fetching Custom Fields from Org`, LoggerLevel.INFO, this.logger); + let retriveLocation = await this.fetchPackageFromOrg(org, { + types: { name: 'CustomField', members: fields.length > 1 ? fields : fields[0] }, + }); + + const zipTree = await ZipTreeContainer.create(fs.readFileSync(retriveLocation.zipLocation)); + const zipResolver = new MetadataResolver(undefined, zipTree); + const zipComponents = zipResolver.getComponentsFromPath('.'); + let packageName = makeRandomId(6); + await new MetadataConverter().convert(zipComponents, 'source', { + type: 'directory', + outputDirectory: path.join(retriveLocation.unzippedLocation, 'source'), + packageName: packageName + }); + + //Write a force ignore file as its required for component set resolution + fs.writeFileSync(path.resolve(retriveLocation.unzippedLocation, 'source', '.forceignore'), '# .forceignore v2'); + + let sourceBackedComponents = ComponentSet.fromSource(path.resolve(retriveLocation.unzippedLocation, 'source')); + + return {components:sourceBackedComponents,location:path.join(retriveLocation.unzippedLocation, 'source',packageName)} + } + + +} diff --git a/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts b/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts new file mode 100644 index 000000000..ef41f6061 --- /dev/null +++ b/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts @@ -0,0 +1,71 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +import { delay } from '../utils/Delay'; +const fs = require('fs-extra'); +import AdmZip = require('adm-zip'); +import { Connection } from '@salesforce/core'; +import { RetrieveResult } from 'jsforce/lib/api/metadata'; +import { makeRandomId } from '../utils/RandomId'; + +export default class MetadataFetcher { + constructor(protected logger: Logger) {} + + + protected async fetchPackageFromOrg(org: SFPOrg, members: any) { + let connection = org.getConnection(); + const apiversion = await org.getConnection().retrieveMaxApiVersion(); + + let retrieveRequest = { + apiVersion: Number(apiversion), + }; + + retrieveRequest['singlePackage'] = true; + retrieveRequest['unpackaged'] = members; + connection.metadata.pollTimeout = 60; + let retrievedId = await connection.metadata.retrieve(retrieveRequest); + SFPLogger.log(`Fetching metadata from ${connection.getUsername()}`, LoggerLevel.DEBUG, this.logger); + + let metadata_retrieve_result = await this.checkRetrievalStatus(connection, retrievedId.id); + if (!metadata_retrieve_result.zipFile) + SFPLogger.log('Unable to find the requested metadata', LoggerLevel.ERROR, this.logger); + + let retriveLocation = `.sfp/retrieved/${retrievedId.id}`; + //Extract Security + let zipFileName = `${retriveLocation}/unpackaged_${makeRandomId(8)}.zip`; + fs.mkdirpSync(retriveLocation); + fs.writeFileSync(zipFileName, metadata_retrieve_result.zipFile, { + encoding: 'base64', + }); + this.extract(retriveLocation, zipFileName); + // fs.unlinkSync(zipFileName); + return {zipLocation:zipFileName,unzippedLocation:retriveLocation}; + } + + private async checkRetrievalStatus( + conn: Connection, + retrievedId: string, + isToBeLoggedToConsole: boolean = true + ): Promise { + let metadata_result:RetrieveResult; + + while (true) { + metadata_result = await conn.metadata.checkRetrieveStatus(retrievedId); + + if (metadata_result.done === false) { + if (isToBeLoggedToConsole) SFPLogger.log(`Polling for Retrieval Status`, LoggerLevel.INFO, this.logger); + await delay(5000); + } else { + //this.ux.logJson(metadata_result); + break; + } + } + return metadata_result; + } + + + private extract(unzippedDirectory: string, zipFile: string) { + let zip = new AdmZip(zipFile); + // Overwrite existing files + zip.extractAllTo(unzippedDirectory, true); + } +} diff --git a/packages/sfp-cli/src/core/metadata/MetadataFiles.ts b/packages/sfp-cli/src/core/metadata/MetadataFiles.ts new file mode 100644 index 000000000..cffbea0d6 --- /dev/null +++ b/packages/sfp-cli/src/core/metadata/MetadataFiles.ts @@ -0,0 +1,343 @@ +//TODO: Replace with SDR +import * as path from 'path'; +import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo'; +import FileUtils from '../utils/Fileutils'; +import * as _ from 'lodash'; +import ignore from 'ignore'; +import * as fs from 'fs-extra'; +import ProjectConfig from '../project/ProjectConfig'; +import { globSync } from 'glob'; + +const SEP = /\/|\\/; + +export default class MetadataFiles { + public static sourceOnly: boolean = false; + forceignore: any; + public constructor() { + if (fs.existsSync('.forceignore')) { + this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString()); + } else { + this.forceignore = ignore(); + } + } + static getFullApiName(fileName: string): string { + let fullName = ''; + let metadateType = MetadataInfo.getMetadataName(fileName); + let splitFilepath = fileName.split(SEP); + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); + if (isObjectChild) { + let objectName = splitFilepath[splitFilepath.length - 3]; + let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0]; + fullName = objectName.concat('.' + fieldName); + } else { + fullName = splitFilepath[splitFilepath.length - 1].split('.')[0]; + } + return fullName; + } + static getFullApiNameWithExtension(fileName: string): string { + let fullName = ''; + let metadateType = MetadataInfo.getMetadataName(fileName); + let splitFilepath = fileName.split(SEP); + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); + if (isObjectChild) { + let objectName = splitFilepath[splitFilepath.length - 3]; + let fieldName = splitFilepath[splitFilepath.length - 1]; + fullName = objectName.concat('.' + fieldName); + } else { + fullName = splitFilepath[splitFilepath.length - 1]; + } + return fullName; + } + + public static isCustomMetadata(filepath: string, name: string): boolean { + let result = true; + let splitFilepath = filepath.split(SEP); + let componentName = splitFilepath[splitFilepath.length - 1]; + componentName = componentName.substring(0, componentName.indexOf('.')); + if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) { + //Custom Field or Custom Object + result = componentName.endsWith('__c') || componentName.endsWith('__mdt'); + } + return result; + } + public static getMemberNameFromFilepath(filepath: string, name: string): string { + let member: string; + let splitFilepath = filepath.split(SEP); + let lastIndex = splitFilepath.length - 1; + let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name); + let metadataDescribe: MetadataDescribe = METADATA_INFO[name]; + if (isObjectChild) { + let objectName = splitFilepath[lastIndex - 2]; + let fieldName = splitFilepath[lastIndex].split('.')[0]; + member = objectName.concat('.' + fieldName); + } else if (metadataDescribe.inFolder) { + let baseName = metadataDescribe.directoryName; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + cmpPath = cmpPath.substring(0, cmpPath.indexOf('.')); + member = cmpPath.replace(SEP, '/'); + } else { + if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) { + member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, ''); + } else { + const auraRegExp = new RegExp('aura'); + const lwcRegExp = new RegExp('lwc'); + const staticResourceRegExp = new RegExp('staticresources'); + const experienceBundleRegExp = new RegExp('experiences'); + if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) { + member = splitFilepath[lastIndex - 1]; + } else if (staticResourceRegExp.test(filepath)) { + //Return the fileName + let baseName = 'staticresources'; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + member = cmpPath.split(SEP)[0]; + let extension = path.parse(member).ext; + + member = member.replace(new RegExp(extension + '$'), ''); + } else if (experienceBundleRegExp.test(filepath)) { + //Return the fileName + let baseName = 'experiences'; + let baseIndex = filepath.indexOf(baseName) + baseName.length; + let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator + member = cmpPath.split(SEP)[0]; + let extension = path.parse(member).ext; + + member = member.replace(new RegExp(extension + '$'), ''); + } else { + let extension = path.parse(splitFilepath[lastIndex]).ext; + member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), ''); + } + } + } + return member; + } + + public loadComponents(srcFolder: string, checkIgnore = true): void { + var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder); + let keys = Object.keys(METADATA_INFO); + if (Array.isArray(metadataFiles) && metadataFiles.length > 0) { + metadataFiles.forEach((metadataFile) => { + let found = false; + + for (let i = 0; i < keys.length; i++) { + let match = false; + if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) { + match = true; + } else if ( + METADATA_INFO[keys[i]].inFolder && + metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension) + ) { + match = true; + } + if (match) { + if (_.isNil(METADATA_INFO[keys[i]].files)) { + METADATA_INFO[keys[i]].files = []; + METADATA_INFO[keys[i]].components = []; + } + if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { + METADATA_INFO[keys[i]].files.push(metadataFile); + + let name = FileUtils.getFileNameWithoutExtension( + metadataFile, + METADATA_INFO[keys[i]].sourceExtension + ); + + if (METADATA_INFO[keys[i]].isChildComponent) { + let fileParts = metadataFile.split(SEP); + let parentName = fileParts[fileParts.length - 3]; + name = parentName + '.' + name; + } + + METADATA_INFO[keys[i]].components.push(name); + } + found = true; + break; + } + } + + if (!found) { + const auraRegExp = new RegExp('aura'); + if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) { + if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) { + METADATA_INFO.AuraDefinitionBundle.files = []; + METADATA_INFO.AuraDefinitionBundle.components = []; + } + if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { + METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile); + + let name = FileUtils.getFileNameWithoutExtension(metadataFile); + METADATA_INFO.AuraDefinitionBundle.components.push(name); + } + } + } + }); + } else { + keys.forEach((key) => { + if (_.isNil(METADATA_INFO[key].files)) { + METADATA_INFO[key].files = []; + METADATA_INFO[key].components = []; + } + }); + } + } + //Check if a component is accepted by forceignore. + public accepts(filePath: string) { + return !this.forceignore.ignores(path.relative(process.cwd(), filePath)); + } + + public async isInModuleFolder(filePath: string) { + const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path); + if (!packageDirectories || packageDirectories.length == 0) { + return false; + } + const moduleFolder = packageDirectories.find((packageFolder) => { + let packageFolderNormalized = path.relative('', packageFolder); + return filePath.startsWith(packageFolderNormalized); + }); + return moduleFolder !== undefined; + } + + /** + * Copy a file to an outpu directory. If the filePath is a Metadata file Path, + * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls. + * Enforcing the .forceignore to ignire file ignored in the project. + * @param filePath + * @param outputFolder + */ + public static copyFile(filePath: string, outputFolder: string) { + console.log(`Copying file ${filePath} from file system to ${outputFolder}`); + const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json']; + const pairStatResources = METADATA_INFO.StaticResource.directoryName; + const pairStatResourcesRegExp = new RegExp(pairStatResources); + const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName); + + let copyOutputFolder = outputFolder; + + if (!fs.existsSync(filePath)) { + return; + } + + let exists = fs.existsSync(path.join(outputFolder, filePath)); + if (exists) { + return; + } + + if (filePath.startsWith('.')) { + let parts = path.parse(filePath); + if (parts.dir === '') { + fs.copyFileSync(filePath, path.join(outputFolder, filePath)); + return; + } + } + + let fileName = path.parse(filePath).base; + //exclude lwc ignored files + if (LWC_IGNORE_FILES.includes(fileName)) { + return; + } + + let filePathParts = filePath.split(SEP); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + // Create folder structure + for (let i = 0; i < filePathParts.length - 1; i++) { + let folder = filePathParts[i].replace('"', ''); + outputFolder = path.join(outputFolder, folder); + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + + // Copy all file with same base name + let associatedFilePattern = ''; + if (SOURCE_EXTENSION_REGEX.test(filePath)) { + associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*'); + } else { + let extension = path.parse(filePath).ext; + associatedFilePattern = filePath.replace(extension, '.*'); + } + let files = globSync(associatedFilePattern); + for (let i = 0; i < files.length; i++) { + if (fs.lstatSync(files[i]).isDirectory() == false) { + let oneFilePath = path.join('.', files[i]); + let oneFilePathParts = oneFilePath.split(SEP); + fileName = oneFilePathParts[oneFilePathParts.length - 1]; + let outputPath = path.join(outputFolder, fileName); + fs.copyFileSync(files[i], outputPath); + } + } + + // Hadle ObjectTranslations + // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied + if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) { + let parentFolder = filePathParts[filePathParts.length - 2]; + let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension; + let outputPath = path.join(outputFolder, objectTranslation); + let sourceFile = filePath.replace(fileName, objectTranslation); + if (fs.existsSync(sourceFile) == true) { + fs.copyFileSync(sourceFile, outputPath); + } + } + + //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED + if (pairStatResourcesRegExp.test(filePath)) { + outputFolder = path.join('.', copyOutputFolder); + let srcFolder = '.'; + let staticRecourceRoot = ''; + let resourceFile = ''; + for (let i = 0; i < filePathParts.length; i++) { + outputFolder = path.join(outputFolder, filePathParts[i]); + srcFolder = path.join(srcFolder, filePathParts[i]); + if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) { + let fileOrDirname = filePathParts[i + 1]; + let fileOrDirnameParts = fileOrDirname.split('.'); + srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); + outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); + resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension; + METADATA_INFO.StaticResource.sourceExtension; + staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension; + if (fs.existsSync(srcFolder)) { + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + break; + } + } + if (fs.existsSync(srcFolder)) { + FileUtils.copyRecursiveSync(srcFolder, outputFolder); + } + if (fs.existsSync(resourceFile)) { + fs.copyFileSync(resourceFile, staticRecourceRoot); + } + } + //FOR AURA components and LWC components + if (pairAuaraRegExp.test(filePath)) { + outputFolder = path.join('.', copyOutputFolder); + let srcFolder = '.'; + for (let i = 0; i < filePathParts.length; i++) { + outputFolder = path.join(outputFolder, filePathParts[i]); + srcFolder = path.join(srcFolder, filePathParts[i]); + if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') { + let fileOrDirname = filePathParts[i + 1]; + let fileOrDirnameParts = fileOrDirname.split('.'); + srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); + outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); + + if (fs.existsSync(srcFolder)) { + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + } + break; + } + } + if (fs.existsSync(srcFolder)) { + FileUtils.copyRecursiveSync(srcFolder, outputFolder); + } + } + } +} diff --git a/packages/sfp-cli/src/core/metadata/MetadataInfo.ts b/packages/sfp-cli/src/core/metadata/MetadataInfo.ts new file mode 100644 index 000000000..b3a888cce --- /dev/null +++ b/packages/sfp-cli/src/core/metadata/MetadataInfo.ts @@ -0,0 +1,214 @@ +//TODO: Replace with SDR +import * as _ from 'lodash'; +import * as path from 'path'; +import * as fs from 'fs-extra'; + +export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/; +const SPLITED_TYPES = { + CustomField: { + suffix: 'field', + folder: 'fields', + }, + BusinessProcess: { + suffix: 'businessProcess', + folder: 'businessProcesses', + }, + CompactLayout: { + suffix: 'compactLayout', + folder: 'compactLayouts', + }, + FieldSet: { + suffix: 'fieldSet', + folder: 'fieldSets', + }, + RecordType: { + suffix: 'recordType', + folder: 'recordTypes', + }, + ListView: { + suffix: 'listView', + folder: 'listViews', + }, + SharingReason: { + suffix: 'sharingReason', + folder: 'sharingReasons', + }, + ValidationRule: { + suffix: 'validationRule', + folder: 'validationRules', + }, + WebLink: { + suffix: 'webLink', + folder: 'webLinks', + }, +}; + +export interface MetadataDescribe { + directoryName?: string; + inFolder?: boolean; + metaFile?: boolean; + suffix?: string; + xmlName?: string; + sourceExtension?: string; + childXmlNames?: string[]; + folderExtension?: string; + files?: string[]; + components?: string[]; + isChildComponent?: boolean; +} + +export interface MetadataInfo { + CustomApplication?: MetadataDescribe; + ApexClass?: MetadataDescribe; + ApexPage?: MetadataDescribe; + CustomField?: MetadataDescribe; + CustomObject?: MetadataDescribe; + CustomPermission?: MetadataDescribe; + ExternalDataSource?: MetadataDescribe; + ExperienceBundle?: MetadataDescribe; + Flow?: MetadataDescribe; + RecordType?: MetadataDescribe; + ListView?: MetadataDescribe; + WebLink?: MetadataDescribe; + ValidationRule?: MetadataDescribe; + CompactLayout?: MetadataDescribe; + BujsinessProcess?: MetadataDescribe; + CustomTab?: MetadataDescribe; + Layout?: MetadataDescribe; + Profile?: MetadataDescribe; + Translations?: MetadataDescribe; + CustomLabel?: MetadataDescribe; + CustomLabels?: MetadataDescribe; + GlobalValueSet?: MetadataDescribe; + CustomMetadata?: MetadataDescribe; + Document?: MetadataDescribe; + Queue?: MetadataDescribe; + Group?: MetadataDescribe; + Role?: MetadataDescribe; + Report?: MetadataDescribe; + Dashboard?: MetadataDescribe; + EmailTemplate?: MetadataDescribe; + CustomSite?: MetadataDescribe; + PermissionSet?: MetadataDescribe; + StaticResource?: MetadataDescribe; + CustomObjectTranslation?: MetadataDescribe; + AuraDefinitionBundle?: MetadataDescribe; + Workflow?: MetadataDescribe; + SharingRules?: MetadataDescribe; + LightningComponentBundle?: MetadataDescribe; +} + +export class MetadataInfo { + static loadMetadataInfo(): MetadataInfo { + let metadataInfo: MetadataInfo = {}; + let resourcePath = path.join(__dirname, '..', '..', '..', 'resources', 'metadatainfo.json'); + const fileData = fs.readFileSync(resourcePath, 'utf8'); + let metadataInfoJSON = JSON.parse(fileData); + metadataInfoJSON.metadataObjects.forEach((metadata) => { + let metadataDescribe = metadata as MetadataDescribe; + if (_.isNil(metadata.suffix)) { + if (metadata.xmlName === 'AuraDefinitionBundle') { + metadata.suffix = 'cmp'; + metadataDescribe.suffix = 'cmp'; + } else if (metadata.xmlName == 'LightningComponentBundle') { + metadata.suffix = 'js'; + metadataDescribe.suffix = 'js'; + } + } + metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`; + if (metadata.inFolder) { + let folderExtensionPrefix = metadata.suffix; + if (_.isNil(metadata.suffix)) { + folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1); + } + metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`; + } + + //Generate Describe of cheildItems if exists + if (!_.isNil(metadata.childXmlNames)) { + metadata.childXmlNames.forEach((element) => { + let splitedElement = SPLITED_TYPES[element]; + if (!_.isNil(splitedElement)) { + let childDescribe: MetadataDescribe = {}; + childDescribe.directoryName = SPLITED_TYPES[element].folder; + childDescribe.suffix = SPLITED_TYPES[element].suffix; + childDescribe.xmlName = element; + childDescribe.inFolder = false; + childDescribe.metaFile = false; + childDescribe.isChildComponent = true; + childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`; + metadataInfo[childDescribe.xmlName] = childDescribe; + } + }); + } + metadataInfo[metadataDescribe.xmlName] = metadataDescribe; + }); + return metadataInfo; + } + + static getMetadataName(metadataFile: string, validateSourceExtension = true): string { + let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX); + let extension = ''; + if (matcher) { + extension = matcher[0]; + } else { + extension = path.parse(metadataFile).ext; + } + //SfPowerKit.ux.log(extension); + let metadataName = ''; + + const auraRegExp = new RegExp('aura'); + const lwcRegExp = new RegExp('lwc'); + const staticResourceRegExp = new RegExp('staticresources'); + const experienceBundleRegExp = new RegExp('experiences'); + const documentRegExp = new RegExp('documents'); + if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) { + metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName; + } else if ( + lwcRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.LightningComponentBundle.xmlName; + } else if ( + staticResourceRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.StaticResource.xmlName; + } else if ( + experienceBundleRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.ExperienceBundle.xmlName; + } else if ( + documentRegExp.test(metadataFile) && + (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) + ) { + metadataName = METADATA_INFO.Document.xmlName; + } else { + let keys = Object.keys(METADATA_INFO); + for (let i = 0; i < keys.length; i++) { + let metaDescribe = METADATA_INFO[keys[i]]; + if ( + metaDescribe.sourceExtension === extension || + ('.' + metaDescribe.suffix === extension && !validateSourceExtension) || + metaDescribe.folderExtension === extension + ) { + metadataName = metaDescribe.xmlName; + break; + } + } + } + return metadataName; + } +} + +export const METADATA_INFO = MetadataInfo.loadMetadataInfo(); +export const UNSPLITED_METADATA = [ + METADATA_INFO.Workflow, + METADATA_INFO.SharingRules, + METADATA_INFO.CustomLabels, + METADATA_INFO.Profile, + METADATA_INFO.PermissionSet, +]; + +export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet]; diff --git a/packages/sfp-cli/src/core/metadata/SettingsFetcher.ts b/packages/sfp-cli/src/core/metadata/SettingsFetcher.ts new file mode 100644 index 000000000..971717dbe --- /dev/null +++ b/packages/sfp-cli/src/core/metadata/SettingsFetcher.ts @@ -0,0 +1,22 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +const fs = require('fs-extra'); +import { XMLParser } from 'fast-xml-parser'; +import MetadataFetcher from './MetadataFetcher'; + +export default class SettingsFetcher extends MetadataFetcher { + constructor(logger: Logger) { + super(logger); + } + + public async getSetttingMetadata(org: SFPOrg, setting: string) { + SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger); + let retriveLocation = (await this.fetchPackageFromOrg(org, { + types: { name: 'Settings', members: setting }, + })).unzippedLocation; + let resultFile = `${retriveLocation}/settings/${setting}.settings`; + const parser = new XMLParser(); + let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`]; + return parsedSettings; + } +} diff --git a/packages/sfp-cli/src/core/org/OrgDetailsFetcher.ts b/packages/sfp-cli/src/core/org/OrgDetailsFetcher.ts new file mode 100644 index 000000000..7ded33399 --- /dev/null +++ b/packages/sfp-cli/src/core/org/OrgDetailsFetcher.ts @@ -0,0 +1,120 @@ +import extractDomainFromUrl from '../utils/extractDomainFromUrl'; +import { convertAliasToUsername } from '../utils/AliasList'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import ScratchOrgInfoFetcher from './ScratchOrgInfoFetcher'; +import OrganizationFetcher from './OrganizationFetcher'; +import { AuthInfo, Connection, Org, trimTo15 } from '@salesforce/core'; + +export default class OrgDetailsFetcher { + private static usernamesToOrgDetails: { [P: string]: OrgDetails } = {}; + + constructor(private username: string) {} + + public async getOrgDetails(): Promise { + //Convert alias to username + this.username = await convertAliasToUsername(this.username); + + if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) + return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; + + const authInfo = await AuthInfo.create({ username: this.username }); + + let authInfoFields = authInfo.getFields(); + + + let sfdxAuthUrl: string; + try { + sfdxAuthUrl = authInfo.getSfdxAuthUrl(); + } catch (error) { + SFPLogger.log(`Unable to get SFDX Auth URL: ${error.message}`, LoggerLevel.TRACE, null); + } + + const isScratchOrg = authInfoFields.devHubUsername; + let scratchOrgInfo = isScratchOrg + ? await this.getScratchOrgDetails(authInfoFields.orgId, authInfo) + : ({} as ScratchOrgDetails); + + const organization = await this.getOrganization(authInfo); + + OrgDetailsFetcher.usernamesToOrgDetails[this.username] = { + sfdxAuthUrl: sfdxAuthUrl, + instanceUrl: authInfoFields.instanceUrl, + ...authInfoFields, + ...scratchOrgInfo, + ...organization, + }; + + return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; + } + + public async getOrgDomainUrl(): Promise { + await this.getOrgDetails(); + + if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) { + let domain = extractDomainFromUrl(OrgDetailsFetcher.usernamesToOrgDetails[this.username].instanceUrl); + if (domain) return domain; + else return ''; + } else { + return ''; + } + } + + private async getScratchOrgDetails(orgId: string, authInfo: AuthInfo): Promise { + const hubOrg: Org = await ( + await Org.create({ + connection: await Connection.create({ + authInfo: authInfo, + }), + }) + ).getDevHubOrg(); + + let scratchOrgInfo = ( + await new ScratchOrgInfoFetcher(hubOrg).getScratchOrgInfoByOrgId([trimTo15(orgId)]) + )[0]; + + if (scratchOrgInfo) { + return { + isScratchOrg:true, + status: scratchOrgInfo.Status, + }; + } else { + throw new Error( + `No information for scratch org with ID ${trimTo15( + orgId + )} found in Dev Hub ${hubOrg.getUsername()}` + ); + } + } + + private async getOrganization(authInfo: AuthInfo) { + const connection = await Connection.create({ + authInfo: authInfo, + }); + + const results = await new OrganizationFetcher(connection).fetch(); + + if (results[0]) { + return { + isSandbox: results[0].IsSandbox, + organizationType: results[0].OrganizationType, + }; + } else { + throw new Error(`No Organization records found for ${connection.getUsername()}`); + } + } +} + +export interface OrgDetails extends ScratchOrgDetails, Organization { + sfdxAuthUrl: string; + instanceUrl:string; +} + +export interface ScratchOrgDetails { + isScratchOrg:boolean; + status: string; +} + +export interface Organization { + isSandbox: boolean; + organizationType: string; +} diff --git a/packages/sfp-cli/src/core/org/OrganizationFetcher.ts b/packages/sfp-cli/src/core/org/OrganizationFetcher.ts new file mode 100644 index 000000000..b453b9851 --- /dev/null +++ b/packages/sfp-cli/src/core/org/OrganizationFetcher.ts @@ -0,0 +1,12 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class OrganizationFetcher { + constructor(private conn: Connection) {} + + public fetch() { + const query = 'SELECT OrganizationType, IsSandbox FROM Organization LIMIT 1'; + + return QueryHelper.query<{ OrganizationType: string; IsSandbox: boolean }>(query, this.conn, false); + } +} diff --git a/packages/sfp-cli/src/core/org/SFPOrg.ts b/packages/sfp-cli/src/core/org/SFPOrg.ts new file mode 100644 index 000000000..d1fc38c18 --- /dev/null +++ b/packages/sfp-cli/src/core/org/SFPOrg.ts @@ -0,0 +1,271 @@ +import { Org } from '@salesforce/core'; +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2Detail from '../package/Package2Detail'; +import SfpPackage from '../package/SfpPackage'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { convertUsernameToAlias } from '../utils/AliasList'; +import ObjectCRUDHelper from '../utils/ObjectCRUDHelper'; +import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor'; + +export default class SFPOrg extends Org { + /** + * Get list of all artifacts in an org + */ + public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) { + let records=[] + try { + records = await QueryHelper.query( + `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`, + this.getConnection(), + false + ); + return records; + } catch (error) { + SFPLogger.log( + 'Unable to fetch any sfp artifacts in the org\n' + + '1. sfp package is not installed in the org\n' + + '2. The required prerequisite object is not deployed to this org\n', + LoggerLevel.WARN, + logger + ); + } + return records; + } + /** + * Check whether an artifact is installed in a Org + * @param {Logger} logger + * @param {SfpPackage} sfpPackage + */ + public async isArtifactInstalledInOrg( + logger: Logger, + sfpPackage: SfpPackage + ): Promise<{ isInstalled: boolean; versionNumber?: string }> { + let result: { isInstalled: boolean; versionNumber?: string } = { + isInstalled: false, + }; + try { + SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger); + result.isInstalled = false; + let installedArtifacts = await this.getInstalledArtifacts(); + let packageName = sfpPackage.packageName; + for (const artifact of installedArtifacts) { + if (artifact.Name === packageName) { + result.versionNumber = artifact.Version__c; + if (artifact.Version__c === sfpPackage.package_version_number) { + result.isInstalled = true; + return result; + } + } + } + } catch (error) { + SFPLogger.log( + 'Unable to fetch any sfp artifacts in the org\n' + + '1. sfp package is not installed in the org\n' + + '2. The required prerequisite object is not deployed to this org\n', + LoggerLevel.WARN, + logger + ); + } + return result; + } + /** + * Updates or Create information about an artifact in the org + * @param {Logger} logger + * @param {SfpPackage} sfpPackage + */ + public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise { + let artifactId = await this.getArtifactRecordId(sfpPackage); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Existing artifact record id for ${sfpPackage.packageName} in Org for ${ + sfpPackage.package_version_number + }: ${artifactId ? artifactId : 'N/A'}` + ), + LoggerLevel.INFO, + logger + ); + + let packageName = sfpPackage.package_name; + + if (artifactId == null) { + artifactId = await ObjectCRUDHelper.createRecord( + this.getConnection(), + 'sfpArtifact2__c', + { + Name: packageName, + Tag__c: sfpPackage.tag, + Version__c: sfpPackage.package_version_number, + CommitId__c: sfpPackage.sourceVersion, + } + ); + } else { + artifactId = await ObjectCRUDHelper.updateRecord( + this.getConnection(), + 'sfpArtifact2__c', + { + Id: artifactId, + Name: packageName, + Tag__c: sfpPackage.tag, + Version__c: sfpPackage.package_version_number, + CommitId__c: sfpPackage.sourceVersion, + } + ); + } + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${ + artifactId ? artifactId : '' + }` + ), + LoggerLevel.INFO, + logger + ); + return artifactId; + } + + private async getArtifactRecordId(sfpPackage: SfpPackage): Promise { + let installedArtifacts = await this.getInstalledArtifacts(); + + let packageName = sfpPackage.packageName; + for (const artifact of installedArtifacts) { + if (artifact.Name === packageName) { + return artifact.Id; + } + } + return null; + } + /** + * Retrieves all packages(recognized by Salesforce) installed in the org + */ + public async getAllInstalled2GPPackages(): Promise { + const installedPackages: Package2Detail[] = []; + + let records = await InstalledPackagesQueryExecutor.exec(this.getConnection()); + + records.forEach((record) => { + let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`; + + let packageDetails: Package2Detail = { + name: record.SubscriberPackage.Name, + package2Id: record.SubscriberPackageId, + namespacePrefix: record.SubscriberPackage.NamespacePrefix, + subscriberPackageVersionId: record.SubscriberPackageVersion.Id, + versionNumber: packageVersionNumber, + type: record.SubscriberPackageVersion.Package2ContainerOptions, + isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent, + }; + + installedPackages.push(packageDetails); + }); + + return installedPackages; + } + + /** + * Retrives all managed packages in the org + */ + public async getAllInstalledManagedPackages(): Promise { + const installedPackages = await this.getAllInstalled2GPPackages(); + return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed'); + } + /** + * List all the packages created in DevHub, will throw an error, if its not a DevHub + */ + public async listAllPackages() { + if (await this.determineIfDevHubOrg(true)) { + let records = await QueryHelper.query(packageQuery, this.getConnection(), true); + records.forEach((record) => { + record.IsOrgDependent = + record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No'; + }); + + return records; + } else throw new Error('Package Type Information can only be fetched from a DevHub'); + } + + public async getAlias(): Promise { + return await convertUsernameToAlias(this.getUsername()); + } + + /** + * Return all artifacts including sfp as well as external unlocked/managed + */ + public async getAllInstalledArtifacts():Promise { + let artifacts = await this.getInstalledArtifacts(`Name`); + let installedArtifacts: InstalledArtifact[]=[]; + let installed2GPPackages = await this.getAllInstalled2GPPackages(); + + artifacts.forEach((artifact) => { + let installedArtifact: InstalledArtifact = { + name: artifact.Name, + version: artifact.Version__c, + commitId:artifact.CommitId__c, + isInstalledBysfp: true, + }; + let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name); + if (packageFound) { + installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId; + if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`; + else installedArtifact.type = `Unlocked`; + } else { + installedArtifact.subscriberVersion = `N/A`; + installedArtifact.type = `Source/Data`; + } + installedArtifacts.push(installedArtifact); + }); + + installed2GPPackages.forEach((installed2GPPackage) => { + let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name); + if (!packageFound) { + let installedArtifact: InstalledArtifact = { + name: installed2GPPackage.name, + version: installed2GPPackage.versionNumber, + commitId: `N/A`, + }; + if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`; + else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`; + else installedArtifact.type = `Unlocked`; + + installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId; + installedArtifact.isInstalledBysfp = false; + installedArtifacts.push(installedArtifact); + } + }); + return installedArtifacts; + } +} + +const packageQuery = + 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' + + 'FROM Package2 ' + + 'WHERE IsDeprecated != true ' + + 'ORDER BY NamespacePrefix, Name'; + + +export interface InstalledArtifact { + name: string; + version: string; + commitId?: string; + subscriberVersion?: string; + type?: string; + isInstalledBysfp?: boolean; +} + +export interface sfpArtifact2__c { + Id?: string; + Name: string; + Tag__c: string; + Version__c: string; + CommitId__c: string; +} + +export interface PackageTypeInfo { + Id: string; + Name: string; + Description: string; + NamespacePrefix: string; + ContainerOptions: string; + IsOrgDependent: boolean | string; +} diff --git a/packages/sfp-cli/src/core/org/ScratchOrgInfoFetcher.ts b/packages/sfp-cli/src/core/org/ScratchOrgInfoFetcher.ts new file mode 100644 index 000000000..c238af473 --- /dev/null +++ b/packages/sfp-cli/src/core/org/ScratchOrgInfoFetcher.ts @@ -0,0 +1,30 @@ +import { Org, trimTo15 } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export default class ScratchOrgInfoFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgInfoByOrgId(orgId: string[]) { + const conn = this.hubOrg.getConnection(); + + let collection = orgId + .map((id) => { + return `'${trimTo15(id)}'`; + }) + .toString(); + + let query = ` + SELECT Id, ScratchOrg, Status + FROM ScratchOrgInfo + WHERE ScratchOrg IN (${collection}) + `; + + return QueryHelper.query(query, conn, false); + } +} + +export interface ScratchOrgInfo { + Id: string; + ScratchOrg: string; + Status: 'New' | 'Deleted' | 'Active' | 'Error'; +} diff --git a/packages/sfp-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts b/packages/sfp-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts new file mode 100644 index 000000000..2d124718c --- /dev/null +++ b/packages/sfp-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts @@ -0,0 +1,14 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; + +export default class InstalledPackagesQueryExecutor { + static async exec(conn: Connection) { + const installedPackagesQuery = + 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' + + 'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' + + 'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' + + 'ORDER BY SubscriberPackageId'; + + return QueryHelper.query(installedPackagesQuery, conn, true); + } +} diff --git a/packages/sfp-cli/src/core/package/Package2Detail.ts b/packages/sfp-cli/src/core/package/Package2Detail.ts new file mode 100644 index 000000000..55c55deed --- /dev/null +++ b/packages/sfp-cli/src/core/package/Package2Detail.ts @@ -0,0 +1,10 @@ +export default interface Package2Detail { + name: string; + package2Id?: string; + namespacePrefix?: string; + subscriberPackageVersionId?: string; + versionNumber?: string; + type?: string; + isOrgDependent?: boolean; + key?: string; +} diff --git a/packages/sfp-cli/src/core/package/SfpPackage.ts b/packages/sfp-cli/src/core/package/SfpPackage.ts new file mode 100644 index 000000000..9c4833062 --- /dev/null +++ b/packages/sfp-cli/src/core/package/SfpPackage.ts @@ -0,0 +1,143 @@ +import _ from 'lodash'; +import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; + +export type ApexClasses = Array; + +class PackageInfo { + id?: string; + package_name: string; + package_version_number?: string; + package_version_id?: string; + package_type?: string; + test_coverage?: number; + has_passed_coverage_check?: boolean; + repository_url?: string; + sourceVersion?: string; + branch?: string; + apextestsuite?: string; + isApexFound?: boolean; + assignPermSetsPreDeployment?: string[]; + assignPermSetsPostDeployment?: string[]; + apexTestClassses?: string[]; + isPickListsFound?: boolean; + isTriggerAllTests?: boolean; + isProfilesFound?: boolean; + isPermissionSetGroupFound?: boolean; + isPromoted?: boolean; + tag?: string; + isDependencyValidated?: boolean; + destructiveChanges?: any; + destructiveChangesPath?: string; + payload?: any; + metadataCount?: number; + sourceDir?: string; + dependencies?: any; + reconcileProfiles?: boolean; + isPayLoadContainTypesSupportedByProfiles?: boolean; + creation_details?: { creation_time?: number; timestamp?: number }; + deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[]; + apiVersion?: string; + postDeploymentScript?: string; + preDeploymentScript?: string; + apexClassWithOutTestClasses?: ApexClasses; + triggers?: ApexClasses; + configFilePath?: string; + packageDescriptor?: any; + commitSHAFrom?:string; + commitSHATo?:string; + packageDirectory?: string; + apexClassesSortedByTypes?: ApexSortedByType; + projectConfig?: any; + changelogFilePath?: string; +} + +export default class SfpPackage extends PackageInfo { + public projectDirectory: string; + public workingDirectory: string; + public mdapiDir: string; + public destructiveChangesPath: string; + public resolvedPackageDirectory: string; + + public version: string = '5'; + + //Just a few helpers to resolve api differene + public get packageName(): string { + return this.package_name; + } + + public get versionNumber(): string { + return this.package_version_number; + } + + public set versionNumber(versionNumber:string) + { + this.package_version_number = versionNumber; + } + + public get packageType(): string { + return this.package_type.toLocaleLowerCase(); + } + + public set packageType(packageType: string) { + this.package_type = packageType; + } + /** + * Do not use this constructor directly, use SfPPackageBuilder + * to build a package + * + */ + public constructor() { + super(); + } + + toJSON(): PackageInfo { + let castToPackageMetadata = _.cloneDeep(this); + delete castToPackageMetadata.workingDirectory; + delete castToPackageMetadata.mdapiDir; + delete castToPackageMetadata.projectConfig; + delete castToPackageMetadata.packageDescriptor; + delete castToPackageMetadata.projectDirectory; + delete castToPackageMetadata.resolvedPackageDirectory; + delete castToPackageMetadata.isTriggerAllTests; + return castToPackageMetadata; + } +} + + +export enum PackageType { + Unlocked = "unlocked", + Source = "source", + Data = "data", + Diff = "diff" +} + +export interface DiffPackageMetadata { + + + sourceVersionFrom?: string; + sourceVersionTo?: string; + isProfilesFound?: boolean; + apexTestClassses?: string[]; + isApexFound?: boolean; + isPicklistFound?: boolean; + isPermissionSetGroupFound?: boolean; + isPermissionSetFound?: boolean; + payload?: any; + metadataCount?: number; + profilesToReconcile?: number; + destructiveChanges?: any; + sourceDir?: string; + invalidatedTestClasses?: ApexClasses; + isPayLoadContainTypesSupportedByProfiles?:boolean; +} +export interface SfpPackageParams { + overridePackageTypeWith?: string; + branch?: string; + packageVersionNumber?: string; + repositoryUrl?: string; + sourceVersion?: string; + configFilePath?: string; + pathToReplacementForceIgnore?: string; + revisionFrom?: string; + revisionTo?: string; +} diff --git a/packages/sfp-cli/src/core/package/SfpPackageBuilder.ts b/packages/sfp-cli/src/core/package/SfpPackageBuilder.ts new file mode 100644 index 000000000..e394099a1 --- /dev/null +++ b/packages/sfp-cli/src/core/package/SfpPackageBuilder.ts @@ -0,0 +1,278 @@ +import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; +import ProjectConfig from '../project/ProjectConfig'; +import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator'; +import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor'; +import PackageManifest from './components/PackageManifest'; +import MetadataCount from './components/MetadataCount'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import path from 'path'; +import { Artifact } from '../artifacts/ArtifactFetcher'; +import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage'; +import PropertyFetcher from './propertyFetchers/PropertyFetcher'; +import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher'; +import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher'; +import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher'; +import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl'; +import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl'; +import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl'; +import lodash = require('lodash'); +import { EOL } from 'os'; +import PackageVersionUpdater from './version/PackageVersionUpdater'; +import { AnalyzerRegistry } from './analyser/AnalyzerRegistry'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; + +export default class SfpPackageBuilder { + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string, + params?: SfpPackageParams, + packageCreationParams?: PackageCreationParams, + projectConfig?: any + ) { + if (!projectConfig) { + projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + } else { + // Clone the projectConfig to prevent mutation + projectConfig = lodash.cloneDeep(projectConfig); + } + + let propertyFetchers: PropertyFetcher[] = [ + new AssignPermissionSetFetcher(), + new DestructiveManifestPathFetcher(), + new ReconcilePropertyFetcher(), + ]; + + let startTime = Date.now; + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.package_name = sfdx_package; + sfpPackage.projectConfig = projectConfig; + sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion; + sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig( + sfdx_package, + sfpPackage.projectConfig + ); + sfpPackage.projectDirectory = projectDirectory?projectDirectory:''; + sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; + //Set Default Version Number + sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; + + //set additional options + sfpPackage.sourceVersion = params?.sourceVersion; + sfpPackage.branch = params?.branch; + sfpPackage.repository_url = params?.repositoryUrl; + if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json'; + else sfpPackage.configFilePath = params?.configFilePath; + + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + //Get Package Type + sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package); + + sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams); + + // Requires destructiveChangesPath which is set by the property fetcher + sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory( + logger, + sfpPackage.projectDirectory, + sfpPackage.projectConfig, + sfpPackage.packageName, + sfpPackage.packageDescriptor.path, + sfpPackage.versionNumber, + sfpPackage.destructiveChangesPath, + sfpPackage.configFilePath, + params?.pathToReplacementForceIgnore + ); + + sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path); + + //Don't proceed further if packageType is Data + if (sfpPackage.package_type != PackageType.Data) { + let sourceToMdapiConvertor = new SourceToMDAPIConvertor( + sfpPackage.workingDirectory, + sfpPackage.packageDescriptor.path, + ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion, + logger + ); + sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath; + const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir); + + sfpPackage.payload = packageManifest.manifestJson; + sfpPackage.triggers = packageManifest.fetchTriggers(); + sfpPackage.isApexFound = packageManifest.isApexInPackage(); + sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); + sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); + sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); + + let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir); + sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType(); + sfpPackage.apexTestClassses = apexFetcher.getTestClasses(); + sfpPackage.metadataCount = await MetadataCount.getMetadataCount( + sfpPackage.workingDirectory, + sfpPackage.packageDescriptor.path + ); + sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces(); + + sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); + + //Load component Set + let componentSet = ComponentSet.fromSource( + path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory) + ); + + //Run through all analyzers + let analyzers = AnalyzerRegistry.getAnalyzers(); + for (const analyzer of analyzers) { + if (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger); + } + } + + //Create the actual package + let createPackage; + + if (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true }; + + let packageType = sfpPackage.package_type; + if (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase(); + + //Get Implementors + switch (packageType) { + case PackageType.Unlocked: + createPackage = new CreateUnlockedPackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Source: + createPackage = new CreateSourcePackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Data: + createPackage = new CreateDataPackageImpl( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + case PackageType.Diff: + packageCreationParams.revisionFrom = params.revisionFrom; + packageCreationParams.revisionTo = params.revisionTo; + createPackage = new CreateDiffPackageImp( + sfpPackage.workingDirectory, + sfpPackage, + packageCreationParams, + logger, + params + ); + break; + } + + return createPackage.exec(); + } + + /* + * Handle version Numbers of package + * If VersionNumber is explcitly passed, use that + * else allow autosubstitute using buildNumber for Source and Data if available + */ + private static handleVersionNumber( + params: SfpPackageParams, + sfpPackage: SfpPackage, + packageCreationParams: PackageCreationParams + ) { + if (params?.packageVersionNumber) { + sfpPackage.versionNumber = params.packageVersionNumber; + } else if (packageCreationParams?.buildNumber) { + if (sfpPackage.packageType != PackageType.Unlocked) { + let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater(); + sfpPackage.versionNumber = versionUpdater.substituteBuildNumber( + sfpPackage, + packageCreationParams.buildNumber + ); + } + } else { + sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; + } + return sfpPackage; + } + + public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise { + //Read artifact metadata + let sfpPackage = new SfpPackage(); + Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' })); + sfpPackage.sourceDir = artifact.sourceDirectoryPath; + sfpPackage.changelogFilePath = artifact.changelogFilePath; + + sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath); + sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + artifact.sourceDirectoryPath, + sfpPackage.package_name + ); + sfpPackage.projectDirectory = artifact.sourceDirectoryPath; + sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; + sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); + + return sfpPackage; + } + + + + private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) { + if ( + this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false || + (sfpPackage.packageType == PackageType.Source && + sfpPackage.isApexFound == true && + sfpPackage.apexTestClassses == null) + ) { + SFPLogger.printHeaderLine('WARNING! NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger); + SFPLogger.log( + `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` + + `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` + + `via triggering all local tests,This definitely is not optimal approach on large orgs` + + `Please consider adding test classes for the classes in the package`, + LoggerLevel.INFO, + logger + ); + SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger); + return true; + } else return false; + } + + // Allow individual packages to use non optimized path + private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { + if (pkgDescriptor['isOptimizedDeployment'] == null) return true; + else return pkgDescriptor['isOptimizedDeployment']; + } +} + +// Options while creating package +export class PackageCreationParams { + breakBuildIfEmpty: boolean = true; + devHub?: string; + installationkeybypass?: boolean; + installationkey?: string; + waitTime?: string; + isCoverageEnabled?: boolean; + isSkipValidation?: boolean; + isComputeDiffPackage?: boolean; + baseBranch?: string; + buildNumber?: string; + useSelectiveBuildOnly?: boolean; + revisionFrom?:string; + revisionTo?:string; +} diff --git a/packages/sfp-cli/src/core/package/SfpPackageInquirer.ts b/packages/sfp-cli/src/core/package/SfpPackageInquirer.ts new file mode 100644 index 000000000..ba0e6a4d3 --- /dev/null +++ b/packages/sfp-cli/src/core/package/SfpPackageInquirer.ts @@ -0,0 +1,178 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import path = require('path'); +import lodash = require('lodash'); +import { URL } from 'url'; +import SfpPackage from './SfpPackage'; + +/** + * Methods for getting information about artifacts + */ +export default class SfpPackageInquirer { + private _latestPackageManifestFromArtifacts: any; + private _pathToLatestPackageManifestFromArtifacts: string; + private _prunedLatestPackageManifestFromArtifacts: any; + + get pathToLatestPackageManifestFromArtifacts() { + return this._pathToLatestPackageManifestFromArtifacts; + } + get prunedLatestPackageManifestFromArtifacts() { + return this._prunedLatestPackageManifestFromArtifacts; + } + + constructor(private readonly sfpPackages: SfpPackage[], private packageLogger?: Logger) {} + + public getLatestProjectConfig() { + let latestPackageManifest = this.getLatestPackageManifestFromArtifacts(this.sfpPackages); + + if (latestPackageManifest) { + this._latestPackageManifestFromArtifacts = latestPackageManifest.latestPackageManifest; + this._pathToLatestPackageManifestFromArtifacts = latestPackageManifest.pathToLatestPackageManifest; + + this._prunedLatestPackageManifestFromArtifacts = this.pruneLatestPackageManifest( + latestPackageManifest.latestPackageManifest, + this.sfpPackages + ); + } + return this._latestPackageManifestFromArtifacts; + } + + /** + * Gets latest package manifest from artifacts + * Returns null if unable to find latest package manifest + */ + private getLatestPackageManifestFromArtifacts( + sfpPackages: SfpPackage[] + ): { + latestPackageManifest: any; + pathToLatestPackageManifest: string; + } { + let latestPackageManifest: any; + let pathToLatestPackageManifest: string; + + this.validateArtifactsSourceRepository(); + + let latestSfpPackage: SfpPackage; + for (let sfpPackage of sfpPackages) { + if ( + latestSfpPackage == null || + latestSfpPackage.creation_details.timestamp < sfpPackage.creation_details.timestamp + ) { + latestSfpPackage = sfpPackage; + + let pathToPackageManifest = path.join(sfpPackage.sourceDir, 'manifests', 'sfdx-project.json.ori'); + if (fs.existsSync(pathToPackageManifest)) { + latestPackageManifest = JSON.parse(fs.readFileSync(pathToPackageManifest, 'utf8')); + + pathToLatestPackageManifest = pathToPackageManifest; + } + } + } + + if (latestPackageManifest) { + SFPLogger.log( + `Found latest package manifest in ${latestSfpPackage.packageName} artifact`, + LoggerLevel.INFO, + this.packageLogger + ); + + return { latestPackageManifest, pathToLatestPackageManifest }; + } else return null; + } + + /** + * Verify that artifacts are from the same source repository + */ + public validateArtifactsSourceRepository(): void { + let remoteURL: RemoteURL; + + for (let sfpPackage of this.sfpPackages) { + let currentRemoteURL: RemoteURL; + + let isHttp: boolean = sfpPackage.repository_url.match(/^https?:\/\//) ? true : false; + if (isHttp) { + const url = new URL(sfpPackage.repository_url); + currentRemoteURL = { + ref: url.toString(), + hostName: url.hostname, + pathName: url.pathname, + }; + } else { + // Handle SSH URL separately, as it is not supported by URL module + currentRemoteURL = { + ref: sfpPackage.repository_url, + hostName: null, + pathName: null, + }; + } + + if (remoteURL == null) { + remoteURL = currentRemoteURL; + continue; + } + + let isValid: boolean; + if (isHttp) { + if ( + currentRemoteURL.hostName === remoteURL.hostName && + currentRemoteURL.pathName === remoteURL.pathName + ) + isValid = true; + else isValid = false; + } else { + if (currentRemoteURL.ref === remoteURL.ref) isValid = true; + else isValid = false; + } + + if (!isValid) { + SFPLogger.log(`remoteURL: ${JSON.stringify(remoteURL)}`, LoggerLevel.DEBUG, this.packageLogger); + SFPLogger.log( + `currentRemoteURL: ${JSON.stringify(currentRemoteURL)}`, + LoggerLevel.DEBUG, + this.packageLogger + ); + throw new Error( + `Artifacts must originate from the same source repository, for deployment to work. The artifact ${sfpPackage.packageName} has repository URL that doesn't meet the current repository URL ${JSON.stringify(currentRemoteURL)} not equal ${JSON.stringify(remoteURL)}` + ); + } + } + } + + /** + * Remove packages that do not have an artifact from the package manifest + * @param latestPackageManifest + * @param artifacts + */ + private pruneLatestPackageManifest(latestPackageManifest: any, sfpPackages: SfpPackage[]) { + let prunedLatestPackageManifest = lodash.cloneDeep(latestPackageManifest); + + let packagesWithArtifacts: string[] = []; + sfpPackages.forEach((sfpPackage) => { + packagesWithArtifacts.push(sfpPackage.packageName); + }); + + let i = prunedLatestPackageManifest.packageDirectories.length; + while (i--) { + if (!packagesWithArtifacts.includes(prunedLatestPackageManifest.packageDirectories[i].package)) { + let removedPackageDirectory = prunedLatestPackageManifest.packageDirectories.splice(i, 1); + + // Also remove references to the package as a dependency + prunedLatestPackageManifest.packageDirectories.forEach((pkg) => { + let indexOfDependency = pkg.dependencies?.findIndex( + (dependency) => dependency.package === removedPackageDirectory[0].package + ); + + if (indexOfDependency >= 0) pkg.dependencies.splice(indexOfDependency, 1); + }); + } + } + + return prunedLatestPackageManifest; + } +} + +interface RemoteURL { + ref: string; + hostName: string; + pathName: string; +} diff --git a/packages/sfp-cli/src/core/package/SfpPackageInstaller.ts b/packages/sfp-cli/src/core/package/SfpPackageInstaller.ts new file mode 100644 index 000000000..711db5442 --- /dev/null +++ b/packages/sfp-cli/src/core/package/SfpPackageInstaller.ts @@ -0,0 +1,63 @@ +import path from 'path'; +import { Logger } from '@flxblio/sfp-logger'; +import SFPOrg from '../org/SFPOrg'; +import InstallDataPackageImpl from './packageInstallers/InstallDataPackageImpl'; +import { SfpPackageInstallationOptions } from './packageInstallers/InstallPackage'; +import InstallSourcePackageImpl from './packageInstallers/InstallSourcePackageImpl'; +import InstallUnlockedPackage from './packageInstallers/InstallUnlockedPackage'; +import { PackageInstallationResult } from './packageInstallers/PackageInstallationResult'; +import SfpPackage, { PackageType } from './SfpPackage'; + +export default class SfpPackageInstaller { + public static async installPackage( + logger: Logger, + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + installationOptions: SfpPackageInstallationOptions, + installationContext?: SfPPackageInstallationContext, + overridePackageTypeWith?: string + ): Promise { + let packageType = sfpPackage.packageType; + if (overridePackageTypeWith) packageType = overridePackageTypeWith; + + switch (packageType) { + case PackageType.Unlocked: + let installUnlockedPackageImpl: InstallUnlockedPackage = new InstallUnlockedPackage( + sfpPackage, + targetOrg, + installationOptions, + logger + ); + installUnlockedPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installUnlockedPackageImpl.exec(); + case PackageType.Diff: + case PackageType.Source: + installationOptions.pathToReplacementForceIgnore = installationContext?.currentStage == 'prepare' + ? path.join(sfpPackage.sourceDir, 'forceignores', '.prepareignore') + : null; + let installSourcePackageImpl: InstallSourcePackageImpl = new InstallSourcePackageImpl( + sfpPackage, + targetOrg, + installationOptions, + logger + ); + installSourcePackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installSourcePackageImpl.exec(); + case PackageType.Data: + let installDataPackageImpl: InstallDataPackageImpl = new InstallDataPackageImpl( + sfpPackage, + targetOrg, + logger, + installationOptions + ); + installDataPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; + return installDataPackageImpl.exec(); + default: + throw new Error('Unknown Package Type'); + } + } +} + +export class SfPPackageInstallationContext { + currentStage: string; +} diff --git a/packages/sfp-cli/src/core/package/analyser/AnalyzerRegistry.ts b/packages/sfp-cli/src/core/package/analyser/AnalyzerRegistry.ts new file mode 100644 index 000000000..0e4abe323 --- /dev/null +++ b/packages/sfp-cli/src/core/package/analyser/AnalyzerRegistry.ts @@ -0,0 +1,20 @@ +import FHTAnalyser from './FHTAnalyzer'; +import FTAnalyser from './FTAnalyzer'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import PicklistAnalyzer from './PicklistAnalyzer'; + +export class AnalyzerRegistry { + static getAnalyzers(): PackageAnalyzer[] { + let packageAnalyzers: PackageAnalyzer[] = []; + + //TODO: Make dynamic + let fhtAnalyzer = new FHTAnalyser(); + let ftAnalyser = new FTAnalyser(); + let picklistAnalyzer = new PicklistAnalyzer(); + packageAnalyzers.push(fhtAnalyzer); + packageAnalyzers.push(ftAnalyser); + packageAnalyzers.push(picklistAnalyzer); + + return packageAnalyzers; + } +} diff --git a/packages/sfp-cli/src/core/package/analyser/FHTAnalyzer.ts b/packages/sfp-cli/src/core/package/analyser/FHTAnalyzer.ts new file mode 100644 index 000000000..3d71504e6 --- /dev/null +++ b/packages/sfp-cli/src/core/package/analyser/FHTAnalyzer.ts @@ -0,0 +1,76 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import * as yaml from 'js-yaml'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class FHTAnalyser implements PackageAnalyzer { + + public getName() { + return "Field History Tracking Analyzer" + } + + + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + + let fhtFields: { [key: string]: Array } = {}; + + //read the yaml + let fhtYamlPath = path.join( + sfpPackage.workingDirectory, + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + '/postDeploy/history-tracking.yml' + ); + + //read components mentioned in yaml + if (fs.existsSync(fhtYamlPath)) { + //convert yaml to json + fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; + } + + + //filter the components in the package + fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet); + + if (Object.keys(fhtFields).length>0) { + sfpPackage['isFHTFieldFound'] = true; + sfpPackage['fhtFields'] = fhtFields; + } + } catch (error) { + //Ignore error for now + SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + private async addFieldsFromComponentSet( + fhtFields: { [key: string]: Array }, + componentSet: ComponentSet + ): Promise>> { + let sourceComponents = componentSet.getSourceComponents().toArray(); + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { + continue; + } + + let customField = sourceComponent.parseXmlSync().CustomField; + if (customField['trackHistory'] == 'true') { + let objName = sourceComponent.parent.fullName; + if (!fhtFields[objName]) fhtFields[objName] = []; + fhtFields[objName].push(sourceComponent.name); + } + } + return fhtFields; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfp-cli/src/core/package/analyser/FTAnalyzer.ts b/packages/sfp-cli/src/core/package/analyser/FTAnalyzer.ts new file mode 100644 index 000000000..911e1e356 --- /dev/null +++ b/packages/sfp-cli/src/core/package/analyser/FTAnalyzer.ts @@ -0,0 +1,74 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import * as yaml from 'js-yaml'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class FTAnalyser implements PackageAnalyzer { + + public getName(): string { + return "Feed Tracking Analyzer"; + }; + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + + let ftFields: { [key: string]: Array } = {}; + + //read the yaml + let ftYamlPath = path.join( + sfpPackage.workingDirectory, + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + '/postDeploy/feed-tracking.yml' + ); + + //read components mentioned in yaml + if (fs.existsSync(ftYamlPath)) { + //convert yaml to json + ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; + } + + + //filter the components in the package + ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet); + + if (Object.keys(ftFields).length>0) { + sfpPackage['isFTFieldFound'] = true; + sfpPackage['ftFields'] = ftFields; + } + } catch (error) { + //Ignore error for now + SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + private async addFieldsFromComponentSet( + ftFields: { [key: string]: Array }, + componentSet: ComponentSet + ): Promise>> { + let sourceComponents = componentSet.getSourceComponents().toArray(); + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { + continue; + } + + let customField = sourceComponent.parseXmlSync().CustomField; + if (customField['trackFeedHistory'] == 'true') { + let objName = sourceComponent.parent.fullName; + if (!ftFields[objName]) ftFields[objName] = []; + ftFields[objName].push(sourceComponent.name); + } + } + return ftFields; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfp-cli/src/core/package/analyser/PackageAnalyzer.ts b/packages/sfp-cli/src/core/package/analyser/PackageAnalyzer.ts new file mode 100644 index 000000000..3072da027 --- /dev/null +++ b/packages/sfp-cli/src/core/package/analyser/PackageAnalyzer.ts @@ -0,0 +1,12 @@ +import { Logger } from "@flxblio/sfp-logger"; +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import SfpPackage from "../SfpPackage"; + +export interface PackageAnalyzer +{ + getName(); + analyze(sfpPackage: SfpPackage,componentSet:ComponentSet,logger:Logger): Promise + isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise + + +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/package/analyser/PicklistAnalyzer.ts b/packages/sfp-cli/src/core/package/analyser/PicklistAnalyzer.ts new file mode 100644 index 000000000..35f24476c --- /dev/null +++ b/packages/sfp-cli/src/core/package/analyser/PicklistAnalyzer.ts @@ -0,0 +1,52 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { PackageAnalyzer } from './PackageAnalyzer'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class PicklistAnalyzer implements PackageAnalyzer { + + public getName() { + return "Picklist Analyzer" + } + + + + public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { + try { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let components = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name == registry.types.customobject.name) { + //issues/1367 + //this can add child elements that are not custom fields.. + components.push(...sourceComponent.getChildren()); + } + + if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { + components.push(sourceComponent); + } + } + + if (components) { + for (const fieldComponent of components) { + let customField = fieldComponent.parseXmlSync().CustomField; + //issues/1367 + //if the component isn't a field customField will be undefined..so check + if (customField && customField['type'] == 'Picklist') { + sfpPackage.isPickListsFound= true; + break; + } + } + } + } catch (error) { + SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger); + } + return sfpPackage; + } + + public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { + if (sfpPackage.packageType != PackageType.Data) return true; + else return false; + } +} diff --git a/packages/sfp-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts b/packages/sfp-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts new file mode 100644 index 000000000..5edac57a7 --- /dev/null +++ b/packages/sfp-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts @@ -0,0 +1,129 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Connection } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import { delay } from '../../utils/Delay'; +import { LoggerLevel } from '@flxblio/sfp-logger'; +import SFPOrg from '../../org/SFPOrg'; +import AdmZip from "adm-zip" +import path from 'path'; +import tmp from "tmp"; +import { XMLParser } from 'fast-xml-parser'; +import { isEmpty } from 'lodash'; + +export default class DeployDestructiveManifestToOrgImpl { + public constructor(private sfpOrg: SFPOrg, private destructiveManifestPath: string) { } + + + + + public async exec(): Promise { + //Connect to the org + const conn = this.sfpOrg.getConnection(); + const apiversion = await conn.retrieveMaxApiVersion(); + let workingDirectory = this.generateCacheDirectory(); + await this.copyAndValidateDestructiveManifest(this.destructiveManifestPath, workingDirectory); + this.generateEmptyPackageXml(workingDirectory, apiversion); + let zipFile = await this.generateDeploymentZipFile(workingDirectory); + await this.deployDestructiveManifest(zipFile, conn); + } + + private generateCacheDirectory() { + + let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); + let tempDir = tmpDirObj.name; + let destructCacheDirectory = path.join(tempDir, 'destruct'); + fs.mkdirSync(destructCacheDirectory); + return destructCacheDirectory; + } + + private async copyAndValidateDestructiveManifest(existingManifestPath: string, workingDirectory: string) { + let destructiveManifestFile = path.join(workingDirectory, 'destructiveChanges.xml'); + + //Copy Destructive Manifest File to Temporary Directory + fs.copyFileSync(existingManifestPath, destructiveManifestFile); + const parser = new XMLParser(); + let destructiveChanges = await parser.parse(fs.readFileSync(path.resolve(destructiveManifestFile))); + + if (isEmpty(destructiveChanges['Package']['types'])) { + throw new Error('Invalid Destructive Change Definition encountered, please check'); + } + + SFPLogger.log(destructiveChanges['Package']['types'], LoggerLevel.TRACE); + } + + + private generateEmptyPackageXml(workingDirectory: string, apiversion: string) { + let packageXml = ` + + + * + CustomLabel + + ${apiversion} + `; + + let packageXmlPath = path.join(workingDirectory, 'package.xml'); + fs.outputFileSync(packageXmlPath, packageXml); + + SFPLogger.log(`Empty Package.xml with ${apiversion} created at ${workingDirectory}`, LoggerLevel.DEBUG); + } + + private async generateDeploymentZipFile(workingDirectory: string) { + let zip = new AdmZip(); + zip.addLocalFolder(workingDirectory); + zip.writeZip(path.join(workingDirectory, 'package.zip')); + return path.join(workingDirectory, 'package.zip'); + } + + + + private async deployDestructiveManifest(zipFile: string, conn: Connection) { + //Deploy Package + conn.metadata.pollTimeout = 300; + + const zipStream = fs.createReadStream(zipFile); + let deployResult = await conn.metadata.deploy(zipStream, { rollbackOnError: true, singlePackage: true }); + + + SFPLogger.log( + `Deploying Destructive Changes with ID ${deployResult.id} to ${conn.getUsername()}`, + LoggerLevel.INFO + ); + let deploymentStatus = await this.checkDeploymentStatus(conn, deployResult.id); + + if (deploymentStatus.success) { + if (deploymentStatus.success) + SFPLogger.log( + `Deployed Destructive Changes in target org ${conn.getUsername()} succesfully`, + LoggerLevel.INFO + ); + } else { + let componentFailures = deploymentStatus.details.componentFailures; + let errorResult = []; + componentFailures.forEach((failure) => { + errorResult.push({ + componentType: failure.componentType, + fullName: failure.fullName, + problem: failure.problem, + }); + }); + + console + throw new Error('Unable to deploy the Destructive Changes: ' + JSON.stringify(errorResult)); + } + } + + private async checkDeploymentStatus(conn: Connection, retrievedId: string) { + + while (true) { + let result = await conn.metadata.checkDeployStatus(retrievedId, true); + + if (!result.done) { + SFPLogger.log('Polling for Deployment Status', LoggerLevel.INFO); + await delay(5000); + } else { + return result; + } + } + } +} diff --git a/packages/sfp-cli/src/core/package/components/MetadataCount.ts b/packages/sfp-cli/src/core/package/components/MetadataCount.ts new file mode 100644 index 000000000..23454e15d --- /dev/null +++ b/packages/sfp-cli/src/core/package/components/MetadataCount.ts @@ -0,0 +1,18 @@ +import { globSync } from 'glob'; +import path from 'path'; + +export default class MetadataCount { + public static async getMetadataCount(projectDirectory: string, sourceDirectory: string): Promise { + let metadataCount; + try { + let metadataFiles: string[] = globSync(`**/*-meta.xml`, { + cwd: projectDirectory ? path.join(projectDirectory, sourceDirectory) : sourceDirectory, + absolute: true, + }); + metadataCount = metadataFiles.length; + } catch (error) { + metadataCount = -1; + } + return metadataCount; + } +} diff --git a/packages/sfp-cli/src/core/package/components/PackageManifest.ts b/packages/sfp-cli/src/core/package/components/PackageManifest.ts new file mode 100644 index 000000000..9d0be4521 --- /dev/null +++ b/packages/sfp-cli/src/core/package/components/PackageManifest.ts @@ -0,0 +1,271 @@ +import path from 'path'; +import * as fs from 'fs-extra'; +import { ApexClasses } from '../SfpPackage'; +import xml2json from '../../utils/xml2json'; +const xml2js = require('xml2js'); + +export default class PackageManifest { + private _manifestJson; + private _manifestXml: string; + + /** + * Getter for package manifest JSON + */ + get manifestJson() { + return this._manifestJson; + } + + /** + * Getter for package manifest XML + */ + get manifestXml(): string { + return this._manifestXml; + } + + private constructor() {} + + /** + * Factory method + * @param mdapiDir directory containing package.xml + * @returns instance of PackageManifest + */ + static async create(mdapiDir: string): Promise { + const packageManifest = new PackageManifest(); + + const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8'); + + packageManifest._manifestXml = packageXml; + packageManifest._manifestJson = await xml2json(packageXml); + + return packageManifest; + } + + /** + * Factory method + * @param components + * @param apiVersion + * @returns intance of PackageManifest + */ + static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest { + const packageManifest = new PackageManifest(); + + const packageJson = { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [], + version: apiVersion, + }; + + components.forEach((component) => { + const type = packageJson.types.find((type) => type.name === component.type); + if (type) { + // Add member to existing type + type.members.push(component.fullName); + } else { + // create new type + const newType = { + name: component.type, + members: [component.fullName], + }; + packageJson.types.push(newType); + } + }); + + const builder = new xml2js.Builder({ + xmldec: { version: '1.0', encoding: 'UTF-8' }, + }); + + let packageObj = { + Package: packageJson, + }; + + packageManifest._manifestXml = builder.buildObject(packageObj); + packageManifest._manifestJson = packageObj; + + return packageManifest; + } + + /** + * Factory method + * @param manifest package JSON + * @returns instance of PackageManifest + */ + static async createWithJSONManifest(manifest: any): Promise { + const packageManifest = new PackageManifest(); + packageManifest._manifestJson = manifest; + + const builder = new xml2js.Builder({ + xmldec: { version: '1.0', encoding: 'UTF-8' }, + }); + + packageManifest._manifestXml = builder.buildObject(manifest); + + return packageManifest; + } + + /** + * + * @returns true or false, for whether there are profiles + */ + public isProfilesInPackage(): boolean { + let isProfilesFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'Profile') { + isProfilesFound = true; + break; + } + } + } else if (this.manifestJson.Package.types.name === 'Profile') { + isProfilesFound = true; + } + } + + return isProfilesFound; + } + + /** + * + * @returns true or false, for whether there are profiles + */ + public isPermissionSetsInPackage(): boolean { + let isPermissionSetFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'PermissionSet') { + isPermissionSetFound = true; + break; + } + } + } else if (this.manifestJson.Package.types.name === 'PermissionSet') { + isPermissionSetFound = true; + } + } + + return isPermissionSetFound; + } + + public isPermissionSetGroupsFoundInPackage(): boolean { + let isPermissionSetGroupFound = false; + if (Array.isArray(this._manifestJson?.Package?.types)) { + for (let type of this._manifestJson.Package.types) { + if (type.name === 'PermissionSetGroup') { + isPermissionSetGroupFound = true; + break; + } + } + } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') { + isPermissionSetGroupFound = true; + } + return isPermissionSetGroupFound; + } + + /** + * + * @returns true or false, for whether there are Apex classes and/or triggers + */ + public isApexInPackage(): boolean { + let isApexFound = false; + + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name === 'ApexClass' || type.name === 'ApexTrigger') { + isApexFound = true; + break; + } + } + } else if ( + this._manifestJson.Package.types.name === 'ApexClass' || + this._manifestJson.Package.types.name === 'ApexTrigger' + ) { + isApexFound = true; + } + } + + return isApexFound; + } + + /** + * + * @returns Apex triggers if there are any, otherwise returns undefined + */ + public fetchTriggers(): ApexClasses { + let triggers: string[]; + + let types; + if (this._manifestJson.Package.types) { + if (this._manifestJson.Package.types instanceof Array) { + types = this._manifestJson.Package.types; + } else { + // Create array with single type + types = [this._manifestJson.Package.types]; + } + } + + if (types) { + for (const type of types) { + if (type.name === 'ApexTrigger') { + if (type.members instanceof Array) { + triggers = type.members; + } else { + // Create array with single member + triggers = [type.members]; + } + break; + } + } + } + + return triggers; + } + + public isPayloadContainTypesOtherThan(providedType: string): boolean { + let anyOtherType = false; + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (type.name !== providedType) { + anyOtherType = true; + break; + } + } + } else if (this._manifestJson.Package.types.name !== providedType) { + anyOtherType = true; + } + } + return anyOtherType; + } + + public isPayLoadContainTypesSupportedByProfiles(): boolean { + const profileSupportedMetadataTypes = [ + 'ApexClass', + 'CustomApplication', + 'CustomObject', + 'CustomField', + 'Layout', + 'ApexPage', + 'CustomTab', + 'RecordType', + 'SystemPermissions', + ]; + + let containsProfileSupportedType = false; + if (this._manifestJson.Package.types) { + if (Array.isArray(this._manifestJson.Package.types)) { + for (const type of this._manifestJson.Package.types) { + if (profileSupportedMetadataTypes.includes(type.name)) { + containsProfileSupportedType = true; + break; + } + } + } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) { + containsProfileSupportedType = true; + } + } + return containsProfileSupportedType; + } +} diff --git a/packages/sfp-cli/src/core/package/components/PackageToComponent.ts b/packages/sfp-cli/src/core/package/components/PackageToComponent.ts new file mode 100644 index 000000000..7f6a6eef1 --- /dev/null +++ b/packages/sfp-cli/src/core/package/components/PackageToComponent.ts @@ -0,0 +1,28 @@ +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import Component from '../../dependency/Component'; + + +export default class PackageToComponent { + public constructor(private packageName:string,private packageDirectory:string) {} + + public generateComponents() { + const components: Component[] = []; + + let componentSet = ComponentSet.fromSource(this.packageDirectory); + + let componentSetArray = componentSet.getSourceComponents().toArray(); + + for (const individualComponentFromComponentSet of componentSetArray) { + const component: Component = { + id: undefined, + fullName: individualComponentFromComponentSet.fullName, + type: individualComponentFromComponentSet.type.name, + files: [individualComponentFromComponentSet.xml], + package: this.packageName, + }; + components.push(component); + } + + return components; + } +} diff --git a/packages/sfp-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts b/packages/sfp-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts new file mode 100644 index 000000000..209c95b29 --- /dev/null +++ b/packages/sfp-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts @@ -0,0 +1,53 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; +const Table = require('cli-table'); +import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import { METADATA_INFO } from '../../metadata/MetadataInfo'; + +export default class ReconcileProfileAgainstOrgImpl { + public constructor(private sfpOrg:SFPOrg, private project_directory: string, private logger: Logger) {} + + public async exec() { + + let result=[]; + try { + let profileReconciler = new ProfileReconcile(this.sfpOrg); + let reconcileProfiles = await profileReconciler.reconcile( + [ this.project_directory], + [], + undefined + ); + + // Return an object to be displayed with --json + + reconcileProfiles.forEach((file) => { + result.push({ + state: 'Cleaned', + fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), + type: 'Profile', + path: path.relative(this.project_directory, file), + }); + }); + } catch (err) { + SFPLogger.log(err, LoggerLevel.ERROR); + + SFPLogger.log( + 'An error occured during profile reconcile. You can rerun the command after a moment.', + LoggerLevel.ERROR + ); + } + const table = new Table({ + head: ['State', 'Full Name', 'Type', 'Path'], + chars: ZERO_BORDER_TABLE, + }); + for (let res of result) { + table.push([res.state, res.fullName, res.type, res.path]); + } + SFPLogger.log(table.toString(), LoggerLevel.INFO); + return result; + } + + +} diff --git a/packages/sfp-cli/src/core/package/coverage/PackageTestCoverage.ts b/packages/sfp-cli/src/core/package/coverage/PackageTestCoverage.ts new file mode 100644 index 000000000..b2d37496e --- /dev/null +++ b/packages/sfp-cli/src/core/package/coverage/PackageTestCoverage.ts @@ -0,0 +1,273 @@ +import SFPLogger, { COLOR_WARNING, Logger } from '@flxblio/sfp-logger'; +import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import ApexClassFetcher from '../../apex/ApexClassFetcher'; +import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher'; +import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher'; + +export default class PackageTestCoverage { + private individualClassCoverage: IndividualClassCoverage; + private packageTestCoverage: number = -1; // Set inital value + + public constructor( + private pkg: SfpPackage, + private codeCoverage: any, + private logger: Logger, + private readonly conn: Connection + ) { + this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger); + } + + public async getCurrentPackageTestCoverage(): Promise { + let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; + let triggers: string[] = this.pkg.triggers; + + let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers( + this.codeCoverage, + packageClasses, + triggers + ); + + let totalLines: number = 0; + let totalCovered: number = 0; + for (let classCoverage of filteredCodeCoverage) { + if (classCoverage.coveredPercent !== null) { + totalLines += classCoverage.totalLines; + totalCovered += classCoverage.totalCovered; + } + } + + let listOfApexClassOrTriggerId: string[] = []; + + let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage); + if (classesNotTouchedByTestClass.length > 0) { + let apexClassIds = ( + await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass) + ).map((apexClass) => apexClass.Id); + listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds); + } + + let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage); + if (triggersNotTouchedByTestClass.length > 0) { + let triggerIds = ( + await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass) + ).map((trigger) => trigger.Id); + listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds); + } + + if (listOfApexClassOrTriggerId.length > 0) { + let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher( + this.conn + ).fetchACCAById(listOfApexClassOrTriggerId); + + if (recordsOfApexCodeCoverageAggregate.length > 0) { + let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes + recordsOfApexCodeCoverageAggregate.forEach((record) => { + numLinesUncovered += record.NumLinesUncovered; + }); + totalLines += numLinesUncovered; + } + } + + let testCoverage = Math.floor((totalCovered / totalLines) * 100); + this.packageTestCoverage = testCoverage; + return testCoverage; + } + + public async validateTestCoverage( + coverageThreshold?: number + ): Promise<{ + result: boolean; + message?: string; + packageTestCoverage: number; + classesCovered?: { name: string; coveredPercent: number }[]; + classesWithInvalidCoverage?: { name: string; coveredPercent: number }[]; + }> { + if (this.packageTestCoverage == -1) + //No Value available + await this.getCurrentPackageTestCoverage(); + + let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage); + + if (coverageThreshold == undefined || coverageThreshold < 75) { + SFPLogger.log('Setting minimum coverage percentage to 75%.'); + coverageThreshold = 75; + } + + + + if (this.pkg.packageType === PackageType.Unlocked) { + if (this.packageTestCoverage < coverageThreshold) { + // Coverage inadequate, set result to false + return { + result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + message: `${COLOR_WARNING( + `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%` + )}`, + }; + } else { + return { + result: true, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + message: `Package overall coverage is greater than ${coverageThreshold}%`, + }; + } + } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) { + SFPLogger.log("Package type is Source. Validating individual class coverage"); + + let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage( + this.getIndividualClassCoverageByPackage(this.codeCoverage), + coverageThreshold + ); + + if (individualClassValidationResults.result) { + return { + result: true, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, + message: `Individidual coverage of classes is greater than ${coverageThreshold}%`, + }; + } else { + return { + result: false, + packageTestCoverage: this.packageTestCoverage, + classesCovered: classesCovered, + classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, + message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`, + }; + } + } else { + throw new Error('Unhandled package type'); + } + } + + private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] { + let individualClassCoverage: { + name: string; + coveredPercent: number; + }[] = []; + + let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; + let triggers: string[] = this.pkg.triggers; + + codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers( + codeCoverageReport, + packageClasses, + triggers + ); + + for (let classCoverage of codeCoverageReport) { + if (classCoverage['coveredPercent'] !== null) { + individualClassCoverage.push({ + name: classCoverage['name'], + coveredPercent: classCoverage['coveredPercent'], + }); + } + } + + let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass( + packageClasses, + codeCoverageReport + ); + + if (namesOfClassesWithoutTest.length > 0) { + let classesWithoutTest: { + name: string; + coveredPercent: number; + }[] = namesOfClassesWithoutTest.map((className) => { + return { name: className, coveredPercent: 0 }; + }); + individualClassCoverage = individualClassCoverage.concat(classesWithoutTest); + } + + // Check for triggers with no test class + let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport); + + if (namesOfTriggersWithoutTest.length > 0) { + let triggersWithoutTest: { + name: string; + coveredPercent: number; + }[] = namesOfTriggersWithoutTest.map((triggerName) => { + return { name: triggerName, coveredPercent: 0 }; + }); + individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest); + } + + return individualClassCoverage; + } + + /** + * Returns names of triggers in the package that are not triggered by the execution of any test classes + * Returns empty array if triggers is null or undefined + * @param triggers + * @param codeCoverageReport + * @returns + */ + private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] { + if (triggers != null) { + return triggers.filter((trigger) => { + for (let classCoverage of codeCoverageReport) { + if (classCoverage['name'] === trigger) { + // Filter out triggers if accounted for in coverage json + return false; + } + } + return true; + }); + } else return []; + } + + /** + * Returns name of classes in the package that are not touched by the execution of any test classes + * Returns empty array if packageClasses is null or undefined + * @param packageClasses + * @param codeCoverageReport + * @returns + */ + private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] { + if (packageClasses != null) { + return packageClasses.filter((packageClass) => { + for (let classCoverage of codeCoverageReport) { + if (classCoverage['name'] === packageClass) { + // Filter out package class if accounted for in coverage json + return false; + } + } + return true; + }); + } else return []; + } + + /** + * Filter code coverage to classes and triggers in the package + * @param codeCoverage + * @param packageClasses + * @param triggers + */ + private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) { + let filteredCodeCoverage = codeCoverage.filter((classCoverage) => { + if (packageClasses != null) { + for (let packageClass of packageClasses) { + if (packageClass === classCoverage['name']) return true; + } + } + + if (triggers != null) { + for (let trigger of triggers) { + if (trigger === classCoverage['name']) { + return true; + } + } + } + + return false; + }); + + return filteredCodeCoverage; + } +} diff --git a/packages/sfp-cli/src/core/package/coverage/PackageVersionCoverage.ts b/packages/sfp-cli/src/core/package/coverage/PackageVersionCoverage.ts new file mode 100644 index 000000000..bee874e13 --- /dev/null +++ b/packages/sfp-cli/src/core/package/coverage/PackageVersionCoverage.ts @@ -0,0 +1,39 @@ +import { Connection } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2VersionFetcher from '../version/Package2VersionFetcher'; + +export default class PackageVersionCoverage { + public constructor(private connection: Connection, private logger: Logger) {} + + public async getCoverage(versionId: string): Promise { + const package2VersionFetcher = new Package2VersionFetcher(this.connection); + const package2Version = await package2VersionFetcher.fetchBySubscriberPackageVersionId(versionId); + SFPLogger.log(`Fetched Record ${JSON.stringify(package2Version)}`, LoggerLevel.TRACE, this.logger); + if (package2Version) { + var packageCoverage = {}; + packageCoverage.HasPassedCodeCoverageCheck = package2Version.HasPassedCodeCoverageCheck; + packageCoverage.coverage = package2Version.CodeCoverage ? package2Version.CodeCoverage.apexCodeCoveragePercentage : 0; + packageCoverage.packageId = package2Version.Package2Id; + packageCoverage.packageName = package2Version.Package2.Name; + packageCoverage.packageVersionId = package2Version.SubscriberPackageVersionId; + packageCoverage.packageVersionNumber = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; + + SFPLogger.log( + `Successfully Retrieved the Apex Test Coverage of the package version`, + LoggerLevel.INFO, + this.logger + ); + } else { + throw new Error(`Package version doesnot exist, Please check the version details`); + } + return packageCoverage; + } +} +interface PackageCoverage { + coverage: number; + packageName: string; + packageId: string; + packageVersionNumber: string; + packageVersionId: string; + HasPassedCodeCoverageCheck: boolean; +} diff --git a/packages/sfp-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts b/packages/sfp-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts new file mode 100644 index 000000000..a91dc95e0 --- /dev/null +++ b/packages/sfp-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts @@ -0,0 +1,103 @@ +import { Connection } from '@salesforce/core'; +import PackageDependencyResolver from './PackageDependencyResolver'; +import _ from 'lodash'; +import Package2VersionFetcher from '../version/Package2VersionFetcher'; +import Package2Detail from '../Package2Detail'; + +/** + * Resolves external package dependency versions to their subscriber version + */ +export default class ExternalPackage2DependencyResolver { + //TOOD: Finalize Keys + constructor(private conn: Connection, private projectConfig, private keys) {} + + public async resolveExternalPackage2DependenciesToVersions( + packagesToBeResolved?: string[], + packagesToBeSkipped?: string[], + isDependencyValidated?: boolean + ): Promise { + if (isDependencyValidated == undefined) isDependencyValidated = true; + //Do a dependency resolution first only for external dependencies + //Resolve .LATEST to exact version numbers + let revisedProjectConfig = await new PackageDependencyResolver( + this.conn, + this.projectConfig, + packagesToBeSkipped, + null, + isDependencyValidated + ).resolvePackageDependencyVersions(); + + let packageVersions: Package2Detail[] = []; + let packageVersionFetcher = new Package2VersionFetcher(this.conn); + + let packagesToKeys: { [p: string]: string }; + if (this.keys) { + packagesToKeys = this.parseKeys(this.keys); + } + + //Resolve provided version Number to SubscriberVersionId + for (const sfdxPackage of revisedProjectConfig.packageDirectories) { + + if(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package)) + continue; + + if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) { + for (let i = 0; i < sfdxPackage.dependencies.length; i++) { + let dependency = sfdxPackage.dependencies[i]; + + if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) + { + let dependendentPackage: Package2Detail = { name: dependency.package }; + packageVersions.push(dependendentPackage); + continue; + } + + if (!packageVersions.find((elem) => elem.name == dependency.package)) { + let dependendentPackage: Package2Detail = { name: dependency.package }; + if (dependency.versionNumber) { + dependendentPackage.versionNumber = dependency.versionNumber; + let packageVersion = await packageVersionFetcher.fetchByPackage2Id( + revisedProjectConfig.packageAliases[dependendentPackage.name], + dependendentPackage.versionNumber, + true + ); + dependendentPackage.subscriberPackageVersionId = + packageVersion[0].SubscriberPackageVersionId; + } else { + dependendentPackage.subscriberPackageVersionId = + revisedProjectConfig.packageAliases[dependendentPackage.name]; + } + if (packagesToKeys?.[dependendentPackage.name]) { + dependendentPackage.key = packagesToKeys[dependency.package]; + } + packageVersions.push(dependendentPackage); + } + } + } + } + return packageVersions; + } + + /** + * Parse keys in string format "packageA:key packageB:key packageC:key" + * Returns map of packages to keys + * @param keys + */ + private parseKeys(keys: string) { + let output: { [p: string]: string } = {}; + + keys = keys.trim(); + let listOfKeys = keys.split(' '); + + for (let key of listOfKeys) { + let packageKeyPair = key.split(':'); + if (packageKeyPair.length === 2) { + output[packageKeyPair[0]] = packageKeyPair[1]; + } else { + // Format is incorrect, throw an error + throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); + } + } + return output; + } +} diff --git a/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts b/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts new file mode 100644 index 000000000..43babb444 --- /dev/null +++ b/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts @@ -0,0 +1,269 @@ +import { Connection } from '@salesforce/core'; +import lodash = require('lodash'); +import Git from '../../git/Git'; +import GitTags from '../../git/GitTags'; +import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + + +/** + * Resolves package dependency versions to their exact versions + */ +export default class PackageDependencyResolver { + private package2VersionCache: Package2VersionCache = new Package2VersionCache(); + + constructor( + private conn: Connection, + private projectConfig, + private packagesToBeSkipped?: string[], + private packagesToBeResolved?: string[], + private resolveExternalDepenciesOnly?: boolean + ) { + // prevent mutation of original config + this.projectConfig = lodash.cloneDeep(this.projectConfig); + } + + /** + * Resolves package dependency versions in project config + * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped) + * @returns new project config JSON, does not change original JSON + */ + public async resolvePackageDependencyVersions() { + for (const packageDirectory of this.projectConfig.packageDirectories) { + if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) { + throw Error(`Unsupported path.. Use only one of the options at any given time`); + } + + if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) { + continue; + } + + if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) { + continue; + } + if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) { + for (let i = 0; i < packageDirectory.dependencies.length; i++) { + let dependency = packageDirectory.dependencies[i]; + if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) { + + throw new Error(`Can't find package id for dependency: ` + dependency.package); + } + + let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package] + + if (this.isSubscriberPackageVersionId(packageVersionId)) { + // Already resolved + continue; + } + + if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) { + // Dependency is part of the same build, will be resolved when new version is created + continue; + } + let package2VersionForDependency: any = ''; + if ( dependency.branch && dependency.branch !== '' ) { + SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO); + package2VersionForDependency = await this.getPackage2VersionForDependency( + this.conn, + dependency, + packageVersionId, + dependency.branch + ); + SFPLogger.log(`Fetched latest branched package of ${dependency.package},` + +`version: ${package2VersionForDependency.MajorVersion}.` + +`${package2VersionForDependency.MinorVersion}.` + +`${package2VersionForDependency.PatchVersion}.` + +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO); + + let branchedPackageAlias = `${dependency.package}@` + +`${package2VersionForDependency.MajorVersion}.` + +`${package2VersionForDependency.MinorVersion}.` + +`${package2VersionForDependency.PatchVersion}.` + +`${package2VersionForDependency.BuildNumber}-` + +`${dependency.branch}`; + dependency.package = branchedPackageAlias; + this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId; + delete dependency.versionNumber; + delete dependency.branch; + continue; + + }else { + package2VersionForDependency = await this.getPackage2VersionForDependency( + this.conn, + dependency, + packageVersionId + ); + } + + + if (package2VersionForDependency == null) { + packageDirectory.dependencies.splice(i, 1); + i--; + } else + dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`; + } + } + } + return this.projectConfig; + } + + /** + * Get last validated Package2 version for package dependency + * @param conn + * @param dependency + * @returns Package2Version + */ + private async getPackage2VersionForDependency( + conn: Connection, + dependency: { package: string; versionNumber: string }, + packageVersionId: string, + branch?: string, + ): Promise { + + //Dont hit api's if its only for external dependencies + if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) { + if (this.resolveExternalDepenciesOnly) return null; + } + + let package2Version: Package2Version; + + let versionNumber: string = dependency.versionNumber; + let vers: string[] = versionNumber.split('.'); + if (vers.length === 4 && vers[3] === 'LATEST') { + versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`; + } + + let package2Versions: Package2Version[]; + if (this.package2VersionCache.has(packageVersionId, versionNumber)) { + package2Versions = this.package2VersionCache.get( + packageVersionId, + versionNumber + ); + } else { + const package2VersionFetcher = new Package2VersionFetcher(conn); + let records; + if( branch ){ + records = await package2VersionFetcher.fetchByPackageBranchAndName( + branch, + dependency.package, + versionNumber + ); + }else{ + records = await package2VersionFetcher.fetchByPackage2Id( + packageVersionId, + versionNumber, + true + ); + } + + this.package2VersionCache.set( + packageVersionId, + versionNumber, + records + ); + package2Versions = this.package2VersionCache.get( + packageVersionId, + versionNumber + ); + } + + if (package2Versions.length === 0) { + throw new Error( + `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}` + ); + } + + if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) { + package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency); + } else { + // Take last validated package for external packages + package2Version = package2Versions[0]; + } + return package2Version; + } + + /** + * Get Package2 version created from the current branch + * @param package2Versions + * @param dependency + * @returns Package2Version + */ + private async getPackage2VersionFromCurrentBranch( + package2Versions: Package2Version[], + dependency: { package: string; versionNumber: string } + ) { + let package2VersionOnCurrentBranch: Package2Version; + + const git = await Git.initiateRepo(); + const gitTags = new GitTags(git, dependency.package); + const tags = await gitTags.listTagsOnBranch(); + + for (const package2Version of package2Versions) { + const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; + for (const tag of tags) { + if (tag.endsWith(version)) { + package2VersionOnCurrentBranch = package2Version; + break; + } + } + if (package2VersionOnCurrentBranch) break; + } + + if (!package2VersionOnCurrentBranch) { + throw new Error( + `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch` + ); + } + + return package2VersionOnCurrentBranch; + } + + private isSubscriberPackageVersionId(packageAlias: string): boolean { + const subscriberPackageVersionIdPrefix = '04t'; + return packageAlias.startsWith(subscriberPackageVersionIdPrefix); + } +} + +class Package2VersionCache { + private cache: { [p: string]: Package2Version[] } = {}; + + /** + * Checks whether cache contains key for package ID and version number + * @param packageId + * @param versionNumberstartw + * @returns true or false + */ + has(packageId: string, versionNumber: string): boolean { + const key = `${packageId}-${versionNumber}`; + if (this.cache[key]) return true; + else return false; + } + + /** + * Set the cache value, Package2 versions, for package ID and version number + * @param packageId + * @param versionNumber + * @param package2Versions + * @returns cache + */ + set( + packageId: string, + versionNumber: string, + package2Versions: Package2Version[] + ): { [p: string]: Package2Version[] } { + const key = `${packageId}-${versionNumber}`; + this.cache[key] = package2Versions; + return this.cache; + } + + /** + * + * @param packageId + * @param versionNumber + * @returns Package2 versions for package ID and version number + */ + get(packageId: string, versionNumber: string): Package2Version[] { + const key = `${packageId}-${versionNumber}`; + return this.cache[key]; + } +} diff --git a/packages/sfp-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts b/packages/sfp-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts new file mode 100644 index 000000000..d91c91f27 --- /dev/null +++ b/packages/sfp-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts @@ -0,0 +1,109 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import _, { uniq } from 'lodash'; +import semver = require('semver'); +import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter'; +import { Connection } from '@salesforce/core'; +import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency'; + +export default class TransitiveDependencyResolver { + constructor(private sfdxProjectConfig: any, private logger?: Logger) {} + + public async resolveTransitiveDependencies(): Promise> { + SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger); + + let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig); + clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig); + let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig); + pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap( + pkgWithDependencies, + new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig) + ); + pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies); + + return pkgWithDependencies; + } + + private fillDepsWithUserDefinedExternalDependencyMap( + pkgWithDependencies: Map, + externalDependencyMap: any + ): Map { + if (externalDependencyMap) { + for (let pkg of Object.keys(externalDependencyMap)) { + pkgWithDependencies.set(pkg, externalDependencyMap[pkg]); + } + } + return pkgWithDependencies; + } + + private fillDepsTransitively( + dependencyMap: Map + ): Map { + let pkgs = Array.from(dependencyMap.keys()); + for (let pkg of pkgs) { + SFPLogger.log( + COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), + LoggerLevel.TRACE, + this.logger + ); + let dependenencies: { package: string; versionNumber?: string }[] = []; + for (let dependency of dependencyMap.get(pkg)) { + if (dependencyMap.get(dependency.package)) { + //push parents first + dependenencies = dependenencies.concat(dependencyMap.get(dependency.package)); + SFPLogger.log( + `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${ + dependency.package + }`, + LoggerLevel.TRACE, + this.logger + ); + } + //push itself + dependenencies.push(dependency); + } + //deduplicate dependency list + let uniqueDependencies = [ + ...new Set(dependenencies.map((objects) => JSON.stringify(objects))), + ].map((tmpString) => JSON.parse(tmpString)); + for (let j = 0; j < uniqueDependencies.length; j++) { + if (uniqueDependencies[j].versionNumber) { + let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber); + + for (let i = j + 1; i < uniqueDependencies.length; i++) { + if (uniqueDependencies[j].package == uniqueDependencies[i].package) { + let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber); + // replace existing packageInfo if package version number is newer + if (semver.lt(version, versionToCompare)) { + uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i); + + } else { + uniqueDependencies.splice(i, 1); + i--; + } + } + } + } + //do a dedup again + uniqueDependencies = [ + ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))), + ].map((tmpString) => JSON.parse(tmpString)); + } + dependencyMap.set(pkg, uniqueDependencies); + } + return dependencyMap; + } + + private swapAndDropArrayElement(arr: T[], i: number, j: number): T[] { + if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) { + return arr; + } + + let newArr = [...arr]; + [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; + return [...newArr.slice(0, j), ...newArr.slice(j + 1)]; + } + + +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts new file mode 100644 index 000000000..c7a74f82e --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts @@ -0,0 +1,27 @@ +import { Logger } from "@flxblio/sfp-logger"; +import { Connection } from "@salesforce/core"; +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; +import SfpPackage from "../SfpPackage"; +import SFPOrg from "../../org/SFPOrg"; +import { DeploySourceResult } from "../../deployers/DeploymentExecutor"; + +export interface DeploymentContext +{ + apiVersion: string; + waitTime: string; +} + +export interface DeploymentCustomizer +{ + gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet:ComponentSet, conn: Connection, logger: Logger):Promise<{location:string, componentSet:ComponentSet}>; + isEnabled(sfpPackage:SfpPackage, conn:Connection,logger:Logger):Promise; + getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + getName():string + execute(sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg:SFPOrg, + logger: Logger, + deploymentContext:DeploymentContext + ):Promise +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts new file mode 100644 index 000000000..709ce227f --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts @@ -0,0 +1,121 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SfpPackage from '../SfpPackage'; +import { Connection } from '@salesforce/core'; + +import { Schema } from 'jsforce'; +import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import { TestLevel } from '../../apextest/TestOptions'; +import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; + +const QUERY_BODY = + 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFieldHistoryTracked = true AND EntityDefinitionId IN '; + +export default class FHTEnabler extends MetdataDeploymentCustomizer { + + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg) return false; + + if ( + sfpPackage['isFHTFieldFound'] && + (sfpPackage.packageDescriptor.enableFHT == undefined || sfpPackage.packageDescriptor.enableFHT == true) + ) { + return true; + } + } + + + + public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + { + return { + ignoreWarnings:true, + waitTime:waitTime, + apiVersion:apiVersion, + testLevel : TestLevel.RunSpecifiedTests, + specifiedTests :'skip', + rollBackOnError:true + } + } + + public async gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + //First retrieve all objects/fields of interest from the package + let objList = []; + let fieldList = []; + Object.keys(sfpPackage['fhtFields']).forEach((key) => { + objList.push(`'${key}'`); + sfpPackage['fhtFields'][key].forEach((field) => fieldList.push(key + '.' + field)); + }); + //Now query all the fields for this object where FHT is already enabled + SFPLogger.log( + `Gathering fields which are already enabled with trackHistory on target org....`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log('FHT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) + let fhtFieldsInOrg = await QueryHelper.query<{ + QualifiedApiName: string; + EntityDefinition: any; + IsFieldHistoryTracked: boolean; + }>(QUERY_BODY + '(' + objList + ')', conn, true); + + //Clear of the fields that alread has FHT applied and keep a reduced filter + fhtFieldsInOrg.map((record) => { + let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; + const index = fieldList.indexOf(field); + if (index > -1) { + fieldList.splice(index, 1); + } + }); + + if (fieldList.length > 0) { + //Now retrieve the fields from the org + let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); + let sfpOrg = await SFPOrg.create({ connection: conn }); + let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); + + + + //Modify the component set + //Parsing is risky due to various encoding, so do an inplace replacement + for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { + let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); + + metadataOfComponent = metadataOfComponent.replace( + 'false', + 'true' + ); + + + + fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); + } + + return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; + } else SFPLogger.log(`No fields are required to be updated, skipping update of Field History Tracking`, LoggerLevel.INFO, logger); + } + + public getName(): string { + return 'Field History Tracking Enabler'; + } +} + +interface CustomField { + QualifiedApiName: string; + IsFieldHistoryTracked: boolean; + EntityDefinitionId: string; +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FTEnabler.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FTEnabler.ts new file mode 100644 index 000000000..3daa6708b --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FTEnabler.ts @@ -0,0 +1,107 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import * as fs from 'fs-extra'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SfpPackage from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import { Schema } from 'jsforce'; +import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; +import SFPOrg from '../../org/SFPOrg'; +import path from 'path'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import { TestLevel } from '../../apextest/TestOptions'; +import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; + +const QUERY_BODY = + 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFeedEnabled = true AND EntityDefinitionId IN '; + +export default class FTEnabler extends MetdataDeploymentCustomizer { + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg) return false; + + if ( + sfpPackage['isFTFieldFound'] && + (sfpPackage.packageDescriptor.enableFT == undefined || sfpPackage.packageDescriptor.enableFT == true) + ) { + return true; + } + } + + public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise + { + return { + ignoreWarnings:true, + waitTime:waitTime, + apiVersion:apiVersion, + testLevel : TestLevel.RunSpecifiedTests, + specifiedTests :'skip', + rollBackOnError:true + } + } + + public async gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + //First retrieve all objects/fields of interest from the package + let objList = []; + let fieldList = []; + Object.keys(sfpPackage['ftFields']).forEach((key) => { + objList.push(`'${key}'`); + sfpPackage['ftFields'][key].forEach((field) => fieldList.push(key + '.' + field)); + }); + //Now query all the fields for this object where FT is already enabled + SFPLogger.log( + `Gathering fields which are already enabled with feed traking in the target org....`, + LoggerLevel.INFO, + logger + ); + + SFPLogger.log('FT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) + let ftFieldsInOrg = await QueryHelper.query<{ + QualifiedApiName: string; + EntityDefinition: any; + IsFeedEnabled: boolean; + }>(QUERY_BODY + '(' + objList + ')', conn, true); + + //Clear of the fields that alread has FT applied and keep a reduced filter + ftFieldsInOrg.map((record) => { + let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; + const index = fieldList.indexOf(field); + if (index > -1) { + fieldList.splice(index, 1); + } + }); + + if (fieldList.length > 0) { + //Now retrieve the fields from the org + let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); + let sfpOrg = await SFPOrg.create({ connection: conn }); + let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); + + //Modify the component set + //Parsing is risky due to various encoding, so do an inplace replacement + for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { + let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); + + metadataOfComponent = metadataOfComponent.replace( + 'false', + 'true' + ); + + fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); + } + + return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; + } else SFPLogger.log(`No fields are required to be updated,skipping updates to Feed History tracking`, LoggerLevel.INFO, logger); + } + + public getName(): string { + return 'Feed Tracking Enabler'; + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts new file mode 100644 index 000000000..1c524e287 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts @@ -0,0 +1,83 @@ +import { Connection } from "@salesforce/core"; +import DeploySourceToOrgImpl, { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; +import SfpPackage from "../SfpPackage"; +import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; +import SFPLogger,{COLOR_KEY_MESSAGE,Logger,LoggerLevel} from "@flxblio/sfp-logger" +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import SFPOrg from "../../org/SFPOrg"; +import DeploymentExecutor, { DeploySourceResult } from "../../deployers/DeploymentExecutor"; +import PackageComponentPrinter from "../../display/PackageComponentPrinter"; +import DeployErrorDisplayer from "../../display/DeployErrorDisplayer"; + +export abstract class MetdataDeploymentCustomizer implements DeploymentCustomizer +{ + abstract gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet: ComponentSet, conn: Connection, logger: Logger): Promise<{ location: string; componentSet: ComponentSet; }>; + abstract isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise; + abstract getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise; + abstract getName(): string; + + + async execute(sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg:SFPOrg, + logger: Logger, + deploymentContext:DeploymentContext + ):Promise + { + if (await this.isEnabled(sfpPackage, sfpOrg.getConnection(), logger)) { + SFPLogger.log( + `Executing Post Deployer ${COLOR_KEY_MESSAGE(this.getName())}`, + LoggerLevel.INFO, + logger + ); + let modifiedPackage = await this.gatherComponentsToBeDeployed( + sfpPackage, + componentSet, + sfpOrg.getConnection(), + logger + ); + + //Check if there are components to be deployed + //Asssume its sucessfully deployed + if (!modifiedPackage || modifiedPackage.componentSet.getSourceComponents().toArray().length == 0) { + return { + deploy_id: `000000`, + result: true, + message: `No deployment required`, + }; + } + + + //deploy the fht enabled components to the org + let deploymentOptions = await this.getDeploymentOptions( + sfpOrg.getUsername(), + deploymentContext.waitTime, + deploymentContext.apiVersion + ); + + //Print components inside Component Set + let components = modifiedPackage.componentSet.getSourceComponents(); + PackageComponentPrinter.printComponentTable(components, logger); + + let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( + sfpOrg, + modifiedPackage.location, + modifiedPackage.componentSet, + deploymentOptions, + logger + ); + + let result = await deploySourceToOrgImpl.exec(); + if (!result.result) { + DeployErrorDisplayer.displayErrors(result.response, logger); + } + return result; + } else { + SFPLogger.log( + `Post Deployer ${COLOR_KEY_MESSAGE(this.getName())} skipped or not enabled`, + LoggerLevel.INFO, + logger + ); + } + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts new file mode 100644 index 000000000..b17b48be5 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts @@ -0,0 +1,218 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import { DeploymentContext, DeploymentCustomizer } from './DeploymentCustomizer'; +import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; +import SFPOrg from '../../org/SFPOrg'; +import { Schema } from 'jsforce'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; + +const QUERY_BODY = 'SELECT Id FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '; + +export default class PicklistEnabler implements DeploymentCustomizer { + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + if (sfpPackage.packageType === PackageType.Unlocked) { + if ( + sfpPackage.isPickListsFound && + (sfpPackage.packageDescriptor.enablePicklist == undefined || + sfpPackage.packageDescriptor.enablePicklist == true) + ) { + return true; + } + } else return false; + } + + async execute( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg: SFPOrg, + logger: Logger, + deploymentContext: DeploymentContext + ): Promise { + try { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let components = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name == registry.types.customobject.name) { + components.push(...sourceComponent.getChildren()); + } + + if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { + components.push(sourceComponent); + } + } + + if (components) { + for (const fieldComponent of components) { + let customField = fieldComponent.parseXmlSync().CustomField; + //check for empty picklists + if ( + !customField || + customField['type'] !== 'Picklist' || + !customField.valueSet?.valueSetDefinition + ) { + continue; + } + //no updates for custom metadata picklists + if (customField['fieldManageability']) continue; + + let objName = fieldComponent.parent.fullName; + let picklistName = fieldComponent.name; + let urlId = + QUERY_BODY + "'" + objName + "'" + ' AND QualifiedApiName = ' + "'" + picklistName + "'"; + + let picklistValueSource = await this.getPicklistSource(customField); + + SFPLogger.log( + `Fetching picklist for custom field ${picklistName} on object ${objName}`, + LoggerLevel.INFO, + logger + ); + + let picklistInOrg = await this.getPicklistInOrg(urlId, sfpOrg.getConnection()); + + //check for empty picklists on org and fix first deployment issue + if (!picklistInOrg?.Metadata?.valueSet?.valueSetDefinition) { + SFPLogger.log( + `Picklist field ${objName}.${picklistName} not in target Org. Skipping`, + LoggerLevel.TRACE, + logger + ); + continue; + } + + + let picklistValueInOrg = []; + + for (const value of picklistInOrg.Metadata.valueSet.valueSetDefinition.value) { + //ignore inactive values from org + if (value.isActive == false) { + continue; + } + + let valueInfo: { [key: string]: string } = {}; + valueInfo.fullName = value['valueName']; + decodeURIComponent(valueInfo.fullName); + valueInfo.label = value['label']; + decodeURIComponent(valueInfo.label); + valueInfo.default = value['default'] && value['default'] === true ? 'true' : 'false'; + picklistValueInOrg.push(valueInfo); + } + + let isPickListIdentical = this.arePicklistsIdentical(picklistValueInOrg, picklistValueSource); + + if (!isPickListIdentical) { + this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger); + } else { + SFPLogger.log( + `Picklist for custom field ${objName}.${picklistName} is identical to the source.No deployment`, + LoggerLevel.INFO, + logger + ); + } + } + + return { + deploy_id: `000000`, + result: true, + message: `Patched Picklists`, + }; + } + } catch (error) { + SFPLogger.log(`Unable to process Picklist update due to ${error.message}`, LoggerLevel.WARN, logger); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + } + + private async getPicklistInOrg(urlId: string, conn: Connection): Promise { + let response = await QueryHelper.query(urlId, conn, true); + + if (response && Array.isArray(response) && response.length > 0 && response[0].attributes) { + let responseUrl = response[0].attributes.url; + let fieldId = responseUrl.slice(responseUrl.lastIndexOf('.') + 1); + let responsePicklist = await conn.tooling.sobject('CustomField').find({ Id: fieldId }); + + if (responsePicklist) { + return responsePicklist[0]; + } + } + } + + gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + throw new Error('Method not implemented.'); + } + getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise { + throw new Error('Method not implemented.'); + } + + private async getPicklistSource(customField: any): Promise { + let picklistValueSet = []; + let values = customField.valueSet?.valueSetDefinition?.value; + //only push values when picklist > 1 or exactly 1 value + if (Array.isArray(values)) { + for (const value of values) { + //ignore inactive values from source + if(!value?.isActive || value?.isActive == 'true'){ + picklistValueSet.push({fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'] , default: value.default, label: value['label'] ? decodeURI(value['label']) : value['label']}); + } + } + } else if (typeof values === 'object' && 'fullName' in values) { + //ignore inactive values from source + if(!values?.isActive || values?.isActive == 'true'){ + picklistValueSet.push({fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'] , default: values.default, label: values['label'] ? decodeURI(values['label']) : values['label']}); + } + } + return picklistValueSet; + } + + private arePicklistsIdentical(picklistValueInOrg: any[], picklistValueSource: any[]): boolean { + return ( + picklistValueInOrg.length === picklistValueSource.length && + picklistValueInOrg.every((element_1) => + picklistValueSource.some( + (element_2) => + element_1.fullName === element_2.fullName && + element_1.label === element_2.label && + element_1.default === element_2.default + ) + ) + ); + } + + private async deployPicklist(picklistInOrg: any, picklistValueSource: any, conn: Connection, logger: Logger) { + //empty the the old value set + picklistInOrg.Metadata.valueSet.valueSetDefinition.value = []; + picklistValueSource.map((value) => { + picklistInOrg.Metadata.valueSet.valueSetDefinition.value.push(value); + }); + picklistInOrg.Metadata.valueSet.valueSettings = []; + + let picklistToDeploy: any; + picklistToDeploy = { + attributes: picklistInOrg.attributes, + Id: picklistInOrg.Id, + Metadata: picklistInOrg.Metadata, + FullName: picklistInOrg.FullName, + }; + SFPLogger.log(`Update picklist for custom field ${picklistToDeploy.FullName}`, LoggerLevel.INFO, logger); + try { + await conn.tooling.sobject('CustomField').update(picklistToDeploy); + } catch (error) { + throw new Error( + `Unable to update picklist for custom field ${picklistToDeploy.FullName} due to ${error.message}` + ); + } + } + + public getName(): string { + return 'Picklist Enabler'; + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts new file mode 100644 index 000000000..d2ac675f6 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts @@ -0,0 +1,18 @@ +import { DeploymentCustomizer } from './DeploymentCustomizer'; +import FHTEnabler from './FHTEnabler'; +import FTEnabler from './FTEnabler'; + + +export class PostDeployersRegistry { + static getPostDeployers(): DeploymentCustomizer[] { + let postDeployers: DeploymentCustomizer[] = []; + + //TODO: Make dynamic + let fhtEnabler = new FHTEnabler(); + let ftEnabler = new FTEnabler(); + postDeployers.push(fhtEnabler); + postDeployers.push(ftEnabler); + + return postDeployers; + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts new file mode 100644 index 000000000..2e423cbc9 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts @@ -0,0 +1,14 @@ +import { DeploymentCustomizer } from './DeploymentCustomizer'; +import PicklistEnabler from './PicklistEnabler'; + + +export class PreDeployersRegistry { + static getPreDeployers(): DeploymentCustomizer[] { + let preDeployers: DeploymentCustomizer[] = []; + + let picklistEnabler = new PicklistEnabler(); + preDeployers.push(picklistEnabler); + + return preDeployers; + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilter.ts b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilter.ts new file mode 100644 index 000000000..47290e189 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilter.ts @@ -0,0 +1,13 @@ +import { ComponentSet } from "@salesforce/source-deploy-retrieve"; +import { Logger } from "@flxblio/sfp-logger"; +import SFPOrg from "../../org/SFPOrg"; +import { PackageType } from "../SfpPackage"; + +export interface DeploymentFilter +{ + apply(org: SFPOrg, componentSet: ComponentSet,logger:Logger):Promise; + isToApply(projectConfig: any,packageType:string): boolean; + +} + + diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts new file mode 100644 index 000000000..4e5721e2f --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts @@ -0,0 +1,18 @@ +import { DeploymentFilter } from './DeploymentFilter'; +import EntitlementVersionFilter from './EntitlementVersionFilter'; + + + + +export class DeploymentFilterRegistry { + static getImplementations(): DeploymentFilter[] { + let deploymentFilterImpls: DeploymentFilter[] = []; + + //TODO: Make dynamic + let entitlementVersionFilter = new EntitlementVersionFilter(); + deploymentFilterImpls.push(entitlementVersionFilter); + + + return deploymentFilterImpls; + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts b/packages/sfp-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts new file mode 100644 index 000000000..47d9399c8 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts @@ -0,0 +1,110 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SFPOrg from '../../org/SFPOrg'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { DeploymentFilter } from './DeploymentFilter'; +import * as fs from 'fs-extra'; +import SettingsFetcher from '../../metadata/SettingsFetcher'; +import { PackageType } from '../SfpPackage'; +const { XMLBuilder } = require('fast-xml-parser'); + +const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`; +const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`; + +export default class EntitlementVersionFilter implements DeploymentFilter { + + public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { + //Only do if entitlment exits in the package + let sourceComponents = componentSet.getSourceComponents().toArray(); + let isEntitlementFound: boolean = false; + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.entitlementprocess.name) { + isEntitlementFound = true; + break; + } + } + if (!isEntitlementFound) return componentSet; + + try { + let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`); + + let query; + if (entitlementSettings.enableEntitlementVersioning == true) { + SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger); + query = EXISTING_SLAPPROCESS_QUERY; + } else { + SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger); + query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING; + } + + SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger); + //Fetch Entitlements currently in the org + let slaProcessesInOrg = await QueryHelper.query(query, org.getConnection(), false); + let modifiedComponentSet = new ComponentSet(); + //Compare version numbers in the org vs version in the component set + //Remove if the version numbers match + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.entitlementprocess.name) { + let slaProcessLocal = sourceComponent.parseXmlSync(); + + let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find( + (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name'] + ); + + if ( + slaProcessMatchedByName && + entitlementSettings.enableEntitlementVersioning && + slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber + ) { + //This is a deployment candidate + //Modify versionMaster tag to match in the org + slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster; + let builder = new XMLBuilder({ + format: true, + ignoreAttributes: false, + attributeNamePrefix: '@_', + }); + let xmlContent = builder.build(slaProcessLocal); + fs.writeFileSync(sourceComponent.xml, xmlContent); + modifiedComponentSet.add(sourceComponent); + } else if (slaProcessMatchedByName) { + SFPLogger.log( + `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`, + LoggerLevel.INFO, + logger + ); + } else { + //Doesnt exist, deploy + modifiedComponentSet.add(sourceComponent); + } + } else { + modifiedComponentSet.add(sourceComponent); + } + } + + SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger); + return modifiedComponentSet; + } catch (error) { + SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger); + return componentSet; + } + } + + public isToApply(projectConfig: any, packageType: string): boolean { + if (packageType != PackageType.Source) return false; + + if (projectConfig?.plugins?.sfp?.disableEntitlementFilter) return false; + else return true; + } + + + + +} + +interface SlaProcess { + Name: string; + NameNorm: string; + VersionNumber: string; + VersionMaster: string; +} diff --git a/packages/sfp-cli/src/core/package/diff/PackageComponentDiff.ts b/packages/sfp-cli/src/core/package/diff/PackageComponentDiff.ts new file mode 100644 index 000000000..10bd597bd --- /dev/null +++ b/packages/sfp-cli/src/core/package/diff/PackageComponentDiff.ts @@ -0,0 +1,424 @@ +import * as xml2js from 'xml2js'; +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as rimraf from 'rimraf'; +import * as _ from 'lodash'; +import simplegit from 'simple-git'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ProjectConfig from '../../project/ProjectConfig'; +import MetadataFiles from '../../metadata/MetadataFiles'; +import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo'; +import { MetadataResolver } from '@salesforce/source-deploy-retrieve'; +import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil'; + +const deleteNotSupported = ['RecordType']; +const git = simplegit(); +let sfdxManifest; + +export default class PackageComponentDiff { + private gitDiffUtils: GitDiffUtils; + + destructivePackageObjPre: any[]; + destructivePackageObjPost: any[]; + resultOutput: { + action: string; + metadataType: string; + componentName: string; + message: string; + path: string; + }[]; + public constructor( + private logger: Logger, + private sfdxPackage: string, + private revisionFrom?: string, + private revisionTo?: string, + private isDestructive?: boolean + ) { + if (this.revisionTo == null || this.revisionTo.trim() === '') { + this.revisionTo = 'HEAD'; + } + if (this.revisionFrom == null) { + this.revisionFrom = ''; + } + this.destructivePackageObjPost = []; + this.destructivePackageObjPre = []; + this.resultOutput = []; + + sfdxManifest = ProjectConfig.getSFDXProjectConfig(null); + this.gitDiffUtils = new GitDiffUtils(); + } + + public async build(outputFolder: string) { + rimraf.sync(outputFolder); + + const sepRegex = /\n|\r/; + let data = ''; + + //check if same commit + const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]); + const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]); + if (commitFrom === commitTo) { + throw new Error(`Unable to compute diff, as both commits are same`); + } + //Make it relative to make the command works from a project created as a subfolder in a repository + data = await git.diff([ + '--raw', + this.revisionFrom, + this.revisionTo, + '--relative', + ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path, + ]); + + let content = data.split(sepRegex); + let diffFile: DiffFile = await this.parseContent(content); + await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger); + + let filesToCopy = diffFile.addedEdited; + let deletedFiles = diffFile.deleted; + + deletedFiles = deletedFiles.filter((deleted) => { + let found = false; + let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path); + for (let i = 0; i < filesToCopy.length; i++) { + let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path); + if (deletedMetadata === addedOrEdited) { + found = true; + break; + } + } + return !found; + }); + + if (fs.existsSync(outputFolder) == false) { + fs.mkdirSync(outputFolder); + } + + const resolver = new MetadataResolver(); + + if (filesToCopy && filesToCopy.length > 0) { + for (let i = 0; i < filesToCopy.length; i++) { + + try { + let filePath = filesToCopy[i].path; + + let sourceComponents = resolver.getComponentsFromPath(filePath); + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + if(path.extname(sourceComponent.content)) + await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); + else + await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) { + await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); + } else { + await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); + } + } + } catch (error) { + + if(error.message.includes(`Unable to find the required file`)) + throw error; + + //Metadata resolver is not respecting forceignores at this stage + // So it fails on diff packages with post deploy, so lets ignore and move on + SFPLogger.log( + `Error while inferencing type of ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`, + LoggerLevel.TRACE, + this.logger + ); + } + } + } + + if (this.isDestructive) { + SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger); + await this.createDestructiveChanges(deletedFiles, outputFolder); + } + + //Folder is empty after all this operations, return without copying additional files + if (fs.readdirSync(outputFolder).length === 0) { + rimraf.sync(outputFolder); + return null; + } + + SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger); + + return this.resultOutput; + } + + //TODO: Refactor using proper ignore + private checkForIngore(pathToIgnore: any[], filePath: string) { + pathToIgnore = pathToIgnore || []; + if (pathToIgnore.length === 0) { + return true; + } + + let returnVal = true; + pathToIgnore.forEach((ignore) => { + if ( + path.resolve(ignore) === path.resolve(filePath) || + path.resolve(filePath).includes(path.resolve(ignore)) + ) { + returnVal = false; + } + }); + return returnVal; + } + + private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) { + if (_.isNil(this.destructivePackageObjPost)) { + this.destructivePackageObjPost = []; + } else { + this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => { + return !_.isNil(metaType.members) && metaType.members.length > 0; + }); + } + this.destructivePackageObjPre = []; + //returns root, dir, base and name + for (let i = 0; i < filePaths.length; i++) { + let filePath = filePaths[i].path; + try { + let matcher = filePath.match(SOURCE_EXTENSION_REGEX); + let extension = ''; + if (matcher) { + extension = matcher[0]; + } else { + extension = path.parse(filePath).ext; + } + + let name = MetadataInfo.getMetadataName(filePath); + + if (name) { + if (!MetadataFiles.isCustomMetadata(filePath, name)) { + // avoid to generate destructive for Standard Components + //Support on Custom Fields and Custom Objects for now + + this.resultOutput.push({ + action: 'Skip', + componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name), + metadataType: 'StandardField/CustomMetadata', + message: '', + path: '--', + }); + + continue; + } + let member = MetadataFiles.getMemberNameFromFilepath(filePath, name); + if (name === METADATA_INFO.CustomField.xmlName) { + let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], ''); + if (isFormular) { + this.destructivePackageObjPre = this.buildDestructiveTypeObj( + this.destructivePackageObjPre, + name, + member + ); + + SFPLogger.log( + `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, + LoggerLevel.DEBUG, + this.logger + ); + + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'Manual Intervention Required', + }); + } else { + this.destructivePackageObjPost = this.buildDestructiveTypeObj( + this.destructivePackageObjPost, + name, + member + ); + } + SFPLogger.log( + `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, + LoggerLevel.DEBUG, + this.logger + ); + + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'destructiveChanges.xml', + }); + } else { + if (!deleteNotSupported.includes(name)) { + this.destructivePackageObjPost = this.buildDestructiveTypeObj( + this.destructivePackageObjPost, + name, + member + ); + this.resultOutput.push({ + action: 'Delete', + componentName: member, + metadataType: name, + message: '', + path: 'destructiveChanges.xml', + }); + } else { + //add the component in the manual action list + // TODO + } + } + } + } catch (ex) { + this.resultOutput.push({ + action: 'ERROR', + componentName: '', + metadataType: '', + message: ex.message, + path: filePath, + }); + } + } + + this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml'); + } + + private writeDestructivechanges(destrucObj: Array, outputFolder: string, fileName: string) { + //ensure unique component per type + for (let i = 0; i < destrucObj.length; i++) { + destrucObj[i].members = _.uniq(destrucObj[i].members); + } + destrucObj = destrucObj.filter((metaType) => { + return metaType.members && metaType.members.length > 0; + }); + + if (destrucObj.length > 0) { + let dest = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: destrucObj, + }, + }; + + let destructivePackageName = fileName; + let filepath = path.join(outputFolder, destructivePackageName); + let builder = new xml2js.Builder(); + let xml = builder.buildObject(dest); + fs.writeFileSync(filepath, xml); + } + } + + private buildDestructiveTypeObj(destructiveObj, name, member) { + let typeIsPresent = false; + for (let i = 0; i < destructiveObj.length; i++) { + if (destructiveObj[i].name === name) { + typeIsPresent = true; + destructiveObj[i].members.push(member); + break; + } + } + let typeNode: any; + if (typeIsPresent === false) { + typeNode = { + name: name, + members: [member], + }; + destructiveObj.push(typeNode); + } + return destructiveObj; + } + + private async parseContent(fileContents): Promise { + const statusRegEx = /\sA\t|\sM\t|\sD\t/; + const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/; + const tabRegEx = /\t/; + const deletedFileRegEx = new RegExp(/\sD\t/); + const lineBreakRegEx = /\r?\n|\r|( $)/; + + let metadataFiles = new MetadataFiles(); + + let diffFile: DiffFile = { + deleted: [], + addedEdited: [], + }; + + for (let i = 0; i < fileContents.length; i++) { + if (statusRegEx.test(fileContents[i])) { + let lineParts = fileContents[i].split(statusRegEx); + + let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, '')); + finalPath = finalPath.trim(); + finalPath = finalPath.replace('\\303\\251', 'é'); + + if (!(await metadataFiles.isInModuleFolder(finalPath))) { + continue; + } + + if (!metadataFiles.accepts(finalPath)) { + continue; + } + + let revisionPart = lineParts[0].split(/\t|\s/); + + if (deletedFileRegEx.test(fileContents[i])) { + //Deleted + diffFile.deleted.push({ + revisionFrom: revisionPart[2].substring(0, 9), + revisionTo: revisionPart[3].substring(0, 9), + path: finalPath, + }); + } else { + // Added or edited + diffFile.addedEdited.push({ + revisionFrom: revisionPart[2].substring(0, 9), + revisionTo: revisionPart[3].substring(0, 9), + path: finalPath, + }); + } + } else if (renamedRegEx.test(fileContents[i])) { + let lineParts = fileContents[i].split(renamedRegEx); + + let paths = lineParts[1].trim().split(tabRegEx); + + let finalPath = path.join('.', paths[1].trim()); + finalPath = finalPath.replace('\\303\\251', 'é'); + let revisionPart = lineParts[0].split(/\t|\s/); + + if (!(await metadataFiles.isInModuleFolder(finalPath))) { + continue; + } + + if (!metadataFiles.accepts(paths[0].trim())) { + continue; + } + + diffFile.addedEdited.push({ + revisionFrom: '0000000', + revisionTo: revisionPart[3], + renamedPath: path.join('.', paths[0].trim()), + path: finalPath, + }); + + //allow deletion of renamed components + diffFile.deleted.push({ + revisionFrom: revisionPart[2], + revisionTo: '0000000', + path: paths[0].trim(), + }); + } + } + return diffFile; + } +} +enum AdapterId { + Bundle = 'bundle', + Decomposed = 'decomposed', + Default = 'default', + MatchingContentFile = 'matchingContentFile', + MixedContent = 'mixedContent', +} diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts new file mode 100644 index 000000000..e620bf96c --- /dev/null +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -0,0 +1,166 @@ +const fs = require('fs'); +const path = require('path'); +import Git from '../../git/Git'; +import IgnoreFiles from '../../ignore/IgnoreFiles'; +import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ProjectConfig from '../../project/ProjectConfig'; +import GitTags from '../../git/GitTags'; +import lodash = require('lodash'); +import { EOL } from 'os'; +import { PackageType } from '../SfpPackage'; + +export class PackageDiffOptions { + skipPackageDescriptorChange?: boolean = false; + //If not set, utlize latest git tags + useLatestGitTags?:boolean=true; + packagesMappedToLastKnownCommitId?: { [p: string]: string }; + pathToReplacementForceIgnore?: string; +} + +export default class PackageDiffImpl { + public constructor( + private logger: Logger, + private sfdx_package: string, + private project_directory: string|null, + private diffOptions?: PackageDiffOptions + ) {} + + public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> { + let git: Git = await Git.initiateRepo(this.logger,this.project_directory); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory); + let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`, + ), + LoggerLevel.TRACE, + this.logger + ); + + let tag: string; + if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) { + tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId); + } else { + tag = await this.getLatestTagFromGit(git, this.sfdx_package); + } + + if (tag) { + SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger); + + // Get the list of modified files between the tag and HEAD refs + let modified_files: string[]; + try { + modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); + } catch (error) { + SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`)); + SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`)); + SFPLogger.log(COLOR_ERROR(`Actual error received:`)); + SFPLogger.log(COLOR_ERROR(error)); + throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`) + } + + let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package); + + if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files); + + SFPLogger.log( + `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`, + LoggerLevel.TRACE, + this.logger + ); + + // Check whether the package has been modified + for (let filename of modified_files) { + + let normalizedPkgPath = path.normalize(pkgDescriptor.path); + let normalizedFilename = path.normalize(filename); + + let relativePath = path.relative(normalizedPkgPath, normalizedFilename); + + if (!relativePath.startsWith('..')) { + SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger); + return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag }; + } + } + + SFPLogger.log( + `Checking for changes to package descriptor in sfdx-project.json`, + LoggerLevel.TRACE, + this.logger + ); + let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor); + if (isPackageDescriptorChanged) { + return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag }; + } + + return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; + } else { + SFPLogger.log( + `Tag missing for ${this.sfdx_package}...marking package for build anyways`, + LoggerLevel.TRACE, + this.logger + ); + return { isToBeBuilt: true, reason: `Previous version not found` }; + } + } + + private applyForceIgnoreToModifiedFiles(modified_files: string[]) { + let forceignorePath: string; + if (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore; + else if (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore'); + else forceignorePath = '.forceignore'; + + let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString()); + + // Filter the list of modified files with .forceignore + modified_files = ignoreFiles.filter(modified_files); + + return modified_files; + } + + private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise { + const gitTags: GitTags = new GitTags(git, sfdx_package); + let tags: string[] = await gitTags.listTagsOnBranch(); + + SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG); + if (tags.length > 10) { + SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); + } else { + SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); + } + + return tags.pop(); + } + + private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise { + let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]); + let projectConfig = JSON.parse(projectConfigJson); + + let packageDescriptorFromLatestTag: string; + for (let dir of projectConfig['packageDirectories']) { + if (this.sfdx_package === dir.package) { + packageDescriptorFromLatestTag = dir; + } + } + + if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) { + SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger); + + //skip check and ignore + if (this.diffOptions?.skipPackageDescriptorChange) { + SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger); + return false; + } else return true; + } else return false; + } + + private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string { + if (packagesToCommits[sfdx_package] != null) { + return packagesToCommits[sfdx_package]; + } else { + return null; + } + } +} diff --git a/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts b/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts new file mode 100644 index 000000000..cf5e58c58 --- /dev/null +++ b/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts @@ -0,0 +1,301 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import * as rimraf from 'rimraf'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { mkdirpSync } from 'fs-extra'; +import * as fs from 'fs-extra'; +import PackageComponentDiff from '../diff/PackageComponentDiff'; +let path = require('path'); + +export default class SfpPackageContentGenerator { + public static isPreDeploymentScriptAvailable: boolean = false; + public static isPostDeploymentScriptAvailable: boolean = false; + + public static async generateSfpPackageDirectory( + logger: Logger, + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + packageDirectory: string, + versionNumber:string, + destructiveManifestFilePath?: string, + configFilePath?: string, + pathToReplacementForceIgnore?: string, + revisionFrom?: string, + revisionTo?: string + ): Promise { + let artifactDirectory: string = `.sfp/${this.makefolderid(5)}_source`, + rootDirectory: string; + + if (projectDirectory) { + rootDirectory = projectDirectory; + } else { + rootDirectory = ''; + } + + if (packageDirectory == null) packageDirectory = ''; + + mkdirpSync(artifactDirectory); + + //Ensure the directory is clean + rimraf.sync(path.join(artifactDirectory, packageDirectory)); + + //Create a new directory + fs.mkdirsSync(path.join(artifactDirectory, packageDirectory)); + + SfpPackageContentGenerator.createScripts(artifactDirectory, rootDirectory, sfdx_package); + + SfpPackageContentGenerator.createForceIgnores(artifactDirectory, rootDirectory); + + + if (pathToReplacementForceIgnore) + SfpPackageContentGenerator.replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger); + + if (destructiveManifestFilePath) { + SfpPackageContentGenerator.copyDestructiveManifests( + destructiveManifestFilePath, + artifactDirectory, + rootDirectory, + logger + ); + } + + if (configFilePath) { + SfpPackageContentGenerator.copyConfigFilePath(configFilePath, artifactDirectory, rootDirectory, logger); + } + + SfpPackageContentGenerator.handleUnpackagedMetadata( + sfdx_package, + projectConfig, + rootDirectory, + artifactDirectory + ); + + SfpPackageContentGenerator.createPackageManifests( + artifactDirectory, + rootDirectory, + projectConfig, + sfdx_package, + versionNumber + ); + + fs.copySync(path.join(rootDirectory, packageDirectory), path.join(artifactDirectory, packageDirectory)); + + return artifactDirectory; + } + + private static handleUnpackagedMetadata( + sfdx_package: string, + projectConfig: any, + rootDirectory: string, + artifactDirectory: string + ) { + const packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdx_package, projectConfig); + if (packageDescriptor.unpackagedMetadata?.path) { + if (fs.pathExistsSync(packageDescriptor.unpackagedMetadata.path)) { + let unpackagedMetadataDir: string = path.join(artifactDirectory, `unpackagedMetadata`); + mkdirpSync(unpackagedMetadataDir); + fs.copySync(path.join(rootDirectory, packageDescriptor.unpackagedMetadata.path), unpackagedMetadataDir); + } else { + throw new Error(`unpackagedMetadata ${packageDescriptor.unpackagedMetadata.path} does not exist`); + } + } + } + + private static createPackageManifests( + artifactDirectory: string, + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + versionNumber:string + ) { + // Create pruned package manifest in source directory + let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdx_package); + + //Ensure version numbers are used from + cleanedUpProjectManifest.packageDirectories[0].versionNumber=versionNumber + + //Handle unpackaged metadata + if (fs.existsSync(path.join(artifactDirectory, 'unpackagedMetadata'))) { + cleanedUpProjectManifest.packageDirectories[0].unpackagedMetadata.path = path.join('unpackagedMetadata'); + cleanedUpProjectManifest.packageDirectories.push({ path: path.join('unpackagedMetadata'), default: false }); + } + + //Setup preDeployment Script Path + if (fs.existsSync(path.join(artifactDirectory, 'scripts', `preDeployment`))) + cleanedUpProjectManifest.packageDirectories[0].preDeploymentScript = path.join('scripts', `preDeployment`); + + //Setup postDeployment Script Path + if (fs.existsSync(path.join(artifactDirectory, 'scripts', `postDeployment`))) + cleanedUpProjectManifest.packageDirectories[0].postDeploymentScript = path.join( + 'scripts', + `postDeployment` + ); + + fs.writeFileSync(path.join(artifactDirectory, 'sfdx-project.json'), JSON.stringify(cleanedUpProjectManifest)); + + // Copy original package manifest + let manifestsDir: string = path.join(artifactDirectory, `manifests`); + mkdirpSync(manifestsDir); + fs.copySync(path.join(projectDirectory, 'sfdx-project.json'), path.join(manifestsDir, 'sfdx-project.json.ori')); + } + + /** + * Create scripts directory containing preDeploy & postDeploy + * @param artifactDirectory + * @param projectDirectory + * @param sfdx_package + */ + private static createScripts(artifactDirectory: string, projectDirectory: string, sfdx_package): void { + let scriptsDir: string = path.join(artifactDirectory, `scripts`); + mkdirpSync(scriptsDir); + + let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(projectDirectory, sfdx_package); + + if (packageDescriptor.preDeploymentScript) { + if (projectDirectory) + packageDescriptor.preDeploymentScript = path.join( + projectDirectory, + packageDescriptor.preDeploymentScript + ); + + if (fs.existsSync(packageDescriptor.preDeploymentScript)) { + fs.copySync(packageDescriptor.preDeploymentScript, path.join(scriptsDir, `preDeployment`)); + } else { + throw new Error(`preDeploymentScript ${packageDescriptor.preDeploymentScript} does not exist`); + } + } + + if (packageDescriptor.postDeploymentScript) { + if (projectDirectory) + packageDescriptor.postDeploymentScript = path.join( + projectDirectory, + packageDescriptor.postDeploymentScript + ); + + if (fs.existsSync(packageDescriptor.postDeploymentScript)) { + fs.copySync(packageDescriptor.postDeploymentScript, path.join(scriptsDir, `postDeployment`)); + } else { + throw new Error(`postDeploymentScript ${packageDescriptor.postDeploymentScript} does not exist`); + } + } + } + + /** + * Create root forceignore and forceignores directory containing ignore files for different stages + * @param artifactDirectory + * @param projectDirectory + */ + private static createForceIgnores(artifactDirectory: string, projectDirectory: string): void { + let forceIgnoresDir: string = path.join(artifactDirectory, `forceignores`); + mkdirpSync(forceIgnoresDir); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let ignoreFiles = projectConfig.plugins?.sfp?.ignoreFiles; + + //TODO: Make this readable + //This is a fix when sfppackage is used in stages where build is not involved + //So it has to be build from the root of the unzipped directory + //and whatever mentioned in .json is already translated + + let rootForceIgnore: string = path.join(projectDirectory, '.forceignore'); + let copyForceIgnoreForStage = (stage) => { + if (ignoreFiles?.[stage]) { + if (fs.existsSync(path.join(projectDirectory, ignoreFiles[stage]))) { + fs.copySync( + path.join(projectDirectory, ignoreFiles[stage]), + path.join(forceIgnoresDir, '.' + stage + 'ignore') + ); + } else if (fs.existsSync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'))) { + fs.copySync( + path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'), + path.join(forceIgnoresDir, '.' + stage + 'ignore') + ); + } else throw new Error(`${ignoreFiles[stage]} does not exist`); + } else fs.copySync(rootForceIgnore, path.join(forceIgnoresDir, '.' + stage + 'ignore')); + + //append additional entry to force ignore file + //TODO: Revisit the location + fs.appendFileSync( path.join(forceIgnoresDir, '.' + stage + 'ignore'),"\n**/postDeploy"); + }; + + let stages: string[] = ['prepare', 'validate', 'quickbuild', 'build']; + stages.forEach((stage) => copyForceIgnoreForStage(stage)); + + fs.copySync(rootForceIgnore, path.join(artifactDirectory, '.forceignore')); + } + + /** + * Replaces root forceignore with provided forceignore + * @param artifactDirectory + * @param pathToReplacementForceIgnore + */ + private static replaceRootForceIgnore( + artifactDirectory: string, + pathToReplacementForceIgnore: string, + logger: Logger + ): void { + if (fs.existsSync(pathToReplacementForceIgnore)) { + fs.copySync(pathToReplacementForceIgnore, path.join(artifactDirectory, '.forceignore')); + } else { + SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, logger); + SFPLogger.log( + 'Package creation will continue using the unchanged forceignore in the root directory', + LoggerLevel.INFO, + logger + ); + } + } + + private static copyDestructiveManifests( + destructiveManifestFilePath: string, + artifactDirectory: string, + projectDirectory: any, + logger: Logger + ) { + if (fs.existsSync(destructiveManifestFilePath)) { + try { + fs.mkdirsSync(path.join(artifactDirectory, 'destructive')); + fs.copySync( + path.join(projectDirectory, destructiveManifestFilePath), + path.join(artifactDirectory, 'destructive', 'destructiveChanges.xml') + ); + } catch (error) { + SFPLogger.log( + 'Unable to read/parse destructive manifest, Please check your artifacts, Will result in an error while deploying', + LoggerLevel.WARN, + logger + ); + } + } + } + + private static copyConfigFilePath( + configFilePath: string, + artifactDirectory: string, + projectDirectory: any, + logger: Logger + ) { + if (fs.existsSync(configFilePath)) { + try { + fs.mkdirsSync(path.join(artifactDirectory, 'config')); + fs.copySync( + path.join(projectDirectory, configFilePath), + path.join(artifactDirectory, 'config', 'project-scratch-def.json') + ); + } catch (error) { + SFPLogger.log(error, LoggerLevel.TRACE, logger); + SFPLogger.log('Utilizing default config file path', LoggerLevel.TRACE, logger); + } + } + } + + private static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfp-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts b/packages/sfp-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts new file mode 100644 index 000000000..5d59eadba --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts @@ -0,0 +1,86 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import path from 'path'; +import FileSystem from '../../utils/FileSystem'; +import { CreatePackage } from './CreatePackage'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; + +const SFDMU_CONFIG = 'export.json'; +const VLOCITY_CONFIG = 'VlocityComponents.yaml'; + +export default class CreateDataPackageImpl extends CreatePackage { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Data; + } + + isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean { + let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory)); + + let hasExportJson = files.find((file) => path.basename(file) === 'export.json'); + + let hasCsvFile = files.find((file) => path.extname(file) === '.csv'); + + let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config + + if(hasYAMLFile) return false; + + if (!hasExportJson || !hasCsvFile) return true; + else return false; + } + + preCreatePackage(sfpPackage) { + this.validateDataPackage(sfpPackage.resolvedPackageDirectory); + } + + createPackage(sfpPackage: SfpPackage) { + //Do Nothing, as no external calls or processing is required + } + + postCreatePackage(sfpPackage: SfpPackage) {} + + printAdditionalPackageSpecificHeaders() {} + + // Validate type of data package and existence of the correct configuration files + private validateDataPackage(packageDirectory: string) { + const files = FileSystem.readdirRecursive(packageDirectory); + let isSfdmu: boolean; + let isVlocity: boolean; + + for (const file of files) { + if (path.basename(file) === SFDMU_CONFIG) isSfdmu = true; + if (path.basename(file) === VLOCITY_CONFIG) isVlocity = true; + } + + if (isSfdmu && isVlocity) { + throw new Error( + `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration` + ); + } else if (isSfdmu) { + SFPLogger.log( + `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, + LoggerLevel.INFO, + this.logger + ); + } else if (isVlocity) { + SFPLogger.log( + `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, + LoggerLevel.INFO, + this.logger + ); + } else { + throw new Error( + `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` + ); + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts b/packages/sfp-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts new file mode 100644 index 000000000..e94b293ab --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts @@ -0,0 +1,271 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import SFPOrg from '../../org/SFPOrg'; +import CreateSourcePackageImpl from './CreateSourcePackageImpl'; +import PackageToComponent from '../components/PackageToComponent'; +import path from 'path'; +import * as fs from 'fs-extra'; +import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher'; +import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor'; +import PackageManifest from '../components/PackageManifest'; +import MetadataCount from '../components/MetadataCount'; +import * as rimraf from 'rimraf'; +import Component from '../../dependency/Component'; +import PackageComponentDiff from '../diff/PackageComponentDiff'; + +export default class CreateDiffPackageImp extends CreateSourcePackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Diff; + } + + printAdditionalPackageSpecificHeaders() {} + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + async preCreatePackage(sfpPackage: SfpPackage) { + const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); + + //Fetch Baseline commit from DevHub + let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg); + + if (this.packageCreationParams.revisionFrom) { + this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom; + } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) { + this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]; + } else { + this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion; + } + + if (this.packageCreationParams.revisionTo) { + this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo; + } else { + this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion; + } + } + + private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) { + let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts(); + let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts); + return packagesInstalledInOrgMappedToCommits; + } + + public async createPackage(sfpPackage: SfpPackage) { + //Unresolved SHAs can be same if the package is not installed in the org or is the same + if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) { + try { + let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff( + this.logger, + this.sfpPackage.packageName, + this.sfpPackage.commitSHAFrom, + this.sfpPackage.commitSHATo, + true + ); + await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff')); + } catch (error) { + //if both are same after git resolution.. just do nothing, treat is a normal source package + if (error.message.includes('Unable to compute diff, as both commits are same')) { + SFPLogger.log( + `Both commits are same, treating it as an empty package`, + LoggerLevel.WARN, + this.logger + ); + //Create an empty diff directory to force skip of packages + const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`); + fs.mkdirpSync(diffSrcDir); + } else throw error; + } + + await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger); + + await this.replaceSourceWithDiff( + sfpPackage.workingDirectory, + sfpPackage.packageDirectory, + `diff/${sfpPackage.packageDirectory}` + ); + + SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { + package: sfpPackage.packageName, + type: sfpPackage.packageType, + }); + } + } + + postCreatePackage(sfpPackage) {} + + private async replaceSourceWithDiff( + workingDirectory: string, + packageDirectory: string, + diffPackageDirectory: string + ) { + const srcDir = path.join(workingDirectory, packageDirectory); + const diffSrcDir = path.join(workingDirectory, diffPackageDirectory); + + // Check if src directories exist, if so remove them + if (fs.pathExistsSync(srcDir)) await fs.remove(srcDir); + + // Rename diff/src directory to src + if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir); + else { + // Ensure package directory exists + await fs.mkdirpSync(diffSrcDir); + await fs.move(diffSrcDir, srcDir); + } + + //check if destructiveChanges.xml exist in diff directory + const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml'); + if (fs.existsSync(destructiveChangesPath)) { + //Move destructiveChanges.xml to diff directory + await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml')); + } + //remove diffSrcDir + if (fs.pathExistsSync(path.join(workingDirectory, 'diff'))) + fs.removeSync(path.join(workingDirectory, 'diff')); + } + + async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) { + let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; + packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts); + + return packagesMappedToLastKnownCommitId; + + async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> { + const packagesToCommits: { [p: string]: string } = {}; + let jsonOverrides = {}; + + // Add an option to override diff package from during debugging + // Also useful for when the record is yet to be baselined + try { + const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8'); + jsonOverrides = JSON.parse(jsonData); + } catch (error) { + console.log('No JSON override file found or there is an error reading it'); + } + + // Merge the installedArtifacts data with the JSON overrides + if (installedArtifacts) { + installedArtifacts.forEach((artifact) => { + packagesToCommits[artifact.Name] = artifact.CommitId__c; + }); + } + + // Add additional packages from the JSON overrides that are not in installedArtifacts + Object.keys(jsonOverrides).forEach((pkgName) => { + if (!packagesToCommits.hasOwnProperty(pkgName)) { + packagesToCommits[pkgName] = jsonOverrides[pkgName]; + } + }); + + if (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; + + return packagesToCommits; + } + } + + private async introspectDiffPackageCreated( + sfpPackage: SfpPackage, + packageParams: SfpPackageParams, + logger: Logger + ): Promise { + let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff'); + if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) { + let changedComponents = new PackageToComponent( + sfpPackage.packageName, + path.join(workingDirectory, sfpPackage.packageDirectory) + ).generateComponents(); + + let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher( + sfpPackage, + changedComponents, + logger + ); + let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses(); + + //Convert again for finding the values in the diff package + let sourceToMdapiConvertor = new SourceToMDAPIConvertor( + workingDirectory, + sfpPackage.packageDescriptor.path, + sfpPackage.apiVersion, + logger + ); + + let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath; + + const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath); + + sfpPackage.payload = packageManifest.manifestJson; + sfpPackage.apexTestClassses = impactedTestClasses; + sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage( + changedComponents, + sfpPackage.apexClassesSortedByTypes + ); + sfpPackage.isApexFound = packageManifest.isApexInPackage(); + sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); + sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); + sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); + + sfpPackage.metadataCount = await MetadataCount.getMetadataCount( + workingDirectory, + sfpPackage.packageDescriptor.path + ); + rimraf.sync(mdapiDirPath); + } else { + //Souce Diff Directory is empty + sfpPackage.payload = {}; + sfpPackage.apexTestClassses = []; + sfpPackage.apexClassWithOutTestClasses = []; + sfpPackage.isApexFound = false; + sfpPackage.isProfilesFound = false; + sfpPackage.isPermissionSetGroupFound = false; + sfpPackage.isPayLoadContainTypesSupportedByProfiles = false; + sfpPackage.metadataCount = 0; + } + + function getOnlyChangedClassesFromPackage( + changedComponents: Component[], + apexClassesSortedByTypes: ApexSortedByType + ): string[] { + // Check if the parameters are not empty or undefined + if (!changedComponents || !apexClassesSortedByTypes) { + return undefined; + } + + // Check if the 'class' property exists in apexClassesSortedByTypes + if (!apexClassesSortedByTypes.class) { + return undefined; + } + + // Get the names of all classes in the ApexSortedByType + let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name); + let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name); + const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name); + apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name)); + apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name)); + + // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass' + const filteredComponents = changedComponents.filter( + (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass' + ); + + // Extract the fullName property from the filtered components + const filteredChangedClasses = filteredComponents.map((component) => component.fullName); + + return filteredChangedClasses; + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageCreators/CreatePackage.ts b/packages/sfp-cli/src/core/package/packageCreators/CreatePackage.ts new file mode 100644 index 000000000..4f5225b8d --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageCreators/CreatePackage.ts @@ -0,0 +1,146 @@ +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; + +export abstract class CreatePackage { + private startTime: number; + + constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams?: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + //Initialize Params + if (this.params == null) this.params = {}; + } + + public async exec(): Promise { + //Capture Start TimegetSFDXProjectConfig + this.startTime = Date.now(); + + //Print Header + this.printHeader(); + + //Check if the package is empty + await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path); + //Call lifecycle commands + await this.preCreatePackage(this.sfpPackage); + await this.createPackage(this.sfpPackage); + await this.postCreatePackage(this.sfpPackage); + + //Add addtional descriptors available + this.writeDeploymentStepsToArtifact(this.sfpPackage); + + //Send Metrics to Logging system + this.sendMetricsWhenSuccessfullyCreated(); + + return this.sfpPackage; + } + + abstract getTypeOfPackage(); + + abstract preCreatePackage(sfpPackage: SfpPackage); + abstract createPackage(sfpPackage: SfpPackage); + abstract postCreatePackage(sfpPackage: SfpPackage); + + private sendMetricsWhenSuccessfullyCreated() { + let elapsedTime = Date.now() - this.startTime; + + this.sfpPackage.creation_details = { + creation_time: elapsedTime, + timestamp: Date.now(), + }; + + if (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked) + SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + }); + + SFPStatsSender.logCount('package.created', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + + SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + is_dependency_validated: String(this.sfpPackage.isDependencyValidated), + }); + } + + private writeDeploymentStepsToArtifact(packageDescriptor: any) { + if (packageDescriptor.assignPermSetsPreDeployment) { + if (packageDescriptor.assignPermSetsPreDeployment instanceof Array) + this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment; + else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); + } + + if (packageDescriptor.assignPermSetsPostDeployment) { + if (packageDescriptor.assignPermSetsPostDeployment instanceof Array) + this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment; + else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); + } + } + + private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) { + if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) { + if (this.packageCreationParams.breakBuildIfEmpty) + throw new Error(`Package directory ${packageDirectory} is empty`); + else this.printEmptyArtifactWarning(); + } + } + + abstract isEmptyPackage(projectDirectory: string, packageDirectory: string); + + protected printEmptyArtifactWarning() { + SFPLogger.printHeaderLine( + `WARNING! Empty aritfact encountered`, + COLOR_WARNING, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + 'Either this folder is empty or the application of .forceignore results in an empty folder', + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger); + SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger); + } + + private printHeader() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create package`)}`), LoggerLevel.INFO, this.logger); + SFPLogger.log( + COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`), + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`), + LoggerLevel.INFO, + this.logger + ); + + SFPLogger.log( + COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`), + LoggerLevel.INFO, + this.logger + ); + + this.printAdditionalPackageSpecificHeaders(); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + abstract printAdditionalPackageSpecificHeaders(); +} diff --git a/packages/sfp-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts b/packages/sfp-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts new file mode 100644 index 000000000..bbef35a16 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts @@ -0,0 +1,117 @@ +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import { ApexSortedByType, FileDescriptor } from '../../apex/parser/ApexTypeFetcher'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { CreatePackage } from './CreatePackage'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; +import { COLOR_INFO } from '@flxblio/sfp-logger'; +import { COLOR_HEADER } from '@flxblio/sfp-logger'; +import { COLOR_WARNING } from '@flxblio/sfp-logger'; +const Table = require('cli-table'); + +export default class CreateSourcePackageImpl extends CreatePackage { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Source; + } + + printAdditionalPackageSpecificHeaders() {} + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + preCreatePackage(sfpPackage: SfpPackage) {} + + public async createPackage(sfpPackage: SfpPackage) { + this.handleApexTestClasses(sfpPackage); + + SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { + package: sfpPackage.packageName, + type: sfpPackage.packageType, + }); + } + + postCreatePackage(sfpPackage) {} + + protected handleApexTestClasses(sfpPackage: SfpPackage) { + let classTypes: ApexSortedByType = sfpPackage.apexClassesSortedByTypes; + + if (sfpPackage.isApexFound && classTypes?.testClass?.length == 0) { + this.printSlowDeploymentWarning(); + sfpPackage.isTriggerAllTests = true; + } else if (sfpPackage.isApexFound && classTypes?.testClass?.length > 0) { + if (classTypes?.parseError?.length > 0) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + SFPLogger.log( + 'Unable to parse these classes to correctly identify test classes, Its not your issue, its ours!'+ + 'Please raise a issue in our repo!', + LoggerLevel.INFO, + this.logger + ); + this.printClassesIdentified(classTypes?.parseError); + sfpPackage.isTriggerAllTests = true; + } else { + this.printHintForOptimizedDeployment(); + sfpPackage.isTriggerAllTests = false; + this.printClassesIdentified(classTypes?.testClass); + sfpPackage.apexTestClassses = []; + classTypes?.testClass.forEach((element) => { + sfpPackage.apexTestClassses.push(element.name); + }); + } + } + } + + private printHintForOptimizedDeployment() { + SFPLogger.printHeaderLine('OPTION FOR DEPLOYMENT OPTIMIZATION AVAILABLE',COLOR_HEADER,LoggerLevel.INFO,this.logger); + SFPLogger.log( + `Following apex test classes were identified and can be used for deploying this package,${EOL}` + + `in an optimal manner, provided each individual class meets the test coverage requirement of 75% and above${EOL}` + + `Ensure each apex class/trigger is validated for coverage in the validation stage`, + null, + this.logger + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + private printSlowDeploymentWarning() { + SFPLogger.printHeaderLine('WARNING! YOU MIGHT NOT BE ABLE TO DEPLOY OR WILL HAVE A SLOW DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,this.logger); + SFPLogger.log( + `This package has apex classes/triggers, however apex test classes were not found, You would not be able to deploy` + + `to production org optimally if each class do not have coverage of 75% and above,We will attempt deploying` + + `this package by triggering all local tests in the org which could be realy costly in terms of deployment time!`, + null, + this.logger + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); + } + + private printClassesIdentified(fetchedClasses: FileDescriptor[]) { + if (fetchedClasses === null || fetchedClasses === undefined) return; + + let table = new Table({ + head: ['Class', 'Error'], + chars: ZERO_BORDER_TABLE + }); + + for (let fetchedClass of fetchedClasses) { + let item = [fetchedClass.name, fetchedClass.error ? JSON.stringify(fetchedClass.error) : 'N/A']; + table.push(item); + } + SFPLogger.log('Following apex test classes were identified', LoggerLevel.INFO, this.logger); + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); + } +} diff --git a/packages/sfp-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts b/packages/sfp-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts new file mode 100644 index 000000000..3d15823b1 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts @@ -0,0 +1,262 @@ +import ProjectConfig from '../../project/ProjectConfig'; +import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +import { delay } from '../../utils/Delay'; +import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; +import { CreatePackage } from './CreatePackage'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import PackageVersionCoverage from '../coverage/PackageVersionCoverage'; +import { Connection, SfProject } from '@salesforce/core'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import { EOL } from 'os'; +import SFPOrg, { PackageTypeInfo } from '../../org/SFPOrg'; +import { PackageCreationParams } from '../SfpPackageBuilder'; +import { PackageVersion, PackageVersionCreateRequestResult } from '@salesforce/packaging'; +import { Duration } from '@salesforce/kit'; +import PackageDependencyDisplayer from '../../display/PackageDependencyDisplayer'; +const path = require('path'); + +export default class CreateUnlockedPackageImpl extends CreatePackage { + private static packageTypeInfos: PackageTypeInfo[]; + private isOrgDependentPackage: boolean = false; + private connection: Connection; + private devhubOrg: SFPOrg; + workingDirectory: string; + + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + super(projectDirectory, sfpPackage, packageCreationParams, logger, params); + } + + getTypeOfPackage() { + return PackageType.Unlocked; + } + + async preCreatePackage(sfpPackage: SfpPackage) { + this.devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); + + this.connection = this.devhubOrg.getConnection(); + + let packageId = ProjectConfig.getPackageId(sfpPackage.projectConfig, this.sfpPackage.packageName); + + // Get working directory + this.workingDirectory = sfpPackage.workingDirectory; + + //Get the one in working directory, this is always hardcoded to match + this.params.configFilePath = path.join('config', 'project-scratch-def.json'); + + //Get Type of Package + SFPLogger.log('Fetching Package Type Info from DevHub', LoggerLevel.INFO, this.logger); + let packageTypeInfos = await this.getPackageTypeInfos(); + let packageTypeInfo = packageTypeInfos.find((pkg) => pkg.Id == packageId); + if (packageTypeInfo == null) { + SFPLogger.log( + 'Unable to find a package info for this particular package, Are you sure you created this package?', + LoggerLevel.WARN, + this.logger + ); + throw new Error('Unable to fetch Package Info'); + } + + if (packageTypeInfo.IsOrgDependent == 'Yes') this.isOrgDependentPackage = true; + + SFPLogger.log(`Package ${packageTypeInfo.Name}`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`IsOrgDependent ${packageTypeInfo.IsOrgDependent}`, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Package Id ${packageTypeInfo.Id}`, LoggerLevel.INFO, this.logger); + SFPLogger.log('-------------------------', LoggerLevel.INFO, this.logger); + + //cleanup sfp constructs in working directory + this.deletesfpAdditionsToProjectConfig(this.workingDirectory); + + //Resolve the package dependencies + if (this.isOrgDependentPackage) { + // Store original dependencies to artifact + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } else if (!this.isOrgDependentPackage && !this.packageCreationParams.isSkipValidation) { + sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + this.workingDirectory, + this.sfpPackage.packageName + ); + //Store the resolved dependencies + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } else { + sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; + } + + //Print Dependencies + PackageDependencyDisplayer.printPackageDependencies(sfpPackage.dependencies,sfpPackage.projectConfig, this.logger); + + } + + async createPackage(sfpPackage: SfpPackage) { + const sfProject = await SfProject.resolve(this.workingDirectory); + + // fix for #1202 + // bug packaging lib doesnt support unpackaged metadata from working directory which is not the root + // it keeps on searching for the unpackage in the root folder + // so fix up the path manually + let targetPackageDir = sfProject.getPackageDirectories()[0]; + if (targetPackageDir['unpackagedMetadata']) + targetPackageDir['unpackagedMetadata'] = { path: path.join(this.workingDirectory, 'unpackagedMetadata') }; + + let result = await PackageVersion.create( + { + connection: this.devhubOrg.getConnection(), + project: sfProject, + installationkey: this.packageCreationParams.installationkey, + installationkeybypass: this.packageCreationParams.installationkeybypass, + tag: sfpPackage.tag, + skipvalidation: + this.packageCreationParams.isSkipValidation && !this.isOrgDependentPackage ? true : false, + codecoverage: + this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage ? true : false, + versionnumber: sfpPackage.versionNumber, + definitionfile: path.join(this.workingDirectory, this.params.configFilePath), + packageId: this.sfpPackage.packageName, + }, + { timeout: Duration.minutes(0), frequency: Duration.seconds(30) } + ); + + SFPLogger.log(`Package creation for ${this.sfpPackage.packageName} Initiated`, LoggerLevel.INFO, this.logger); + //Poll for package creation every 30 seconds + let currentPackageCreationStatus: PackageVersionCreateRequestResult; + while (true) { + await delay(30000); //Poll every 30 seconds + currentPackageCreationStatus = await PackageVersion.getCreateStatus( + result.Id, + this.devhubOrg.getConnection() + ); + + //Too Verbose when reading errors.. use only for debug + SFPLogger.log( + `Status: ${COLOR_KEY_MESSAGE(currentPackageCreationStatus.Status)}, Next Status check in 30 seconds`, + LoggerLevel.DEBUG, + this.logger + ); + if (currentPackageCreationStatus.Status === `Success`) { + break; + } else if (currentPackageCreationStatus.Status === 'Error') { + let errorMessage = ''; + const errors = currentPackageCreationStatus?.Error; + if (errors?.length) { + errorMessage = 'Creation errors: '; + for (let i = 0; i < errors.length; i++) { + errorMessage += `\n${i + 1}) ${errors[i]}`; + } + } + throw new Error(`Unable to create ${this.sfpPackage.packageName} due to \n` + errorMessage); + } + } + + SFPLogger.log(`Package Result:${JSON.stringify(currentPackageCreationStatus)}`, LoggerLevel.TRACE, this.logger); + + //Get the full details on the package and throw an error if the result is null, usually when the comamnd is timed out + if (currentPackageCreationStatus.SubscriberPackageVersionId) { + sfpPackage.package_version_id = currentPackageCreationStatus.SubscriberPackageVersionId; + await this.getPackageInfo(sfpPackage); + } else { + throw new Error( + `The build for ${this.sfpPackage.packageName} was not completed in the wait time ${this.packageCreationParams.waitTime} provided.${EOL} + You might want to increase the wait time or better check the dependencies or convert to different package type ${EOL} + Read more about it here https://docs.flxblio.io/development-practices/types-of-packaging/unlocked-packages#build-options-with-unlocked-packages` + ); + } + + //Break if coverage is low + if (this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage) { + if (!sfpPackage.has_passed_coverage_check) + throw new Error('This package has not meet the minimum coverage requirement of 75%'); + } + } + + postCreatePackage(sfpPackage: SfpPackage) { + //copy the original config back as existing one would have cleaned up + fs.copyFileSync( + path.join(this.workingDirectory, 'sfdx-project-bak.json'), + path.join(this.workingDirectory, 'sfdx-project.json') + ); + fs.unlinkSync(path.join(this.workingDirectory, 'sfdx-project-bak.json')); + if (sfpPackage.isDependencyValidated) { + SFPStatsSender.logGauge('package.testcoverage', sfpPackage.test_coverage, { + package: sfpPackage.package_name, + from: 'createpackage', + }); + } + } + + isEmptyPackage(projectDirectory: string, packageDirectory: string) { + return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); + } + + printAdditionalPackageSpecificHeaders() {} + + private deletesfpAdditionsToProjectConfig(workingDirectory: string) { + let projectManifestFromWorkingDirectory = ProjectConfig.getSFDXProjectConfig(workingDirectory); + let packageDescriptorInWorkingDirectory = ProjectConfig.getPackageDescriptorFromConfig( + this.sfpPackage.packageName, + projectManifestFromWorkingDirectory + ); + + fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project-bak.json'), projectManifestFromWorkingDirectory); + + //Cleanup sfp constructs + if (this.isOrgDependentPackage) delete packageDescriptorInWorkingDirectory['dependencies']; + + delete packageDescriptorInWorkingDirectory['type']; + delete packageDescriptorInWorkingDirectory['assignPermSetsPreDeployment']; + delete packageDescriptorInWorkingDirectory['assignPermSetsPostDeployment']; + delete packageDescriptorInWorkingDirectory['skipDeployOnOrgs']; + delete packageDescriptorInWorkingDirectory['skipTesting']; + delete packageDescriptorInWorkingDirectory['skipCoverageValidation']; + delete packageDescriptorInWorkingDirectory['ignoreOnStages']; + delete packageDescriptorInWorkingDirectory['ignoreDeploymentErrors']; + delete packageDescriptorInWorkingDirectory['preDeploymentScript']; + delete packageDescriptorInWorkingDirectory['postDeploymentScript']; + delete packageDescriptorInWorkingDirectory['aliasfy']; + delete packageDescriptorInWorkingDirectory['checkpointForPrepare']; + delete packageDescriptorInWorkingDirectory['testSynchronous']; + delete packageDescriptorInWorkingDirectory['tags']; + + fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project.json'), projectManifestFromWorkingDirectory); + } + + private async getPackageInfo(sfpPackage: SfpPackage) { + let packageVersionCoverage: PackageVersionCoverage = new PackageVersionCoverage(this.connection, this.logger); + let count = 0; + while (count < 10) { + count++; + try { + SFPLogger.log('Fetching Version Number and Coverage details', LoggerLevel.INFO, this.logger); + + let pkgInfoResult = await packageVersionCoverage.getCoverage(sfpPackage.package_version_id); + + sfpPackage.isDependencyValidated = !this.packageCreationParams.isSkipValidation; + sfpPackage.package_version_number = pkgInfoResult.packageVersionNumber; + sfpPackage.test_coverage = pkgInfoResult.coverage; + sfpPackage.has_passed_coverage_check = pkgInfoResult.HasPassedCodeCoverageCheck; + break; + } catch (error) { + SFPLogger.log( + `Unable to fetch package version info due to ${error.message}`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log('Retrying...', LoggerLevel.INFO, this.logger); + await delay(2000); + continue; + } + } + } + + private async getPackageTypeInfos() { + if (CreateUnlockedPackageImpl.packageTypeInfos == null) { + CreateUnlockedPackageImpl.packageTypeInfos = await this.devhubOrg.listAllPackages(); + } + return CreateUnlockedPackageImpl.packageTypeInfos; + } +} diff --git a/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts b/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts new file mode 100644 index 000000000..c58e992d7 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts @@ -0,0 +1,52 @@ +import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; +import path from 'path'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class SourceToMDAPIConvertor { + public constructor( + private projectDirectory: string, + private sourceDirectory: string, + private sourceApiVersion: string, + private logger?: Logger + ) {} + + public async convert() { + let mdapiDir = `.sfp/${this.makefolderid(5)}_mdapi`; + //Create destination directory + if (this.projectDirectory != null) mdapiDir = path.resolve(this.projectDirectory, mdapiDir); + + //Source Directory is nested inside project directory when used with artifacts + //TODO: projectDirectory nomenclature is incorrect, should be parentDirectory perhaps? + let resolvedSourceDirectory = this.sourceDirectory; + if (this.projectDirectory != null) + resolvedSourceDirectory = path.resolve(this.projectDirectory, this.sourceDirectory); + + //Build component set from provided source directory + let componentSet = ComponentSet.fromSource({ + fsPaths: [resolvedSourceDirectory], + }); + + if (this.sourceApiVersion) componentSet.sourceApiVersion = this.sourceApiVersion; + + const converter = new MetadataConverter(); + let convertResult = await converter.convert(componentSet, 'metadata', { + type: 'directory', + outputDirectory: mdapiDir, + }); + SFPLogger.log(`Source converted successfully to ${mdapiDir}`, LoggerLevel.TRACE, this.logger); + SFPLogger.log(`ConvertResult:` + JSON.stringify(convertResult), LoggerLevel.TRACE, this.logger); + + return convertResult; + } + + private makefolderid(length): string { + var result = ''; + var characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts new file mode 100644 index 000000000..9d4af0579 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts @@ -0,0 +1,104 @@ +const fs = require('fs-extra'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFDMURunImpl from '../../sfdmuwrapper/SFDMURunImpl'; +import VlocityPackDeployImpl from '../../vlocitywrapper/VlocityPackDeployImpl'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +const path = require('path'); +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; + +export default class InstallDataPackageImpl extends InstallPackage { + public constructor( + sfpPackage: SfpPackage, + targetOrg:SFPOrg, + logger: Logger, + options: SfpPackageInstallationOptions, + ) { + super(sfpPackage, targetOrg, logger,options); + } + + public async install() { + try { + //Fetch the sfdxcommand executor for the type + let dataPackageDeployer: SFDXCommand = await this.getSFDXCommand( + this.sfpPackage.sourceDir, + this.packageDirectory + ); + + SFPLogger.log(`Executing installation command: ${dataPackageDeployer.getGeneratedSFDXCommandWithParams()}`,LoggerLevel.INFO,this.logger); + let result = await dataPackageDeployer.exec(false); + + SFPLogger.log(result, LoggerLevel.INFO, this.logger); + } catch (error) { + let csvIssuesReportFilepath: string = path.join( + this.sfpPackage.sourceDir, + this.packageDirectory, + `CSVIssuesReport.csv` + ); + if (fs.existsSync(csvIssuesReportFilepath)) { + SFPLogger.log( + `\n---------------------WARNING: SFDMU detected CSV issues, verify the following files -------------------------------`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log(fs.readFileSync(csvIssuesReportFilepath, 'utf8'), LoggerLevel.INFO, this.logger); + } + throw error; + } + } + private async getSFDXCommand(sourceDirectory: string, packageDirectory: string): Promise { + //Determine package type + let packageType: string = this.determinePackageType(path.join(sourceDirectory, packageDirectory)); + + //Pick the type of SFDX command to use + let dataPackageDeployer: SFDXCommand; + if (packageType === 'sfdmu') { + let orgDomainUrl = await new OrgDetailsFetcher( this.sfpOrg.getUsername()).getOrgDomainUrl(); + + dataPackageDeployer = new SFDMURunImpl( + sourceDirectory, + this.sfpOrg.getUsername(), + orgDomainUrl, + packageDirectory, + this.logger, + LoggerLevel.INFO + ); + } else if (packageType === 'vlocity') { + dataPackageDeployer = new VlocityPackDeployImpl( + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + packageDirectory, + null, + null + ); + } else { + throw new Error('Unsupported package type'); + } + + return dataPackageDeployer; + } + + private determinePackageType(packageDirectory: string): string { + if (fs.pathExistsSync(path.join(packageDirectory, 'export.json'))) { + SFPLogger.log( + `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, + LoggerLevel.INFO, + this.logger + ); + return 'sfdmu'; + } else if (fs.pathExistsSync(path.join(packageDirectory, 'VlocityComponents.yaml'))) { + SFPLogger.log( + `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, + LoggerLevel.INFO, + this.logger + ); + return 'vlocity'; + } else { + throw new Error( + `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` + ); + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts new file mode 100644 index 000000000..74f8ddccd --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts @@ -0,0 +1,497 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { PackageInstallationResult, PackageInstallationStatus } from './PackageInstallationResult'; +import ProjectConfig from '../../project/ProjectConfig'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import AssignPermissionSets from '../../permsets/AssignPermissionSets'; +import ScriptExecutor from '../../scriptExecutor/ScriptExecutorHelpers'; +import { Connection } from '@salesforce/core'; +import * as fs from 'fs-extra'; +import FileSystem from '../../utils/FileSystem'; +import OrgDetailsFetcher, { OrgDetails } from '../../org/OrgDetailsFetcher'; +import path = require('path'); +import PermissionSetGroupUpdateAwaiter from '../../permsets/PermissionSetGroupUpdateAwaiter'; +import SfpOrg from '../../org/SFPOrg'; +import SfpPackage, { PackageType } from '../SfpPackage'; +import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; +import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import getFormattedTime from '../../utils/GetFormattedTime'; +import { TestLevel } from '../../apextest/TestOptions'; +import { PostDeployersRegistry } from '../deploymentCustomizers/PostDeployersRegistry'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import PackageComponentPrinter from '../../display/PackageComponentPrinter'; +import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; +import { PreDeployersRegistry } from '../deploymentCustomizers/PreDeployersRegistry'; +import { AnalyzerRegistry } from '../analyser/AnalyzerRegistry'; + +export class SfpPackageInstallationOptions { + installationkey?: string; + apexcompile?: string = 'package'; + securitytype?: string = 'none'; + upgradetype?: string = 'mixed-mode'; + waitTime?: string; + apiVersion?: string; + publishWaitTime?: number = 60; + skipTesting?: boolean; + optimizeDeployment?: boolean; + deploymentType?: DeploymentType; + disableArtifactCommit?: boolean = false; + isInstallingForValidation?: boolean; + skipIfPackageInstalled: boolean; + isDryRun?: boolean = false; + pathToReplacementForceIgnore?: string; +} + +export abstract class InstallPackage { + protected connection: Connection; + protected packageDescriptor; + protected packageDirectory; + + private _isArtifactToBeCommittedInOrg: boolean = true; + + public constructor( + protected sfpPackage: SfpPackage, + protected sfpOrg: SfpOrg, + protected logger: Logger, + protected options: SfpPackageInstallationOptions + ) { } + + public async exec(): Promise { + let startTime = Date.now(); + let elapsedTime: number; + try { + this.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( + this.sfpPackage.sourceDir, + this.sfpPackage.packageName + ); + + this.connection = this.sfpOrg.getConnection(); + + if (await this.isPackageToBeInstalled(this.options.skipIfPackageInstalled)) { + if (!this.options.isDryRun) { + await this.waitTillAllPermissionSetGroupIsUpdated(); + await this.assignPermsetsPreDeployment(); + await this.executePreDeploymentScripts(); + await this.setPackageDirectoryForPackage(); + await this.executePreDeployers(); + await this.checkPackageDirectoryExists(); + await this.install(); + await this.assignPermsetsPostDeployment(); + await this.executePostDeployers(); + await this.executePostDeploymentScript(); + await this.commitPackageInstallationStatus(); + + elapsedTime = Date.now() - startTime; + this.sendMetricsWhenSuccessfullyInstalled(elapsedTime); + } + return { result: PackageInstallationStatus.Succeeded, elapsedTime: elapsedTime }; + } else { + SFPLogger.log('Skipping Package Installation', LoggerLevel.INFO, this.logger); + return { result: PackageInstallationStatus.Skipped }; + } + } catch (error) { + elapsedTime = Date.now() - startTime; + this.sendMetricsWhenFailed(elapsedTime); + return { + result: PackageInstallationStatus.Failed, + message: error.message, + elapsedTime: elapsedTime, + }; + } + } + + checkPackageDirectoryExists() { + let absPackageDirectory: string = path.join(this.sfpPackage.sourceDir, this.packageDirectory); + if (!fs.existsSync(absPackageDirectory)) { + throw new Error(`Package directory ${absPackageDirectory} does not exist`); + } + } + + private async waitTillAllPermissionSetGroupIsUpdated() { + try { + //Package Has Permission Set Group + let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( + this.connection, + this.logger + ); + await permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated(); + } catch (error) { + //Ignore error + // Lets try proceeding + SFPLogger.log( + `Unable to check the status of Permission Set Groups due to ${error}`, + LoggerLevel.WARN, + this.logger + ); + } + } + + protected async setPackageDirectoryForPackage() { + if (this.packageDescriptor.aliasfy) { + const searchDirectory = path.join(this.sfpPackage.sourceDir, this.packageDescriptor.path); + const files = FileSystem.readdirRecursive(searchDirectory, true); + + let aliasDir: string; + + let alias = await this.sfpOrg.getAlias(); + aliasDir = files.find( + (file) => path.basename(file) === alias && fs.lstatSync(path.join(searchDirectory, file)).isDirectory() + ); + + SFPLogger.log(`Using alias directory ${aliasDir ? aliasDir : 'default'}`, LoggerLevel.INFO, this.logger); + + if (!aliasDir) { + const orgDetails = await new OrgDetailsFetcher(this.sfpOrg.getUsername()).getOrgDetails(); + + if (orgDetails.isSandbox) { + // If the target org is a sandbox, find a 'default' directory to use as package directory + aliasDir = files.find( + (file) => + path.basename(file) === 'default' && + fs.lstatSync(path.join(searchDirectory, file)).isDirectory() + ); + } + } + + if (!aliasDir) { + throw new Error( + `Aliasfied package '${this.sfpPackage.packageName}' does not have an alias with '${alias}' or 'default' directory` + ); + } + + this.packageDirectory = path.join(this.packageDescriptor.path, aliasDir); + } + else { + this.packageDirectory = path.join(this.packageDescriptor['path']); + } + + } + + private sendMetricsWhenFailed(elapsedTime: number) { + SFPLogger.log( + `Package ${COLOR_KEY_MESSAGE( + this.sfpPackage.package_name + )} installation attempt failed,it took ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` + ); + SFPStatsSender.logCount('package.installation.failure', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + } + + private sendMetricsWhenSuccessfullyInstalled(elapsedTime: number) { + SFPLogger.log( + `Package ${COLOR_KEY_MESSAGE(this.sfpPackage.package_name)} installation took ${COLOR_KEY_MESSAGE( + getFormattedTime(elapsedTime) + )}`, + LoggerLevel.INFO, + this.logger + ); + SFPStatsSender.logElapsedTime('package.installation.elapsed_time', elapsedTime, { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + SFPStatsSender.logCount('package.installation', { + package: this.sfpPackage.package_name, + type: this.sfpPackage.package_type, + target_org: this.sfpOrg.getUsername(), + }); + } + + //Set this to disable whethere info about the artifact has to be recorded in the org + public set isArtifactToBeCommittedInOrg(toCommit: boolean) { + this._isArtifactToBeCommittedInOrg = toCommit; + } + + private async commitPackageInstallationStatus() { + if (this._isArtifactToBeCommittedInOrg) { + try { + await this.sfpOrg.updateArtifactInOrg(this.logger, this.sfpPackage); + } catch (error) { + SFPLogger.log( + 'Unable to commit information about the package into org..Check whether prerequisities are installed', + LoggerLevel.WARN, + this.logger + ); + } + } + } + + protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { + if (skipIfPackageInstalled) { + let installationStatus = await this.sfpOrg.isArtifactInstalledInOrg(this.logger, this.sfpPackage); + return !installationStatus.isInstalled; + } else if(this.sfpPackage.packageType == PackageType.Diff) + { + // If diff package, check if there are any changes to be deployed, else skip + if(!this.sfpPackage.destructiveChanges && this.sfpPackage.metadataCount==0) + { + return false; + } + } + + return true; // Always install packages if skipIfPackageInstalled is false + } + + private async assignPermsetsPreDeployment() { + try { + if (this.sfpPackage.assignPermSetsPreDeployment) { + SFPLogger.log('Assigning permission sets before deployment:', LoggerLevel.INFO, this.logger); + + await AssignPermissionSets.applyPermsets( + this.sfpPackage.assignPermSetsPreDeployment, + this.connection, + this.sfpPackage.sourceDir, + this.logger + ); + } + } catch (error) { + //Proceed ahead not a critical error to break installation + SFPLogger.log(`Unable to assign permsets (Pre Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public async executePreDeploymentScripts() { + let preDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `preDeployment`); + if (fs.existsSync(preDeploymentScript)) { + let alias = await this.sfpOrg.getAlias(); + SFPLogger.log('Executing preDeployment script', LoggerLevel.INFO, this.logger); + await ScriptExecutor.executeScript( + this.logger, + preDeploymentScript, + this.sfpPackage.packageName, + this.sfpOrg.getUsername(), + alias ? alias : this.sfpOrg.getUsername(), + this.sfpPackage.sourceDir, + this.sfpPackage.packageDirectory + ); + } + } + + abstract install(); + + private async assignPermsetsPostDeployment() { + try { + if (this.sfpPackage.assignPermSetsPostDeployment) { + SFPLogger.log('Assigning permission sets after deployment:', LoggerLevel.INFO, this.logger); + + await AssignPermissionSets.applyPermsets( + this.sfpPackage.assignPermSetsPostDeployment, + this.connection, + this.sfpPackage.sourceDir, + this.logger + ); + } + } catch (error) { + //Proceed ahead not a critical error to break installation + SFPLogger.log(`Unable to assign permsets (Post Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public async executePostDeploymentScript() { + let postDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `postDeployment`); + if (fs.existsSync(postDeploymentScript)) { + SFPLogger.log('Executing postDeployment script', LoggerLevel.INFO, this.logger); + let alias = await this.sfpOrg.getAlias(); + await ScriptExecutor.executeScript( + this.logger, + postDeploymentScript, + this.sfpPackage.packageName, + this.sfpOrg.getUsername(), + alias ? alias : this.sfpOrg.getUsername(), + this.sfpPackage.sourceDir, + this.sfpPackage.packageDirectory + ); + } + } + + private async executePostDeployers() { + SFPLogger.log(`Executing Post Deployers`, LoggerLevel.INFO, this.logger); + + //Gather componentSet + let componentSet = ComponentSet.fromSource( + path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) + ); + + for (const postDeployer of PostDeployersRegistry.getPostDeployers()) { + try { + if (await postDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { + SFPLogger.log( + `Executing Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, + LoggerLevel.INFO, + this.logger + ); + + await postDeployer.execute( + this.sfpPackage, + componentSet, + this.sfpOrg, + this.logger, + {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} + ); + + } else { + SFPLogger.log( + `Post Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped or not enabled`, + LoggerLevel.INFO, + this.logger + ); + } + } catch (error) { + SFPLogger.log( + `Unable to process post deploy for ${postDeployer.getName()} due to ${error.message}`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped due to error`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + private async executePreDeployers() { + SFPLogger.log(`Executing Pre Deployers`, LoggerLevel.INFO, this.logger); + + //Gather componentSet + let componentSet = ComponentSet.fromSource( + path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) + ); + + let analyzers = AnalyzerRegistry.getAnalyzers(); + for (const analyzer of analyzers) { + if(await analyzer.isEnabled(this.sfpPackage, this.logger)) + { + SFPLogger.log(`Executing ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); + this.sfpPackage = await analyzer.analyze(this.sfpPackage,componentSet, this.logger); + } + else + { + SFPLogger.log(`Skipped ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); + } + } + + for (const preDeployer of PreDeployersRegistry.getPreDeployers()) { + try { + if (await preDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { + SFPLogger.log( + `Executing Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())}`, + LoggerLevel.INFO, + this.logger + ); + + await preDeployer.execute( + this.sfpPackage, + componentSet, + this.sfpOrg, + this.logger, + {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} + ); + + } else { + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped or not enabled`, + LoggerLevel.INFO, + this.logger + ); + } + } catch (error) { + SFPLogger.log( + `Unable to process pre deploy for ${preDeployer.getName()} due to ${error.message}`, + LoggerLevel.WARN, + this.logger + ); + SFPLogger.log( + `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped due to error`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + protected async generateDeploymentOptions( + waitTime: string, + optimizeDeployment: boolean, + skipTest: boolean, + target_org: string, + apiVersion: string + ): Promise { + let deploymentOptions: DeploymentOptions = { + ignoreWarnings: true, + waitTime: waitTime, + }; + deploymentOptions.ignoreWarnings = true; + deploymentOptions.waitTime = waitTime; + deploymentOptions.apiVersion = apiVersion; + + //Find Org Type + let orgDetails: OrgDetails; + try { + orgDetails = await new OrgDetailsFetcher(target_org).getOrgDetails(); + } catch (err) { + SFPLogger.log(`Unable to fetch org details,assuming it is production`, LoggerLevel.WARN, this.logger); + orgDetails = { + instanceUrl: undefined, + isScratchOrg: false, + isSandbox: false, + organizationType: undefined, + sfdxAuthUrl: undefined, + status: undefined, + }; + } + + + if (this.options.deploymentType == DeploymentType.MDAPI_DEPLOY && this.sfpPackage.isApexFound && this.options.isInstallingForValidation == false) { + if (orgDetails.isSandbox) { + //enforce during selective deployment + if (skipTest) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( + this.sfpPackage.apexTestClassses + ); + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } else { + if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( + this.sfpPackage.apexTestClassses + ); + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } + } + // #Issue 1417 + // Handle the use-cases of a not optimized source package validating + else if (this.sfpPackage.packageType == PackageType.Source && this.sfpPackage.isApexFound && this.options.isInstallingForValidation && !optimizeDeployment ) { + if (skipTest) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else { + deploymentOptions.testLevel = TestLevel.RunLocalTests; + } + } else { + if (orgDetails.isSandbox) { + deploymentOptions.testLevel = TestLevel.RunNoTests; + } else { + deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; + deploymentOptions.specifiedTests = 'skip'; + } + } + + deploymentOptions.rollBackOnError = true; + return deploymentOptions; + } + + private getAStringOfSpecificTestClasses(apexTestClassses: string[]) { + let specifedTests = apexTestClassses.join(); + return specifedTests; + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts new file mode 100644 index 000000000..dee64cf99 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts @@ -0,0 +1,397 @@ +import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; +import ReconcileProfileAgainstOrgImpl from '../components/ReconcileProfileAgainstOrgImpl'; +import DeployDestructiveManifestToOrgImpl from '../components/DeployDestructiveManifestToOrgImpl'; +import SFPLogger, { COLOR_SUCCESS, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import * as fs from 'fs-extra'; +const path = require('path'); +const tmp = require('tmp'); +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import PackageEmptyChecker from '../validators/PackageEmptyChecker'; +import { TestLevel } from '../../apextest/TestOptions'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import ProjectConfig from '../../project/ProjectConfig'; +import { DeploymentFilterRegistry } from '../deploymentFilters/DeploymentFilterRegistry'; +import DeploymentOptionDisplayer from '../../display/DeploymentOptionDisplayer'; +import PackageComponentPrinter from '../../display/PackageComponentPrinter'; +import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; +import { COLOR_ERROR } from '@flxblio/sfp-logger'; +import { globSync } from 'glob'; + +export default class InstallSourcePackageImpl extends InstallPackage { + private pathToReplacementForceIgnore: string; + private deploymentType: DeploymentType; + + + + public constructor( + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + options: SfpPackageInstallationOptions, + logger: Logger + ) { + super(sfpPackage, targetOrg, logger, options); + this.options = options; + this.pathToReplacementForceIgnore = options.pathToReplacementForceIgnore; + this.deploymentType = options.deploymentType; + } + + public async install() { + let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); + let tempDir = tmpDirObj.name; + + try { + //Handle the right force ignore file + this.handleForceIgnores(); + + // Apply Destructive Manifest + await this.applyDestructiveChanges(); + + + //Apply Reconcile if Profiles are found + //To Reconcile we have to go for multiple deploys, first we have to reconcile profiles and deploy the metadata + let isReconcileActivated = false; + let isReconcileErrored = false; + let profileFolders; + ({ + profileFolders, + isReconcileActivated, + isReconcileErrored, + } = await this.reconcileProfilesBeforeDeployment( + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + tempDir + )); + + let deploymentOptions: DeploymentOptions; + let result: DeploySourceResult; + //Construct Deploy Command for actual payload + deploymentOptions = await this.generateDeploymentOptions( + this.options.waitTime, + this.options.optimizeDeployment, + this.options.skipTesting, + this.sfpOrg.getUsername(), + this.options.apiVersion + ); + + //enable source tracking + if (this.deploymentType === DeploymentType.SOURCE_PUSH) { + deploymentOptions.sourceTracking = true; + } + + //Make a copy.. dont mutate sourceDirectory + let resolvedSourceDirectory = this.sfpPackage.sourceDir; + + let emptyCheck = this.handleEmptyPackage(resolvedSourceDirectory, this.packageDirectory); + + if (emptyCheck.isToSkip == true) { + SFPLogger.log( + `${COLOR_SUCCESS(`Skipping the package as there is nothing to be deployed`)}`, + LoggerLevel.INFO, + this.logger + ); + return { + deploy_id: `000000`, + result: true, + message: `Package is empty, nothing to install,skipped`, + }; + } else if (emptyCheck.isToSkip == false) { + + //Create componentSet To Be Deployed + let componentSet = ComponentSet.fromSource( + path.resolve(emptyCheck.resolvedSourceDirectory, this.packageDirectory) + ); + + //Apply Filters + let deploymentFilters = DeploymentFilterRegistry.getImplementations(); + + for (const deploymentFilter of deploymentFilters) { + if ( + deploymentFilter.isToApply( + ProjectConfig.getSFDXProjectConfig(emptyCheck.resolvedSourceDirectory), + this.sfpPackage.packageType + ) + ) + componentSet = await deploymentFilter.apply(this.sfpOrg, componentSet, this.logger); + } + + //Check if there are components to be deployed after filtering + //Assume its successfully deployed + if (componentSet.size == 0) { + return { + deploy_id: `000000`, + result: true, + message: `Package contents were filtered out, nothing to install`, + }; + } + + //Print components inside Component Set + let components = componentSet.getSourceComponents(); + PackageComponentPrinter.printComponentTable(components, this.logger); + + + if (!this.options.isInstallingForValidation) { + DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); + } + + let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( + this.sfpOrg, + this.sfpPackage.sourceDir, + componentSet, + deploymentOptions, + this.logger + ); + + result = await deploySourceToOrgImpl.exec(); + + if (result.result) { + //Apply PostDeployment Activities + try { + if (isReconcileActivated) { + //Bring back the original profiles, reconcile and redeploy again + await this.reconcileAndRedeployProfiles( + profileFolders, + this.sfpPackage.sourceDir, + this.sfpOrg.getUsername(), + this.packageDirectory, + tempDir, + deploymentOptions + ); + } + } catch (error) { + + SFPLogger.log( + 'Failed to apply reconcile the second time, Partial Metadata applied', + LoggerLevel.INFO, + this.logger + ); + } + } else if (result.result === false) { + DeployErrorDisplayer.displayErrors(result.response, this.logger); + throw new Error(result.message); + } + } + //} + } catch (error) { + tmpDirObj.removeCallback(); + throw error; + } + } + + private handleEmptyPackage( + sourceDirectory: string, + packageDirectory: string + ): { isToSkip: boolean; resolvedSourceDirectory: string } { + //Check empty conditions + let status = PackageEmptyChecker.isToBreakBuildForEmptyDirectory(sourceDirectory, packageDirectory, false); + + + if (status.result == 'break') { + throw new Error('No components in the package, Please check your build again'); + } else if (status.result == 'skip') { + return { + isToSkip: true, + resolvedSourceDirectory: sourceDirectory, + }; + } else { + return { + isToSkip: false, + resolvedSourceDirectory: sourceDirectory, + }; + } + } + + private handleForceIgnores() { + if (this.pathToReplacementForceIgnore) { + this.replaceForceIgnoreInSourceDirectory(this.sfpPackage.sourceDir, this.pathToReplacementForceIgnore); + + + //Handle Diff condition + // if (this.isDiffFolderAvailable) + // this.replaceForceIgnoreInSourceDirectory( + // path.join(this.sfpPackage.sourceDir, 'diff'), + // this.pathToReplacementForceIgnore + // ); + } + } + + private async applyDestructiveChanges() { + + if(this.sfpPackage.destructiveChanges) + { + try { + SFPLogger.log( + 'Attempt to delete components mentioned in destructive manifest', + LoggerLevel.INFO, + this.logger + ); + let deployDestructiveManifestToOrg = new DeployDestructiveManifestToOrgImpl( + this.sfpOrg, + path.join(this.sfpPackage.sourceDir, 'destructive', 'destructiveChanges.xml') + ); + + await deployDestructiveManifestToOrg.exec(); + } catch (error) { + SFPLogger.log( + `We attempted a deletion of components, However we are not successful. \ + Either the components are already deleted or there are components which \ + have dependency to components in the manifest. \ + Please check whether this manifest works! \ + Actual Error Observed: \ + -------------------------------------- \ + ${COLOR_ERROR(error.message)}`, + LoggerLevel.INFO, + this.logger + ); + } + } + } + + private async reconcileProfilesBeforeDeployment(sourceDirectoryPath: string, target_org: string, tempDir: string) { + let profileFolders: any; + let isReconcileActivated: boolean = false; + let isReconcileErrored: boolean = false; + try { + //Hard exit.. no reconcile set in orchestrator + if (this.sfpPackage.reconcileProfiles == false) return { isReconcileActivated: false }; + + //Handle diff for fastfeedback + if (this.sfpPackage.isProfilesFound) { + } else { + return { isReconcileActivated: false }; + } + + SFPLogger.log( + 'Attempting reconcile to profiles as payload contain profiles', + LoggerLevel.INFO, + this.logger + ); + //copy the original profiles to temporary location + profileFolders = globSync('**/profiles', { + cwd: path.join(sourceDirectoryPath), + }); + if (profileFolders.length > 0) { + profileFolders.forEach((folder) => { + fs.copySync(path.join(sourceDirectoryPath, folder), path.join(tempDir, folder)); + }); + } + //Now Reconcile + let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( + this.sfpOrg, + path.join(sourceDirectoryPath), + this.logger + ); + await reconcileProfileAgainstOrg.exec(); + isReconcileActivated = true; + } catch (err) { + SFPLogger.log('Failed to reconcile profiles:' + err, LoggerLevel.INFO, this.logger); + isReconcileErrored = true; + if (profileFolders.length > 0) { + SFPLogger.log('Restoring original profiles as preprocessing failed', LoggerLevel.INFO, this.logger); + profileFolders.forEach((folder) => { + fs.copySync(path.join(tempDir, folder), path.join(this.sfpPackage.sourceDir, folder)); + }); + } + } + return { profileFolders, isReconcileActivated, isReconcileErrored }; + } + + private async reconcileAndRedeployProfiles( + profileFolders: string[], + sourceDirectoryPath: string, + target_org: string, + sourceDirectory: string, + tmpdir: string, + deploymentOptions: any + ) { + //if no profile supported metadata, no point in + //doing a reconcile + if (this.sfpPackage.isProfilesFound == false) return; + if (this.sfpPackage.isPayLoadContainTypesSupportedByProfiles == false) return; + + + if (profileFolders.length > 0) { + SFPLogger.log(`Restoring original profiles for reconcile and deploy`, LoggerLevel.INFO, this.logger); + profileFolders.forEach((folder) => { + fs.copySync(path.join(tmpdir, folder), path.join(sourceDirectoryPath, folder)); + }); + + //Now Reconcile + let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( + this.sfpOrg, + sourceDirectoryPath, + this.logger + ); + await reconcileProfileAgainstOrg.exec(); + + //Now deploy the profiles alone + + const profilesDirs = globSync('**/profiles/', { + cwd: path.join(sourceDirectoryPath, sourceDirectory), + absolute: true, + }); + + const profileDeploymentStagingDirectory = path.join( + sourceDirectoryPath, + 'ProfileDeploymentStagingDirectory' + ); + fs.mkdirpSync(path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); + + for (const dir of profilesDirs) { + // Duplicate profiles are overwritten + fs.copySync(dir, path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); + } + + fs.copySync( + path.join(sourceDirectoryPath, 'sfdx-project.json'), + path.join(profileDeploymentStagingDirectory, 'sfdx-project.json') + ); + fs.copySync( + path.join(sourceDirectoryPath, '.forceignore'), + path.join(profileDeploymentStagingDirectory, '.forceignore') + ); + + //Create componentSet To Be Deployed + let componentSet = ComponentSet.fromSource( + path.resolve(profileDeploymentStagingDirectory, sourceDirectory) + ); + + DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); + let deploySourceToOrgImpl: DeploySourceToOrgImpl = new DeploySourceToOrgImpl( + this.sfpOrg, + this.sfpPackage.sourceDir, + componentSet, + deploymentOptions, + this.logger + ); + let profileReconcile: DeploySourceResult = await deploySourceToOrgImpl.exec(); + + if (!profileReconcile.result) { + DeployErrorDisplayer.displayErrors(profileReconcile.response, this.logger); + SFPLogger.log('Unable to deploy reconciled profiles', LoggerLevel.INFO, this.logger); + } + } + } + + + + /** + * Replaces forceignore in source directory with provided forceignore + * @param sourceDirectory + * @param pathToReplacementForceIgnore + */ + private replaceForceIgnoreInSourceDirectory(sourceDirectory: string, pathToReplacementForceIgnore: string): void { + if (fs.existsSync(pathToReplacementForceIgnore)) + fs.copySync(pathToReplacementForceIgnore, path.join(sourceDirectory, '.forceignore')); + else { + SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, this.logger); + SFPLogger.log( + 'Package installation will continue using the unchanged forceignore in the source directory', + null, + this.logger + ); + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts new file mode 100644 index 000000000..6635b61e8 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts @@ -0,0 +1,91 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; +import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; +import SfpPackage from '../SfpPackage'; +import SFPOrg from '../../org/SFPOrg'; +import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; + +export default class InstallUnlockedPackage extends InstallPackage { + private packageVersionId; + + public constructor( + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + options: SfpPackageInstallationOptions, + logger: Logger + ) { + super(sfpPackage, targetOrg, logger, options); + this.packageVersionId = sfpPackage.package_version_id; + this.options = options; + } + + public async install() { + let installUnlockedPackageWrapper: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( + this.logger, + this.sfpOrg.getUsername(), + this.packageVersionId, + this.options, + this.sfpPackage.packageName + ); + await installUnlockedPackageWrapper.install(this.sfpPackage.payload); + } + + /** + * Checks whether unlocked package version is installed in org. + * Overrides base class method. + * @param skipIfPackageInstalled + * @returns + */ + protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { + try { + if (skipIfPackageInstalled) { + SFPLogger.log( + `${EOL}Checking whether package ${COLOR_KEY_MESSAGE( + this.sfpPackage.package_name + )} with ID ${COLOR_KEY_MESSAGE( + this.packageVersionId + )} is installed in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + let installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); + + let packageFound = installedPackages.find((installedPackage) => { + return installedPackage.subscriberPackageVersionId.substring(0,14) === this.packageVersionId.substring(0,14); + }); + + if (packageFound) { + SFPLogger.log( + `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + return false; + } else { + SFPLogger.log( + `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, + LoggerLevel.INFO, + this.logger + ); + return true; + } + } else { + SFPLogger.log( + 'Skip if package to be installed is false, Proceeding with installation', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } catch (error) { + SFPLogger.log( + 'Unable to check whether this package is installed in the target org', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts new file mode 100644 index 000000000..34af33f68 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts @@ -0,0 +1,134 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import Package2Detail from '../Package2Detail'; +import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; +import SFPOrg from '../../org/SFPOrg'; +import { SfpPackageInstallationOptions } from './InstallPackage'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; + +export default class InstallUnlockedPackageCollection { + private installedPackages: Package2Detail[]; + constructor(private sfpOrg: SFPOrg, private logger: Logger,private dryRun:boolean=false) {} + + public async install( + package2s: Package2Detail[], + skipIfInstalled: boolean, + ignoreErrorIfAHigherVersionPackageIsInstalled: boolean = true + ) { + this.installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); + + SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); + + for (const package2 of package2s) { + if ( + package2.subscriberPackageVersionId && + this.isPackageToBeInstalled(skipIfInstalled, package2.subscriberPackageVersionId, package2.name) + ) { + SFPLogger.log( + `Installing Package ${package2.name} in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + let installUnlockedPackageImpl: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( + this.logger, + this.sfpOrg.getUsername(), + package2.subscriberPackageVersionId, + new SfpPackageInstallationOptions(), + package2.name + ); + if (package2.key) installUnlockedPackageImpl.setInstallationKey(package2.key); + try { + if(!this.dryRun) + await installUnlockedPackageImpl.install(); + } catch (error) { + let message: string = error.message; + if ( + message.includes(`A newer version of this package is currently installed`) && + ignoreErrorIfAHigherVersionPackageIsInstalled + ) { + SFPLogger.log( + `A higher version of this package is already installed and cant be dowgraded,skipping`, + LoggerLevel.WARN, + this.logger + ); + continue; + } else { + SFPLogger.log( + `Unable to install ${package2.name} in ${this.sfpOrg.getUsername()} due to ${message}`, + LoggerLevel.ERROR, + this.logger + ); + throw error; + } + } + } else { + SFPLogger.log( + `Skipping Installing of package ${COLOR_KEY_MESSAGE( + package2.name + )} in ${this.sfpOrg.getUsername()}`, + LoggerLevel.WARN, + this.logger + ); + } + } + + SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); + } + + /** + * Checks whether unlocked package version is installed in org. + * Overrides base class method. + * @param skipIfPackageInstalled + * @returns + */ + protected isPackageToBeInstalled( + skipIfPackageInstalled: boolean, + packageVersionId: string, + pacakgeName?: string + ): boolean { + try { + if (skipIfPackageInstalled) { + SFPLogger.log( + `${EOL}Checking whether package ${COLOR_KEY_MESSAGE(pacakgeName)} with ID ${COLOR_KEY_MESSAGE( + packageVersionId)}is installed in ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + + let packageFound = this.installedPackages.find((installedPackage) => { + return installedPackage.subscriberPackageVersionId.substring(0,15) === packageVersionId.substring(0,15); + }); + + if (packageFound) { + SFPLogger.log( + `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, + LoggerLevel.INFO, + this.logger + ); + return false; + } else { + SFPLogger.log( + `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, + LoggerLevel.INFO, + this.logger + ); + return true; + } + } else { + SFPLogger.log( + 'Skip if package to be installed is false, Proceeding with installation', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } catch (error) { + SFPLogger.log( + 'Unable to check whether this package is installed in the target org', + LoggerLevel.INFO, + this.logger + ); + return true; + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts new file mode 100644 index 000000000..41574d826 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts @@ -0,0 +1,96 @@ +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_SUCCESS, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; +import SFPOrg from '../../org/SFPOrg'; +import { PackageInstallCreateRequest, PackagingSObjects, SubscriberPackageVersion } from '@salesforce/packaging'; +import { delay } from '../../utils/Delay'; +import { SfpPackageInstallationOptions } from './InstallPackage'; + + + +export default class InstallUnlockedPackageImpl { + public constructor( + private logger: Logger, + private targetUserName: string, + private packageId: string, + private installationOptions: SfpPackageInstallationOptions, + private packageName?:string + ) { + } + + public setInstallationKey(installationKey: string) { + this.installationOptions.installationkey = installationKey; + } + + public async install(payloadToDisplay?: any): Promise { + let connection = (await SFPOrg.create({ aliasOrUsername: this.targetUserName })).getConnection(); + //Print Metadata carried in the package + if (payloadToDisplay) PackageMetadataPrinter.printMetadataToDeploy(payloadToDisplay, this.logger); + + const subscriberPackageVersion = new SubscriberPackageVersion({ + connection, + aliasOrId: this.packageId, + password: this.installationOptions.installationkey, + }); + + const request: PackageInstallCreateRequest = { + SubscriberPackageVersionKey: await subscriberPackageVersion.getId(), + Password: this.installationOptions.installationkey as PackageInstallCreateRequest['Password'], + ApexCompileType: 'package' as PackageInstallCreateRequest['ApexCompileType'], + SecurityType: this.installationOptions.securitytype as PackageInstallCreateRequest['SecurityType'], + UpgradeType: this.installationOptions.upgradetype as PackageInstallCreateRequest['UpgradeType'], + EnableRss: true, + }; + + //Fire a package installation + let pkgInstallRequest = await subscriberPackageVersion.install(request, {}); + let status = this.parseStatus( + pkgInstallRequest, + this.targetUserName, + this.packageName ? this.packageName : this.packageId, + this.logger + ); + while (status == 'IN_PROGRESS') { + pkgInstallRequest = await SubscriberPackageVersion.getInstallRequest(pkgInstallRequest.Id, connection); + status = this.parseStatus( + pkgInstallRequest, + this.targetUserName, + this.packageName ? this.packageName : this.packageId, + this.logger + ); + await delay(30000); //Poll every 30 seconds + } + } + public parseStatus( + request: PackagingSObjects.PackageInstallRequest, + username: string, + pkgName: string, + logger: Logger + ): 'IN_PROGRESS' | 'SUCCESS' { + const { Status } = request; + if (Status === 'SUCCESS') { + SFPLogger.log( + `Status: ${COLOR_SUCCESS(`Succesfully Installed`)} ${pkgName} to ${username} with Id ${request.Id}`, + LoggerLevel.INFO, + logger + ); + return Status; + } else if (['IN_PROGRESS', 'UNKNOWN'].includes(Status)) { + SFPLogger.log( + `Status: ${COLOR_KEY_MESSAGE(`In Progress`)} Installing ${pkgName} to ${username} with Id ${request.Id}`, + LoggerLevel.INFO, + logger + ); + return 'IN_PROGRESS'; + } else { + let errorMessage = ''; + const errors = request?.Errors?.errors; + if (errors?.length) { + errorMessage = 'Installation errors: '; + for (let i = 0; i < errors.length; i++) { + errorMessage += `\n${i + 1}) ${errors[i].message}`; + } + } + throw new Error(`Unable to install ${pkgName} due to \n` + errorMessage); + } + } +} diff --git a/packages/sfp-cli/src/core/package/packageInstallers/PackageInstallationResult.ts b/packages/sfp-cli/src/core/package/packageInstallers/PackageInstallationResult.ts new file mode 100644 index 000000000..584155ed1 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageInstallers/PackageInstallationResult.ts @@ -0,0 +1,15 @@ +export type PackageInstallationResult = { + result: PackageInstallationStatus; + deploy_id?: string; + message?: string; + elapsedTime?:number; + isPreScriptExecutionSuceeded?: boolean; + isPostScriptExecutionSuceeeded?:boolean; + numberOfComponentsDeployed?:number; +}; + +export enum PackageInstallationStatus { + Skipped, + Succeeded, + Failed, +} diff --git a/packages/sfp-cli/src/core/package/packageMerger/PackageMergeManager.ts b/packages/sfp-cli/src/core/package/packageMerger/PackageMergeManager.ts new file mode 100644 index 000000000..a8cb955e9 --- /dev/null +++ b/packages/sfp-cli/src/core/package/packageMerger/PackageMergeManager.ts @@ -0,0 +1,160 @@ +import SfpPackage, { PackageType } from '../SfpPackage'; +import SfpPackageBuilder from '../SfpPackageBuilder'; +const tmp = require('tmp'); +import * as fs from 'fs-extra'; +const path = require('path'); +import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; +import { Logger } from '@flxblio/sfp-logger'; + +export default class PackageMergeManager { + public constructor(private sfpPackages: SfpPackage[], private logger?: Logger) {} + + public async mergePackages(targetOrAlias?: string): Promise { + let mergeResult: MergeResult = new MergeResult(); + mergeResult.skippedPackages = []; + mergeResult.unlockedPackages = []; + mergeResult.mergedPackages = []; + + mergeResult.requestedMergeOrder = this.sfpPackages; + + //Use the .sfp directory + let tmpDir = tmp.dirSync({ unsafeCleanup: true }); + let locationOfCopiedDirectory = tmpDir.name; + //Create a temporary folder + let mergedProjectDir = path.join(locationOfCopiedDirectory, `${this.makefolderid(5)}_merged`); + mergeResult.mergedProjectDirectory = mergedProjectDir; + + let mergedPackageDir = path.join(mergedProjectDir, 'force-app'); + fs.mkdirpSync(mergedPackageDir); + + //Create sfdx project.json + fs.writeJSONSync(path.join(mergedProjectDir, 'sfdx-project.json'), this.getMergedProjectManifest(), { + spaces: 4, + }); + + const converter = new MetadataConverter(); + + for (const sfpPackage of this.sfpPackages) { + let componentSet: ComponentSet; + + if (sfpPackage.packageType == PackageType.Data) { + mergeResult.skippedPackages.push(sfpPackage); + continue; + } else if (sfpPackage.packageType == PackageType.Unlocked) { + //Push for now + mergeResult.skippedPackages.push(sfpPackage); + mergeResult.unlockedPackages.push(sfpPackage); + continue; + } else { + //handle alaisfy directory + if (sfpPackage.packageDescriptor.aliasfy) { + let aliasFolder = path.join( + process.cwd(), + sfpPackage.projectDirectory, + sfpPackage.packageDirectory, + targetOrAlias ? targetOrAlias : 'default' + ); + if (fs.existsSync(aliasFolder)) { + componentSet = ComponentSet.fromSource(aliasFolder); + } else { + continue; + } + } else { + componentSet = ComponentSet.fromSource( + path.join(process.cwd(), sfpPackage.projectDirectory, sfpPackage.packageDirectory) + ); + } + + fs.copyFileSync( + path.join(sfpPackage.projectDirectory, 'forceignores', '.buildignore'), + path.join(mergedProjectDir, '.forceignore') + ); + console.log('copied file'); + + //Merge + let results = await converter.convert(componentSet, 'source', { + type: 'merge', + mergeWith: ComponentSet.fromSource(mergedPackageDir).getSourceComponents(), + defaultDirectory: mergedPackageDir, + + forceIgnoredPaths: new Set([ + path.join(process.cwd(), sfpPackage.projectDirectory, 'forceignores', '.buildignore'), + ]), + }); + + for (const component of results.converted) { + if (this.isXmlFileSuffixDuped(component.xml)) { + this.dedupeXmlFileSuffix(component.xml); + } + } + mergeResult.mergedPackages.push(sfpPackage); + } + } + + //Build SfpPackage + if (mergeResult.mergedPackages.length > 0) { + let mergedSfPPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + this.logger, + mergeResult.mergedProjectDirectory, + 'merged', + { + branch: 'temp', + packageVersionNumber: '1.0.0.0', + sourceVersion: '00000000', + }, + null + ); + mergeResult.mergedPackage = mergedSfPPackage; + } + + tmpDir.removeCallback(); + return mergeResult; + } + + private isXmlFileSuffixDuped(xmlFile: string): boolean { + return xmlFile.match(/-meta\.xml/g)?.length === 2; + } + + private dedupeXmlFileSuffix(xmlFile: string): string { + let deduped = xmlFile.replace(/-meta\.xml/, ''); + fs.renameSync(xmlFile, deduped); + + return deduped; + } + + private getMergedProjectManifest() { + let projectManifest = { + packageDirectories: [ + { + path: 'force-app', + package: 'merged', + versionNumber: '2.0.0.0', + default: true, + }, + ], + namespace: '', + sourceApiVersion: '53.0', + }; + return projectManifest; + } + + private makefolderid(length): string { + var result = ''; + var characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} + +export class MergeResult { + mergedProjectDirectory: string; + mergedPackage: SfpPackage; + mergedPackages: SfpPackage[]; + skippedPackages?: SfpPackage[]; + unlockedPackages?: SfpPackage[]; + requestedMergeOrder: SfpPackage[]; +} diff --git a/packages/sfp-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts b/packages/sfp-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts new file mode 100644 index 000000000..91ea99cef --- /dev/null +++ b/packages/sfp-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts @@ -0,0 +1,34 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { SfProject } from '@salesforce/core'; +import { PackageSaveResult, PackageVersion } from '@salesforce/packaging'; +import SFPOrg from '../../org/SFPOrg'; + +export default class PromoteUnlockedPackageImpl { + public constructor( + private project_directory: string, + private package_version_id: string, + private devhub_alias: string + ) {} + + public async promote(): Promise { + let hubOrg = await SFPOrg.create({ aliasOrUsername: this.devhub_alias }); + let project = await SfProject.resolve(this.project_directory); + + const packageVersion = new PackageVersion({ + connection: hubOrg.getConnection(), + project: project, + idOrAlias: this.package_version_id, + }); + const packageVersionData = await packageVersion.getData(); + + let result: PackageSaveResult; + try { + result = await packageVersion.promote(); + result.id = packageVersionData.SubscriberPackageVersionId; + } catch (e) { + if (e.message.includes('previously released')) { + SFPLogger.log(`Package ${this.package_version_id} is already promoted, Ignoring`); + } else throw e; + } + } +} diff --git a/packages/sfp-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts b/packages/sfp-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts new file mode 100644 index 000000000..079f78469 --- /dev/null +++ b/packages/sfp-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts @@ -0,0 +1,23 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; + +export default class AssignPermissionSetFetcher implements PropertyFetcher { + public getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { + if (packageContents.packageDescriptor.assignPermSetsPreDeployment) { + if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) { + packageContents.assignPermSetsPreDeployment = + packageContents.packageDescriptor.assignPermSetsPreDeployment; + } else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); + } + + if (packageContents.packageDescriptor.assignPermSetsPostDeployment) { + if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) { + packageContents.assignPermSetsPostDeployment = + packageContents.packageDescriptor.assignPermSetsPostDeployment; + } else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); + } + + return packageContents; + } +} diff --git a/packages/sfp-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts b/packages/sfp-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts new file mode 100644 index 000000000..c4b05c5de --- /dev/null +++ b/packages/sfp-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts @@ -0,0 +1,29 @@ +import * as fs from 'fs-extra'; +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; +import xml2json from '../../utils/xml2json'; +import { Logger } from '@flxblio/sfp-logger'; + +export default class DestructiveManifestPathFetcher implements PropertyFetcher { + public async getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { + let destructiveChangesPath: string; + + if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) { + throw new Error('Project Config (sfdx-project.json) is null'); + } + + if (packageContents.packageDescriptor['destructiveChangePath']) { + destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath']; + packageContents.destructiveChangesPath = destructiveChangesPath; + } + + try { + if (destructiveChangesPath != null) { + packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8')); + } + } catch (error) { + throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest'); + } + return packageContents; + } +} diff --git a/packages/sfp-cli/src/core/package/propertyFetchers/PropertyFetcher.ts b/packages/sfp-cli/src/core/package/propertyFetchers/PropertyFetcher.ts new file mode 100644 index 000000000..fbe6c4f8e --- /dev/null +++ b/packages/sfp-cli/src/core/package/propertyFetchers/PropertyFetcher.ts @@ -0,0 +1,11 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../SfpPackage'; + +export default interface PropertyFetcher { + /** + * Retrieves property from packageDescriptor and adds its to SfpPackage by reference + * @param packageContents + * @param packageLogger + */ + getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger); +} diff --git a/packages/sfp-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts b/packages/sfp-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts new file mode 100644 index 000000000..0e2bc06a0 --- /dev/null +++ b/packages/sfp-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts @@ -0,0 +1,10 @@ +import SfpPackage from '../SfpPackage'; +import PropertyFetcher from './PropertyFetcher'; + +export default class ReconcilePropertyFetcher implements PropertyFetcher { + getsfpProperties(packageContents: SfpPackage, packageLogger?: any) { + if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) { + packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles; + } + } +} diff --git a/packages/sfp-cli/src/core/package/validators/PackageEmptyChecker.ts b/packages/sfp-cli/src/core/package/validators/PackageEmptyChecker.ts new file mode 100644 index 000000000..8d05ba782 --- /dev/null +++ b/packages/sfp-cli/src/core/package/validators/PackageEmptyChecker.ts @@ -0,0 +1,85 @@ +import path from 'path'; +import { readFileSync, existsSync } from 'fs'; +import FileSystem from '../../utils/FileSystem'; +import ignore from 'ignore'; + +export default class PackageEmptyChecker { + public static isToBreakBuildForEmptyDirectory( + projectDir: string, + sourceDirectory: string, + isToBreakBuildIfEmpty: boolean + ): { + message: string; + result: string; + } { + let directoryToCheck; + let status: { message: string; result: string } = { + message: '', + result: '', + }; + + if (projectDir != null) { + directoryToCheck = path.join(projectDir, sourceDirectory); + } else directoryToCheck = sourceDirectory; + + try { + if (!existsSync(directoryToCheck)) { + //Folder do not exists, break build + if (isToBreakBuildIfEmpty) { + status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'break'; + } else { + status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'skip'; + } + return status; + } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) { + if (isToBreakBuildIfEmpty) { + status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'break'; + } else { + status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; + status.result = 'skip'; + } + return status; + } else { + status.result = 'continue'; + return status; + } + } catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist + } else if (!isToBreakBuildIfEmpty) { + status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`; + status.result = 'skip'; + return status; + } else throw err; + } + } + + public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean { + let dirToCheck; + + if (projectDirectory != null) { + dirToCheck = path.join(projectDirectory, sourceDirectory); + } else { + dirToCheck = sourceDirectory; + } + + let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false); + // Include source directory in filepaths, as it can be a pattern in forceignore + files = files.map((file) => path.join(sourceDirectory, file)); + + let forceignorePath; + if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore'); + else forceignorePath = path.join(process.cwd(), '.forceignore'); + + // Ignore files that are listed in .forceignore + files = ignore() + .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'. + .filter(files); + + if (files == null || files.length === 0) return true; + else return false; + } +} diff --git a/packages/sfp-cli/src/core/package/version/Package2VersionFetcher.ts b/packages/sfp-cli/src/core/package/version/Package2VersionFetcher.ts new file mode 100644 index 000000000..879b84971 --- /dev/null +++ b/packages/sfp-cli/src/core/package/version/Package2VersionFetcher.ts @@ -0,0 +1,109 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import semver from 'semver'; + +/** + * Fetcher for second-generation package version in Dev Hub + */ +export default class Package2VersionFetcher { + private readonly query: string = + 'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version '; + + constructor(private conn: Connection) {} + + /** + * Fetch Package2 versions by Package2 Id + * Sorts by semantic version, in descending order + * @param package2Id + * @param versionNumber + * @param isValidatedPackages + * @returns + */ + async fetchByPackage2Id( + package2Id: string, + versionNumber?: string, + isValidatedPackages?: boolean + ): Promise { + let query = this.query; + + let whereClause: string = `where Package2Id='${package2Id}' `; + + if (versionNumber) { + // TODO: validate version number + const versions = versionNumber.split('.'); + + if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; + if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; + if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; + if (versions[3]) whereClause += `and BuildNumber=${versions[3]} `; + } + + if (isValidatedPackages) whereClause += `and ValidationSkipped = false `; + + whereClause += `and IsDeprecated = false `; + query += whereClause; + + + const records = await QueryHelper.query(query, this.conn, true); + + + if (records.length > 1) { + return records.sort((a, b) => { + const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`; + const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`; + return semver.rcompare(v1, v2); + }); + } else return records; + } + + async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise { + let query = this.query; + + let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`; + query += whereClause; + + const records = await QueryHelper.query(query, this.conn, true); + return records[0]; + } + + async fetchByPackageBranchAndName( + packageBranch: string, + packageName: string, + versionNumber?: string, + ): Promise { + + let query = this.query; + + let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `; + if (versionNumber) { + // TODO: validate version number + const versions = versionNumber.split('.'); + if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; + if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; + if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; + } + query += whereClause; + + let orderByClause: string = `order by CreatedDate desc`; + query += orderByClause; + + const records = await QueryHelper.query(query, this.conn, true); + return records; + + } +} + +export interface Package2Version { + SubscriberPackageVersionId: string; + Package2Id: string; + Package2: { Name: string }; + IsPasswordProtected: boolean; + IsReleased: boolean; + MajorVersion: number; + MinorVersion: number; + PatchVersion: number; + BuildNumber: number; + CodeCoverage: { apexCodeCoveragePercentage: number }; + HasPassedCodeCoverageCheck: boolean; + Branch: string; +} diff --git a/packages/sfp-cli/src/core/package/version/Package2VersionInstaller.ts b/packages/sfp-cli/src/core/package/version/Package2VersionInstaller.ts new file mode 100644 index 000000000..906bb37d0 --- /dev/null +++ b/packages/sfp-cli/src/core/package/version/Package2VersionInstaller.ts @@ -0,0 +1,26 @@ +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class Package2VersionInstaller { + public constructor( + logger: Logger, + logLevel: LoggerLevel, + working_directory: string, + private targetUserName: string, + private packageId: string, + private waitTime: string, + private publishWaitTime?: string, + private installationkey?: string, + private securityType?: string, + private upgradeType?: string, + private apiVersion?: string, + private apexCompile: string = 'package' + ) {} + + public setInstallationKey(installationKey: string) { + this.installationkey = installationKey; + } + + + + +} diff --git a/packages/sfp-cli/src/core/package/version/PackageVersionLister.ts b/packages/sfp-cli/src/core/package/version/PackageVersionLister.ts new file mode 100644 index 000000000..9075d5292 --- /dev/null +++ b/packages/sfp-cli/src/core/package/version/PackageVersionLister.ts @@ -0,0 +1,62 @@ +import { SfProject } from '@salesforce/core'; +import { Package } from '@salesforce/packaging'; +import SFPOrg from '../../org/SFPOrg'; + +export default class PackageVersionLister { + + constructor(private hubOrg:SFPOrg) + { + + } + + public async listAllReleasedVersions(projectDir: string) { + + const sfProject = await SfProject.resolve(projectDir); + + const records = await Package.listVersions(this.hubOrg.getConnection(), sfProject, { + createdLastDays: undefined, + concise: true, + modifiedLastDays: undefined, + packages: [], + isReleased: true, + orderBy: undefined, + verbose: false, + }); + + const results: any[] = []; + + if (records?.length > 0) { + records.forEach((record) => { + results.push({ + Package2Id: record.Package2Id, + Branch: record.Branch, + Tag: record.Tag, + MajorVersion: record.MajorVersion, + MinorVersion: record.MinorVersion, + PatchVersion: record.PatchVersion, + BuildNumber: record.BuildNumber, + Id: record.Id, + SubscriberPackageVersionId: record.SubscriberPackageVersionId, + ConvertedFromVersionId: record.ConvertedFromVersionId, + Name: record.Name, + NamespacePrefix: record.Package2.NamespacePrefix, + Package2Name: record.Package2.Name, + Version: [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join( + '.' + ), + IsReleased: record.IsReleased, + CreatedDate: new Date(record.CreatedDate).toISOString().replace('T', ' ').substring(0, 16), + LastModifiedDate: new Date(record.LastModifiedDate) + .toISOString() + .replace('T', ' ') + .substring(0, 16), + ReleaseVersion: + record.ReleaseVersion == null ? '' : Number.parseFloat(record.ReleaseVersion).toFixed(1), + BuildDurationInSeconds: record.BuildDurationInSeconds == null ? '' : record.BuildDurationInSeconds, + }); + }); + } + + return results; + } +} diff --git a/packages/sfp-cli/src/core/package/version/PackageVersionUpdater.ts b/packages/sfp-cli/src/core/package/version/PackageVersionUpdater.ts new file mode 100644 index 000000000..55786d1b1 --- /dev/null +++ b/packages/sfp-cli/src/core/package/version/PackageVersionUpdater.ts @@ -0,0 +1,18 @@ +import SfpPackage from '../SfpPackage'; + +export default class PackageVersionUpdater { + public constructor() {} + + public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string { + if (!sfpPackage.versionNumber) { + throw new Error('The package doesnt have a version attribute, Please check your definition'); + } else { + let segments = sfpPackage.versionNumber.split('.'); + let numberToBeAppended = parseInt(buildNumber); + + if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number'); + else segments[3] = buildNumber; + return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`; + } + } +} diff --git a/packages/sfp-cli/src/core/permsets/AssignPermissionSets.ts b/packages/sfp-cli/src/core/permsets/AssignPermissionSets.ts new file mode 100644 index 000000000..2ff6a45e1 --- /dev/null +++ b/packages/sfp-cli/src/core/permsets/AssignPermissionSets.ts @@ -0,0 +1,17 @@ +import { Connection } from '@salesforce/core'; +import { Logger } from '@flxblio/sfp-logger'; +import AssignPermissionSetsImpl from './AssignPermissionSetsImpl'; + +export default class AssignPermissionSets { + static async applyPermsets(permsets: string[], conn: Connection, sourceDirectory: string, logger: Logger) { + let assignPermissionSetsImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + conn, + permsets, + sourceDirectory, + logger + ); + + let results = await assignPermissionSetsImpl.exec(); + if (results.failedAssignments.length > 0) throw new Error('Unable to assign permsets'); + } +} diff --git a/packages/sfp-cli/src/core/permsets/AssignPermissionSetsImpl.ts b/packages/sfp-cli/src/core/permsets/AssignPermissionSetsImpl.ts new file mode 100644 index 000000000..ba0049e0f --- /dev/null +++ b/packages/sfp-cli/src/core/permsets/AssignPermissionSetsImpl.ts @@ -0,0 +1,93 @@ +import { Connection } from '@salesforce/core'; +import child_process = require('child_process'); +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import PermissionSetFetcher from './PermissionSetFetcher'; +import { ZERO_BORDER_TABLE } from '../display/TableConstants'; +const Table = require('cli-table'); + +export default class AssignPermissionSetsImpl { + constructor( + private conn: Connection, + private permSets: string[], + private project_directory: string, + private packageLogger: Logger + ) {} + + public async exec(): Promise<{ + successfullAssignments: { + username: string; + permset: string; + }[]; + failedAssignments: { + username: string; + permset: string; + }[]; + }> { + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn); + let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment(); + + let failedAssignments: { + username: string; + permset: string; + }[] = []; + let successfullAssignments: { + username: string; + permset: string; + }[] = []; + + for (let permSet of this.permSets) { + let permSetAssignmentMatch = assignedPermSets.find((record) => { + return record.PermissionSet.Name === permSet; + }); + + if (permSetAssignmentMatch !== undefined) { + // Treat permsets that have already been assigned as successes + successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + continue; + } + + try { + let permsetAssignmentJson: string = child_process.execSync( + `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`, + { + cwd: this.project_directory, + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'inherit'], + } + ); + + let permsetAssignment = JSON.parse(permsetAssignmentJson); + if (permsetAssignment.status === 0) + successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + } catch (err) { + failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); + } + } + + if (successfullAssignments.length > 0) { + SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger); + this.printPermsetAssignments(successfullAssignments); + } + + if (failedAssignments.length > 0) { + SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger); + this.printPermsetAssignments(failedAssignments); + } + + return { successfullAssignments, failedAssignments }; + } + + private printPermsetAssignments(assignments: { username: string; permset: string }[]) { + let table = new Table({ + head: ['Username', 'Permission Set Assignment'], + chars: ZERO_BORDER_TABLE + }); + + assignments.forEach((assignment) => { + table.push([assignment.username, assignment.permset]); + }); + + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger); + } +} diff --git a/packages/sfp-cli/src/core/permsets/PermissionSetFetcher.ts b/packages/sfp-cli/src/core/permsets/PermissionSetFetcher.ts new file mode 100644 index 000000000..5133d9958 --- /dev/null +++ b/packages/sfp-cli/src/core/permsets/PermissionSetFetcher.ts @@ -0,0 +1,15 @@ +import { Connection } from '@salesforce/core'; +import QueryHelper from '../queryHelper/QueryHelper'; + +/* + * Retrieve Permsets for a user from a target org + */ +export default class PermissionSetFetcher { + constructor(private username: string, private conn: Connection) {} + + public async fetchAllPermsetAssignment() { + const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`; + + return QueryHelper.query(query, this.conn, false); + } +} diff --git a/packages/sfp-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts b/packages/sfp-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts new file mode 100644 index 000000000..87d04b6d7 --- /dev/null +++ b/packages/sfp-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts @@ -0,0 +1,46 @@ +import { Connection } from '@salesforce/core'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import QueryHelper from '../queryHelper/QueryHelper'; +import { delay } from '../utils/Delay'; + +const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`; + +export default class PermissionSetGroupUpdateAwaiter { + constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {} + + async waitTillAllPermissionSetGroupIsUpdated() { + SFPLogger.log( + `Checking status of permission sets group..`, + LoggerLevel.INFO, + this.logger + ); + while (true) { + try { + let records = await QueryHelper.query(psGroupQuery, this.connection, false); + if (records.length > 0) { + SFPLogger.log( + `Pausing deployment as ${records.length} PermissionSetGroups are being updated`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log( + `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`, + LoggerLevel.INFO, + this.logger + ); + await delay(this.intervalBetweenRepeats); + } else { + SFPLogger.log( + `Proceeding with deployment, as no PermissionSetGroups are being updated`, + LoggerLevel.INFO, + this.logger + ); + break; + } + } catch (error) { + SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger); + throw error; + } + } + } +} diff --git a/packages/sfp-cli/src/core/project/ProjectConfig.ts b/packages/sfp-cli/src/core/project/ProjectConfig.ts new file mode 100644 index 000000000..ebd7e1e20 --- /dev/null +++ b/packages/sfp-cli/src/core/project/ProjectConfig.ts @@ -0,0 +1,281 @@ +const fs = require('fs-extra'); +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import _ from 'lodash'; +import { PackageType } from '../package/SfpPackage'; +let path = require('path'); + +/** + * Helper functions for retrieving info from project config + */ +export default class ProjectConfig { + /** + * Returns 0H Id of package from project config + * @param projectConfig + * @param sfdxPackage + */ + public static getPackageId(projectConfig: any, sfdxPackage: string) { + if (projectConfig['packageAliases']?.[sfdxPackage]) { + return projectConfig['packageAliases'][sfdxPackage]; + } else { + throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); + } + } + + /** + * Returns package names, as an array of strings + * @param projectDirectory + */ + public static getAllPackages(projectDirectory: string): string[] { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let sfdxpackages = []; + projectConfig['packageDirectories'].forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); + }); + return sfdxpackages; + } + + public static getAllExternalPackages( + projectConfig: any + ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] { + let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = []; + let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); + const packageAliases = projectConfig.packageAliases || {}; + Object.entries(packageAliases).forEach(([key, value]) => { + if ( + !_.find( + packagesInCurrentDirectory, + (elem) => { + return elem.package == key; + }, + 0 + ) + ) + externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string }); + }); + return externalPackages; + } + + /** + * Returns package names from projectConfig, as an array of strings + * @param projectDirectory + */ + public static getAllPackagesFromProjectConfig(projectConfig: any): string[] { + let sfdxpackages = []; + projectConfig.packageDirectories.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); + }); + return sfdxpackages; + } + + public static getAllPackagesAndItsDependencies( + projectConfig: any + ): Map { + let pkgWithDependencies = new Map(); + let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); + for (let pkg of packages) { + if (pkg.dependencies) { + pkgWithDependencies.set(pkg.package, pkg.dependencies); + } + } + return pkgWithDependencies; + } + + public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let sfdxpackages = []; + projectConfig.packageDirectories?.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); + }); + return sfdxpackages; + } + + public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] { + let sfdxpackages = []; + projectConfig.packageDirectories?.forEach((pkg) => { + //Only push packages that have package and versionNumber, ignore everything else + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); + }); + return sfdxpackages; + } + + /** + * Returns package manifest as JSON object + * @param projectDirectory + */ + public static getSFDXProjectConfig(projectDirectory: string): any { + let projectConfigJSON: string; + + if (projectDirectory) { + projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json'); + } else { + projectConfigJSON = 'sfdx-project.json'; + } + + try { + return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8')); + } catch (error) { + throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`); + } + } + + /** + * Returns type of package + * @param projectConfig + * @param sfdxPackage + */ + public static getPackageType( + projectConfig: any, + sfdxPackage: string + ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff { + let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); + + if (projectConfig['packageAliases']?.[sfdxPackage]) { + return PackageType.Unlocked; + } else { + if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data; + else if(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff + else + return PackageType.Source; + } + } + + /** + * Returns package descriptor from package manifest at project directory + * @param projectDirectory + * @param sfdxPackage + */ + public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + + let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); + + return sfdxPackageDescriptor; + } + + /** + * Returns package descriptor from project config JSON object + * @param sfdxPackage + * @param projectConfig + */ + public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) { + let sfdxPackageDescriptor: any; + + if (sfdxPackage) { + projectConfig['packageDirectories'].forEach((pkg) => { + if (sfdxPackage == pkg['package']) { + sfdxPackageDescriptor = pkg; + } + }); + } + + if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`); + + return sfdxPackageDescriptor; + } + + /** + * Returns descriptor of default package + * @param projectDirectory + */ + public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any { + let packageDirectory: string; + let sfdxPackageDescriptor: any; + + let projectConfig = this.getSFDXProjectConfig(projectDirectory); + + //Return the default package directory + projectConfig['packageDirectories'].forEach((pkg) => { + if (pkg['default'] == true) { + packageDirectory = pkg['path']; + sfdxPackageDescriptor = pkg; + } + }); + + if (packageDirectory == null) throw new Error('Package or package directory not exist'); + else return sfdxPackageDescriptor; + } + + /** + * Returns pruned package manifest, containing sfdxPackage only + * @param projectDirectory + * @param sfdxPackage + */ + public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any { + const projectConfig = this.getSFDXProjectConfig(projectDirectory); + + return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage); + } + + /** + * Returns pruned package manifest, containing sfdxPackage only + * @param projectConfig + * @param sfdxPackage + */ + public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any { + if (sfdxPackage) { + let i = projectConfig['packageDirectories'].length; + while (i--) { + if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) { + projectConfig['packageDirectories'].splice(i, 1); + } + } + } else { + let i = projectConfig['packageDirectories'].length; + while (i--) { + if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) { + projectConfig['packageDirectories'].splice(i, 1); + } + } + } + projectConfig['packageDirectories'][0]['default'] = true; //add default = true + return projectConfig; + } + + /** + * Returns pruned package manifest, containing sfdxPackages only + * @param projectConfig + * @param sfdxPackages + */ + public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any { + let revisedPackageDirectory = []; + let originalPackageDirectory = projectConfig['packageDirectories']; + for (let pkg of originalPackageDirectory) { + for (const sfdxPackage of sfdxPackages) { + if (pkg.name == sfdxPackage) { + pkg.default = false; + revisedPackageDirectory.push(pkg); + } + } + } + projectConfig['packageDirectories'][0]['default'] = true; //add default = true + projectConfig.packageDirectories = revisedPackageDirectory; + return projectConfig; + } + + /** + * Returns pruned package manifest, containing sfdxPackages only + * @param projectConfig + * @param sfdxPackages + */ + public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any { + const projectConfig = this.getSFDXProjectConfig(projectDirectory); + return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages); + } + + + + public static async updateProjectConfigWithDependencies( + projectConfig: any, + dependencyMap: Map + ) { + let updatedprojectConfig = await _.cloneDeep(projectConfig); + updatedprojectConfig.packageDirectories.map((pkg) => { + return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) }); + }); + + return updatedprojectConfig; + } +} diff --git a/packages/sfp-cli/src/core/project/UserDefinedExternalDependency.ts b/packages/sfp-cli/src/core/project/UserDefinedExternalDependency.ts new file mode 100644 index 000000000..a56301ad5 --- /dev/null +++ b/packages/sfp-cli/src/core/project/UserDefinedExternalDependency.ts @@ -0,0 +1,61 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Connection, LoggerLevel } from '@salesforce/core'; +import _ from 'lodash'; +import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver'; + +/** + * Functions to deal with externalDependencyMap supplied by the user + * to aid in resolving transitive dependencies + */ +export default class UserDefinedExternalDependencyMap { + + + public fetchDependencyEntries(projectConfig: any) { + if (projectConfig.plugins?.sfp?.externalDependencyMap) { + let externalDependencyMap = projectConfig.plugins.sfp.externalDependencyMap; + SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG); + return externalDependencyMap; + } + else + return {}; + } + + public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) { + let externalDependencies = []; + let updatedProjectConfig = await _.cloneDeep(projectConfig); + let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null); + + let externalDependencyMap = this.fetchDependencyEntries(projectConfig); + + let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); + + for (let externalPackage2 of externalPackage2s) { + externalDependencies.push(externalPackage2.name); + } + for (let dependency of externalDependencies) { + if (!Object.keys(externalDependencyMap).includes(dependency)) { + externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }]; + } + } + updatedProjectConfig.plugins.sfp.externalDependencyMap = externalDependencyMap; + return updatedProjectConfig; + } + + public async cleanupEntries(projectConfig: any) { + let updatedProjectConfig = await _.cloneDeep(projectConfig); + if (updatedProjectConfig?.plugins?.sfp?.externalDependencyMap) { + const externalDependencyMap = updatedProjectConfig.plugins.sfp.externalDependencyMap; + for (let externalPackage of Object.keys(externalDependencyMap)) { + if (externalDependencyMap[externalPackage][0].package == '') { + delete externalDependencyMap[externalPackage]; + } else if ( + externalDependencyMap[externalPackage][0].package != '' && + externalDependencyMap[externalPackage][0].versionNumber == '' + ) { + delete externalDependencyMap[externalPackage][0].versionNumber; + } + } + } + return updatedProjectConfig; + } +} diff --git a/packages/sfp-cli/src/core/queryHelper/ChunkCollection.ts b/packages/sfp-cli/src/core/queryHelper/ChunkCollection.ts new file mode 100644 index 000000000..c6a6c9b7d --- /dev/null +++ b/packages/sfp-cli/src/core/queryHelper/ChunkCollection.ts @@ -0,0 +1,38 @@ + + +/** + * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars) + * @param collection values in SOQL WHERE clause + * @param chunkSize default is 4000 + * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000 + */ +export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] { + const result: string[][] = []; + chunkSize = chunkSize - offset; + + let chunk: string[] = []; + let numberOfCharsInChunk: number = 0; + for (const elem of collection) { + if (elem.length + 2 > chunkSize) { + throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`); + } + + const commasAndQuotes = 2*(chunk.length+1) + chunk.length; + if (numberOfCharsInChunk + elem.length + commasAndQuotes <= chunkSize) { + chunk.push(elem); + numberOfCharsInChunk += elem.length; + } else { + result.push(chunk); + + // Create new chunk + chunk = []; + numberOfCharsInChunk = 0; + chunk.push(elem); + numberOfCharsInChunk += elem.length; + } + } + + result.push(chunk); + + return result; +} \ No newline at end of file diff --git a/packages/sfp-cli/src/core/queryHelper/QueryHelper.ts b/packages/sfp-cli/src/core/queryHelper/QueryHelper.ts new file mode 100644 index 000000000..9b077895c --- /dev/null +++ b/packages/sfp-cli/src/core/queryHelper/QueryHelper.ts @@ -0,0 +1,18 @@ +import { Connection } from '@salesforce/core'; + +const retry = require('async-retry'); + +export default class QueryHelper { + static async query(query: string, conn: Connection, isTooling: boolean): Promise { + return retry( + async (bail) => { + let records; + if (isTooling) records = (await conn.tooling.query(query)).records; + else records = (await conn.query(query)).records; + + return records; + }, + { retries: 3, minTimeout: 2000 } + ); + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/PasswordGenerator.ts b/packages/sfp-cli/src/core/scratchorg/PasswordGenerator.ts new file mode 100644 index 000000000..482d5d529 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/PasswordGenerator.ts @@ -0,0 +1,41 @@ +import { Connection, User, AuthInfo, LoggerLevel } from '@salesforce/core'; +import SFPLogger from '@flxblio/sfp-logger'; + +export default class PasswordGenerator { + public async exec(userName: string) { + const query = `SELECT id FROM User WHERE username = '${userName}'`; + + const authInfo = await AuthInfo.create({ username: userName }); + const userConnection = await Connection.create({ authInfo: authInfo }); + let userRecord = (await userConnection.query(query)).records as any; + let passwordBuffer = User.generatePasswordUtf8(); + let pwd; + + await passwordBuffer.value(async (buffer: Buffer) => { + try { + pwd = buffer.toString('utf8'); + + // eslint-disable-next-line @typescript-eslint/ban-ts-ignore + // @ts-ignore TODO: expose `soap` on Connection however appropriate + const soap = userConnection.soap; + await soap.setPassword(userRecord[0].Id, pwd); + } catch (e) { + console.log(e); + pwd = undefined; + if (e.message === 'INSUFFICIENT_ACCESS: Cannot set password for self') { + SFPLogger.log( + `${e.message}. Incase of scratch org, Add "features": ["EnableSetPasswordInApi"] in your project-scratch-def.json then create your scratch org.`, + LoggerLevel.WARN + ); + } else { + SFPLogger.log(`${e.message}`, LoggerLevel.WARN); + } + } + }); + + return { + username: userName, + password: pwd, + }; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/ScratchOrg.ts b/packages/sfp-cli/src/core/scratchorg/ScratchOrg.ts new file mode 100644 index 000000000..8c700d757 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/ScratchOrg.ts @@ -0,0 +1,18 @@ +export default interface ScratchOrg { + failureMessage?: string; + tag?: string; + recordId?: string; + orgId?: string; + loginURL?: string; + signupEmail?: string; + username?: string; + alias?: string; + password?: string; + isScriptExecuted?: boolean; + expiryDate?: string; + accessToken?: string; + instanceURL?: string; + status?: string; + sfdxAuthUrl?: string; + elapsedTime?:number +} diff --git a/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts b/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts new file mode 100644 index 000000000..f354fbbd8 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts @@ -0,0 +1,149 @@ +import { AuthInfo, Org, StateAggregator } from '@salesforce/core'; +import ScratchOrg from './ScratchOrg'; +import PasswordGenerator from './PasswordGenerator'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { Duration } from '@salesforce/kit'; +import { ScratchOrgRequest } from '@salesforce/core'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import getFormattedTime from '../utils/GetFormattedTime'; +import SFPStatsSender from '../stats/SFPStatsSender'; +const retry = require('async-retry'); + +export default class ScratchOrgOperator { + constructor(private hubOrg: Org) {} + + public async create( + alias: string, + config_file_path: string, + expiry: number, + waitTime: number = 6 + ): Promise { + SFPLogger.log('Parameters: ' + alias + ' ' + config_file_path + ' ' + expiry + ' ', LoggerLevel.TRACE); + + let startTime = Date.now(); + SFPLogger.log(`Requesting Scratch Org ${alias}..`, LoggerLevel.INFO); + let scatchOrgResult = await this.requestAScratchOrg( + alias, + config_file_path, + Duration.days(expiry), + Duration.minutes(waitTime) + ); + SFPLogger.log(JSON.stringify(scatchOrgResult), LoggerLevel.TRACE); + + //create scratchOrg object + let scratchOrg: ScratchOrg = { + alias: alias, + orgId: scatchOrgResult.orgId, + username: scatchOrgResult.username, + loginURL: scatchOrgResult.loginURL, + elapsedTime: Date.now() - startTime, + }; + + try { + //Get Sfdx Auth URL + const authInfo = await AuthInfo.create({ username: scratchOrg.username }); + scratchOrg.sfdxAuthUrl = authInfo.getSfdxAuthUrl(); + } catch (error) { + throw new Error( + `Unable to set auth URL, Ignoring this scratch org, as its not suitable for pool due to ${error.message}` + ); + } + + //Generate Password + let passwordData = await new PasswordGenerator().exec(scratchOrg.username); + + scratchOrg.password = passwordData.password; + + if (!passwordData.password) { + throw new Error('Unable to setup password to scratch org'); + } else { + SFPLogger.log(`Password successfully set for ${scratchOrg.alias}`, LoggerLevel.DEBUG); + } + + SFPLogger.log( + `Creation request for Scratch Org ${scratchOrg.alias} is completed successfully in ${COLOR_KEY_MESSAGE( + getFormattedTime(scratchOrg.elapsedTime) + )}`, + LoggerLevel.INFO + ); + SFPStatsSender.logElapsedTime(`scratchorg.creation.time`,scratchOrg.elapsedTime) + return scratchOrg; + } + + public async delete(scratchOrgIds: string[]) { + let hubConn = this.hubOrg.getConnection(); + + await retry( + async (bail) => { + let result = await hubConn.del('ActiveScratchOrg', scratchOrgIds); + }, + { retries: 3, minTimeout: 3000 } + ); + } + + private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration) { + const createCommandOptions: ScratchOrgRequest = { + durationDays: expireIn.days, + nonamespace: false, + noancestors: false, + wait: waitTime, + retry: 3, + definitionfile: definitionFile, + }; + + const { username, scratchOrgInfo, authFields, warnings } = await this.hubOrg.scratchOrgCreate( + createCommandOptions + ); + + await this.setAliasForUsername(username, alias); + + return { + username: username, + loginURL: scratchOrgInfo.LoginUrl, + warnings, + orgId: authFields.orgId, + }; + } + + public async shareScratchOrgThroughEmail(emailId: string, scratchOrg: ScratchOrg) { + let hubOrgUserName = this.hubOrg.getUsername(); + let apiVersion = this.hubOrg.getConnection().retrieveMaxApiVersion(); + let body = `${hubOrgUserName} has fetched a new scratch org from the Scratch Org Pool!\n + All the post scratch org scripts have been succesfully completed in this org!\n + The Login url for this org is : ${scratchOrg.loginURL}\n + Username: ${scratchOrg.username}\n + Password: ${scratchOrg.password}\n + Please use sfdx force:auth:web:login -r ${scratchOrg.loginURL} -a command to authenticate against this Scratch org

+ Thank you for using SFPLogger!`; + + const options = { + method: 'POST', + body: JSON.stringify({ + inputs: [ + { + emailBody: body, + emailAddresses: emailId, + emailSubject: `${hubOrgUserName} created you a new Salesforce org`, + senderType: 'CurrentUser', + }, + ], + }), + url: `/services/data/v${apiVersion}actions/standard/emailSimple`, + }; + + await retry( + async (bail) => { + await this.hubOrg.getConnection().requestPost(options.url, options.body); + }, + { retries: 3, minTimeout: 30000 } + ); + + SFPLogger.log(`Succesfully send email to ${emailId} for ${scratchOrg.username}`, LoggerLevel.INFO); + } + + private async setAliasForUsername(username: string, aliasToSet: string): Promise { + const stateAggregator = await StateAggregator.getInstance(); + stateAggregator.aliases.set(aliasToSet, { username: username }); + await stateAggregator.aliases.write(); + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/ClientSourceTracking.ts b/packages/sfp-cli/src/core/scratchorg/pool/ClientSourceTracking.ts new file mode 100644 index 000000000..806dd2de1 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/ClientSourceTracking.ts @@ -0,0 +1,205 @@ +const path = require('path'); +import * as fs from 'fs-extra'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Connection, SfProject } from '@salesforce/core'; +import SFPOrg from '../../org/SFPOrg'; +import { SourceTracking } from '@salesforce/source-tracking'; +import ProjectConfig from '../../project/ProjectConfig'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import { EOL } from 'os'; +import { PackageType } from '../../package/SfpPackage'; +import Git from '../../git/Git'; + +const tmp = require('tmp'); + +export default class ClientSourceTracking { + private conn: Connection; + private org: SFPOrg; + private logger: Logger; + + private sfdxOrgIdDir; + + private constructor() {} + + static async create(conn: Connection, logger: Logger) { + const clientSourceTracking = new ClientSourceTracking(); + + clientSourceTracking.conn = conn; + + clientSourceTracking.org = await SFPOrg.create({ connection: clientSourceTracking.conn }); + clientSourceTracking.logger = logger; + + clientSourceTracking.sfdxOrgIdDir = `.sf/orgs/${clientSourceTracking.org.getOrgId()}`; + + return clientSourceTracking; + } + + async creatSourceTrackingFiles(): Promise { + await this.createRemoteSourceTracking(); + await this.createLocalSourceTracking(); + } + + private async createRemoteSourceTracking() { + const project = await SfProject.resolve(); + const tracking = await SourceTracking.create({ + org: this.org, + project: project, + }); + + tracking.resetRemoteTracking(); + } + + /** + * Create local source tracking from sfp artifacts installed in scratch org + */ + private async createLocalSourceTracking() { + + let git; + try { + git = await Git.initiateRepoAtTempLocation(this.logger); + + const sfpArtifacts = await this.org.getInstalledArtifacts(); + + if(sfpArtifacts.length==0) + throw new Error(`Unable to find any artifacts in the org`); + + //clean up MPD to just one package, so that source tracking lib + //does do a full scan and break + this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), sfpArtifacts[0].Name); + + const project = await SfProject.resolve(git.getRepositoryPath()); + + // Create local source tracking files in temp repo + const tracking = await SourceTracking.create({ + org: this.org, + project: project, + }); + + + + SFPLogger.log( + `Total Artifacts to Analyze: ${sfpArtifacts.length}`, + LoggerLevel.INFO, + this.logger + ); + + let count = 1; + for (const artifact of sfpArtifacts) { + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log( + COLOR_HEADER(`Package ${count} of ${sfpArtifacts.length}`), + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log(`Analyzing package ${COLOR_KEY_MESSAGE(artifact.Name)}`, LoggerLevel.INFO, this.logger); + // Checkout version of source code from which artifact was created + await git.checkout(artifact.CommitId__c,true) + + SFPLogger.log( + `Version pushed while preparing this org is ${artifact.Version__c} with SHA ${artifact.CommitId__c}`, + LoggerLevel.INFO, + this.logger + ); + + //clean up MPD to per package, to speed up + this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), artifact.Name); + + const projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); + + try { + const packageType = ProjectConfig.getPackageType(projectConfig, artifact.Name); + if (packageType === PackageType.Unlocked || packageType === PackageType.Source) { + let componentSet = ComponentSet.fromSource( + path.join( + git.getRepositoryPath(), + ProjectConfig.getPackageDescriptorFromConfig(artifact.Name, projectConfig).path + ) + ); + let components = componentSet.getSourceComponents(); + + //Get all components in the directory + //Count for logging purposes. dont have to waste processing convering + //a lazy collection to array once again + let componentCount = 1; + let componentPaths: string[] = []; + for (const component of components) { + componentCount++; + componentPaths.push(component.xml); + if (component.content) componentPaths.push(component.content); + } + + await tracking.updateLocalTracking({ + files: componentPaths, + }); + SFPLogger.log( + `Updated source tracking for package: ${artifact.Name} with ${componentCount} items`, + LoggerLevel.INFO, + this.logger + ); + } else SFPLogger.log(`Encountered data package... skipping`, LoggerLevel.INFO, this.logger); + } catch (error) { + if(error.message.includes) + { + SFPLogger.log( + ` sfp is unable to sync the package ${artifact.name}${EOL}, + as it not able to find the find equivalent git references`, + LoggerLevel.ERROR, + this.logger); + } + else + SFPLogger.log( + `Unable to update local source tracking due to ${error.message}`, + LoggerLevel.INFO, + this.logger + ); + SFPLogger.log(`Skipping package.. ${artifact.Name}`, LoggerLevel.WARN, this.logger); + } + count++; + } + + SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); + SFPLogger.log(`Copying the temporary repository over to original location`, LoggerLevel.INFO, this.logger); + // Copy source tracking files from temp repo to actual repo + fs.mkdirpSync(path.join(this.sfdxOrgIdDir, 'localSourceTracking')); + fs.copySync( + path.join(git.getRepositoryPath(), this.sfdxOrgIdDir, 'localSourceTracking'), + path.join(this.sfdxOrgIdDir, 'localSourceTracking') + ); + } catch (error) { + + if(error.message.includes(`reference is not a tree`)) + { + SFPLogger.log( + `sfp is unable to sync this repository, + as it not able to find the matching git references${EOL} + Are you sure this pool was created from the same repository?`, + LoggerLevel.ERROR, + this.logger); + } + else + SFPLogger.log( + `Unable to update local source tracking due to ${error.message}`, + LoggerLevel.ERROR, + this.logger + ); + } finally { + if(git) + git.deleteTempoRepoIfAny(); + } + } + + private cleanupSFDXProjectJsonTonOnePackage(projectDir: string, packageName: string) { + try { + let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectDirectory(projectDir, packageName); + fs.writeJSONSync(path.join(projectDir, 'sfdx-project.json'), cleanedUpProjectManifest, { + spaces: 4, + }); + } catch (error) { + SFPLogger.log( + `sfdx-project.json not found/unable to write, skipping..` + error.message, + LoggerLevel.DEBUG, + this.logger + ); + } + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts new file mode 100644 index 000000000..d21987759 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts @@ -0,0 +1,47 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class OrphanedOrgsDeleteImpl extends PoolBaseImpl { + public constructor(hubOrg: Org, private logger:Logger) { + super(hubOrg); + this.hubOrg = hubOrg; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getOrphanedScratchOrgs()) as any; + + let scratchOrgToDelete: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + let scrathOrgIds: string[] = []; + for (let element of results.records) { + if (element.Description?.includes(`"requestedBy":"sfp"`)) { + let soDetail: ScratchOrg = {}; + soDetail.orgId = element.ScratchOrg; + soDetail.username = element.SignupUsername; + soDetail.status = 'recovered'; + scratchOrgToDelete.push(soDetail); + scrathOrgIds.push(`'${element.Id}'`); + } + } + + if (scrathOrgIds.length > 0) { + let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( + scrathOrgIds.join(',') + ); + + if (activeScrathOrgs.records.length > 0) { + for (let scratchOrg of activeScrathOrgs.records) { + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); + SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is recovered`,LoggerLevel.TRACE,this.logger); + } + } + } + } + + return scratchOrgToDelete; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolBaseImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolBaseImpl.ts new file mode 100644 index 000000000..ba7ef6c41 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolBaseImpl.ts @@ -0,0 +1,22 @@ +import { Org } from '@salesforce/core'; +import { Result } from 'neverthrow'; +import ScratchOrg from '../ScratchOrg'; +import { PoolConfig } from './PoolConfig'; +import { PoolError } from './PoolError'; +import PreRequisiteCheck from './prequisitecheck/PreRequisiteCheck'; + +export abstract class PoolBaseImpl { + protected hubOrg: Org; + + constructor(hubOrg: Org) { + this.hubOrg = hubOrg; + } + + public async execute(): Promise|void> { + let prerequisiteCheck: PreRequisiteCheck = new PreRequisiteCheck(this.hubOrg); + await prerequisiteCheck.checkForPrerequisites(); + return this.onExec(); + } + + protected abstract onExec(): Promise|void>; +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts new file mode 100644 index 000000000..b18fc05f2 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts @@ -0,0 +1,40 @@ +import ScratchOrg from '../ScratchOrg'; + +export interface PoolConfig { + tag: string; + maxAllocation: number; + waitTime?: number; + expiry?: number; + batchSize?: number; + configFilePath: string; + releaseConfigFile?:string; + succeedOnDeploymentErrors?: boolean; + keys?: string; + installAll: boolean; + enableSourceTracking: boolean; + relaxAllIPRanges?: boolean; + ipRangesToBeRelaxed?: []; + retryOnFailure?: boolean; + fetchArtifacts: { + artifactFetchScript?: string; + npm?: { + npmrcPath?: string; + scope: string; + }; + }; + disableSourcePackageOverride?:boolean; + snapshotPool?:string; + postDeploymentScriptPath: string; + preDependencyInstallationScriptPath: string; + enableVlocity?: boolean; + min_allocation?: number; + current_allocation?: number; + to_allocate?: number; + to_satisfy_min?: number; + to_satisfy_max?: number; + scratchOrgs?: ScratchOrg[]; + failedToCreate?: number; + maxRetryCount?:number; + + +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts new file mode 100644 index 000000000..12c0bcadf --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts @@ -0,0 +1,432 @@ +import { Org } from '@salesforce/core'; +import Bottleneck from 'bottleneck'; +import { PoolConfig } from './PoolConfig'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgLimitsFetcher from './services/fetchers/ScratchOrgLimitsFetcher'; +import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; +import * as rimraf from 'rimraf'; +import * as fs from 'fs-extra'; +import PoolJobExecutor, { ScriptExecutionResult } from './PoolJobExecutor'; +import { PoolError, PoolErrorCodes } from './PoolError'; +import SFPLogger, { COLOR_KEY_MESSAGE, LoggerLevel } from '@flxblio/sfp-logger'; +import { Result, ok, err } from 'neverthrow'; +import SFPStatsSender from '../../stats/SFPStatsSender'; +import { EOL } from 'os'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; +import PoolFetchImpl from './PoolFetchImpl'; +import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; +import { COLOR_ERROR } from '@flxblio/sfp-logger'; +import getFormattedTime from '../../utils/GetFormattedTime'; +import path from 'path'; + +export default class PoolCreateImpl extends PoolBaseImpl { + private limiter; + private scriptExecutorWrappedForBottleneck; + private limits: any; + private scratchOrgInfoFetcher: ScratchOrgInfoFetcher; + private scratchOrgInfoAssigner: ScratchOrgInfoAssigner; + private scratchOrgOperator: ScratchOrgOperator; + private totalToBeAllocated: number; + private totalAllocated: number = 0; + + public constructor( + hubOrg: Org, + private pool: PoolConfig, + private poolScriptExecutor: PoolJobExecutor, + private logLevel: LoggerLevel + ) { + super(hubOrg); + this.limiter = new Bottleneck({ + maxConcurrent: this.pool.batchSize, + }); + + this.scriptExecutorWrappedForBottleneck = this.limiter.wrap(this.scriptExecutor); + } + + protected async onExec(): Promise> { + await this.hubOrg.refreshAuth(); + + const scriptExecPromises: Array> = []; + + + //fetch current status limits + this.limits = await new ScratchOrgLimitsFetcher(this.hubOrg).getScratchOrgLimits(); + + //Create Service classes + this.scratchOrgInfoFetcher = new ScratchOrgInfoFetcher(this.hubOrg); + this.scratchOrgInfoAssigner = new ScratchOrgInfoAssigner(this.hubOrg); + + //Create Operator + this.scratchOrgOperator = new ScratchOrgOperator(this.hubOrg); + + // Setup Logging Directory + rimraf.sync('script_exec_outputs'); + fs.mkdirpSync('script_exec_outputs'); + + //Compute allocation + try { + if (!this.pool.snapshotPool) { + SFPLogger.log(COLOR_KEY_MESSAGE('Computing Allocation..'), LoggerLevel.INFO); + try { + this.totalToBeAllocated = await this.computeAllocation(); + } catch (error) { + return err({ + success: 0, + failed: 0, + message: `Unable to access fields on ScratchOrgInfo, Please check the profile being used`, + errorCode: PoolErrorCodes.PrerequisiteMissing, + }); + } + + if (this.totalToBeAllocated === 0) { + if (this.limits.ActiveScratchOrgs.Remaining > 0) { + return err({ + success: 0, + failed: 0, + message: `The tag provided ${this.pool.tag} is currently at the maximum capacity , No scratch orgs will be allocated`, + errorCode: PoolErrorCodes.Max_Capacity, + }); + } else { + return err({ + success: 0, + failed: 0, + message: `There is no capacity to create a pool at this time, Please try again later`, + errorCode: PoolErrorCodes.No_Capacity, + }); + } + } + + //Generate Scratch Orgs + this.pool.scratchOrgs = await this.generateScratchOrgs( + this.pool, + this.scratchOrgOperator, + this.scratchOrgInfoAssigner + ); + } else { + this.pool.scratchOrgs = await this.fetchScratchOrgsFromSnapshotPool( + this.pool, + this.scratchOrgInfoFetcher, + this.scratchOrgInfoAssigner + ); + } + } catch (error) { + return err({ + success: 0, + failed: this.pool.failedToCreate, + message: `All requested scratch orgs failed to provision, Please check your code or config \n Failed with ${error.message}`, + errorCode: PoolErrorCodes.UnableToProvisionAny, + }); + } + + // Assign workers to executed scripts + for (const scratchOrg of this.pool.scratchOrgs) { + const result = this.scriptExecutorWrappedForBottleneck(scratchOrg, this.hubOrg.getUsername()); + scriptExecPromises.push(result); + } + + await Promise.all(scriptExecPromises); + + this.pool = await this.finalizeGeneratedScratchOrgs( + this.pool, + this.scratchOrgOperator, + this.scratchOrgInfoFetcher + ); + + if (!this.pool.scratchOrgs || this.pool.scratchOrgs.length == 0) { + return err({ + success: 0, + failed: this.pool.failedToCreate, + message: `All requested scratch orgs failed to provision, Please check your code or config`, + errorCode: PoolErrorCodes.UnableToProvisionAny, + }); + } + return ok(this.pool); + + + } + + private async computeAllocation(): Promise { + //Compute current pool requirement + const activeCount = await this.scratchOrgInfoFetcher.getCountOfActiveScratchOrgsByTag(this.pool.tag); + return this.allocateScratchOrgsPerTag(this.limits.ActiveScratchOrgs.Remaining, activeCount, this.pool); + } + + private allocateScratchOrgsPerTag( + remainingScratchOrgs: number, + countOfActiveScratchOrgs: number, + pool: PoolConfig + ) { + pool.current_allocation = countOfActiveScratchOrgs; + pool.to_allocate = 0; + pool.to_satisfy_max = + pool.maxAllocation - pool.current_allocation > 0 ? pool.maxAllocation - pool.current_allocation : 0; + + if (pool.to_satisfy_max > 0 && pool.to_satisfy_max <= remainingScratchOrgs) { + pool.to_allocate = pool.to_satisfy_max; + } else if (pool.to_satisfy_max > 0 && pool.to_satisfy_max > remainingScratchOrgs) { + pool.to_allocate = remainingScratchOrgs; + } + + SFPLogger.log( + `${EOL}Current Allocation of ScratchOrgs in the pool ${this.pool.tag}: ` + pool.current_allocation, + LoggerLevel.INFO + ); + SFPLogger.log('Remaining Active scratchOrgs in the org: ' + remainingScratchOrgs, LoggerLevel.INFO); + SFPLogger.log('ScratchOrgs to be allocated: ' + pool.to_allocate, LoggerLevel.INFO); + return pool.to_allocate; + } + + private async generateScratchOrgs( + pool: PoolConfig, + scratchOrgOperator: ScratchOrgOperator, + scratchOrgInfoAssigner: ScratchOrgInfoAssigner + ) { + //Generate Scratch Orgs + SFPLogger.log(COLOR_KEY_MESSAGE('Generate Scratch Orgs..'), LoggerLevel.INFO); + + const scratchOrgPromises = new Array>(); + + const scratchOrgCreationLimiter = new Bottleneck({ + maxConcurrent: pool.batchSize, + }); + + addDescriptionToScratchOrg(pool); + + const startTime = Date.now(); + for (let i = 1; i <= pool.to_allocate; i++) { + const scratchOrgPromise: Promise = scratchOrgCreationLimiter.schedule(() => + scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime) + ); + scratchOrgPromises.push(scratchOrgPromise); + } + + SFPLogger.log(`Waiting for all scratch org request to complete, Please wait`); + //Wait for all orgs to be created + const scratchOrgCreationResults = await Promise.allSettled(scratchOrgPromises); + //Only worry about scrath orgs that have suceeded + const isFulfilled = (p: PromiseSettledResult): p is PromiseFulfilledResult => p.status === 'fulfilled'; + const isRejected = (p: PromiseSettledResult): p is PromiseRejectedResult => p.status === 'rejected'; + + let scratchOrgs = scratchOrgCreationResults.filter(isFulfilled).map((p) => p.value); + const rejectedScratchOrgs = scratchOrgCreationResults.filter(isRejected).map((p) => p.reason); + for (const reason of rejectedScratchOrgs) { + if (reason.message.includes(`The client has timed out`)) { + //Log how many we were able to create + const elapsedTime = Date.now() - startTime; + SFPLogger.log( + `A scratch org creation was rejected due to saleforce not responding within the set wait time of ${pool.waitTime} mins \n` + + `Time elasped so far ${COLOR_KEY_MESSAGE( + getFormattedTime(elapsedTime) + )},You might need to inrease the wait time further and rety ` + ); + } else SFPLogger.log(`A scratch org creation was rejected due to ${reason.message}`); + } + + //Log how many we were able to create + const elapsedTime = Date.now() - startTime; + SFPLogger.log( + `Created ${COLOR_SUCCESS(scratchOrgs.length)} of ${pool.to_allocate} successfully with ${COLOR_ERROR( + rejectedScratchOrgs.length + )} failures in ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` + ); + + SFPStatsSender.logElapsedTime(`pool.scratchorg.creation.time`, elapsedTime, { pool: pool.tag }); + if (scratchOrgs && scratchOrgs.length > 0) { + //Splice scratchorgs that are having incorrect status of deleted , Why salesforce why?? + let index = scratchOrgs.length; + while (index--) { + try { + const orgDetails = await new OrgDetailsFetcher(scratchOrgs[index].username).getOrgDetails(); + if (orgDetails.status === 'Deleted') { + throw new Error( + `Throwing away scratch org ${this.pool.scratchOrgs[index].alias} as it has a status of deleted` + ); + } + } catch (error) { + scratchOrgs.splice(index, 1); + } + } + + scratchOrgs = await this.scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); + + const scratchOrgInprogress = []; + + scratchOrgs.forEach((scratchOrg) => { + scratchOrgInprogress.push({ + Id: scratchOrg.recordId, + Pooltag__c: this.pool.tag, + Password__c: scratchOrg.password, + SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, + Allocation_status__c: 'In Progress', + }); + }); + + if (scratchOrgInprogress.length > 0) { + //set pool tag + await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); + } + return scratchOrgs; + } else throw new Error(`No scratch orgs were sucesfully generated`); + + function addDescriptionToScratchOrg(pool: PoolConfig) { + + const configClonePath = path.join('.sfp','scratchorg-configs',`${ makeFileId(8)}.json`); + fs.mkdirpSync('.sfp/scratchorg-configs'); + fs.copyFileSync(pool.configFilePath,configClonePath); + + const scratchOrgDefn = fs.readJSONSync(configClonePath); + if (!scratchOrgDefn.description) + scratchOrgDefn.description = JSON.stringify({ + requestedBy: 'sfp', + pool: pool.tag, + requestedAt: new Date().toISOString(), + }); + else + scratchOrgDefn.description = scratchOrgDefn.description.concat( + ' ', + JSON.stringify({ + requestedBy: 'sfp', + pool: pool.tag, + requestedAt: new Date().toISOString(), + }) + ); + fs.writeJSONSync(configClonePath, scratchOrgDefn, { spaces: 4 }); + pool.configFilePath = configClonePath; + } + + function makeFileId(length): string { + let result = ''; + const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + } + + private async fetchScratchOrgsFromSnapshotPool( + pool: PoolConfig, + scratchOrgInfoFetcher: ScratchOrgInfoFetcher, + scratchOrgInfoAssigner: ScratchOrgInfoAssigner + ) { + //Generate Scratch Orgs + SFPLogger.log( + COLOR_KEY_MESSAGE(`Fetching Scratch Orgs from snapshot pool ${this.pool.snapshotPool}`), + LoggerLevel.INFO + ); + + let scratchOrgs = (await new PoolFetchImpl( + this.hubOrg, + this.pool.snapshotPool, + false, + true, + undefined, + undefined, + undefined, + true, + this.pool.maxAllocation + ).execute()) as ScratchOrg[]; + scratchOrgs = await scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); + + const scratchOrgInprogress = []; + + if (scratchOrgs && scratchOrgs.length > 0) { + scratchOrgs.forEach((scratchOrg) => { + scratchOrgInprogress.push({ + Id: scratchOrg.recordId, + Pooltag__c: this.pool.tag, + Password__c: scratchOrg.password, + SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, + Allocation_status__c: 'In Progress', + }); + }); + + if (scratchOrgInprogress.length > 0) { + //set pool tag + await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); + } + return scratchOrgs; + } else { + throw new Error('No scratch orgs were found to be fetched'); + } + } + + private async finalizeGeneratedScratchOrgs( + pool: PoolConfig, + scratchOrgOperator: ScratchOrgOperator, + scratchOrgInfoFetcher: ScratchOrgInfoFetcher + ) { + pool.failedToCreate = 0; + for (let i = pool.scratchOrgs.length - 1; i >= 0; i--) { + const scratchOrg = pool.scratchOrgs[i]; + if (scratchOrg.isScriptExecuted) { + continue; + } + + SFPLogger.log( + `Failed to execute scripts for ${scratchOrg.username} with alias ${scratchOrg.alias} due to ${scratchOrg.failureMessage}`, + LoggerLevel.ERROR + ); + + try { + //Delete scratchorgs that failed to execute script + + const activeScratchOrgRecordId = await scratchOrgInfoFetcher.getActiveScratchOrgRecordIdGivenScratchOrg( + scratchOrg.orgId + ); + + await scratchOrgOperator.delete([activeScratchOrgRecordId]); + console.log(`Succesfully deleted scratchorg ${scratchOrg.username}`); + } catch (error) { + SFPLogger.log( + `Unable to delete the scratchorg ${scratchOrg.username}.. due to\n` + error, + LoggerLevel.ERROR + ); + } + + pool.failedToCreate += 1; + pool.scratchOrgs.splice(i, 1); + } + return pool; + } + + private async scriptExecutor(scratchOrg: ScratchOrg): Promise { + SFPLogger.log( + `Executing Preparation Job ${scratchOrg.alias} with username: ${scratchOrg.username}`, + LoggerLevel.INFO + ); + + const startTime = Date.now(); + const result = await this.poolScriptExecutor.execute(scratchOrg, this.hubOrg, this.logLevel); + + if (result.isOk()) { + scratchOrg.isScriptExecuted = true; + const submitInfoToPool = await this.scratchOrgInfoAssigner.setScratchOrgInfo({ + Id: scratchOrg.recordId, + Allocation_status__c: 'Available', + }); + if (!submitInfoToPool) { + scratchOrg.isScriptExecuted = false; + scratchOrg.failureMessage = 'Unable to set the scratch org record in Pool'; + SFPStatsSender.logCount('prepare.org.failed'); + } else { + SFPStatsSender.logCount('prepare.org.succeeded'); + } + + SFPStatsSender.logElapsedTime('prepare.org.singlejob.elapsed_time', Date.now() - startTime, { + poolname: this.pool.tag, + }); + } else { + scratchOrg.isScriptExecuted = false; + scratchOrg.failureMessage = result.error.message; + SFPStatsSender.logCount('prepare.org.failed'); + } + + return scratchOrg; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts new file mode 100644 index 000000000..1a6768542 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts @@ -0,0 +1,65 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; +import { Logger } from '@flxblio/sfp-logger'; +import { LoggerLevel } from '@flxblio/sfp-logger'; + +export default class PoolDeleteImpl extends PoolBaseImpl { + private tag: string; + private mypool: boolean; + private allScratchOrgs: boolean; + private inprogressonly: boolean; + + public constructor(hubOrg: Org, tag: string, mypool: boolean, allScratchOrgs: boolean, inprogressonly: boolean,private logger:Logger) { + super(hubOrg); + this.hubOrg = hubOrg; + this.tag = tag; + this.mypool = mypool; + this.allScratchOrgs = allScratchOrgs; + this.inprogressonly = inprogressonly; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + this.mypool, + !this.allScratchOrgs + )) as any; + + let scratchOrgToDelete: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + let scrathOrgIds: string[] = []; + for (let element of results.records) { + if (!this.inprogressonly || element.Allocation_status__c === 'In Progress') { + let soDetail: ScratchOrg = {}; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.expiryDate = element.ExpirationDate; + soDetail.status = 'Deleted'; + + scratchOrgToDelete.push(soDetail); + scrathOrgIds.push(`'${element.Id}'`); + } + } + + if (scrathOrgIds.length > 0) { + let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( + scrathOrgIds.join(',') + ); + + if (activeScrathOrgs.records.length > 0) { + for (let scratchOrg of activeScrathOrgs.records) { + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); + SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is deleted successfully`,LoggerLevel.TRACE,this.logger); + } + } + } + } + + return scratchOrgToDelete; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolError.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolError.ts new file mode 100644 index 000000000..820346576 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolError.ts @@ -0,0 +1,13 @@ +export interface PoolError { + success: number; + failed: number; + errorCode: PoolErrorCodes; + message?: string; +} + +export enum PoolErrorCodes { + Max_Capacity = 'MaxCapacity', + No_Capacity = 'NoCapacity', + PrerequisiteMissing = 'PrerequisitesMissing', + UnableToProvisionAny = 'UnableToProvisionAny', +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts new file mode 100644 index 000000000..77a2c3566 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts @@ -0,0 +1,244 @@ +import SFPLogger from '@flxblio/sfp-logger'; +import { AuthInfo, LoggerLevel, Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import { getUserEmail } from './services/fetchers/GetUserEmail'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; +import ClientSourceTracking from './ClientSourceTracking'; +import isValidSfdxAuthUrl from './prequisitecheck/IsValidSfdxAuthUrl'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class PoolFetchImpl extends PoolBaseImpl { + private tag: string; + private mypool: boolean; + private sendToUser: string; + private alias: string; + private setdefaultusername: boolean; + private authURLEnabledScratchOrg: boolean; + private isSourceTrackingToBeSet: boolean = false; + + public constructor( + hubOrg: Org, + tag: string, + mypool: boolean, + authURLEnabledScratchOrg: boolean, + sendToUser?: string, + alias?: string, + setdefaultusername?: boolean, + private fetchAllScratchOrgs?: boolean, + private limitBy?:number + ) { + super(hubOrg); + this.tag = tag; + this.mypool = mypool; + this.authURLEnabledScratchOrg = authURLEnabledScratchOrg; + this.sendToUser = sendToUser; + this.alias = alias; + this.setdefaultusername = setdefaultusername; + } + + public setSourceTrackingOnFetch() { + this.isSourceTrackingToBeSet = true; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + this.mypool, + true + )) as any; + + let availableSo = []; + if (results.records.length > 0) { + availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); + } + if (availableSo.length == 0) { + throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); + } + + if (this.fetchAllScratchOrgs) { + return this.fetchAllScratchOrg(availableSo,this.limitBy); + } else return this.fetchSingleScratchOrg(availableSo); + } + + private async fetchAllScratchOrg(availableSo: any[],limitBy?:number): Promise { + let fetchedSOs: ScratchOrg[] = []; + + if (availableSo.length > 0) { + SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); + + let count = 1; + for (let element of availableSo) { + if (this.authURLEnabledScratchOrg) { + if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { + SFPLogger.log( + `Iterating through pool to find a scratch org with valid authURL`, + LoggerLevel.TRACE + ); + continue; + } + } + + + + SFPLogger.log( + `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, + LoggerLevel.TRACE + ); + let soDetail: any = {}; + soDetail['Id'] = element.Id; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; + soDetail.status = 'Available'; + soDetail.alias = `SO` + count; + fetchedSOs.push(soDetail); + + + if(limitBy && count==limitBy) + break; + + count++; + } + } + + for (const soDetail of fetchedSOs) { + //Login to the org + let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); + if (!isLoginSuccessFull) { + SFPLogger.log(`Unable to login to scratchorg ${soDetail.username}}`, LoggerLevel.ERROR); + fetchedSOs = fetchedSOs.filter((item) => item.username !== soDetail.username); + } + } + + return fetchedSOs; + } + + private async fetchSingleScratchOrg(availableSo: any[]): Promise { + let soDetail: ScratchOrg; + + if (availableSo.length > 0) { + SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); + + for (let element of availableSo) { + if (this.authURLEnabledScratchOrg) { + if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { + SFPLogger.log( + `Iterating through pool to find a scratch org with valid authURL`, + LoggerLevel.TRACE + ); + continue; + } + } + + let allocateSO = await new ScratchOrgInfoAssigner(this.hubOrg).setScratchOrgInfo({ + Id: element.Id, + Allocation_status__c: 'Allocate', + }); + if (allocateSO === true) { + SFPLogger.log( + `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, + LoggerLevel.TRACE + ); + soDetail = {}; + soDetail['Id'] = element.Id; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; + soDetail.status = 'Assigned'; + + break; + } else { + SFPLogger.log( + `Scratch org ${element.SignupUsername} allocation failed. trying to get another Scratch org from ${this.tag} pool`, + LoggerLevel.TRACE + ); + } + } + } + + if (availableSo.length == 0 || !soDetail) { + throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); + } + + if (this.sendToUser) { + //Fetch the email for user id + let emailId; + try { + emailId = await getUserEmail(this.sendToUser, this.hubOrg); + } catch (error) { + SFPLogger.log( + 'Unable to fetch details of the specified user, Check whether the user exists in the org ', + LoggerLevel.ERROR + ); + throw new Error('Failed to fetch user details'); + } + + try { + //Send an email for username + await new ScratchOrgOperator(this.hubOrg).shareScratchOrgThroughEmail(emailId, soDetail); + } catch (error) { + SFPLogger.log( + 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org', + LoggerLevel.ERROR + ); + throw new Error( + 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org' + ); + } + } else { + //Login to the org + let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); + //Attempt to Fetch Source Tracking Files and silently continue if it fails + if (isLoginSuccessFull && this.isSourceTrackingToBeSet) { + try { + const conn = (await Org.create({ aliasOrUsername: soDetail.username })).getConnection(); + const clientSourceTracking = await ClientSourceTracking.create(conn, null); + await clientSourceTracking.creatSourceTrackingFiles(); + } catch (error) { + SFPLogger.log('Retriveing Source Tracking skipped.. ' + error.message, LoggerLevel.TRACE); + } + } + } + return soDetail; + } + + private async loginToScratchOrgIfSfdxAuthURLExists(soDetail: ScratchOrg): Promise { + try { + if (soDetail.sfdxAuthUrl && isValidSfdxAuthUrl(soDetail.sfdxAuthUrl)) { + + + const oauth2Options = AuthInfo.parseSfdxAuthUrl(soDetail.sfdxAuthUrl); + const authInfo = await AuthInfo.create({ oauth2Options }); + await authInfo.save({...authInfo.getFields(),isScratch:true,devHubUsername:this.hubOrg.getUsername(),expirationDate:soDetail.expiryDate}); + + await authInfo.handleAliasAndDefaultSettings({ + alias: this.alias?this.alias:soDetail.alias, + setDefault: true, + setDefaultDevHub: false, + }); + + const result = authInfo.getFields(true); + // ensure the clientSecret field... even if it is empty + // as per https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/auth/sfdxurl/store.ts + result.clientSecret = result.clientSecret ?? ''; + await AuthInfo.identifyPossibleScratchOrgs(result, authInfo); + + return true; + } else { + SFPLogger.log('Unable to autenticate to the scratch org', LoggerLevel.INFO); + return false; + } + } catch (error) { + SFPLogger.log('Unable to autenticate to the scratch org due ' + error.message, LoggerLevel.ERROR); + return false; + } + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts new file mode 100644 index 000000000..1d70e4aff --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts @@ -0,0 +1,41 @@ +import { Org } from '@salesforce/core'; +import { PoolConfig } from './PoolConfig'; +import ScratchOrg from '../ScratchOrg'; +import { Result } from 'neverthrow'; +import * as fs from 'fs-extra'; +import { EOL } from 'os'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; + +export default abstract class PoolJobExecutor { + protected logToFilePath: string; + + constructor(protected pool: PoolConfig) {} + + async execute( + scratchOrg: ScratchOrg, + hubOrg: Org, + logLevel: LoggerLevel + ): Promise> { + this.logToFilePath = `.sfp/prepare_logs/${scratchOrg.alias}.log`; + //Create file logger + fs.outputFileSync(this.logToFilePath, `sfp--log${EOL}`); + SFPLogger.log(`Preparation Log files for ${scratchOrg.username} written to ${this.logToFilePath}`); + return this.executeJob(scratchOrg, hubOrg, this.logToFilePath, logLevel); + } + + abstract executeJob( + scratchOrg: ScratchOrg, + hubOrg: Org, + logToFilePath: string, + logLevel: LoggerLevel + ): Promise>; +} + +export interface ScriptExecutionResult { + scratchOrgUsername: string; +} + +export interface JobError { + message: string; + scratchOrgUsername: string; +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolListImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolListImpl.ts new file mode 100644 index 000000000..bf5ad0d64 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolListImpl.ts @@ -0,0 +1,48 @@ +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrg from '../ScratchOrg'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; + +export default class PoolListImpl extends PoolBaseImpl { + private tag: string; + private allScratchOrgs: boolean; + + public constructor(hubOrg: Org, tag: string, allScratchOrgs: boolean) { + super(hubOrg); + this.hubOrg = hubOrg; + this.tag = tag; + this.allScratchOrgs = allScratchOrgs; + } + + protected async onExec(): Promise { + const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( + this.tag, + null, + !this.allScratchOrgs + )) as any; + + let scratchOrgList: ScratchOrg[] = new Array(); + if (results.records.length > 0) { + for (let element of results.records) { + let soDetail: ScratchOrg = {}; + soDetail.tag = element.Pooltag__c; + soDetail.orgId = element.ScratchOrg; + soDetail.loginURL = element.LoginUrl; + soDetail.username = element.SignupUsername; + soDetail.password = element.Password__c; + soDetail.expiryDate = element.ExpirationDate; + if (element.Allocation_status__c === 'Assigned') { + soDetail.status = 'In use'; + } else if (element.Allocation_status__c === 'Available') { + soDetail.status = 'Available'; + } else { + soDetail.status = 'Provisioning in progress'; + } + + scratchOrgList.push(soDetail); + } + } + + return scratchOrgList; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts new file mode 100644 index 000000000..435d6fac7 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts @@ -0,0 +1,26 @@ +import { Org } from '@salesforce/core'; +import { PoolBaseImpl } from './PoolBaseImpl'; +import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; +import ScratchOrgOperator from '../ScratchOrgOperator'; + +export default class PoolOrgDeleteImpl extends PoolBaseImpl { + username: string; + + public constructor(hubOrg: Org, username: string) { + super(hubOrg); + this.hubOrg = hubOrg; + this.username = username; + } + + protected async onExec(): Promise { + try { + let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgIdGivenUserName(this.username); + await new ScratchOrgOperator(this.hubOrg).delete(scratchOrgId); + } catch (err) { + throw new Error( + `Either the scratch org doesn't exist or you do not have the correct permissions, Failed with ` + + err.message + ); + } + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts b/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts new file mode 100644 index 000000000..9cd50260a --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts @@ -0,0 +1,19 @@ +export default function isValidSfdxAuthUrl(sfdxAuthUrl: string): boolean { + if (sfdxAuthUrl.match(/force:\/\/(?[a-zA-Z0-9._]+)@.+/)) { + return true; + } else { + let match = sfdxAuthUrl.match( + /force:\/\/(?[a-zA-Z0-9._=]+):(?[a-zA-Z0-9]*):(?[a-zA-Z0-9._=]+)@.+/ + ); + + if (match !== null) { + if (match.groups.refreshToken === 'undefined') { + return false; + } else { + return true; + } + } else { + return false; + } + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts b/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts new file mode 100644 index 000000000..18da896a9 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts @@ -0,0 +1,63 @@ +import { Org } from '@salesforce/core'; +const retry = require('async-retry'); +import { Result, ok, err } from 'neverthrow'; +import { PoolConfig } from '../PoolConfig'; +import { PoolError, PoolErrorCodes } from '../PoolError'; + +export default class PreRequisiteCheck { + private static isPrerequisiteChecked: boolean = false; + private static isPrerequisiteMet = false; + private static describeResult; + + private hubOrg: Org; + + constructor(hubOrg: Org) { + this.hubOrg = hubOrg; + } + + public async checkForPrerequisites(): Promise { + let sfdxAuthUrlFieldExists = false; + let conn = this.hubOrg.getConnection(); + let expectedValues = ['In Progress', 'Available', 'Allocate', 'Assigned','Return']; + let availableValues: string[] = []; + if (!PreRequisiteCheck.isPrerequisiteChecked) { + await retry( + async (bail) => { + PreRequisiteCheck.describeResult = await conn.sobject('ScratchOrgInfo').describe(); + if (PreRequisiteCheck.describeResult) { + for (const field of PreRequisiteCheck.describeResult.fields) { + if (field.name === 'SfdxAuthUrl__c') { + sfdxAuthUrlFieldExists = true; + } + + if (field.name === 'Allocation_status__c' && field.picklistValues.length >= 4) { + for (let picklistValue of field.picklistValues) { + if (picklistValue.active) { + availableValues.push(picklistValue.value); + } + } + } + } + } + }, + { retries: 3, minTimeout: 30000 } + ); + + PreRequisiteCheck.isPrerequisiteChecked = true; + //If there are values returned, its not compatible + let statusValuesAvailable = + expectedValues.filter((item) => { + return !availableValues.includes(item); + }).length <= 1 + ? true + : false; + + if (sfdxAuthUrlFieldExists && statusValuesAvailable) PreRequisiteCheck.isPrerequisiteMet = true; + } + + if (!PreRequisiteCheck.isPrerequisiteMet) { + throw new Error( `Required Prerequisite values in ScratchOrgInfo is missing in the DevHub` + + `For more information Please refer https://sfp.flxblio.io/getting-started/prerequisites \n`); + } + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts new file mode 100644 index 000000000..e0c34bf9e --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts @@ -0,0 +1,28 @@ +import { LoggerLevel, Org } from '@salesforce/core'; + +let retry = require('async-retry'); +import SFPLogger from '@flxblio/sfp-logger'; + +export async function getUserEmail(username: string, hubOrg: Org) { + let hubConn = hubOrg.getConnection(); + + return retry( + async (bail) => { + if (!username) { + bail(new Error('username cannot be null. provide a valid username')); + return; + } + let query = `SELECT email FROM user WHERE username='${username}'`; + + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + + if (results.records.size < 1) { + bail(new Error(`No user found with username ${username} in devhub.`)); + return; + } + return results.records[0].Email; + }, + { retries: 3, minTimeout: 3000 } + ); +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts new file mode 100644 index 000000000..a89ad737a --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts @@ -0,0 +1,187 @@ +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; +import { Org } from '@salesforce/core'; +import ScratchOrg from '../../../ScratchOrg'; +const retry = require('async-retry'); +const ORDER_BY_FILTER = ' ORDER BY CreatedDate DESC'; + +export default class ScratchOrgInfoFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgRecordId(scratchOrgs: ScratchOrg[]) { + if (scratchOrgs == undefined || scratchOrgs.length == 0) return; + + let hubConn = this.hubOrg.getConnection(); + + let scratchOrgIds = scratchOrgs + .map(function (scratchOrg) { + scratchOrg.orgId = scratchOrg.orgId.slice(0, 15); + return `'${scratchOrg.orgId}'`; + }) + .join(','); + + let query = `SELECT Id, ScratchOrg FROM ScratchOrgInfo WHERE ScratchOrg IN ( ${scratchOrgIds} )`; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + + return retry( + async (bail) => { + const results = (await hubConn.query(query)) as any; + let resultAsObject = this.arrayToObject(results.records, 'ScratchOrg'); + + SFPLogger.log(JSON.stringify(resultAsObject), LoggerLevel.TRACE); + + scratchOrgs.forEach((scratchOrg) => { + scratchOrg.recordId = resultAsObject[scratchOrg.orgId]['Id']; + }); + + return scratchOrgs; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getScratchOrgsByTag(tag: string, isMyPool: boolean, unAssigned: boolean) { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query; + + if (tag) + query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + else + query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c != null AND Status = 'Active' `; + + if (isMyPool) { + query = query + ` AND createdby.username = '${this.hubOrg.getUsername()}' `; + } + if (unAssigned) { + // if new version compatible get Available / In progress + query = + query + `AND ( Allocation_status__c ='Available' OR Allocation_status__c = 'In Progress' ) `; + } + query = query + ORDER_BY_FILTER; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getOrphanedScratchOrgs() { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query; + query = `SELECT Id, Pooltag__c, SignupUsername, Description, ScratchOrg FROM ScratchOrgInfo WHERE Pooltag__c = null AND Status = 'Active'`; + query = query + ORDER_BY_FILTER; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgsByInfoId(scrathOrgIds: string) { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, SignupUsername FROM ActiveScratchOrg WHERE ScratchOrgInfoId IN (${scrathOrgIds}) `; + + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getCountOfActiveScratchOrgsByTag(tag: string): Promise { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + SFPLogger.log('RESULT:' + JSON.stringify(results), LoggerLevel.TRACE); + return results.totalSize; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getCountOfActiveScratchOrgsByTagAndUsername(tag: string): Promise { + let hubConn = this.hubOrg.getConnection(); + + return retry( + async (bail) => { + let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await hubConn.query(query)) as any; + return results.totalSize; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgRecordIdGivenScratchOrg(scratchOrgId: string): Promise { + let hubConn = this.hubOrg.getConnection(); + return retry( + async (bail) => { + let query = `SELECT Id FROM ActiveScratchOrg WHERE ScratchOrg = '${scratchOrgId}'`; + let records = (await hubConn.query(query)).records; + + SFPLogger.log('Retrieve Active ScratchOrg Id:' + JSON.stringify(records), LoggerLevel.TRACE); + return records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getActiveScratchOrgRecordsAsMapByUser(hubOrg: Org) { + let conn = this.hubOrg.getConnection(); + let query = + 'SELECT count(id) In_Use, SignupEmail FROM ActiveScratchOrg GROUP BY SignupEmail ORDER BY count(id) DESC'; + const results = (await conn.query(query)) as any; + SFPLogger.log(`Info Fetched: ${JSON.stringify(results)}`, LoggerLevel.DEBUG); + + let scratchOrgRecordAsMapByUser = this.arrayToObject(results.records, 'SignupEmail'); + return scratchOrgRecordAsMapByUser; + } + + public async getScratchOrgIdGivenUserName(username: string) { + let conn = this.hubOrg.getConnection(); + let query = `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername = '${username}'`; + return retry( + async (bail) => { + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await conn.query(query)) as any; + return results.records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + public async getScratchOrgInfoIdGivenUserName(username: string) { + let conn = this.hubOrg.getConnection(); + let query = `SELECT Id FROM ScratchOrgInfo WHERE SignupUsername = '${username}'`; + return retry( + async (bail) => { + SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); + const results = (await conn.query(query)) as any; + return results.records[0].Id; + }, + { retries: 3, minTimeout: 3000 } + ); + } + + private arrayToObject = (array, keyfield) => + array.reduce((obj, item) => { + obj[item[keyfield]] = item; + return obj; + }, {}); +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts new file mode 100644 index 000000000..d8d54a45e --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts @@ -0,0 +1,13 @@ +import { Org } from '@salesforce/core'; + +export default class ScratchOrgLimitsFetcher { + constructor(private hubOrg: Org) {} + + public async getScratchOrgLimits(): Promise { + let conn = this.hubOrg.getConnection(); + let apiVersion = await conn.retrieveMaxApiVersion(); + let query_uri = `${conn.instanceUrl}/services/data/v${apiVersion}/limits`; + const result = await conn.request(query_uri); + return result; + } +} diff --git a/packages/sfp-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts b/packages/sfp-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts new file mode 100644 index 000000000..5055b8cc3 --- /dev/null +++ b/packages/sfp-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts @@ -0,0 +1,24 @@ +import { LoggerLevel, Org } from '@salesforce/core'; +let retry = require('async-retry'); +import SFPLogger from '@flxblio/sfp-logger'; +import ScratchOrgInfoFetcher from '../fetchers/ScratchOrgInfoFetcher'; +import ObjectCRUDHelper from '../../../../utils/ObjectCRUDHelper'; + +export default class ScratchOrgInfoAssigner { + constructor(private hubOrg: Org) {} + + public async setScratchOrgInfo(soInfo: any): Promise { + let hubConn = this.hubOrg.getConnection(); + let result = await ObjectCRUDHelper.updateRecord(hubConn,'ScratchOrgInfo',soInfo); + if(result) return true; + } + + public async setScratchOrgStatus(username: string, status: 'Allocate' | 'InProgress' | 'Return'): Promise { + let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgInfoIdGivenUserName(username); + + return this.setScratchOrgInfo({ + Id: scratchOrgId, + Allocation_status__c: status, + }); + } +} diff --git a/packages/sfp-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts b/packages/sfp-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts new file mode 100644 index 000000000..0c7f92965 --- /dev/null +++ b/packages/sfp-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts @@ -0,0 +1,19 @@ +import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import defaultShell from '../utils/DefaultShell'; + +export default class scriptExecutorHelpers { + static async executeScript(logger: Logger, ...args: string[]) { + let cmd: string; + let argStr =args.join(' '); + if (process.platform !== 'win32') { + cmd = `${defaultShell()} -e ${argStr}`; + } else { + cmd = `cmd.exe /c ${argStr}`; + } + + SFPLogger.log(`Executing command.. ${cmd}`,LoggerLevel.INFO,logger); + let scriptExecutor: ExecuteCommand = new ExecuteCommand(logger, LoggerLevel.INFO, true); + let result = await scriptExecutor.execCommand(cmd, null); + } + } diff --git a/packages/sfp-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts b/packages/sfp-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts new file mode 100644 index 000000000..4df46887d --- /dev/null +++ b/packages/sfp-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts @@ -0,0 +1,28 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class SFDMURunImpl extends SFDXCommand { + public constructor( + working_directory: string, + target_org: string, + private targetOrgDomain: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, working_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'sf sfdmu run'; + } + getCommandName(): string { + return 'sfdmu run'; + } + + getGeneratedParams(): string { + let command = `--path ${this.packageDirectory} -s csvfile -u ${this.target_org} --noprompt --canmodify ${this.targetOrgDomain}`; + if (this.logLevel) command += ` --loglevel ${LoggerLevel[this.logLevel]}`; + return command; + } +} diff --git a/packages/sfp-cli/src/core/stats/NativeMetricSender.ts b/packages/sfp-cli/src/core/stats/NativeMetricSender.ts new file mode 100644 index 000000000..b68631635 --- /dev/null +++ b/packages/sfp-cli/src/core/stats/NativeMetricSender.ts @@ -0,0 +1,22 @@ +import { Logger } from '@flxblio/sfp-logger'; + +export abstract class NativeMetricSender { + constructor(protected logger: Logger) {} + + abstract initialize(apiHost: string, apiKey: string): void; + + abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void; + + abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void; + + protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] { + if (tags != null && !Array.isArray(tags)) { + let transformedTagArray: string[] = []; + for (const [key, value] of Object.entries(tags)) { + transformedTagArray.push(`${key}:${value}`); + } + return transformedTagArray; + } + return tags as string[]; + } +} diff --git a/packages/sfp-cli/src/core/stats/SFPStatsSender.ts b/packages/sfp-cli/src/core/stats/SFPStatsSender.ts new file mode 100644 index 000000000..24e0bd165 --- /dev/null +++ b/packages/sfp-cli/src/core/stats/SFPStatsSender.ts @@ -0,0 +1,114 @@ +import StatsDClient, { ClientOptions, StatsD } from 'hot-shots'; +import * as fs from 'fs-extra'; +import { EOL } from 'os'; +import { NativeMetricSender } from './NativeMetricSender'; +import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender'; +import { Logger } from '@flxblio/sfp-logger'; +import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender'; +import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender'; + +export default class SFPStatsSender { + private static client: StatsD; + private static metricsLogger; + private static nativeMetricsSender: NativeMetricSender; + + static initialize(port: string, host: string, protocol: string) { + let options: ClientOptions = { + host: host, + port: port == null ? 8125 : Number(port), + protocol: protocol == 'tcp' ? 'tcp' : 'udp', + prefix: 'sfp.', + }; + SFPStatsSender.client = new StatsDClient(options); + } + + static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) { + switch (type) { + case 'DataDog': + this.nativeMetricsSender = new DataDogMetricsSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + case 'NewRelic': + this.nativeMetricsSender = new NewRelicMetricSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + case 'Splunk': + this.nativeMetricsSender = new SplunkMetricSender(logger); + this.nativeMetricsSender.initialize(apiHost, apiKey); + break; + + default: + throw new Error('Invalid Metric Type'); + } + } + + static initializeLogBasedMetrics() { + try { + fs.mkdirpSync('.sfp/logs'); + SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`; + } catch (error) { + console.log('Unable to initiate Log based metrics', error); + } + } + + static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags); + + //Native Datadog integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `timers`, + value: elapsedMilliSeconds, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags); + + //Native Metrics integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `guage`, + value: value, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logCount(metric: string, tags?: { [key: string]: string } | string[]) { + if (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags); + + //Native Metrics integration + if (SFPStatsSender.nativeMetricsSender != null) { + SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags); + } + + let metrics = { + metric: `sfp.${metric}`, + type: `count`, + timestamp: Date.now(), + tags: tags, + }; + SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); + } + + static logMetrics(key: any, logger?: any) { + if (logger) { + fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8'); + } + } +} diff --git a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts new file mode 100644 index 000000000..b1e6cb574 --- /dev/null +++ b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts @@ -0,0 +1,52 @@ +import { BufferedMetricsLogger } from 'datadog-metrics'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { NativeMetricSender } from '../NativeMetricSender'; + +export class DataDogMetricsSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private nativeDataDogMetricsLogger: BufferedMetricsLogger; + + public initialize(apiHost: string, apiKey: string) { + try { + this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({ + apiHost: apiHost, + apiKey: apiKey, + prefix: 'sfp.', + flushIntervalSeconds: 0, + }); + } catch (error) { + SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger); + } + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + try { + let transformedTags = this.transformTagsToStringArray(tags); + this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags); + this.nativeDataDogMetricsLogger.flush(); + } catch (error) { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.TRACE, + this.logger + ); + } + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + try { + let transformedTags = this.transformTagsToStringArray(tags); + this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags); + this.nativeDataDogMetricsLogger.flush(); + } catch (error) { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.TRACE, + this.logger + ); + } + } +} diff --git a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts new file mode 100644 index 000000000..bc6d6130d --- /dev/null +++ b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts @@ -0,0 +1,66 @@ +import { NativeMetricSender } from '../NativeMetricSender'; +import { telemetry } from '@newrelic/telemetry-sdk'; +import { + CountMetric, + GaugeMetric, + MetricBatch, + MetricClient, +} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export class NewRelicMetricSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private nrMetricClient: telemetry.metrics.MetricClient; + + //Ignore API Host, as newrelic sdk doesnt need it + public initialize(apiHost: string, apiKey: string) { + try { + this.nrMetricClient = new MetricClient({ apiKey: apiKey }); + } catch (error) { + SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger); + } + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const guageMetric = new GaugeMetric(metric, value); + guageMetric.attributes = tags as { [key: string]: string }; + const batch = new MetricBatch({}, Date.now(), 1); + batch.addMetric(guageMetric); + this.nrMetricClient.send(batch, (error, response, body) => { + if (response) { + SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); + } + if (error) + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const countMetric = new CountMetric(metric); + countMetric.record(1); + countMetric.attributes = tags as { [key: string]: string }; + const batch = new MetricBatch({}, Date.now(), 1); + batch.addMetric(countMetric); + + this.nrMetricClient.send(batch, (error, response, body) => { + if (response) { + SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); + } + if (error) + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } +} diff --git a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts new file mode 100644 index 000000000..f92a5f5d8 --- /dev/null +++ b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts @@ -0,0 +1,49 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { NativeMetricSender } from '../NativeMetricSender'; +import axios ,{AxiosInstance} from 'axios'; + + + +export class SplunkMetricSender extends NativeMetricSender { + constructor(logger: Logger) { + super(logger); + } + + private instance: AxiosInstance; + + public initialize(apiHost: string, apiKey: string) { + this.instance = axios.create({ + baseURL: apiHost, + headers: {'Authorization': apiKey, 'Content-Type': 'application/json'} + }); + } + + public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}}; + this.instance.post('', JSON.stringify(payload)) + .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) + .catch((error) => { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } + + public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { + metric = `sfp.${metric}`; + const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}}; + this.instance.post('', JSON.stringify(payload)) + .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) + .catch((error) => { + SFPLogger.log( + `Unable to transmit metrics for metric ${metric} due to` + error, + LoggerLevel.WARN, + this.logger + ); + }); + } +} + diff --git a/packages/sfp-cli/src/core/utils/AliasList.ts b/packages/sfp-cli/src/core/utils/AliasList.ts new file mode 100644 index 000000000..f7d41dbb3 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/AliasList.ts @@ -0,0 +1,16 @@ +import { StateAggregator } from '@salesforce/core'; + + +export async function convertAliasToUsername(alias: string) { + const stateAggregator = await StateAggregator.getInstance(); + await stateAggregator.orgs.readAll(); + return await stateAggregator.aliases.resolveUsername(alias) +} + +export async function convertUsernameToAlias(username: string) { + + const stateAggregator = await StateAggregator.getInstance(); + await stateAggregator.orgs.readAll(); + return await stateAggregator.aliases.resolveAlias(username) + +} diff --git a/packages/sfp-cli/src/core/utils/ChunkArray.ts b/packages/sfp-cli/src/core/utils/ChunkArray.ts new file mode 100644 index 000000000..7cd6fa0d8 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/ChunkArray.ts @@ -0,0 +1,11 @@ +export function chunkArray(perChunk: number, inputArray: any[]): Array { + let chunks = [], + i = 0, + n = inputArray.length; + + while (i < n) { + chunks.push(inputArray.slice(i, (i += perChunk))); + } + + return chunks; +} diff --git a/packages/sfp-cli/src/core/utils/DefaultShell.ts b/packages/sfp-cli/src/core/utils/DefaultShell.ts new file mode 100644 index 000000000..d8b4ae16a --- /dev/null +++ b/packages/sfp-cli/src/core/utils/DefaultShell.ts @@ -0,0 +1,7 @@ +const sfp_DEFAULT_SHELL = `sh`; + +export default function defaultShell(): string { + return process.env.sfp_DEFAULT_SHELL + ? process.env.sfp_DEFAULT_SHELL + : sfp_DEFAULT_SHELL; +} diff --git a/packages/sfp-cli/src/core/utils/Delay.ts b/packages/sfp-cli/src/core/utils/Delay.ts new file mode 100644 index 000000000..80eb87107 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/Delay.ts @@ -0,0 +1,3 @@ +export async function delay(ms: number = 0) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/packages/sfp-cli/src/core/utils/FileSystem.ts b/packages/sfp-cli/src/core/utils/FileSystem.ts new file mode 100644 index 000000000..d77a7744d --- /dev/null +++ b/packages/sfp-cli/src/core/utils/FileSystem.ts @@ -0,0 +1,52 @@ +import fs = require('fs-extra'); +import path = require('path'); + +export default class FileSystem { + /** + * List nested files within a directory + * @param directory + * @param includeDirectories + * @returns + */ + static readdirRecursive( + searchDirectory: string, + includeDirectories: boolean = false, + isAbsolute: boolean = false + ): string[] { + const result: string[] = []; + + if (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`); + + (function readdirRecursiveHandler(directory: string): void { + const files: string[] = fs.readdirSync(directory); + + files.forEach((file) => { + let filepath: string; + if (isAbsolute) { + filepath = path.resolve(directory, file); + } else { + filepath = path.join(directory, file); + } + + if (fs.lstatSync(filepath).isDirectory()) { + if (includeDirectories) { + if (isAbsolute) { + result.push(path.resolve(filepath)); + } else { + result.push(path.relative(searchDirectory, filepath)); + } + } + readdirRecursiveHandler(filepath); + } else { + if (isAbsolute) { + result.push(path.resolve(filepath)); + } else { + result.push(path.relative(searchDirectory, filepath)); + } + } + }); + })(searchDirectory); + + return result; + } +} diff --git a/packages/sfp-cli/src/core/utils/Fileutils.ts b/packages/sfp-cli/src/core/utils/Fileutils.ts new file mode 100644 index 000000000..b121332b0 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/Fileutils.ts @@ -0,0 +1,204 @@ +const fs = require('fs'); +const path = require('path'); +const _ = require('lodash'); +const os = require('os'); + +const SEP = /\/|\\/; + +export const PLUGIN_CACHE_FOLDER = 'sfpowerkit'; + +export default class FileUtils { + /** + * Delete file or directories recursively from the project + * @param deletedComponents Files or directories to delete + */ + public static deleteComponents(deletedComponents: string[]) { + deletedComponents.forEach((component) => { + if (fs.existsSync(component)) { + if (fs.lstatSync(component).isDirectory()) { + FileUtils.deleteFolderRecursive(component); + } else { + fs.unlinkSync(component); + } + } + }); + } + /** + * Load all files from the given folder with the given extension + * @param folder the folder from which files wille be loaded + * @param extension File extension to load. + */ + public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] { + let result: string[] = []; + let pathExists = fs.existsSync(folder); + let folderName = path.basename(folder); + if (!pathExists) { + console.log('Folder does not exist:', folderName); + return result; + } + let content: string[] = fs.readdirSync(folder); + content.forEach((file) => { + let curFile = path.join(folder, file); + let stats = fs.statSync(curFile); + if (stats.isFile()) { + if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') { + result.push(curFile); + } + } else if (stats.isDirectory()) { + let files: string[] = this.getAllFilesSync(curFile, extension); + result = _.concat(result, files); + } + }); + return result; + } + + public static getGlobalCacheDir() { + let homedir = os.homedir(); + let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; + if (!fs.existsSync(configDir)) { + console.log('Config folder does not exists, Creating Folder'); + fs.mkdirSync(configDir); + } + + return configDir; + } + + /** + * Get the cache path for the given cache file name + * @param fileName + */ + public static getGlobalCachePath(fileName: string) { + let homedir = os.homedir(); + let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; + if (!fs.existsSync(configDir)) { + console.log('Config folder does not exists, Creating Folder'); + fs.mkdirSync(configDir); + } + return configDir + path.sep + fileName; + } + + /** + * Create a folder path recursively + * @param targetDir + * @param param1 + */ + public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) { + const sep = path.sep; + const initDir = path.isAbsolute(targetDir) ? sep : ''; + const baseDir = isRelativeToScript ? __dirname : '.'; + + targetDir.split(sep).reduce((parentDir, childDir) => { + const curDir = path.resolve(baseDir, parentDir, childDir); + try { + fs.mkdirSync(curDir); + } catch (err) { + if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') { + throw err; + } + } + return curDir; + }, initDir); + } + /** + * Get the file name withoud extension + * @param filePath file path + * @param extension extension + */ + public static getFileNameWithoutExtension(filePath: string, extension?: string): string { + let fileParts = filePath.split(SEP); + let fileName = fileParts[fileParts.length - 1]; + if (extension) { + fileName = fileName.substr(0, fileName.lastIndexOf(extension)); + } else { + fileName = fileName.substr(0, fileName.indexOf('.')); + } + return fileName; + } + + /** + * Copu folder recursively + * @param src source folder to copy + * @param dest destination folder + */ + public static copyRecursiveSync(src, dest) { + let exists = fs.existsSync(src); + if (exists) { + let stats = fs.statSync(src); + let isDirectory = stats.isDirectory(); + if (isDirectory) { + exists = fs.existsSync(dest); + if (!exists) { + fs.mkdirSync(dest); + } + fs.readdirSync(src).forEach(function (childItemName) { + FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); + }); + } else { + fs.copyFileSync(src, dest); + } + } + } + /** + * Get path to a given folder base on the parent folder + * @param src Parent folder + * @param foldername folder to build the path to + */ + public static getFolderPath(src, foldername) { + let exists = fs.existsSync(src); + let toReturn = ''; + if (exists) { + let stats = fs.statSync(src); + let isDirectory = stats.isDirectory(); + if (isDirectory) { + let childs = fs.readdirSync(src); + for (let i = 0; i < childs.length; i++) { + let childItemName = childs[i]; + if (childItemName === foldername) { + toReturn = path.join(src, childItemName); + } else { + let childStat = fs.statSync(path.join(src, childItemName)); + if (childStat.isDirectory()) { + toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername); + } + } + if (toReturn !== '') { + break; + } + } + } + } + return toReturn; + } + + /** + * Delete a folder and its content recursively + * @param folder folder to delete + */ + public static deleteFolderRecursive(folder) { + if (fs.existsSync(folder)) { + fs.readdirSync(folder).forEach(function (file, index) { + let curPath = path.join(folder, file); + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + //console.log("Delete recursively"); + FileUtils.deleteFolderRecursive(curPath); + } else { + // delete file + //console.log("Delete file "+ curPath); + fs.unlinkSync(curPath); + } + }); + //console.log("delete folder "+ folder); + fs.rmdirSync(folder); + } + } + public static makefolderid(length): string { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } +} diff --git a/packages/sfp-cli/src/core/utils/GetFormattedTime.ts b/packages/sfp-cli/src/core/utils/GetFormattedTime.ts new file mode 100644 index 000000000..0c4fd9057 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/GetFormattedTime.ts @@ -0,0 +1,6 @@ +export default function getFormattedTime(milliseconds: number): string { + let date = new Date(0); + date.setMilliseconds(milliseconds); + let timeString = date.toISOString().substr(11, 12); + return timeString; +} diff --git a/packages/sfp-cli/src/core/utils/ObjectCRUDHelper.ts b/packages/sfp-cli/src/core/utils/ObjectCRUDHelper.ts new file mode 100644 index 000000000..e4db23cc5 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/ObjectCRUDHelper.ts @@ -0,0 +1,38 @@ +import { Connection } from '@salesforce/core'; +import { Record, SaveResult } from 'jsforce'; +import { isArray } from 'lodash'; + +const retry = require('async-retry'); + +export default class ObjectCRUDHelper { + static async updateRecord(conn: Connection, sObject: string, record: Record): Promise { + return retry( + async (bail) => { + let result = await conn.update(sObject, record); + if (isArray(result)) { + let isAllRecordsSucceeded = true; + for (const individualResult of result as SaveResult[]) { + if (!individualResult.success) { + isAllRecordsSucceeded = false; + } + } + if (isAllRecordsSucceeded) return 'All records updated'; + else throw new Error('Some records have been failed to update'); + } else if ((result as SaveResult).success) return (result as SaveResult).id; + else bail(); + }, + { retries: 3, minTimeout: 2000 } + ); + } + + static async createRecord(conn: Connection, sObject: string, record: Record): Promise { + return retry( + async (bail) => { + let result = await conn.create(sObject, record); + if (result.success) return result.id; + else bail(); + }, + { retries: 3, minTimeout: 2000 } + ); + } +} diff --git a/packages/sfp-cli/src/core/utils/OnExit.ts b/packages/sfp-cli/src/core/utils/OnExit.ts new file mode 100644 index 000000000..5daeff556 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/OnExit.ts @@ -0,0 +1,17 @@ +import { ChildProcess } from 'child_process'; + +export async function onExit(childProcess: ChildProcess, message?: string): Promise<{}> { + return new Promise((resolve, reject) => { + childProcess.once('close', (code: number, signal: string) => { + if (code === 0 || (code === null && signal === 'SIGTERM')) { + resolve(undefined); + } else { + reject(new Error(message ? message : `Exit with error code ${code}`)); + } + }); + + childProcess.once('error', (err: Error) => { + reject(new Error(message ? message : err.message)); + }); + }); +} diff --git a/packages/sfp-cli/src/core/utils/RandomId.ts b/packages/sfp-cli/src/core/utils/RandomId.ts new file mode 100644 index 000000000..36d0d7272 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/RandomId.ts @@ -0,0 +1,9 @@ +export function makeRandomId(length): string { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} diff --git a/packages/sfp-cli/src/core/utils/VersionNumberConverter.ts b/packages/sfp-cli/src/core/utils/VersionNumberConverter.ts new file mode 100644 index 000000000..b86c233eb --- /dev/null +++ b/packages/sfp-cli/src/core/utils/VersionNumberConverter.ts @@ -0,0 +1,33 @@ +/** + * Converts build-number dot delimeter to hyphen + * If dot delimeter does not exist, returns input + * @param version + */ +export default function convertBuildNumDotDelimToHyphen(version: string) { + let convertedVersion = version; + + let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version); + if (version[indexOfBuildNumDelimiter] === '.') { + convertedVersion = + version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1); + } + return convertedVersion; +} + +/** + * Get the index of the build-number delimeter + * Returns null if unable to find index of delimeter + * @param version + */ +function getIndexOfBuildNumDelimeter(version: string) { + let numOfDelimetersTraversed: number = 0; + for (let i = 0; i < version.length; i++) { + if (!Number.isInteger(parseInt(version[i], 10))) { + numOfDelimetersTraversed++; + } + if (numOfDelimetersTraversed === 3) { + return i; + } + } + return null; +} diff --git a/packages/sfp-cli/src/core/utils/extractDomainFromUrl.ts b/packages/sfp-cli/src/core/utils/extractDomainFromUrl.ts new file mode 100644 index 000000000..1f7844797 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/extractDomainFromUrl.ts @@ -0,0 +1,10 @@ +/** + * Extracts domain name from full URL string + * @param url + * @returns + */ +export default function extractDomainFromUrl(url: string): string { + if (!url) return url; + const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); + return matches && matches[1]; +} diff --git a/packages/sfp-cli/src/core/utils/xml2json.ts b/packages/sfp-cli/src/core/utils/xml2json.ts new file mode 100644 index 000000000..9fdeb2d78 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/xml2json.ts @@ -0,0 +1,10 @@ +const xmlParser = require('xml2js').Parser({ explicitArray: false }); + +export default function xml2json(xml) { + return new Promise((resolve, reject) => { + xmlParser.parseString(xml, function (err, json) { + if (err) reject(err); + else resolve(json); + }); + }); +} diff --git a/packages/sfp-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts b/packages/sfp-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts new file mode 100644 index 000000000..981f942a5 --- /dev/null +++ b/packages/sfp-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts @@ -0,0 +1,21 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityInitialInstall extends SFDXCommand { + public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packUpdateSettings'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} --nojob installVlocityInitial`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts b/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts new file mode 100644 index 000000000..2cdc70087 --- /dev/null +++ b/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts @@ -0,0 +1,31 @@ +import path from 'path'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityPackDeployImpl extends SFDXCommand { + public constructor( + project_directory: string, + target_org: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packDeploy'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} -job ${path.join( + this.packageDirectory, + 'VlocityComponents.yaml' + )} packDeploy`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts b/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts new file mode 100644 index 000000000..6d4f6584c --- /dev/null +++ b/packages/sfp-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts @@ -0,0 +1,21 @@ +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityPackUpdateSettings extends SFDXCommand { + public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:packUpdateSettings'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} --nojob packUpdateSettings`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfp-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts b/packages/sfp-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts new file mode 100644 index 000000000..b31df3640 --- /dev/null +++ b/packages/sfp-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts @@ -0,0 +1,31 @@ +import path from 'path'; +import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class VlocityRefreshBase extends SFDXCommand { + public constructor( + project_directory: string, + target_org: string, + private packageDirectory: string, + logger: Logger, + logLevel: LoggerLevel + ) { + super(target_org, project_directory, logger, logLevel); + } + + getSFDXCommand(): string { + return 'vlocity'; + } + getCommandName(): string { + return 'vlocity:refreshVlocityBase'; + } + + getGeneratedParams(): string { + let command = `-sfdx.username ${this.target_org} -job ${path.join( + this.packageDirectory, + 'VlocityComponents.yaml' + )} refreshVlocityBase`; + if (this.logLevel) command += ` -verbose`; + return command; + } +} diff --git a/packages/sfp-cli/src/errors/ReleaseError.ts b/packages/sfp-cli/src/errors/ReleaseError.ts new file mode 100644 index 000000000..334f3c552 --- /dev/null +++ b/packages/sfp-cli/src/errors/ReleaseError.ts @@ -0,0 +1,22 @@ +import SfpError from './SfpError'; + +import { ReleaseResult } from '../impl/release/ReleaseImpl'; + +export default class ReleaseError extends SfpError { + /** + * Payload for the results of the release + */ + readonly data: ReleaseResult; + + /** + * The underlying error that caused this error to be raised + */ + readonly cause: Error; + + constructor(message: string, data: ReleaseResult, cause?: Error) { + super(message); + + this.data = data; + this.cause = cause; + } +} diff --git a/packages/sfp-cli/src/errors/SfpError.ts b/packages/sfp-cli/src/errors/SfpError.ts new file mode 100644 index 000000000..2665ed5c3 --- /dev/null +++ b/packages/sfp-cli/src/errors/SfpError.ts @@ -0,0 +1,20 @@ +export default abstract class SfpError extends Error { + readonly message: string; + readonly code: string; + /** + * The underlying error that caused this error to be raised + */ + readonly cause: Error; + /** + * Additional payload for the error + */ + abstract data: unknown; + + constructor(message: string, code?: string, cause?: Error) { + super(message); + + this.message = message; + this.code = code; + this.cause = cause; + } +} diff --git a/packages/sfp-cli/src/errors/ValidateError.ts b/packages/sfp-cli/src/errors/ValidateError.ts new file mode 100644 index 000000000..5890a1ec6 --- /dev/null +++ b/packages/sfp-cli/src/errors/ValidateError.ts @@ -0,0 +1,21 @@ +import SfpError from './SfpError'; +import ValidateResult from '../impl/validate/ValidateResult'; + +export default class ValidateError extends SfpError { + /** + * Payload for the results of the release + */ + readonly data: ValidateResult; + + /** + * The underlying error that caused this error to be raised + */ + readonly cause: Error; + + constructor(message: string, data: ValidateResult, cause?: Error) { + super(message); + + this.data = data; + this.cause = cause; + } +} diff --git a/packages/sfp-cli/src/flags/duration.ts b/packages/sfp-cli/src/flags/duration.ts new file mode 100644 index 000000000..af0994e29 --- /dev/null +++ b/packages/sfp-cli/src/flags/duration.ts @@ -0,0 +1,75 @@ +/* + * 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 + */ +import { Flags } from '@oclif/core'; +import { Messages } from '@salesforce/core'; +import { Duration } from '@salesforce/kit'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); + +type DurationUnit = Lowercase; + +export type DurationFlagConfig = { + unit: Required; + defaultValue?: number; + min?: number; + max?: number; +}; + +/** + * Duration flag with built-in default and min/max validation + * You must specify a unit + * Defaults to undefined if you don't specify a default + * + * @example + * + * ``` + * import { Flags } from '@salesforce/sf-plugins-core'; + * public static flags = { + * wait: Flags.duration({ + * min: 1, + * unit: 'minutes' + * defaultValue: 33, + * char: 'w', + * description: 'Wait time in minutes' + * }), + * } + * ``` + */ +export const durationFlag = Flags.custom({ + // eslint-disable-next-line @typescript-eslint/require-await + parse: async (input, _, opts) => validate(input, opts), + // eslint-disable-next-line @typescript-eslint/require-await + default: async (context) => + context.options.defaultValue ? toDuration(context.options.defaultValue, context.options.unit) : undefined, +}); + +const validate = (input: string, config: DurationFlagConfig): Duration => { + const { min, max, unit } = config || {}; + let parsedInput: number; + + try { + parsedInput = parseInt(input, 10); + if (typeof parsedInput !== 'number' || isNaN(parsedInput)) { + throw messages.createError('errors.InvalidDuration'); + } + } catch (e) { + throw messages.createError('errors.InvalidDuration'); + } + + if (min && max && (parsedInput < min || parsedInput > max)) { + throw messages.createError('errors.DurationBounds', [min, max]); + } else if (min && parsedInput < min) { + throw messages.createError('errors.DurationBoundsMin', [min]); + } else if (max && parsedInput > max) { + throw messages.createError('errors.DurationBoundsMax', [max]); + } + + return toDuration(parsedInput, unit); +}; + +const toDuration = (parsedInput: number, unit: DurationUnit): Duration => Duration[unit](parsedInput); diff --git a/packages/sfp-cli/src/flags/orgApiVersion.ts b/packages/sfp-cli/src/flags/orgApiVersion.ts new file mode 100644 index 000000000..92ca9ac74 --- /dev/null +++ b/packages/sfp-cli/src/flags/orgApiVersion.ts @@ -0,0 +1,74 @@ +/* + * 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 + */ +import { Flags } from '@oclif/core'; +import { Messages, Lifecycle, OrgConfigProperties, validateApiVersion } from '@salesforce/core'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); + +// versions below this are retired +export const minValidApiVersion = 21; +// this and all un-retired versions below it are deprecated +export const maxDeprecated = 30; +export const maxDeprecatedUrl = 'https://help.salesforce.com/s/articleView?id=000354473&type=1;'; + +/**const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); + * apiVersion for a salesforce org's rest api. + * Will validate format and that the api version is still supported. + * Will default to the version specified in Config, if it exists (and will provide an override warning) + * + * CAVEAT: unlike the apiversion flag on sfdxCommand, this does not set the version on the org/connection + * We leave this up to the plugins to implement + * + * @example + * + * ``` + * import { Flags } from '@salesforce/sf-plugins-core'; + * public static flags = { + * 'api-version': Flags.orgApiVersion({ + * char: 'a', + * description: 'api version for the org' + * }), + * } + * ``` + */ +export const orgApiVersionFlag = Flags.custom({ + aliases: ['apiversion'], + parse: async (input) => validate(input), + default: async () => getDefaultFromConfig(), + description: messages.getMessage('flags.apiVersion.description'), +}); + +const getDefaultFromConfig = async (): Promise => { + // (perf) only import ConfigAggregator if necessary + const { ConfigAggregator } = await import('@salesforce/core'); + const config = await ConfigAggregator.create(); + const apiVersionFromConfig = config.getInfo(OrgConfigProperties.ORG_API_VERSION)?.value as string; + if (apiVersionFromConfig) { + await Lifecycle.getInstance().emitWarning( + messages.getMessage('flags.apiVersion.overrideWarning', [apiVersionFromConfig]) + ); + return validate(apiVersionFromConfig); + } +}; + +const validate = async (input: string): Promise => { + // basic format check + if (!validateApiVersion(input)) { + throw messages.createError('errors.InvalidApiVersion', [input]); + } + const requestedVersion = parseInt(input, 10); + if (requestedVersion < minValidApiVersion) { + throw messages.createError('errors.RetiredApiVersion', [minValidApiVersion]); + } + if (requestedVersion <= maxDeprecated) { + await Lifecycle.getInstance().emitWarning( + messages.getMessage('flags.apiVersion.warning.deprecated', [maxDeprecated, maxDeprecatedUrl]) + ); + } + return input; +}; diff --git a/packages/sfp-cli/src/flags/salesforceId.ts b/packages/sfp-cli/src/flags/salesforceId.ts new file mode 100644 index 000000000..1c5695372 --- /dev/null +++ b/packages/sfp-cli/src/flags/salesforceId.ts @@ -0,0 +1,70 @@ +/* + * 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 + */ +import { Flags } from '@oclif/core'; +import { Messages, validateSalesforceId } from '@salesforce/core'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/sf-plugins-core', 'messages'); + +export type IdFlagConfig = { + /** + * Can specify if the version must be 15 or 18 characters long or 'both'. Leave blank to allow either 15 or 18. + */ + length?: 15 | 18 | 'both'; + /** + * If the ID belongs to a certain sobject type, specify the 3 character prefix. + */ + startsWith?: string; +}; + +/** + * Id flag with built-in validation. Short character is `i` + * + * @example + * + * ``` + * import { Flags } from '@salesforce/sf-plugins-core'; + * public static flags = { + * // set length or prefix + * 'flag-name': salesforceId({ length: 15, startsWith: '00D' }), + * // add flag properties + * 'flag2': salesforceId({ + * required: true, + * description: 'flag2 description', + * }), + * // override the character i + * 'flag3': salesforceId({ + * char: 'j', + * }), + * } + * ``` + */ +export const salesforceIdFlag = Flags.custom({ + // eslint-disable-next-line @typescript-eslint/require-await + parse: async (input, _ctx, opts) => validate(input, opts), + char: 'i', +}); + +const validate = (input: string, config?: IdFlagConfig): string => { + const { length, startsWith } = config ?? {}; + + // If the flag doesn't specify a length or specifies "both", then let it accept both 15 or 18. + const allowedIdLength = !length || length === 'both' ? [15, 18] : [length]; + + if (!allowedIdLength.includes(input.length)) { + throw messages.createError('errors.InvalidIdLength', [ + allowedIdLength.join(` ${messages.getMessage('errors.InvalidIdLength.or')} `), + ]); + } + if (!validateSalesforceId(input)) { + throw messages.createError('errors.InvalidId'); + } + if (startsWith && !input.startsWith(startsWith)) { + throw messages.createError('errors.InvalidPrefix', [startsWith]); + } + return input; +}; diff --git a/packages/sfp-cli/src/flags/sfdxflags.ts b/packages/sfp-cli/src/flags/sfdxflags.ts new file mode 100644 index 000000000..9d73f98da --- /dev/null +++ b/packages/sfp-cli/src/flags/sfdxflags.ts @@ -0,0 +1,139 @@ +/* + * Modified from sfdx-plugins-core to meet sfp requirment + * sfp is not moving to the new style immediately + * to reduce migration efforts in pipelines + * + * + * Original Copyright + * 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 + */ + +import { Flags } from '@oclif/core'; +import { Lifecycle, Messages, Org, OrgConfigProperties } from '@salesforce/core'; +import { orgApiVersionFlag } from './orgApiVersion'; +import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; + +/** + * Adds an alias for the orgApiVersionFlag + + */ +export const orgApiVersionFlagSfdxStyle = orgApiVersionFlag({ + aliases: ['apiversion'], +}); + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); + +export const loglevel = Flags.string({ + description: 'logging level for this command invocation', + default: 'info', + required: false, + options: [ + 'trace', + 'debug', + 'info', + 'warn', + 'error', + 'fatal', + 'TRACE', + 'DEBUG', + 'INFO', + 'WARN', + 'ERROR', + 'FATAL', + ], +}); + +const orgAliases = { + aliases: ['targetusername', 'u'], +}; + + + + +const userNameFlag = Flags.custom({ + ...orgAliases, + char: 'u', + summary: messages.getMessage('flags.targetOrg.summary'), + parse: async (input: string | undefined) => { + let aliasAccessor = (await AliasAccessor.create()); + if(aliasAccessor.resolveAlias(input)) + return aliasAccessor.resolveAlias(input); + else + return aliasAccessor.resolveUsername(input); + + }, +}); + +export const optionalUserNameFlag = userNameFlag({ + aliases: ['targetusername', 'u'], + char: 'u', +}); + +export const requiredUserNameFlag = userNameFlag({ + aliases: ['targetusername', 'u'], + char: 'u', + required: true, +}); + +const devhubFlag = Flags.custom({ + char: 'v', + summary: messages.getMessage('flags.targetDevHubOrg.summary'), + parse: async (input: string | undefined) => { + let aliasAccessor = (await AliasAccessor.create()); + let resolvedAliasOrUserName; + if(aliasAccessor.resolveAlias(input)) + resolvedAliasOrUserName=aliasAccessor.resolveAlias(input); + else + resolvedAliasOrUserName=aliasAccessor.resolveUsername(input); + //Check if its devhub + const org = await Org.create({ aliasOrUsername: resolvedAliasOrUserName, isDevHub: true }); + return resolvedAliasOrUserName; + }, +}); + + +export const targetdevhubusername = devhubFlag({ + aliases: ['targetdevhubusername'], + required: true, +}); + + +export const optionalDevHubFlag = devhubFlag({ + aliases: ['targetdevhubusername'], + required: false, +}); + +export type ArrayWithOptions = { + // prevent invalid options from being passed + multiple?: true; + // parse is disallowed because we have to overwrite it + parse?: undefined; +}; +/** + */ +export const arrayFlagSfdxStyle = Flags.custom({ + multiple: true, + delimiter: ',', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error parse expects to return string[] but we need to return string. + // This is a weird consequence of implementing an array flag. The oclif parser splits the input (e.g. "thing1,thing2") + // on the delimiter and passes each value individually to the parse function. However, the return type needs to be + // string[] so that upstream consumers have the correct flag typings. + parse: async (input, ctx) => { + const inputParts = ctx.token.input.split(',').map((i) => i.trim()); + if (inputParts.length > 1) { + await Lifecycle.getInstance().emitWarning(messages.getMessage('warning.arrayInputFormat')); + } + + return input; + }, +}); + +export const logsgroupsymbol = arrayFlagSfdxStyle({ + char: 'g', + description: messages.getMessage('flags.logsgroupsymbol.summary'), +}); \ No newline at end of file diff --git a/packages/sfp-cli/src/impl/Stage.ts b/packages/sfp-cli/src/impl/Stage.ts new file mode 100644 index 000000000..cf47a3e53 --- /dev/null +++ b/packages/sfp-cli/src/impl/Stage.ts @@ -0,0 +1,10 @@ +export enum Stage { + ANALYZE = 'analyze', + PREPARE = 'prepare', + VALIDATE = 'validate', + QUICKBUILD = 'quickbuild', + BUILD = 'build', + DEPLOY = 'deploy', + PROMOTE = 'promote', + PUBLISH = 'publish' +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifact.ts b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifact.ts new file mode 100644 index 000000000..6378564c0 --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifact.ts @@ -0,0 +1,8 @@ +export default interface FetchAnArtifact { + fetchArtifact( + packageName: string, + artifactDirectory: string, + version: string, + isToContinueOnMissingArtifact: boolean + ): void; +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts new file mode 100644 index 000000000..8e5cead2d --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts @@ -0,0 +1,64 @@ +import * as fs from 'fs-extra'; +import child_process = require('child_process'); +import path = require('path'); +import FetchAnArtifact from './FetchAnArtifact'; +import SFPLogger, { COLOR_WARNING } from '@flxblio/sfp-logger'; + +export class FetchAnArtifactFromNPM implements FetchAnArtifact { + constructor(private scope: string, private npmrcPath: string) { + + //Check whether the user has already passed in @, and remove it + this.scope= this.scope.replace(/@/g, '').toLowerCase(); + + + if (this.npmrcPath) { + try { + fs.copyFileSync(this.npmrcPath, path.resolve('.npmrc')); + } catch (error) { + throw new Error('We were unable to find or copy the .npmrc file as provided due to ' + error.message); + } + + if (!fs.existsSync('package.json')) { + // package json is required in the same directory as .npmrc + fs.writeFileSync('package.json', '{}'); + } + } else { + if (fs.existsSync('.npmrc') && !fs.existsSync('package.json')) { + fs.writeFileSync('package.json', '{}'); + } + } + } + + public fetchArtifact( + packageName: string, + artifactDirectory: string, + version: string, + isToContinueOnMissingArtifact: boolean + ) { + try { + // NPM package names must be lowercase + packageName = packageName.toLowerCase(); + + let cmd: string; + if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfp_artifact`; + else cmd = `npm pack ${packageName}_sfp_artifact`; + + cmd += `@${version}`; + + console.log(`Fetching ${packageName} using ${cmd}`); + + child_process.execSync(cmd, { + cwd: artifactDirectory, + stdio: 'pipe', + }); + } catch (error) { + if (!isToContinueOnMissingArtifact) throw error; + else + SFPLogger.log( + COLOR_WARNING( + `Artifact for ${packageName} missing in NPM Registry provided, This might result in deployment failures` + ) + ); + } + } +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts new file mode 100644 index 000000000..abd9fd714 --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts @@ -0,0 +1,58 @@ +import SFPLogger, { COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; +const fs = require('fs-extra'); +import child_process = require('child_process'); +import FetchAnArtifact from './FetchAnArtifact'; +import defaultShell from '../../core/utils/DefaultShell'; + +export class FetchAnArtifactUsingScript implements FetchAnArtifact { + constructor(private scriptPath: string) {} + + public fetchArtifact( + packageName: string, + artifactDirectory: string, + version: string, + isToContinueOnMissingArtifact: boolean + ) { + try { + let cmd: string; + + //Create artifact Directory if it doesnt exist + if (!fs.existsSync(artifactDirectory)) fs.mkdirpSync(artifactDirectory); + + if (version) { + if (process.platform !== 'win32') { + cmd = `${defaultShell()} -e "${ + this.scriptPath + }" "${packageName}" "${version}" "${artifactDirectory}"`; + } else { + cmd = `cmd.exe /c "${this.scriptPath}" "${packageName}" "${version}" "${artifactDirectory}"`; + } + } else { + if (process.platform !== 'win32') { + cmd = `${defaultShell()} -e ${this.scriptPath} ${packageName} ${artifactDirectory}`; + } else { + cmd = `cmd.exe /c ${this.scriptPath} ${packageName} ${artifactDirectory}`; + } + } + + SFPLogger.log(`Fetching ${packageName} using ${cmd}`, LoggerLevel.INFO); + + child_process.execSync(cmd, { + cwd: process.cwd(), + stdio: 'pipe', + }); + + SFPLogger.log(`Successfully Fetched ${packageName}`, LoggerLevel.INFO); + } catch (error) { + if (!isToContinueOnMissingArtifact) throw error; + else { + SFPLogger.log(`Failed to execute script due to ${error.message}`, LoggerLevel.WARN); + SFPLogger.log( + COLOR_WARNING( + `Artifact for ${packageName} missing in Registry provided, This might result in deployment failures` + ) + ); + } + } + } +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchArtifactSelector.ts b/packages/sfp-cli/src/impl/artifacts/FetchArtifactSelector.ts new file mode 100644 index 000000000..0c2472630 --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchArtifactSelector.ts @@ -0,0 +1,17 @@ +import FetchAnArtifact from './FetchAnArtifact'; +import { FetchAnArtifactFromNPM } from './FetchAnArtifactFromNPM'; +import { FetchAnArtifactUsingScript } from './FetchAnArtifactUsingScript'; + +export default class FetchArtifactSelector { + constructor(private fetchArtifactScript?: string, private scope?: string, private npmrcPath?: string) {} + + public getArtifactFetcher(): FetchAnArtifact { + if (this.fetchArtifactScript) { + return new FetchAnArtifactUsingScript(this.fetchArtifactScript); + } else if (this.scope) { + return new FetchAnArtifactFromNPM(this.scope, this.npmrcPath); + } else { + throw new Error('Unable to determine artifact fetcher'); + } + } +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchArtifactsError.ts b/packages/sfp-cli/src/impl/artifacts/FetchArtifactsError.ts new file mode 100644 index 000000000..dcf60ac28 --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchArtifactsError.ts @@ -0,0 +1,26 @@ + +import SfpError from '../../errors/SfpError'; +import { ArtifactVersion } from './FetchImpl'; + + +export default class FetchArtifactsError extends SfpError { + /** + * Payload consisting of artifacts that succeeded and failed to fetch + */ + readonly data: { + success: ArtifactVersion[]; + failed: ArtifactVersion[]; + }; + + /** + * The underlying error that caused this error to be raised + */ + readonly cause: Error; + + constructor(message: string, data: { success:ArtifactVersion[]; failed: ArtifactVersion[] }, cause: Error) { + super(message); + + this.data = data; + this.cause = cause; + } +} diff --git a/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts new file mode 100644 index 000000000..33df9a75c --- /dev/null +++ b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts @@ -0,0 +1,144 @@ +import * as fs from 'fs-extra'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; +import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; +import FetchArtifactsError from './FetchArtifactsError'; +import * as rimraf from 'rimraf'; +import FetchArtifactSelector from './FetchArtifactSelector'; +import _ from 'lodash'; +import path from 'path'; +import FileUtils from '../../core/utils/Fileutils'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + +export default class FetchImpl { + constructor( + private artifactDirectory: string, + private scriptPath: string, + private scope: string, + private npmrcPath: string, + private logger:Logger + ) { + if (!fs.existsSync(artifactDirectory)) fs.mkdirpSync(artifactDirectory); + } + + public async fetchArtifacts( + releaseDefinitions: ReleaseDefinitionSchema[] + ): Promise<{ + success: ArtifactVersion[]; + failed: ArtifactVersion[]; + }> { + const git: Git = await Git.initiateRepo(); + + let fetchedArtifacts: { success: ArtifactVersion[]; failed: ArtifactVersion[] } = { + success: [], + failed: [], + }; + + let allArtifacts: { name: string; version: string }[] = []; + + + for (const releaseDefinition of releaseDefinitions) { + //Each release will be downloaded to specific subfolder inside the provided artifact directory + //As each release is a collection of artifacts + let revisedArtifactDirectory = path.join( + this.artifactDirectory, + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + + rimraf.sync(revisedArtifactDirectory); + fs.mkdirpSync(revisedArtifactDirectory); + + let artifactsToDownload: { name: string; version: string }[] = []; + //additional sanity to not repeat download + for (let artifactEntry of Object.entries(releaseDefinition.artifacts)) { + if (!_.includes(allArtifacts, { name: artifactEntry[0], version: artifactEntry[1] }, 0)) { + allArtifacts.push({ name: artifactEntry[0], version: artifactEntry[1] }); + artifactsToDownload.push({ name: artifactEntry[0], version: artifactEntry[1] }); + } + } + + for (let artifact of artifactsToDownload) { + try { + await this.fetchAnArtifact( + artifact, + git, + this.scriptPath, + this.scope, + this.npmrcPath, + revisedArtifactDirectory + ); + + fetchedArtifacts.success.push(artifact); + } catch (error) { + SFPLogger.log(error.message,LoggerLevel.DEBUG,this.logger); + fetchedArtifacts.failed.push(artifact); + } + } + } + + return fetchedArtifacts; + } + + public async fetchArtifactsProvidedVersion( + artifactVersions: ArtifactVersion[] + ): Promise<{ + success: ArtifactVersion[]; + failed: ArtifactVersion[]; + }> { + const git: Git = await Git.initiateRepo(); + + let fetchedArtifacts: { success: ArtifactVersion[]; failed: ArtifactVersion[] } = { + success: [], + failed: [], + }; + + let allArtifacts: ArtifactVersion[] = _.clone(artifactVersions); + let revisedArtifactDirectory = path.join(this.artifactDirectory, FileUtils.makefolderid(8)); + rimraf.sync(revisedArtifactDirectory); + fs.mkdirpSync(revisedArtifactDirectory); + + let i: number; + + for (const artifactVersion of artifactVersions) { + try { + await this.fetchAnArtifact( + artifactVersion, + git, + this.scriptPath, + this.scope, + this.npmrcPath, + revisedArtifactDirectory + ); + + fetchedArtifacts.success.push(artifactVersion); + } catch (error) { + SFPLogger.log(error.message,LoggerLevel.DEBUG,this.logger); + fetchedArtifacts.failed.push(artifactVersion); + } + } + + return fetchedArtifacts; + } + + private async fetchAnArtifact( + artifact: ArtifactVersion, + git: Git, + scriptPath: string, + scope: string, + npmrcPath: string, + revisedArtifactDirectory: string + ) { + let version: string; + if (artifact.version === 'LATEST_TAG' || artifact.version === 'LATEST_GIT_TAG') { + let latestGitTagVersion: GitTags = new GitTags(git, artifact.name); + version = await latestGitTagVersion.getVersionFromLatestTag(); + } else version = artifact.version; + + let artifactFetcher = new FetchArtifactSelector(scriptPath, scope, npmrcPath).getArtifactFetcher(); + artifactFetcher.fetchArtifact(artifact.name, revisedArtifactDirectory, version, false); + } +} +export type ArtifactVersion = { + name: string; + version: string; +}; diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts new file mode 100644 index 000000000..1326bec90 --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts @@ -0,0 +1,194 @@ +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import { ReleaseChangelog } from './ReleaseChangelog'; +import ChangelogMarkdownGenerator from './ChangelogMarkdownGenerator'; +import ReleaseChangelogUpdater from './ReleaseChangelogUpdater'; +import * as fs from 'fs-extra'; +import path = require('path'); +import { marked } from 'marked'; +const TerminalRenderer = require('marked-terminal'); +const retry = require('async-retry'); +import { GitError } from 'simple-git'; +import SfpPackage from '../../core/package/SfpPackage'; +import SFPLogger, { LoggerLevel, ConsoleLogger, Logger } from '@flxblio/sfp-logger'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import Git from '../../core/git/Git'; +import FileOutputHandler from '../../outputs/FileOutputHandler'; + + + +marked.setOptions({ + // Define custom renderer + renderer: new TerminalRenderer(), +}); + +export default class ChangelogImpl { + constructor( + private logger:Logger, + private artifactDir: string, + private releaseName: string, + private workItemFilters: string[], + private limit: number, + private workItemUrl: string, + private showAllArtifacts: boolean, + private directory:string, + private forcePush: boolean, + private branch: string, + private nopush:boolean, + private isDryRun: boolean, + private org?: string + ) { + this.org = org?.toLowerCase(); + } + + async exec(): Promise { + return retry( + async (bail, retryNum) => { + try { + return await this.execHandler(); + } catch (err) { + if (err instanceof GitError) { + if (!err.message.includes('failed to push some refs')) { + // Do not retry for Git errors that are not related to push + bail(err); + } else { + SFPLogger.log('Failed to push changelog',LoggerLevel.WARN,this.logger); + SFPLogger.log(`Retrying...(${retryNum})`,LoggerLevel.WARN,this.logger); + throw err; + } + } else { + // Do not retry for non-Git errors + bail(err); + } + } + }, + { + retries: 10, + minTimeout: 5, + randomize: true, + } + ); + } + + private async execHandler() { + + let git:Git; + try { + let artifactFilePaths: Artifact[] = ArtifactFetcher.fetchArtifacts(this.artifactDir); + + if (artifactFilePaths.length === 0) { + throw new Error(`No artifacts found at ${path.resolve(process.cwd(), this.artifactDir)}`); + } + + let artifactsToSfpPackage: { [p: string]: SfpPackage } = {}; + let packagesToChangelogFilePaths: { [p: string]: string } = {}; + let artifactSourceBranch: string; + for (let artifactFilepath of artifactFilePaths) { + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromArtifact( + artifactFilepath, + new ConsoleLogger() + ); + + artifactsToSfpPackage[sfpPackage.packageName] = sfpPackage; + packagesToChangelogFilePaths[sfpPackage.packageName] = sfpPackage.changelogFilePath; + + if (artifactSourceBranch == null) { + if (sfpPackage.branch) { + artifactSourceBranch = sfpPackage.branch; + } else { + console.log(`${sfpPackage.packageName} artifact is missing branch information`); + console.log( + `This will cause an error in the future. Re-create the artifact using the latest version of sfp to maintain compatibility.` + ); + } + } + } + + if (!artifactSourceBranch) throw new Error('Atleast one artifact must carry branch information'); + + + + //duplicate repo + let git=await Git.initiateRepoAtTempLocation(this.logger,null,this.branch); + SFPLogger.log(`Checking out branch ${this.branch}`,LoggerLevel.INFO,this.logger); + + let pathToChangelogDirectory = this.createDirectory(this.directory, git.getRepositoryPath()); + + let releaseChangelog: ReleaseChangelog; + if (fs.existsSync(path.join(pathToChangelogDirectory, `releasechangelog.json`))) { + releaseChangelog = JSON.parse(fs.readFileSync(path.join(pathToChangelogDirectory, `releasechangelog.json`), 'utf8')); + } else { + releaseChangelog = { + orgs: [], + releases: [], + }; + } + + SFPLogger.log('Generating changelog...',LoggerLevel.INFO,this.logger); + + releaseChangelog = new ReleaseChangelogUpdater( + releaseChangelog, + this.releaseName, + artifactsToSfpPackage, + packagesToChangelogFilePaths, + this.workItemFilters, + this.org + ).update(); + + // Preview changelog in console + SFPLogger.log( + marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false).generate()), + LoggerLevel.INFO, + this.logger + ); + + + if(this.isDryRun) + { + const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); + outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,true).generate())); + } + + + fs.writeFileSync( + path.join(pathToChangelogDirectory, `releasechangelog.json`), + JSON.stringify(releaseChangelog, null, 4) + ); + + let payload: string = new ChangelogMarkdownGenerator( + releaseChangelog, + this.workItemUrl, + this.limit, + this.showAllArtifacts + ).generate(); + + fs.writeFileSync(path.join(pathToChangelogDirectory, `Release-Changelog.md`), payload); + + if (!this.isDryRun) + { + await git.commitFile([path.join(pathToChangelogDirectory, `releasechangelog.json`),path.join(pathToChangelogDirectory, `Release-Changelog.md`)]); + if(!this.nopush) + await git.pushToRemote(this.branch,this.forcePush) + } + + SFPLogger.log(`Successfully generated changelog`,LoggerLevel.INFO,this.logger); + return releaseChangelog; + } finally { + if(git) + git.deleteTempoRepoIfAny(); + } + } + + + + private createDirectory(directory: string, repoDir: string): string { + if (this.directory) { + if (!fs.pathExistsSync(path.join(repoDir, directory))) { + fs.mkdirpSync(path.join(repoDir, directory)); + } + repoDir = path.join(repoDir, this.directory); + } + return repoDir; + } + + +} diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts new file mode 100644 index 000000000..4c1b487e3 --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts @@ -0,0 +1,184 @@ +import { ReleaseChangelog, Release, org } from './ReleaseChangelog'; +import { URL } from 'url'; +import { EOL } from 'os'; +const markdownTable = require('markdown-table'); + +export default class ChangelogMarkdownGenerator { + constructor( + private releaseChangelog: ReleaseChangelog, + private workItemURL: string, + private limit: number, + private showAllArtifacts: boolean, + private isForWorkItemOnlyOutput:boolean=false + ) {} + + /** + * Generate markdown from ReleaseChangelog + * @returns + */ + generate(): string { + let payload: string = ''; + + if (this.releaseChangelog.orgs && ! this.isForWorkItemOnlyOutput ) { + payload = this.generateOrgs(this.releaseChangelog.orgs, payload); + } + + payload = this.generateReleases(payload); + + return payload; + } + + private generateReleases(payload: string): string { + let limitReleases: number; + if (this.limit <= this.releaseChangelog.releases.length) + limitReleases = this.releaseChangelog.releases.length - this.limit; + else limitReleases = 0; // no limit + + // Generate in descending order, starting from latest release + for (let releaseNum = this.releaseChangelog.releases.length - 1; releaseNum >= limitReleases; releaseNum--) { + let release: Release = this.releaseChangelog.releases[releaseNum]; + + if (!release.names) { + payload += `\n\n `; // Create anchor from release hash Id + payload += `# ${release['name']}\n`; + } else { + payload += `\n\n`; // Create anchor from release hash Id + payload += `# ${release.names.join(`/`)}\n `; + payload += `Cumulative Release Number: ${release.buildNumber} \n\n`; + if(release.date && !this.isForWorkItemOnlyOutput) + payload += `Matching defintion first created or deployed to an org on: ${release.date}\n ` + + } + + if(!this.isForWorkItemOnlyOutput) + payload = this.generateArtifacts(payload, release); + + payload = this.generateWorkItems(payload, release); + + if(!this.isForWorkItemOnlyOutput) + { + let versionChangeOnly: string[] = []; + let noChangeInVersion: string[] = []; + payload = this.generateCommits(payload, release, versionChangeOnly, noChangeInVersion); + + if (versionChangeOnly.length > 0) { + payload += '\n### Additional Information\n'; + payload += `The following artifacts' version may have changed due to an update in the scratch org definition file, `; + payload += `incremented package version in SFDX project configuration, or build all packages:\n`; + + versionChangeOnly.forEach((artifactName) => (payload += ` - ${artifactName}\n`)); + } + + if (noChangeInVersion.length > 0 && this.showAllArtifacts) { + payload += '\nArtifacts with no changes:\n'; + noChangeInVersion.forEach((artifactName) => (payload += ` - ${artifactName}\n`)); + } + } + } + return payload; + } + + private generateCommits( + payload: string, + release: Release, + versionChangeOnly: string[], + noChangeInVersion: string[] + ) { + let isCommitsSectionEmpty: boolean = true; + + payload += '\n### Commits :book:\n'; + for (let artifact of release.artifacts) { + if (artifact.from !== artifact.to) { + if (artifact.commits.length > 0) { + isCommitsSectionEmpty = false; + payload += `\n#### ${artifact.name}\n`; + + let tableOfCommits = [['Date', 'Time', 'Commit ID', 'Commit Message']]; + for (let commit of artifact.commits) { + let commitDate: Date = new Date(commit.date); + tableOfCommits.push([ + this.getDate(commitDate), + this.getTime(commitDate), + commit.commitId, + commit.message, + ]); + } + payload += markdownTable(tableOfCommits) + '\n'; + } else { + versionChangeOnly.push(artifact.name); + } + } else if (artifact.from === artifact.to) { + noChangeInVersion.push(artifact.name); + } + } + + if (isCommitsSectionEmpty) { + payload += `N/A\n`; + } + return payload; + } + + private generateWorkItems(payload: string, release: Release) { + payload += '### Work Items :gem:\n'; + if (Object.keys(release.workItems).length > 0) { + for (let workItem in release.workItems) { + let specificWorkItemURL: string; + if (this.workItemURL != null) { + if (this.workItemURL.endsWith('/')) { + specificWorkItemURL = this.workItemURL.concat(workItem); + } else { + specificWorkItemURL = this.workItemURL.concat(`/${workItem}`); + } + } + payload += `[${workItem}](${specificWorkItemURL})\n`; + } + } else { + payload += `N/A\n`; + } + return payload; + } + + private generateArtifacts(payload: string, release: Release) { + payload += '### Artifacts :package:\n'; + for (let artifactNum = 0; artifactNum < release.artifacts.length; artifactNum++) { + if (release.artifacts[artifactNum].from !== release.artifacts[artifactNum].to || this.showAllArtifacts) + payload += `- **${release.artifacts[artifactNum].name}** v${release.artifacts[artifactNum].version} (${release.artifacts[artifactNum].to})\n\n`; + } + return payload; + } + + private generateOrgs(orgs: org[], payload: string) { + const baseAddr = 'https://img.shields.io/static/v1'; + for (let org of orgs) { + let url = new URL( + `?label=${org.name}&message=${org.latestRelease.names[org.latestRelease.names.length - 1]}-${ + org.latestRelease.buildNumber + }(${org.retryCount})&color=green`, + baseAddr + ); + payload += `[![${org.name}-${org.latestRelease.names[org.latestRelease.names.length - 1]}-${ + org.latestRelease.buildNumber + }(${org.retryCount})-green](${url.toString()})](#${org.latestRelease.hashId}) `; + } + return payload; + } + + + private getDate(date: Date): string { + let day: number = date.getDate(); + let month: number = date.getMonth(); + let year: number = date.getFullYear(); + let pad = (n) => (n < 10 ? '0' + n : n); + + return pad(day) + '/' + pad(month + 1) + '/' + year; + } + + private getTime(date: Date): string { + let hours: number = date.getHours(); + let minutes: number = date.getMinutes(); + let seconds: number = date.getSeconds(); + let pad = (n) => (n < 10 ? '0' + n : n); + + return pad(hours) + ':' + pad(minutes) + ':' + pad(seconds); + } +} diff --git a/packages/sfp-cli/src/impl/changelog/CommitUpdater.ts b/packages/sfp-cli/src/impl/changelog/CommitUpdater.ts new file mode 100644 index 000000000..e20879963 --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/CommitUpdater.ts @@ -0,0 +1,57 @@ +import { Release } from './ReleaseChangelog'; +import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; +import ReadPackageChangelog from './ReadPackageChangelog'; + +export default class CommitUpdater { + constructor( + private latestRelease: Release, + private artifactsToLatestCommitId: { [p: string]: string }, + private packagesToChangelogFilePaths: { [p: string]: string }, + private readPackageChangelog: ReadPackageChangelog + ) {} + + /** + * Generate commits in latest release, for each artifact + * Also sets new latestCommitId for artifacts + * @returns + */ + update(): void { + for (let artifact of this.latestRelease['artifacts']) { + let packageChangelog: PackageChangelog = this.readPackageChangelog( + this.packagesToChangelogFilePaths[artifact.name] + ); + + // Set new latestCommitId + artifact['latestCommitId'] = packageChangelog['commits'][0]['commitId']; + + let indexOfLatestCommitId; + if (this.artifactsToLatestCommitId?.[artifact.name]) { + indexOfLatestCommitId = packageChangelog['commits'].findIndex( + (commit) => commit['commitId'] === this.artifactsToLatestCommitId[artifact.name] + ); + if (indexOfLatestCommitId === -1) { + console.log( + `Cannot find commit Id ${this.artifactsToLatestCommitId[artifact.name]} in ${ + artifact.name + } changelog` + ); + console.log('Assuming that there are no changes...'); + artifact['commits'] = []; + continue; + } + } + + if (indexOfLatestCommitId > 0) { + artifact['commits'] = packageChangelog['commits'].slice(0, indexOfLatestCommitId); + } else if (indexOfLatestCommitId === 0) { + // Artifact verison has not changed + artifact['commits'] = []; + // Skip to next artifact + continue; + } else if (indexOfLatestCommitId === undefined) { + // Artifact was not in previous release + artifact['commits'] = packageChangelog['commits']; + } + } + } +} diff --git a/packages/sfp-cli/src/impl/changelog/OrgsUpdater.ts b/packages/sfp-cli/src/impl/changelog/OrgsUpdater.ts new file mode 100644 index 000000000..4e9549f05 --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/OrgsUpdater.ts @@ -0,0 +1,127 @@ +import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog'; +import lodash = require('lodash'); + +export default class OrgsUpdater { + private latestReleaseId: ReleaseId; + private idOfReleaseWithMatchingHashId: ReleaseId; + + constructor( + private releaseChangelog: ReleaseChangelog, + private latestRelease: Release, + private org: string, + private releaseWithMatchingHashId: Release + ) { + this.latestReleaseId = this.convertReleaseToId(this.latestRelease); + + if (this.releaseWithMatchingHashId) { + this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId); + } + } + + update(): void { + if (!this.idOfReleaseWithMatchingHashId) { + if (this.releaseChangelog.orgs) { + let org = this.releaseChangelog.orgs.find((org) => org.name === this.org); + + if (org) { + org.releases.push(this.latestReleaseId); + org.latestRelease = org.releases[org.releases.length - 1]; + org.retryCount = 0; + } else { + this.releaseChangelog.orgs.push({ + name: this.org, + releases: [this.latestReleaseId], + latestRelease: this.latestReleaseId, + retryCount: 0, + }); + } + } else { + // for backwards-compatibility with pre-existing changelogs + this.releaseChangelog.orgs = [ + { + name: this.org, + releases: [this.latestReleaseId], + latestRelease: this.latestReleaseId, + retryCount: 0, + }, + ]; + } + console.log( + `Updating ${this.org} org with`, + this.latestRelease.names[this.latestRelease.names.length - 1] + + '-' + + this.latestRelease.buildNumber + + `(0)` + ); + } else { + // Update orgs + let org = this.releaseChangelog.orgs.find((org) => org.name === this.org); + + if (org) { + let indexOfReleaseToOrg = org.releases.findIndex( + (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId + ); + if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) { + if (indexOfReleaseToOrg >= 0) { + // Update release names in releases to org + org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId; + org.releases[indexOfReleaseToOrg].date = new Date().toUTCString(); + } else { + // Add releaseId in releases to org + org.releases.push(this.idOfReleaseWithMatchingHashId); + } + + // Update latest release + org.latestRelease = this.idOfReleaseWithMatchingHashId; + org.retryCount = 0; + } else { + if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) { + org.retryCount++; + } else { + org.retryCount = 0; + } + + // Update releases names in releases to org & latestRelease + org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId; + org.latestRelease = this.idOfReleaseWithMatchingHashId; + } + + console.log( + `Updating ${this.org} org with`, + org.latestRelease.names[org.latestRelease.names.length - 1] + + '-' + + org.latestRelease.buildNumber + + `(${org.retryCount})` + ); + } else { + // new org + this.releaseChangelog.orgs.push({ + name: this.org, + releases: [this.idOfReleaseWithMatchingHashId], + latestRelease: this.idOfReleaseWithMatchingHashId, + retryCount: 0, + }); + console.log( + `Updating ${this.org} org with`, + `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${ + this.idOfReleaseWithMatchingHashId.buildNumber + }(0)` + ); + } + } + } + + /** + * Convert Release to Release Id + * @param release + * @returns + */ + private convertReleaseToId(release: Release): ReleaseId { + let releaseNames = [...release.names]; // Shallow copy + return { + names: releaseNames, + buildNumber: release.buildNumber, + hashId: release.hashId, + }; + } +} diff --git a/packages/sfp-cli/src/impl/changelog/ReadPackageChangelog.ts b/packages/sfp-cli/src/impl/changelog/ReadPackageChangelog.ts new file mode 100644 index 000000000..2fa69ae3c --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/ReadPackageChangelog.ts @@ -0,0 +1,5 @@ +import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; + +export default interface ReadPackageChangelog { + (changelogFilePath: string): PackageChangelog; +} diff --git a/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts new file mode 100644 index 000000000..456d8544f --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts @@ -0,0 +1,72 @@ +import { Changelog, Commit } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; + +export class ReleaseChangelog { + releases: Release[]; + orgs?: org[]; +} + +export class org { + /** + * Name of the org + */ + name: string; + + /** + * History of releases to the org + */ + releases: ReleaseId[]; + + /** + * Latest release deployed to org + */ + latestRelease: ReleaseId; + + /** + * Number of consecutive deployments of the latest release to the org + */ + retryCount: number; +} + +export class ReleaseId { + names: string[]; + buildNumber: number; + hashId: string; + date?:string; +} + +export interface Release extends ReleaseId { + workItems: any; + artifacts: Artifact[]; +} + +export interface Artifact extends Changelog { + /** + * Name of the artifact + */ + name: string; + + /** + * Commit Id from which previous artifact was created + */ + from: string; + + /** + * Commit Id from which current artifact was created + */ + to: string; + + /** + * Package version number + */ + version: string; + + /** + * Latest commit Id in the package changelog + */ + latestCommitId: string; + + /** + * Commits between previous artifact's package changelog and current artifact's package changelog + */ + commits: Commit[]; +} diff --git a/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts b/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts new file mode 100644 index 000000000..4a8808c4b --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts @@ -0,0 +1,187 @@ +import { ReleaseChangelog, Release, Artifact } from './ReleaseChangelog'; +import CommitUpdater from './CommitUpdater'; +import WorkItemUpdater from './WorkItemUpdater'; +import OrgsUpdater from './OrgsUpdater'; +import ReadPackageChangelog from './ReadPackageChangelog'; +import * as fs from 'fs-extra'; +import SfpPackage from '../../core/package/SfpPackage'; +var hash = require('object-hash'); + +export default class ReleaseChangelogUpdater { + constructor( + private releaseChangelog: ReleaseChangelog, + private releaseName: string, + private artifactsToSfpPackage: { [p: string]: SfpPackage }, + private packagesToChangelogFilePaths: { [p: string]: string }, + private workItemFilters: string[], + private org: string + ) { } + + update(): ReleaseChangelog { + let buildNumber: number; + if (this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1]?.buildNumber) { + buildNumber = this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1].buildNumber + 1; + } else { + buildNumber = 1; + } + + let latestRelease: Release = this.initLatestRelease(this.releaseName, buildNumber, this.artifactsToSfpPackage); + + let releaseWithMatchingHashId = this.findRelease(this.releaseChangelog.releases, latestRelease); + if (!releaseWithMatchingHashId) { + + + + let artifactsToLatestCommitId: { [P: string]: string }; + if (this.releaseChangelog.releases.length > 0) { + artifactsToLatestCommitId = this.getArtifactsToLatestCommitId(this.releaseChangelog, latestRelease); + } + + let readPackageChangelog: ReadPackageChangelog = (changelogFilePath: string) => { + return JSON.parse(fs.readFileSync(changelogFilePath, 'utf8')); + }; + + new CommitUpdater( + latestRelease, + artifactsToLatestCommitId, + this.packagesToChangelogFilePaths, + readPackageChangelog + ).update(); + + new WorkItemUpdater(latestRelease, this.workItemFilters).update(); + + this.releaseChangelog.releases.push(latestRelease); + } else { + if (!this.containsLatestReleaseName(releaseWithMatchingHashId.names, latestRelease.names[0])) { + // append latestReleaseName + releaseWithMatchingHashId.names.push(latestRelease.names[0]); + } + } + + if (this.org) { + new OrgsUpdater(this.releaseChangelog, latestRelease, this.org, releaseWithMatchingHashId).update(); + } + + return this.releaseChangelog; + } + + /** + * Get map of artifacts to the latest commit Id in past releases + * Also sets artifact "from" property + * @param releaseChangelog + * @param latestRelease + * @returns + */ + private getArtifactsToLatestCommitId(releaseChangelog: ReleaseChangelog, latestRelease: Release) { + let artifactsToLatestCommitId: { [P: string]: string } = {}; + + for (let latestReleaseArtifact of latestRelease.artifacts) { + loopThroughReleases: for (let i = releaseChangelog.releases.length - 1; i >= 0; i--) { + for (let artifact of releaseChangelog.releases[i].artifacts) { + if (artifact.name === latestReleaseArtifact.name) { + latestReleaseArtifact.from = artifact.to; + artifactsToLatestCommitId[latestReleaseArtifact.name] = artifact.latestCommitId; + break loopThroughReleases; + } + } + } + } + + return artifactsToLatestCommitId; + } + + /** + * Finds release with matching hash Id + * Returns null if match cannot be found + * @param releaseChangelog + * @param latestRelease + * @returns + */ + private findRelease(releases: Release[], latestRelease: Release): Release | null { + let foundRelease: Release | null = null; + + if (releases.length > 0) { + // First level matching with hashId + foundRelease = releases.find(release => release.hashId === latestRelease.hashId); + + // If not found by hashId, proceed to next level matching with names and artifacts + if (foundRelease == null) { + // Create a map for constant time lookup of all release's artifacts + const allArtifacts = new Map(); + for (let release of releases) { + for (let artifact of release.artifacts) { + if (allArtifacts.has(artifact.name)) { + allArtifacts.get(artifact.name).push(artifact.version); + } else { + allArtifacts.set(artifact.name, [artifact.version]); + } + } + } + + // Check if all artifacts in the latest release exist in previous releases + let isAllArtifactsAlreadyAvailablePreviously: boolean = true; + for (let artifact of latestRelease.artifacts) { + if (!allArtifacts.has(artifact.name) || !allArtifacts.get(artifact.name).includes(artifact.version)) { + isAllArtifactsAlreadyAvailablePreviously = false; + break; + } + } + + // If all artifacts match, check for names + if (isAllArtifactsAlreadyAvailablePreviously) { + for (let release of releases) { + if (release.names.includes(latestRelease.names[0])) { + foundRelease = release; + break; + } + } + } + } + } + + return foundRelease; + } + + + /** + * Initalise latest release + * @param releaseName + * @param artifactsToSfpPackage + * @returns + */ + private initLatestRelease( + releaseName: string, + buildNumber: number, + artifactsToSfpPackage: { [p: string]: SfpPackage } + ): Release { + let latestRelease: Release = { + names: [releaseName], + buildNumber: buildNumber, + workItems: {}, + artifacts: [], + hashId: undefined, + }; + + for (let sfpPackage of Object.values(artifactsToSfpPackage)) { + let artifact: Artifact = { + name: sfpPackage.packageName, + from: undefined, + to: sfpPackage.sourceVersion?.slice(0, 8), + version: sfpPackage.package_version_number, + latestCommitId: undefined, + commits: undefined, + }; + + latestRelease['artifacts'].push(artifact); + } + + latestRelease.hashId = hash(latestRelease.artifacts); + latestRelease.date = new Date().toString(); + + return latestRelease; + } + + private containsLatestReleaseName(releaseNames: string[], latestReleaseName: string): boolean { + return releaseNames.find((name) => name.toLowerCase() === latestReleaseName.toLowerCase()) ? true : false; + } +} diff --git a/packages/sfp-cli/src/impl/changelog/WorkItemUpdater.ts b/packages/sfp-cli/src/impl/changelog/WorkItemUpdater.ts new file mode 100644 index 000000000..71c9eec7e --- /dev/null +++ b/packages/sfp-cli/src/impl/changelog/WorkItemUpdater.ts @@ -0,0 +1,41 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Release } from './ReleaseChangelog'; + + +export default class WorkItemUpdater { + constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {} + + /** + * Generate work items in latest release + */ + update(): void { + for (const workItemFilter of this.workItemFilters) { + + let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi'); + SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger); + + for (let artifact of this.latestRelease['artifacts']) { + for (let commit of artifact['commits']) { + let commitMessage: String = commit['message'] + '\n' + commit['body']; + let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex); + if (workItems) { + for (let item of workItems) { + if (this.latestRelease['workItems'][item] == null) { + this.latestRelease['workItems'][item] = new Set(); + this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8)); + } else { + this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8)); + } + } + } + } + } + } + + // Convert each work item Set to Array + // Enables JSON stringification of work item + for (let key in this.latestRelease['workItems']) { + this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]); + } + } +} diff --git a/packages/sfp-cli/src/impl/demoreelplayer/DemoReelPlayer.ts b/packages/sfp-cli/src/impl/demoreelplayer/DemoReelPlayer.ts new file mode 100644 index 000000000..daf033582 --- /dev/null +++ b/packages/sfp-cli/src/impl/demoreelplayer/DemoReelPlayer.ts @@ -0,0 +1,61 @@ +import path = require('path'); +import * as fs from 'fs-extra'; +import { marked } from 'marked'; +const TerminalRenderer = require('marked-terminal'); +import { delay } from '../../core/utils/Delay'; + +export default class DemoReelPlayer { + public async execute(demoReelFolderPath: string) { + //Define renderer + marked.setOptions({ + // Define custom renderer + renderer: new TerminalRenderer(), + }); + + let demoReel: demoReel = fs.readJSONSync(path.join(demoReelFolderPath, 'demo.json'), { + encoding: 'UTF-8', + }); + for (let response of demoReel.sequence) { + let ext = path.extname(path.resolve(demoReelFolderPath, response.filepath)); + let data = fs.readFileSync(path.resolve(demoReelFolderPath, response.filepath), 'utf8'); + + if (response.data) { + Object.entries(response.data).forEach((entry) => { + data = data.replace(`\$\{\{${entry[0]}\}\}`, entry[1]); + }); + } + + if (response.repeat) { + let count = 0; + while (count <= response.repeat) { + await delay(response.preDelay); + if (ext === '.md') { + console.log(marked(data)); + } else { + console.log(data); + } + count++; + await delay(response.postDelay); + } + } else { + await delay(response.preDelay); + if (ext === '.md') { + console.log(marked(data)); + } else { + console.log(data); + } + await delay(response.postDelay); + } + } + } +} + +interface demoReel { + sequence: { + filepath: string; + preDelay: number; + postDelay: number; + repeat: number; + data: { [p: string]: string }; + }[]; +} diff --git a/packages/sfp-cli/src/impl/dependency/ShrinkImpl.ts b/packages/sfp-cli/src/impl/dependency/ShrinkImpl.ts new file mode 100644 index 000000000..cf58a7187 --- /dev/null +++ b/packages/sfp-cli/src/impl/dependency/ShrinkImpl.ts @@ -0,0 +1,81 @@ +import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; +import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import _ from 'lodash'; +import { Connection } from '@salesforce/core'; +const Table = require('cli-table'); +import UserDefinedExternalDependency from '../../core/project/UserDefinedExternalDependency'; + +export default class ShrinkImpl { + private dependencyMap; + private updatedprojectConfig: any; + + + constructor(private connToDevHub:Connection, private logger?: Logger) {} + public async shrinkDependencies(sfdxProjectConfig: any): Promise { + SFPLogger.log('Shrinking Project Dependencies...', LoggerLevel.INFO, this.logger); + + this.updatedprojectConfig = _.cloneDeep(sfdxProjectConfig); + + const transitiveDependencyResolver = new TransitiveDependencyResolver( + sfdxProjectConfig + ); + + this.dependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies(); + await this.resolveAndShrinkDependencies(this.dependencyMap); + + this.updatedprojectConfig = new UserDefinedExternalDependency().addDependencyEntries( this.updatedprojectConfig, this.connToDevHub); + + return this.updatedprojectConfig; + } + + private async resolveAndShrinkDependencies(dependencyMap: any) { + let pkgs = [...dependencyMap.keys()]; + + for (let pkg of pkgs) { + SFPLogger.log( + COLOR_HEADER(`cleaning up dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), + LoggerLevel.TRACE, + this.logger + ); + let dependenencies = dependencyMap.get(pkg); + let updatedDependencies = _.cloneDeep(dependenencies); + for (let dependency of dependencyMap.get(pkg)) { + if (dependencyMap.get(dependency.package)) { + SFPLogger.log( + `Shrinking ${dependencyMap.get(dependency.package).length} dependencies from package ${ + dependency.package + }`, + LoggerLevel.TRACE, + this.logger + ); + for (let temp of dependencyMap.get(dependency.package)) { + for (let i = 0; i < updatedDependencies.length; i++) { + if (updatedDependencies[i].package == temp.package) { + updatedDependencies.splice(i, 1); + } + } + } + } else { + SFPLogger.log( + `no dependency found for ${dependency.package} in the map`, + LoggerLevel.TRACE, + this.logger + ); + } + } + //Update project config + await this.updateProjectConfig(pkg, updatedDependencies); + } + + } + + private async updateProjectConfig(packageName: string, fixedDependencies: any) { + this.updatedprojectConfig.packageDirectories.map((pkg) => { + if (pkg.package == packageName) { + return Object.assign(pkg, { dependencies: fixedDependencies }); + } + }); + } +} + diff --git a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts new file mode 100644 index 000000000..98851aaad --- /dev/null +++ b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts @@ -0,0 +1,851 @@ +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, FileLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; +import { Stage } from '../Stage'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import semver = require('semver'); +import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl'; +import { DeploymentType } from '../../core/deployers/DeploymentExecutor'; +import { COLOR_KEY_MESSAGE,COLOR_KEY_VALUE,COLOR_HEADER } from '@flxblio/sfp-logger'; +import { + PackageInstallationResult, + PackageInstallationStatus, +} from '../../core/package/packageInstallers/PackageInstallationResult'; +import SFPOrg from '../../core/org/SFPOrg'; +import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; +import { PostDeployHook } from './PostDeployHook'; +import { PreDeployHook } from './PreDeployHook'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; +import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; +import * as _ from 'lodash'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import convertBuildNumDotDelimToHyphen from '../../core/utils/VersionNumberConverter'; +import ReleaseConfig from '../release/ReleaseConfig'; +import fs from 'fs-extra'; +import { Align, getMarkdownTable } from 'markdown-table-ts'; +import FileOutputHandler from '../../outputs/FileOutputHandler'; + + +const Table = require('cli-table'); +const retry = require('async-retry'); + +export enum DeploymentMode { + NORMAL, + SOURCEPACKAGES, + SOURCEPACKAGES_PUSH, +} + +export interface DeployProps { + targetUsername: string; + artifactDir: string; + deploymentMode: DeploymentMode; + isTestsToBeTriggered: boolean; + skipIfPackageInstalled: boolean; + logsGroupSymbol?: string[]; + waitTime: number; + tags?: any; + logger?: Logger; + currentStage?: Stage; + baselineOrg?: string; + isDryRun?: boolean; + isRetryOnFailure?: boolean; + promotePackagesBeforeDeploymentToOrg?: string; + devhubUserName?: string; + disableArtifactCommit?: boolean; + selectiveComponentDeployment?: boolean; + maxRetryCount?:number; + releaseConfigPath?:string; +} + +export default class DeployImpl { + private _postDeployHook: PostDeployHook; + private _preDeployHook: PreDeployHook; + private targetOrg: SFPOrg; + + constructor(private props: DeployProps) { + + //Set defaults + if(!this.props.maxRetryCount) + this.props.maxRetryCount = 1; + } + + public set postDeployHook(hook: PostDeployHook) { + this._postDeployHook = hook; + } + + public set preDeployHook(hook: PreDeployHook) { + this._preDeployHook = hook; + } + + public async exec(): Promise { + let deployed: PackageInfo[] = []; + let failed: PackageInfo[] = []; + let queue: SfpPackage[]; + let packagesToPackageInfo: { [p: string]: PackageInfo }; + try { + //Create Org + this.targetOrg = await SFPOrg.create({ aliasOrUsername: this.props.targetUsername }); + + let artifacts = ArtifactFetcher.fetchArtifacts(this.props.artifactDir, null, this.props.logger); + + if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${this.props.artifactDir}`); + + //Convert artifacts to SfpPackages + let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts); + + + + //Filter artifacts based on release config + sfpPackages = this.filterSfPPackagesBasedOnReleaseConfig(sfpPackages,this.props.releaseConfigPath,this.props.logger); + + //Grab the latest projectConfig from Packages + let sfpPackageInquirer: SfpPackageInquirer = new SfpPackageInquirer(sfpPackages, this.props.logger); + let sfdxProjectConfig = sfpPackageInquirer.getLatestProjectConfig(); + if (sfdxProjectConfig == null) { + // If unable to find latest package manifest in artifacts, use package manifest in project directory + sfdxProjectConfig = ProjectConfig.getSFDXProjectConfig(null); + } + + SFPLogger.log('Packages' + sfpPackages.length, LoggerLevel.TRACE, this.props.logger); + + packagesToPackageInfo = await this.getPackagesToPackageInfo(sfpPackages); + + SFPLogger.log( + 'Packages' + JSON.stringify(packagesToPackageInfo), + LoggerLevel.TRACE, + this.props.logger + ); + + queue = this.getPackagesToDeploy(sfdxProjectConfig, packagesToPackageInfo); + + SFPLogger.log('queue:' + JSON.stringify(queue), LoggerLevel.TRACE, this.props.logger); + + if (this.props.skipIfPackageInstalled) { + //Filter the queue based on what is deployed in the target org + let isBaselinOrgModeActivated: boolean; + if (this.props.baselineOrg) { + isBaselinOrgModeActivated = true; + } else { + isBaselinOrgModeActivated = false; + this.props.baselineOrg = this.props.targetUsername; //Change baseline to the target one itself + } + + let filteredDeploymentQueue = await this.filterByPackagesInstalledInTheOrg( + sfdxProjectConfig, + queue, + packagesToPackageInfo, + this.props.baselineOrg + ); + SFPLogger.log( + 'filtered queue:' + JSON.stringify(filteredDeploymentQueue), + LoggerLevel.TRACE, + this.props.logger + ); + this.printArtifactVersionsWhenSkipped(queue, packagesToPackageInfo, isBaselinOrgModeActivated,this.props); + queue = filteredDeploymentQueue; + } else { + this.printArtifactVersions(queue, packagesToPackageInfo); + } + + for (let i = 0; i < queue.length; i++) { + let packageInfo = packagesToPackageInfo[queue[i].packageName]; + let sfpPackage: SfpPackage = packageInfo.sfpPackage; + + let packageType: string = sfpPackage.packageType; + + let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig( + queue[i].packageName, + sfdxProjectConfig + ); + + let groupSection; + if (this.props.currentStage == Stage.VALIDATE) { + groupSection = new GroupConsoleLogs( + `Validating: ${i + 1}/${queue.length} ${queue[i].packageName}`, + this.props.logger + ).begin(); + } else + groupSection = new GroupConsoleLogs( + `Installing: ${i + 1}/${queue.length} ${queue[i].packageName}`, + this.props.logger + ).begin(); + + //Display Header + this.displayHeader(sfpPackage, pkgDescriptor, queue[i].packageName); + + let preHookStatus = await this._preDeployHook?.preDeployPackage( + sfpPackage, + this.props.targetUsername, + sfpPackages, + this.props.devhubUserName, + this.props.logger + ); + if (preHookStatus?.isToFailDeployment) { + failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); + throw new Error( + preHookStatus.message + ? preHookStatus.message + : 'Hook Failed to execute, but didnt provide proper message' + ); + } + + let isToBeRetried: boolean = this.props.isRetryOnFailure; + let packageInstallationResult: PackageInstallationResult = await retry( + async (bail, attemptCount) => { + try { + try { + await this.promotePackagesBeforeInstallation(packageInfo.sourceDirectory, sfpPackage); + } catch (error) { + //skip packages already promoted + SFPLogger.log(`Package already promoted .. skipping`,LoggerLevel.WARN); + } + + this.displayRetryHeader(isToBeRetried, attemptCount); + + let installPackageResult = await this.installPackage( + packageType, + queue[i], + this.targetOrg, + queue[i].packageDescriptor.skipTesting, + this.props.waitTime.toString(), + pkgDescriptor, + false, //Queue already filtered by deploy, there is no further need for individual + //commands to decide the skip logic. TODO: fix this incorrect pattern + sfpPackage.apiVersion || sfpPackage.payload?.Package?.version // Use package.xml version for backwards compat with old artifacts + ); + + //Handle specific error condition which need a retry, overriding the set value + isToBeRetried = handleRetryOnSpecificConditions(isToBeRetried, installPackageResult, attemptCount,this.props.maxRetryCount); + + if (isToBeRetried) { + throw new Error(installPackageResult.message); + } else return installPackageResult; + } catch (error) { + if (isToBeRetried) { + throw error; + } else { + // Any other exception, in regular cases dont retry, just bail out + let failedPackageInstallationResult: PackageInstallationResult = { + result: PackageInstallationStatus.Failed, + message: error, + }; + + + FileOutputHandler.getInstance().writeOutput(`deployment-error.md`,`### 💣 Deployment Failed 💣`); + FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`Package Installation failed for **${queue[i].packageName}**`); + FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`Reasons:`); + FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`${error}`); + + return failedPackageInstallationResult; + } + } + + function handleRetryOnSpecificConditions( + isToBeRetried: boolean, + installPackageResult: PackageInstallationResult, + retryCount: number, + maxRetryCount:number + ): boolean { + //override current value when encountering such issue + if (installPackageResult.result === PackageInstallationStatus.Failed) { + if (installPackageResult.message?.includes('ongoing background job')) + return true; + else if (isToBeRetried && retryCount <= maxRetryCount ) + return true; + else + return false; + } else return false; + } + }, + { retries: 10, minTimeout: 30000 } + ); + + if (packageInstallationResult.result === PackageInstallationStatus.Succeeded) { + deployed.push(packageInfo); + } else if (packageInstallationResult.result === PackageInstallationStatus.Skipped) { + continue; + } else if (packageInstallationResult.result === PackageInstallationStatus.Failed) { + failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); + } + + // Only deploy post hook when package installation is successful + if(packageInstallationResult.result === PackageInstallationStatus.Succeeded) { + let postHookStatus = await this._postDeployHook?.postDeployPackage( + sfpPackage, + packageInstallationResult, + this.props.targetUsername, + sfpPackages, + this.props.devhubUserName, + this.props.logger + ); + + if (postHookStatus?.isToFailDeployment) { + failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); + throw new Error( + postHookStatus.message + ? postHookStatus.message + : 'Hook Failed to execute, but didnt provide proper message' + ); + } + } + + if (packageInstallationResult.result === PackageInstallationStatus.Failed) { + failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); + throw new Error(packageInstallationResult.message); + } + + groupSection.end(); + } + + return { + scheduled: queue.length, + deployed: deployed, + failed: failed, + queue: queue, + packagesToPackageInfo: packagesToPackageInfo, + error: null + }; + } catch (err) { + SFPLogger.log(err, LoggerLevel.ERROR, this.props.logger); + + return { + scheduled: queue?.length ? queue.length : 0, + deployed: deployed, + failed: failed, + queue: queue, + packagesToPackageInfo: packagesToPackageInfo, + error: err.message, + }; + } + } + private filterSfPPackagesBasedOnReleaseConfig(sfpPackages: SfpPackage[], releaseConfigPath: string,logger:Logger): SfpPackage[] { + if(!releaseConfigPath) + return sfpPackages; + else + { + SFPLogger.log(COLOR_KEY_MESSAGE(`Filtering packages to be deployed based on release config ${COLOR_KEY_VALUE(releaseConfigPath)}`),LoggerLevel.INFO,logger); + let releaseConfig:ReleaseConfig = new ReleaseConfig(logger,releaseConfigPath); + let packages = releaseConfig.getPackagesAsPerReleaseConfig(); + //Filter artifacts based on packages + let filteredSfPPackages:SfpPackage[] = []; + + for (const sfpPackage of sfpPackages) { + if (packages.includes(sfpPackage.packageName)) { + filteredSfPPackages.push(sfpPackage); + } + } + return filteredSfPPackages; + } + + } + + + private async generateSfpPackageFromArtifacts(artifacts: Artifact[]): Promise { + let sfpPackages: SfpPackage[] = []; + for (const artifact of artifacts) { + let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, this.props.logger); + sfpPackages.push(sfpPackage); + } + return sfpPackages; + } + + private async promotePackagesBeforeInstallation(sourceDirectory: string, sfpPackage: SfpPackage) { + if (this.props.promotePackagesBeforeDeploymentToOrg === this.props.targetUsername) { + if (sfpPackage.packageType === PackageType.Unlocked) { + console.log( + COLOR_KEY_MESSAGE(`Attempting to promote package ${sfpPackage.packageName} before installation`) + ); + if(!this.props.isDryRun) + { + let promoteUnlockedPackageImpl: PromoteUnlockedPackageImpl = new PromoteUnlockedPackageImpl( + sourceDirectory, + sfpPackage.package_version_id, + this.props.devhubUserName + ); + await promoteUnlockedPackageImpl.promote(); + } + } + } + } + + private displayRetryHeader(isRetryOnFailure: boolean, count: number) { + if (isRetryOnFailure && count > 1) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log(`Retrying On Failure Attempt: ${count}`, LoggerLevel.INFO, this.props.logger); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + } + + private displayHeader(sfpPackage: SfpPackage, pkgDescriptor: any, pkg: string) { + let alwaysDeployMessage: string; + + if (this.props.skipIfPackageInstalled) { + if (pkgDescriptor.alwaysDeploy) alwaysDeployMessage = `Always Deploy: ${COLOR_KEY_MESSAGE(`True`)}`; + else alwaysDeployMessage = `Always Deploy: ${COLOR_KEY_MESSAGE(`False`)}`; + } else alwaysDeployMessage = undefined; + + //Display header + SFPLogger.printHeaderLine('Installing Package',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log(COLOR_HEADER(`Name: ${COLOR_KEY_MESSAGE(pkg)}`), LoggerLevel.INFO, this.props.logger); + SFPLogger.log(`Type: ${COLOR_KEY_MESSAGE(sfpPackage.packageType)}`, LoggerLevel.INFO, this.props.logger); + SFPLogger.log( + `Version Number: ${COLOR_KEY_MESSAGE(sfpPackage.versionNumber)}`, + LoggerLevel.INFO, + this.props.logger + ); + this.displayTestInfoHeader(sfpPackage); + if (pkgDescriptor.aliasfy) + SFPLogger.log( + `Aliasified Package: ${COLOR_KEY_MESSAGE(`True`)}`, + LoggerLevel.INFO, + this.props.logger + ); + if(sfpPackage.isApexFound) + SFPLogger.log( + `Contains Apex Classes/Triggers: ${COLOR_KEY_MESSAGE(sfpPackage.isApexFound)}`, + LoggerLevel.INFO, + this.props.logger + ); + if (sfpPackage.packageType == PackageType.Source || sfpPackage.packageType == PackageType.Unlocked) { + if (!pkgDescriptor.aliasfy) { + SFPLogger.log( + `Metadata to be deployed: ${COLOR_KEY_MESSAGE(sfpPackage.metadataCount)}`, + LoggerLevel.INFO, + this.props.logger + ); + } + } + + if (pkgDescriptor.skipTesting) { + SFPLogger.log( + `Skip Testing: ${COLOR_KEY_MESSAGE(pkgDescriptor.skipTesting ? 'true' : 'false')}`, + LoggerLevel.INFO, + this.props.logger + ); + } + + if (alwaysDeployMessage) SFPLogger.log(alwaysDeployMessage, LoggerLevel.INFO, this.props.logger); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + + private displayTestInfoHeader(sfpPackage: SfpPackage) { + if (sfpPackage.packageType == PackageType.Source) { + if (!sfpPackage.isTriggerAllTests) + SFPLogger.log( + `Optimized Deployment: ${COLOR_KEY_MESSAGE( + this.isOptimizedDeploymentForSourcePackage(sfpPackage.packageDescriptor) + )}`, + LoggerLevel.INFO, + this.props.logger + ); + else + SFPLogger.log( + `Trigger All Tests: ${COLOR_KEY_MESSAGE(`true`)}`, + LoggerLevel.INFO, + this.props.logger + ); + } + } + + private printArtifactVersionsWhenSkipped( + queue: SfpPackage[], + packagesToPackageInfo: { [p: string]: PackageInfo }, + isBaselinOrgModeActivated: boolean, + props:DeployProps + ) { + let groupSection = new GroupConsoleLogs(`Full Deployment Breakdown`, this.props.logger).begin(); + let maxTable = new Table({ + head: [ + 'Package', + 'Incoming Version', + isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', + 'To be installed?', + ], + chars: ZERO_BORDER_TABLE, + }); + + queue.forEach((pkg) => { + maxTable.push(processColoursForAllPackages(pkg)); + }); + + SFPLogger.log(maxTable.toString(), LoggerLevel.INFO, this.props.logger); + + + //Insane Hack + //TODO: Export the value to the caller + printDeploymentBreakDownInMarkdown(); + + groupSection.end(); + + groupSection = new GroupConsoleLogs(`Packages to be deployed`, this.props.logger).begin(); + let minTable = new Table({ + head: [ + 'Package', + 'Incoming Version', + isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', + ], + chars: ZERO_BORDER_TABLE, + }); + + queue.forEach((pkg) => { + if (!packagesToPackageInfo[pkg.packageName].isPackageInstalled) + minTable.push([ + COLOR_KEY_MESSAGE(pkg.packageName), + COLOR_KEY_MESSAGE(pkg.versionNumber), + packagesToPackageInfo[pkg.packageName].versionInstalledInOrg + ? COLOR_KEY_MESSAGE(packagesToPackageInfo[pkg.packageName].versionInstalledInOrg) + : COLOR_KEY_MESSAGE('N/A'), + ]); + }); + SFPLogger.log(minTable.toString(), LoggerLevel.INFO, this.props.logger); + groupSection.end(); + + + + function printDeploymentBreakDownInMarkdown() { + let tableData = { + table: { + head: [ + 'Package', + 'Incoming Version', + isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', + 'To be installed?', + 'Promotion Status' + ], + body: [] + }, + alignment: [Align.Left, Align.Left, Align.Left,Align.Right], + }; + for (const pkg of queue) { + tableData.table.body.push(getRowForMarkdownTable(pkg,props)); + } + const table = getMarkdownTable(tableData); + const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); + outputHandler.writeOutput('deployment-breakdown.md',table) ; + } + + function processColoursForAllPackages(pkg) { + const pkgInfo = packagesToPackageInfo[pkg.packageName]; + + let packageName = pkg.packageName; + let versionNumber = pkg.versionNumber; + let versionInstalledInOrg = pkgInfo.versionInstalledInOrg ? pkgInfo.versionInstalledInOrg : 'N/A'; + let isPackageInstalled = pkgInfo.isPackageInstalled ? 'No' : 'Yes'; + + if (pkgInfo.isPackageInstalled) { + packageName = COLOR_SUCCESS(packageName); + versionNumber = COLOR_SUCCESS(versionNumber); + versionInstalledInOrg = COLOR_SUCCESS(versionInstalledInOrg); + isPackageInstalled = COLOR_SUCCESS(isPackageInstalled); + } + else + { + packageName = COLOR_ERROR(packageName); + versionNumber = COLOR_ERROR(versionNumber); + versionInstalledInOrg = COLOR_ERROR(versionInstalledInOrg); + isPackageInstalled = COLOR_ERROR(isPackageInstalled); + + } + + return [packageName, versionNumber, versionInstalledInOrg, isPackageInstalled]; + } + + + function getRowForMarkdownTable(pkg:SfpPackage, props:DeployProps) { + const pkgInfo = packagesToPackageInfo[pkg.packageName]; + + let packageName = pkg.packageName; + let versionNumber = pkg.versionNumber; + let versionInstalledInOrg = pkgInfo.versionInstalledInOrg ? pkgInfo.versionInstalledInOrg : 'N/A'; + let isPackageToBeInstalled = pkgInfo.isPackageInstalled ? 'No' : 'Yes'; + let promotionStatus = 'N/A'; + + if(isPackageToBeInstalled=="Yes") + { + isPackageToBeInstalled = `![Yes](https://img.shields.io/badge/Yes-green.svg)`; + packageName = `**${packageName}**`; + if(pkg.packageType==PackageType.Unlocked) + { + if (props.promotePackagesBeforeDeploymentToOrg == props.targetUsername && versionInstalledInOrg == "N/A") { + promotionStatus = '![Pending](https://img.shields.io/badge/Pending-yellow.svg)'; + } + else if(props.promotePackagesBeforeDeploymentToOrg == props.targetUsername ) { + let versionInstalledInOrgConvertedToSemver = convertBuildNumDotDelimToHyphen(versionInstalledInOrg); + let versionNumberConvertedToSemver = convertBuildNumDotDelimToHyphen(versionNumber); + if (semver.diff(versionInstalledInOrgConvertedToSemver, versionNumberConvertedToSemver) == 'prerelease') { + promotionStatus = '![Already Promoted](https://img.shields.io/badge/Already%20Promoted-red.svg)'; + } + else { + promotionStatus = '![Pending](https://img.shields.io/badge/Pending-yellow.svg)'; + } + } + else + { + promotionStatus = 'N/A'; + } + } + + versionNumber = `**${versionNumber}**`; + versionInstalledInOrg = `**${versionInstalledInOrg}**`; + } + else + { + versionNumber = `**${versionNumber}**`; + versionInstalledInOrg = `**${versionInstalledInOrg}**`; + } + + return [packageName, versionNumber, versionInstalledInOrg, isPackageToBeInstalled,promotionStatus]; + } + } + + private printArtifactVersions(queue: SfpPackage[], packagesToPackageInfo: { [p: string]: PackageInfo }) { + let groupSection = new GroupConsoleLogs(`Packages to be deployed`, this.props.logger).begin(); + let table = new Table({ + head: ['Package', 'Version to be installed'], + chars: ZERO_BORDER_TABLE, + }); + + queue.forEach((pkg) => { + table.push([pkg.packageName, pkg.versionNumber]); + }); + SFPLogger.log(table.toString(), LoggerLevel.INFO, this.props.logger); + groupSection.end(); + + printDeploymentBreakDownInMarkdown(); + + + function printDeploymentBreakDownInMarkdown() { + let tableData = { + table: { + head: [ + 'Package', + 'Version to be installed' + ], + body: [] + }, + alignment: [Align.Left, Align.Left, Align.Left,Align.Right], + }; + for (const pkg of queue) { + tableData.table.body.push(getRowForMarkdownTable(pkg)); + } + + const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); + outputHandler.writeOutput('deployment-breakdown.md',`Please find the packages that will be deployed below`); + outputHandler.appendOutput('deployment-breakdown.md',`\n\n${getMarkdownTable(tableData)}`) ; + } + + function getRowForMarkdownTable(pkg:SfpPackage) { + let packageName = pkg.packageName; + let versionNumber = pkg.versionNumber; + return [packageName, versionNumber]; + } + } + + private async filterByPackagesInstalledInTheOrg( + packageManifest: any, + queue: SfpPackage[], + packagesToPackageInfo: { [p: string]: PackageInfo }, + targetUsername: string + ): Promise { + let targetOrg = await SFPOrg.create({ aliasOrUsername: targetUsername }); + + const clonedQueue = _.clone(queue); + + for (let i = queue.length - 1; i >= 0; i--) { + let packageInfo = packagesToPackageInfo[clonedQueue[i].packageName]; + let sfpPackage: SfpPackage = packageInfo.sfpPackage; + let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig( + clonedQueue[i].packageName, + packageManifest + ); + let packageInstalledInTheOrg = await targetOrg.isArtifactInstalledInOrg( + this.props.logger, + sfpPackage + ); + if (packageInstalledInTheOrg.versionNumber) + packageInfo.versionInstalledInOrg = packageInstalledInTheOrg.versionNumber; + if (packageInstalledInTheOrg.isInstalled) { + if (!pkgDescriptor.alwaysDeploy) { + packageInfo.isPackageInstalled = true; + clonedQueue.splice(i, 1); + } + } + } + + return clonedQueue; + } + + /** + * Returns map of package name to package info + * @param artifacts + */ + private async getPackagesToPackageInfo(sfpPackages: SfpPackage[]): Promise<{ [p: string]: PackageInfo }> { + let packagesToPackageInfo: { [p: string]: PackageInfo } = {}; + + for (let sfpPackage of sfpPackages) { + if (packagesToPackageInfo[sfpPackage.packageName]) { + let previousVersionNumber = convertBuildNumDotDelimToHyphen( + packagesToPackageInfo[sfpPackage.packageName].sfpPackage.versionNumber + ); + let currentVersionNumber = convertBuildNumDotDelimToHyphen(sfpPackage.versionNumber); + + // replace existing packageInfo if package version number is newer + if (semver.gt(currentVersionNumber, previousVersionNumber)) { + packagesToPackageInfo[sfpPackage.packageName] = { + sourceDirectory: sfpPackage.sourceDir, + sfpPackage: sfpPackage, + }; + } + } else { + packagesToPackageInfo[sfpPackage.packageName] = { + sourceDirectory: sfpPackage.sourceDir, + sfpPackage: sfpPackage, + }; + } + } + return packagesToPackageInfo; + } + + /** + * Decider for which package installation type to run + */ + private async installPackage( + packageType: string, + sfpPackage: SfpPackage, + targetOrg: SFPOrg, + skipTesting: boolean, + waitTime: string, + pkgDescriptor: any, + skipIfPackageInstalled: boolean, + apiVersion: string + ): Promise { + //Compute Deployment Type + let deploymentType = + this.props.deploymentMode === DeploymentMode.SOURCEPACKAGES_PUSH + ? DeploymentType.SOURCE_PUSH : DeploymentType.MDAPI_DEPLOY; + + //Add Installation Options + let installationOptions = new SfpPackageInstallationOptions(); + installationOptions.installationkey = null, + installationOptions.apexcompile = 'package'; + installationOptions.waitTime = waitTime; + installationOptions.apiVersion = apiVersion; + installationOptions.publishWaitTime = 60; + installationOptions.isInstallingForValidation = + this.props.deploymentMode != DeploymentMode.NORMAL && + (this.props.currentStage === Stage.PREPARE || this.props.currentStage === Stage.VALIDATE); + installationOptions.optimizeDeployment = this.isOptimizedDeploymentForSourcePackage(pkgDescriptor); + installationOptions.skipTesting = skipTesting; + installationOptions.deploymentType = deploymentType; + installationOptions.disableArtifactCommit = this.props.disableArtifactCommit; + + //During validate, if optimizeDeploymentMode is false, use full local tests to validate + //but respect skipTesting #issue 1075 + //During Prepare (push), dont trigger tests + if (this.props.currentStage == Stage.VALIDATE) { + //Always enable skipTest as the default installation option during validate + //as test are run subsequently + installationOptions.skipTesting = true; + if (!this.isOptimizedDeploymentForSourcePackage(pkgDescriptor)) { + if (sfpPackage.packageDescriptor.skipTesting) + installationOptions.skipTesting = sfpPackage.packageDescriptor.skipTesting; + else installationOptions.skipTesting = false; + } + } else if (this.props.currentStage === Stage.PREPARE) { + installationOptions.optimizeDeployment = false; + installationOptions.skipTesting = true; + } + + installationOptions.skipIfPackageInstalled = skipIfPackageInstalled; + installationOptions.isDryRun = this.props.isDryRun; + + return SfpPackageInstaller.installPackage( + this.props.logger, + sfpPackage, + targetOrg, + installationOptions, + { + currentStage: this.props.currentStage, + }, + sfpPackage.packageType == PackageType.Unlocked && installationOptions.isInstallingForValidation + ? PackageType.Source + : undefined //Override to source + ); + } + + /** + * Checks if package should be installed to target username + * @param packageDescriptor + */ + private isSkipDeployment(packageDescriptor: any, targetUsername: string): boolean { + let skipDeployOnOrgs: string[] = packageDescriptor.skipDeployOnOrgs; + if (skipDeployOnOrgs) { + if (!(skipDeployOnOrgs instanceof Array)) + throw new Error(`Property 'skipDeployOnOrgs' must be of type Array`); + else return skipDeployOnOrgs.includes(targetUsername); + } else return false; + } + + // Allow individual packages to use non optimized path + private isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { + if (pkgDescriptor.isOptimizedDeployment == null) return true; + else return pkgDescriptor.isOptimizedDeployment; + } + + /** + * Returns the packages in the project config that have an artifact + */ + private getPackagesToDeploy( + sfdxProjectConfig: any, + packagesToPackageInfo: { [p: string]: PackageInfo } + ): SfpPackage[] { + let packagesToDeploy: SfpPackage[] = []; + + let packages = sfdxProjectConfig['packageDirectories']; + + // Filter package manifest by whats available in artifacts + for (const pkg of packages) { + if (packagesToPackageInfo[pkg.package]) + packagesToDeploy.push(packagesToPackageInfo[pkg.package].sfpPackage); + } + + // Filter out packages that are to be skipped on the target org + packagesToDeploy = packagesToDeploy.filter( + (sfpPackage) => !this.isSkipDeployment(sfpPackage.packageDescriptor, this.props.targetUsername) + ); + + //Ignore packages based on stage + packagesToDeploy = packagesToDeploy.filter((pkg) => { + if ( + pkg.packageDescriptor.ignoreOnStage?.find((stage) => { + stage = stage.toLowerCase(); + return stage === this.props.currentStage; + }) + ) + return false; + else return true; + }); + + if (packagesToDeploy.length === 0) throw new Error(`No artifacts from project config to be deployed`); + else return packagesToDeploy; + } +} + +export interface PackageInfo { + sourceDirectory: string; + sfpPackage: SfpPackage; + versionInstalledInOrg?: string; + isPackageInstalled?: boolean; +} + +export interface DeploymentResult { + scheduled: number; + queue: any[]; + packagesToPackageInfo: { [p: string]: PackageInfo }; + deployed: PackageInfo[]; + failed: PackageInfo[]; + error: any; +} diff --git a/packages/sfp-cli/src/impl/deploy/PostDeployHook.ts b/packages/sfp-cli/src/impl/deploy/PostDeployHook.ts new file mode 100644 index 000000000..7f73cf3ba --- /dev/null +++ b/packages/sfp-cli/src/impl/deploy/PostDeployHook.ts @@ -0,0 +1,14 @@ +import { Logger } from '@flxblio/sfp-logger'; +import { PackageInstallationResult } from '../../core/package/packageInstallers/PackageInstallationResult'; +import SfpPackage from '../../core/package/SfpPackage'; + +export interface PostDeployHook { + postDeployPackage( + sfpPackage: SfpPackage, + packageInstallationResult: PackageInstallationResult, + targetUsername: string, + deployedPackages?:SfpPackage[], + devhubUserName?: string, + logger?:Logger + ): Promise<{ isToFailDeployment: boolean; message?: string }>; +} diff --git a/packages/sfp-cli/src/impl/deploy/PreDeployHook.ts b/packages/sfp-cli/src/impl/deploy/PreDeployHook.ts new file mode 100644 index 000000000..58294b363 --- /dev/null +++ b/packages/sfp-cli/src/impl/deploy/PreDeployHook.ts @@ -0,0 +1,12 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackage from '../../core/package/SfpPackage'; + +export interface PreDeployHook { + preDeployPackage( + sfpPackage: SfpPackage, + targetUsername: string, + deployedPackages?:SfpPackage[], + devhubUserName?: string, + logger?:Logger, + ): Promise<{ isToFailDeployment: boolean; message?: string }>; +} diff --git a/packages/sfp-cli/src/impl/impact/ImpactedPackagesResolver.ts b/packages/sfp-cli/src/impl/impact/ImpactedPackagesResolver.ts new file mode 100644 index 000000000..0d00338bb --- /dev/null +++ b/packages/sfp-cli/src/impl/impact/ImpactedPackagesResolver.ts @@ -0,0 +1,140 @@ +import PackageDiffImpl, { PackageDiffOptions } from '../../core/package/diff/PackageDiffImpl'; +import { Stage } from '../Stage'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import { PackageType } from '../../core/package/SfpPackage'; +import * as fs from 'fs-extra'; +import { Logger } from '@flxblio/sfp-logger'; +import BuildCollections from '../parallelBuilder/BuildCollections'; + +export interface ImpactedPackageProps { + projectDirectory?: string; + branch?: string; + configFilePath?: string; + currentStage: Stage; + baseBranch?: string; + diffOptions?: PackageDiffOptions; + includeOnlyPackages?: string[]; +} + +export default class ImpactedPackageResolver { + + + constructor(private props: ImpactedPackageProps, private logger: Logger) { + } + + async getImpactedPackages(): Promise> { + let projectConfig = ProjectConfig.getSFDXProjectConfig(this.props.projectDirectory); + let packagesToBeBuilt = this.getPackagesToBeBuilt(this.props.projectDirectory); + let packagesToBeBuiltWithReasons = await this.filterPackagesToBeBuiltByChanged( + this.props.projectDirectory, + projectConfig, + packagesToBeBuilt + ); + + return packagesToBeBuiltWithReasons; + } + + /** + * 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 + */ + private getPathToForceIgnoreForCurrentStage(projectConfig: any, currentStage: Stage): string { + let stageForceIgnorePath: string; + + let ignoreFiles: { [key in Stage]: string } = 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; + } + + private async filterPackagesToBeBuiltByChanged(projectDirectory: string,projectConfig:any, allPackagesInRepo: any) { + let packagesToBeBuilt = new Map(); + let buildCollections = new BuildCollections(projectDirectory); + if (this.props.diffOptions) + this.props.diffOptions.pathToReplacementForceIgnore = this.getPathToForceIgnoreForCurrentStage( + projectConfig, + this.props.currentStage + ); + + for await (const pkg of allPackagesInRepo) { + let diffImpl: PackageDiffImpl = new PackageDiffImpl( + this.logger, + pkg, + this.props.projectDirectory, + this.props.diffOptions + ); + let packageDiffCheck = await diffImpl.exec(); + + if (packageDiffCheck.isToBeBuilt) { + packagesToBeBuilt.set(pkg, { + reason: 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; + } + + private getPackagesToBeBuilt(projectDirectory: string, includeOnlyPackages?: string[]): string[] { + let projectConfig = ProjectConfig.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) { + 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 !== PackageType.Data); + }); + + for (const pkg of packageDescriptors) { + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg['package']); + } + return sfdxpackages; + } + +} diff --git a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts new file mode 100644 index 000000000..1af8798bc --- /dev/null +++ b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts @@ -0,0 +1,83 @@ +import * as fs from 'fs-extra'; +const yaml = require('js-yaml'); +import path from 'path'; + +export default class ImpactedRelaseConfigResolver { + + public getImpactedReleaseConfigs(impactedPackages, configDir,isExplicitDependencyCheckEnabled:boolean=false, filterBy?: string) { + const impactedReleaseDefs = []; + + fs.readdirSync(configDir).forEach((file) => { + const filePath = path.join(configDir, file); + const fileContent = fs.readFileSync(filePath, 'utf8'); + const releaseConfig = yaml.load(fileContent); + + if (releaseConfig.releaseName) { + let releaseImpactedPackages = []; + //Its a releasedefn, + if (releaseConfig.includeOnlyArtifacts) { + releaseImpactedPackages = releaseConfig.includeOnlyArtifacts.filter((artifact) => + impactedPackages.includes(artifact) + ); + } else if (releaseConfig.excludeArtifacts) { + releaseImpactedPackages = impactedPackages.filter( + (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) + ); + } + + + // handle dependencyOn, only do impact if there is atleast one package that is impacted + if (releaseImpactedPackages.length>0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { + releaseImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => + impactedPackages.includes(artifact) + ); + } + + + if (releaseImpactedPackages.length > 0) { + if (filterBy) { + if (releaseConfig.releaseName.includes(filterBy)) { + impactedReleaseDefs.push({ + releaseName: releaseConfig.releaseName, + pool: releaseConfig.pool + ? releaseConfig.pool + : releaseConfig.releaseName, + filePath: filePath, + impactedPackages: releaseImpactedPackages, // Including the impacted packages + }); + } + } else { + impactedReleaseDefs.push({ + releaseName: releaseConfig.releaseName, + pool: releaseConfig.pool + ? releaseConfig.pool + : releaseConfig.releaseName, + filePath: filePath, + impactedPackages: releaseImpactedPackages, // Including the impacted packages + }); + } + } + } + }); + + const sortedImpactedReleaseDefs = impactedReleaseDefs.sort((a, b) => { + if (!a.impactedPackages.length && !b.impactedPackages.length) return 0; + if (!a.impactedPackages.length) return 1; // Move releases with no impacted packages to the end + if (!b.impactedPackages.length) return -1; // Same as above + + const indexA = impactedPackages.indexOf(a.impactedPackages[0]); + const indexB = impactedPackages.indexOf(b.impactedPackages[0]); + + if (indexA === -1 && indexB === -1) return 0; // Neither package is in impactedPackages + if (indexA === -1) return 1; // Move releases with unknown impacted packages to the end + if (indexB === -1) return -1; // Same as above + + return indexA - indexB; // Sort based on index in impactedPackages + }); + + const output = { + include: sortedImpactedReleaseDefs, + }; + return output; + } +} diff --git a/packages/sfp-cli/src/impl/parallelBuilder/BatchingTopoSort.ts b/packages/sfp-cli/src/impl/parallelBuilder/BatchingTopoSort.ts new file mode 100644 index 000000000..88c61f847 --- /dev/null +++ b/packages/sfp-cli/src/impl/parallelBuilder/BatchingTopoSort.ts @@ -0,0 +1,63 @@ +import { AdjacentList } from './DependencyHelper'; + +export default class BatchingTopoSort { + public sort(dag: AdjacentList) { + try { + const indegrees = this.countInDegrees(dag); + let sorted = []; + let roots = this.getRoots(indegrees); + while (roots.length) { + sorted.push(roots); + let newRoots = []; + roots.forEach((root) => { + dag[root].forEach((dependents) => { + indegrees[dependents]--; + if (indegrees[dependents] == 0) newRoots.push(dependents); + }); + }); + + roots = newRoots; + } + + if (this.getNonRoots(indegrees).length) { + throw Error('Cycle(s) detected; toposort only works on acyclic graphs'); + } + + return sorted; + } catch (error) { + throw Error('Missing package in adjacency list or cycles detected' + error); + } + } + + private countInDegrees(dag: AdjacentList): DAGDegrees { + let counts: DAGDegrees = {}; + Object.entries(dag).forEach(([key, dependents]) => { + counts[key] = counts[key] || 0; + dependents.forEach((dependent) => { + counts[dependent] = counts[dependent] || 0; + counts[dependent]++; + }); + }); + return counts; + } + + private getRoots(counts: DAGDegrees) { + return Object.entries(counts) + .filter(([key, degree]) => { + if (degree == 0) return true; + }) + .map(([key, degree]) => key); + } + + private getNonRoots(counts: DAGDegrees) { + return Object.entries(counts) + .filter(([key, degree]) => { + if (degree != 0) return true; + }) + .map(([key, degree]) => key); + } +} + +type DAGDegrees = { + [key: string]: number; +}; diff --git a/packages/sfp-cli/src/impl/parallelBuilder/BuildCollections.ts b/packages/sfp-cli/src/impl/parallelBuilder/BuildCollections.ts new file mode 100644 index 000000000..7d3e3b5dc --- /dev/null +++ b/packages/sfp-cli/src/impl/parallelBuilder/BuildCollections.ts @@ -0,0 +1,65 @@ +import UndirectedGraph from './UndirectedGraph'; +import ProjectConfig from '../../core/project/ProjectConfig'; + +/** + * Class for the manipulation of package build collections + */ +export default class BuildCollections { + // Disconnected undirected graph is used to represent collections and their packages + private _graph: UndirectedGraph; + + constructor(projectDirectory: string) { + this.createGraphOfBuildCollections(projectDirectory); + } + + get graph(): UndirectedGraph { + return this._graph; + } + + /** + * Constructs graph representation of collections + * @param projectDirectory + */ + private createGraphOfBuildCollections(projectDirectory: string) { + this._graph = new UndirectedGraph(); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + for (let pkg of projectConfig.packageDirectories) { + if (pkg.buildCollection) { + if (pkg.buildCollection instanceof Array) { + if (!this._graph.adjacencyList[pkg.package]) this._graph.addVertex(pkg.package); + + pkg.buildCollection.forEach((packageInCollection) => { + // Create vertex for package in collection if it doesn't exist yet + if (!this._graph.adjacencyList[packageInCollection]) { + // Verify that the package in collection is a valid package, before adding to adj. list + if (projectConfig.packageDirectories.find((elem) => elem.package === packageInCollection)) { + this._graph.addVertex(packageInCollection); + } else + throw new Error( + `Package '${packageInCollection}' in collection ${pkg.buildCollection} is not a valid package` + ); + } + + this._graph.addEdge(pkg.package, packageInCollection); + }); + } else + throw new Error( + `Property 'buildCollection' must be of type Array. Received ${pkg.buildCollection}` + ); + } + } + } + + /** + * Returns list of packages contained in the same collection as the package + * @param pkg + */ + listPackagesInCollection(pkg: string): string[] { + return this._graph.dfs(pkg); + } + + isPackageInACollection(pkg: string): boolean { + return this._graph.adjacencyList[pkg] ? true : false; + } +} diff --git a/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts b/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts new file mode 100644 index 000000000..5bc6a3e82 --- /dev/null +++ b/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts @@ -0,0 +1,879 @@ +import BatchingTopoSort from "./BatchingTopoSort"; +import DependencyHelper from "./DependencyHelper"; +import Bottleneck from "bottleneck"; +import PackageDiffImpl, { + PackageDiffOptions, +} from "../../core/package/diff/PackageDiffImpl"; +import { EOL } from "os"; +import SFPStatsSender from "../../core/stats/SFPStatsSender"; +import { Stage } from "../Stage"; +import * as fs from "fs-extra"; +import ProjectConfig from "../../core/project/ProjectConfig"; +import BuildCollections from "./BuildCollections"; +const Table = require("cli-table"); +import SFPLogger, { + COLOR_KEY_VALUE, + ConsoleLogger, + FileLogger, + LoggerLevel, + VoidLogger, +} from "@flxblio/sfp-logger"; +import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; +import { COLOR_HEADER } from "@flxblio/sfp-logger"; +import { COLOR_ERROR } from "@flxblio/sfp-logger"; +import SfpPackage, { + PackageType, +} from "../../core/package/SfpPackage"; +import SfpPackageBuilder from "../../core/package/SfpPackageBuilder"; +import getFormattedTime from "../../core/utils/GetFormattedTime"; +import { + COLON_MIDDLE_BORDER_TABLE, + ZERO_BORDER_TABLE, +} from "../../ui/TableConstants"; +import PackageDependencyResolver from "../../core/package/dependencies/PackageDependencyResolver"; +import SFPOrg from "../../core/org/SFPOrg"; +import Git from "../../core/git/Git"; +import TransitiveDependencyResolver from "../../core/package/dependencies/TransitiveDependencyResolver"; +import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; +import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; +import PackageDependencyDisplayer from "../../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; + +export interface BuildProps { + overridePackageTypes?: { [key: string]: PackageType }; + configFilePath?: string; + projectDirectory?: string; + devhubAlias?: string; + repourl?: string; + waitTime: number; + isQuickBuild: boolean; + isDiffCheckEnabled: boolean; + buildNumber: number; + executorcount: number; + isBuildAllAsSourcePackages: boolean; + branch?: string; + currentStage: Stage; + baseBranch?: string; + diffOptions?: PackageDiffOptions; + includeOnlyPackages?: string[]; +} +export default class BuildImpl { + private limiter: Bottleneck; + private parentsToBeFulfilled; + private childs; + private packagesToBeBuilt: string[]; + private packageCreationPromises: Array>; + private projectConfig; + private parents: any; + private packagesInQueue: string[]; + private packagesBuilt: string[]; + private failedPackages: string[]; + private generatedPackages: SfpPackage[]; + private sfpOrg: SFPOrg; + private scratchOrgDefinitions: { [key: string]: any }[]; + private isMultiConfigFilesEnabled: boolean; + + private repository_url: string; + private commit_id: string; + + private logger = new ConsoleLogger(); + private recursiveAll = (a) => + Promise.all(a).then((r) => + r.length == a.length ? r : this.recursiveAll(a), + ); + + public constructor(private props: BuildProps) { + this.limiter = new Bottleneck({ + maxConcurrent: this.props.executorcount, + }); + + this.packagesBuilt = []; + this.failedPackages = []; + this.generatedPackages = []; + this.packageCreationPromises = new Array(); + } + + public async exec(): Promise<{ + generatedPackages: SfpPackage[]; + failedPackages: string[]; + }> { + if (this.props.devhubAlias) + this.sfpOrg = await SFPOrg.create({ + aliasOrUsername: this.props.devhubAlias, + }); + + + let git = await Git.initiateRepo(new ConsoleLogger()); + this.repository_url = await git.getRemoteOriginUrl(this.props.repourl); + this.commit_id = await git.getHeadCommit(); + + this.packagesToBeBuilt = this.getPackagesToBeBuilt( + this.props.projectDirectory, + this.props.includeOnlyPackages, + ); + + // Read Manifest + this.projectConfig = ProjectConfig.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, + ); + 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 + SFPLogger.log(COLOR_KEY_MESSAGE("Packages scheduled for build")); + SFPLogger.log(table.toString()); + + //Fix transitive dependency gap + let groupDependencyResolutionLogs = new GroupConsoleLogs( + "Resolving dependencies", + this.logger, + ).begin(); + this.projectConfig = await this.resolvePackageDependencies( + this.projectConfig, + ); + groupDependencyResolutionLogs.end(); + + let buildPackagesLogs = new GroupConsoleLogs( + "Building Packages", + this.logger, + ).begin(); + + for await (const pkg of this.packagesToBeBuilt) { + let type = this.getPriorityandTypeOfAPackage( + this.projectConfig, + pkg, + ).type; + SFPStatsSender.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.getChildsOfAllPackages( + this.props.projectDirectory, + this.packagesToBeBuilt, + ); + + this.parents = DependencyHelper.getParentsOfAllPackages( + this.props.projectDirectory, + this.packagesToBeBuilt, + ); + + this.parentsToBeFulfilled = DependencyHelper.getParentsToBeFullFilled( + this.parents, + this.packagesToBeBuilt, + ); + + let sortedBatch = new BatchingTopoSort().sort(this.childs); + + if (!this.props.isQuickBuild && this.sfpOrg) { + const packageDependencyResolver = new PackageDependencyResolver( + 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: Promise = this.limiter + .schedule({ id: pkg, priority: priority }, () => + this.createPackage(type, pkg, this.props.isBuildAllAsSourcePackages), + ) + .then( + (sfpPackage: SfpPackage) => { + this.generatedPackages.push(sfpPackage); + SFPStatsSender.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: any) => 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, + }; + } + + private createDiffPackageScheduledDisplayedAsATable( + packagesToBeBuilt: Map, + ) { + let tableHead = ["Package", "Reason to be built", "Last Known Tag"]; + if ( + this.isMultiConfigFilesEnabled && + this.props.currentStage == Stage.BUILD + ) { + tableHead.push("Scratch Org Config File"); + } + let table = new Table({ + head: tableHead, + chars: 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.BUILD + ) { + item.push( + this.scratchOrgDefinitions[pkg] + ? this.scratchOrgDefinitions[pkg] + : this.props.configFilePath, + ); + } + + table.push(item); + } + return table; + } + + private createAllPackageScheduledDisplayedAsATable() { + let tableHead = ["Package", "Reason to be built"]; + if ( + this.isMultiConfigFilesEnabled && + this.props.currentStage == Stage.BUILD + ) { + tableHead.push("Scratch Org Config File"); + } + let table = new Table({ + head: tableHead, + chars: 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.BUILD + ) { + item.push( + this.scratchOrgDefinitions[pkg] + ? this.scratchOrgDefinitions[pkg] + : this.props.configFilePath, + ); + } + table.push(item); + } + return table; + } + + private async filterPackagesToBeBuiltByChanged( + projectDirectory: string, + allPackagesInRepo: any, + ) { + let packagesToBeBuilt = new Map(); + let buildCollections = new BuildCollections(projectDirectory); + if (this.props.diffOptions) + this.props.diffOptions.pathToReplacementForceIgnore = + this.getPathToForceIgnoreForCurrentStage( + this.projectConfig, + this.props.currentStage, + ); + + for await (const pkg of allPackagesInRepo) { + let diffImpl: PackageDiffImpl = new PackageDiffImpl( + new ConsoleLogger(), + pkg, + this.props.projectDirectory, + this.props.diffOptions, + ); + let packageDiffCheck = await diffImpl.exec(); + + if (packageDiffCheck.isToBeBuilt) { + packagesToBeBuilt.set(pkg, { + reason: 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; + } + + private getPackagesToBeBuilt( + projectDirectory: string, + includeOnlyPackages?: string[], + ): string[] { + let projectConfig = ProjectConfig.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 + 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 !== PackageType.Data + ); + }); + + for (const pkg of packageDescriptors) { + if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg["package"]); + } + return sfdxpackages; + + function printIncludeOnlyPackages() { + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Build will include the below packages as per inclusive filter`, + ), + LoggerLevel.TRACE, + ); + SFPLogger.log( + COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), + LoggerLevel.TRACE, + ); + } + } + + private printQueueDetails() { + SFPLogger.log( + `${EOL}Packages currently processed:{${this.packagesInQueue.length}} + ${this.packagesInQueue}`, + ); + SFPLogger.log( + `Awaiting Dependencies to be resolved:{${this.packagesToBeBuilt.length}} + ${this.packagesToBeBuilt}`, + ); + } + + private handlePackageError(reason: any, pkg: string): any { + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + SFPLogger.log(COLOR_ERROR(`Package Creation Failed for ${pkg}, Here are the details:`)); + try { + // Append error to log file + fs.appendFileSync(`.sfp/logs/${pkg}`, reason.message, "utf8"); + let data = fs.readFileSync(`.sfp/logs/${pkg}`, "utf8"); + + const pathToMarkDownFile = `.sfp/outputs/build-error-info.md`; + fs.mkdirpSync(".sfp/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); + + + SFPLogger.log(data); + } catch (e) { + SFPLogger.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.logCount("build.failed.packages", { package: pkg }); + this.packagesToBeBuilt = this.packagesToBeBuilt.filter((pkgBuild) => { + if (this.childs[pkg].includes(pkgBuild)) { + SFPStatsSender.logCount("build.failed.packages", { + package: pkgBuild, + }); + this.failedPackages.push(pkgBuild); + return false; + } + return true + }); + SFPLogger.log( + COLOR_KEY_MESSAGE(`${EOL}Removed all childs of ${pkg} from queue`), + ); + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + } + + private queueChildPackages(sfpPackage: SfpPackage): any { + 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: Promise = this.limiter + .schedule({ id: pkg, priority: priority }, () => + this.createPackage( + type, + pkg, + this.props.isBuildAllAsSourcePackages, + ), + ) + .then( + (sfpPackage: SfpPackage) => { + SFPStatsSender.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: any) => this.handlePackageError(reason, pkg), + ); + pushedPackages.push(pkg); + this.packagesInQueue.push(pkg); + this.packageCreationPromises.push(packagePromise); + } + }); + + if (pushedPackages.length > 0) { + SFPLogger.log( + COLOR_KEY_MESSAGE( + `${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, + ); + } + + private resolveDependenciesOnCompletedPackage( + dependentPackage: string, + completedPackage: SfpPackage, + ) { + const pkgDescriptor = ProjectConfig.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); + SFPLogger.log(`New branched package is created for dependency: ${packageName}, update the package version id`, LoggerLevel.INFO); + dependency.package = `${packageName}@${completedPackage.package_version_number}-${branch}`; + this.projectConfig.packageAliases[dependency.package] = completedPackage.package_version_id; + } + } else { + dependency.versionNumber = completedPackage.versionNumber; + } + + } + + private getPriorityandTypeOfAPackage(projectConfig: any, pkg: string) { + let priority = 0; + let childs = DependencyHelper.getChildsOfAllPackages( + this.props.projectDirectory, + this.packagesToBeBuilt, + ); + let type = ProjectConfig.getPackageType(projectConfig, pkg); + if (type === PackageType.Unlocked) { + if (childs[pkg].length > 0) + priority = PRIORITY_UNLOCKED_PKG_WITH_DEPENDENCY; + else priority = PRIORITY_UNLOCKED_PKG_WITHOUT_DEPENDENCY; + } else if (type === PackageType.Source) { + priority = PRIORITY_SOURCE_PKG; + } else if (type === PackageType.Data) { + priority = PRIORITY_DATA_PKG; + } else if (type === PackageType.Diff) { + priority = PRIORITY_SOURCE_PKG; + } else { + throw new Error(`Unknown package type ${type}`); + } + + return { priority, type }; + } + + private printPackageDetails(sfpPackage: SfpPackage) { + SFPLogger.log( + COLOR_HEADER( + `${EOL}${sfpPackage.packageName} package created in ${getFormattedTime( + sfpPackage.creation_details.creation_time, + )}`, + ), + ); + + SFPLogger.log(COLOR_HEADER(`-- Package Details:--`)); + const table = new Table({ + chars: COLON_MIDDLE_BORDER_TABLE, + style: { "padding-left": 2 }, + }); + table.push([ + COLOR_HEADER(`Package Type`), + COLOR_KEY_MESSAGE(sfpPackage.package_type), + ]); + table.push([ + COLOR_HEADER(`Package Version Number`), + COLOR_KEY_MESSAGE(sfpPackage.package_version_number), + ]); + + if (sfpPackage.package_type !== PackageType.Data) { + if (sfpPackage.package_type == PackageType.Unlocked) { + if (sfpPackage.package_version_id) + table.push([ + COLOR_HEADER(`Package Version Id`), + COLOR_KEY_MESSAGE(sfpPackage.package_version_id), + ]); + if (sfpPackage.test_coverage) + table.push([ + COLOR_HEADER(`Package Test Coverage`), + COLOR_KEY_MESSAGE(sfpPackage.test_coverage), + ]); + if (sfpPackage.has_passed_coverage_check) + table.push([ + COLOR_HEADER(`Package Coverage Check Passed`), + COLOR_KEY_MESSAGE(sfpPackage.has_passed_coverage_check), + ]); + } + + table.push([ + COLOR_HEADER(`Metadata Count`), + COLOR_KEY_MESSAGE(sfpPackage.metadataCount), + ]); + table.push([ + COLOR_HEADER(`Apex In Package`), + COLOR_KEY_MESSAGE(sfpPackage.isApexFound ? "Yes" : "No"), + ]); + table.push([ + COLOR_HEADER(`Profiles In Package`), + COLOR_KEY_MESSAGE(sfpPackage.isProfilesFound ? "Yes" : "No"), + ]); + + if (sfpPackage.packageType == PackageType.Diff) { + table.push([ + COLOR_HEADER(`Source Version From`), + COLOR_KEY_MESSAGE(sfpPackage.commitSHAFrom), + ]); + table.push([ + COLOR_HEADER(`Source Version To`), + COLOR_KEY_MESSAGE(sfpPackage.commitSHATo), + ]); + + table.push([ + COLOR_HEADER(`Invalidated Test Classes`), + COLOR_KEY_MESSAGE( + sfpPackage.apexTestClassses?.length, + ), + ]); + } + table.push([ + COLOR_HEADER(`Source Version`), + COLOR_KEY_MESSAGE(sfpPackage.sourceVersion), + ]); + + SFPLogger.log(table.toString()); + + const packageDependencies = this.projectConfig.packageDirectories.find( + (dir) => dir.package === sfpPackage.package_name, + ).dependencies; + if ( + packageDependencies && + Array.isArray(packageDependencies) && + packageDependencies.length > 0 + ) { + SFPLogger.log(COLOR_HEADER(` Resolved package dependencies:`)); + PackageDependencyDisplayer.printPackageDependencies( + packageDependencies, + this.projectConfig, + new ConsoleLogger(), + ); + } + } + } + + private async createPackage( + packageType: string, + sfdx_package: string, + isValidateMode: boolean, + ): Promise { + SFPLogger.log( + 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]; + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Matched scratch org definition file found for ${sfdx_package}: ${configFilePath}`, + ), + ); + } + } + + //Compute revision from and revision to + let revisionFrom: string; + let revisionTo: string; + + //let package itself create revisions + if (packageType == 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; + } + + + + + return SfpPackageBuilder.buildPackageFromProjectDirectory( + new FileLogger(`.sfp/logs/${sfdx_package}`), + this.props.projectDirectory, + sfdx_package, + { + overridePackageTypeWith: this.props.overridePackageTypes ? this.props.overridePackageTypes[sfdx_package] : undefined, + branch: this.props.branch, + sourceVersion: this.commit_id, + repositoryUrl: this.repository_url, + configFilePath: configFilePath, + pathToReplacementForceIgnore: this.getPathToForceIgnoreForCurrentStage( + this.projectConfig, + this.props.currentStage, + ), + revisionFrom: revisionFrom, + revisionTo: revisionTo + }, + { + devHub: this.props.devhubAlias, + 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 + */ + private getPathToForceIgnoreForCurrentStage( + projectConfig: any, + currentStage: Stage, + ): string { + let stageForceIgnorePath: string; + + let ignoreFiles: { [key in Stage]: string } = + 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; + } + + private getMultiScratchOrgDefinitionFileMap( + projectConfig: any, + ): { [key: string]: any }[] { + this.isMultiConfigFilesEnabled = + this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles; + let configFiles: { [key: string]: any }[]; + if (this.isMultiConfigFilesEnabled) { + configFiles = + this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths + ?.packages; + } + return configFiles; + } + + private async resolvePackageDependencies(projectConfig: any) { + let isDependencyResolverEnabled = + !projectConfig?.plugins?.sfp + ?.disableTransitiveDependencyResolver; + + if (isDependencyResolverEnabled) { + const transitiveDependencyResolver = new TransitiveDependencyResolver( + projectConfig, + this.logger, + ); + let resolvedDependencyMap = + await transitiveDependencyResolver.resolveTransitiveDependencies(); + projectConfig = await ProjectConfig.updateProjectConfigWithDependencies( + projectConfig, + resolvedDependencyMap, + ); + projectConfig = await new UserDefinedExternalDependency().cleanupEntries( + projectConfig, + ); + return projectConfig; + } else { + return projectConfig; + } + } + + private extractPackageVersionAndBranch(packageAlias: string): [string, string, string] { + 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 ['', '', '']; + } + +} diff --git a/packages/sfp-cli/src/impl/parallelBuilder/DependencyHelper.ts b/packages/sfp-cli/src/impl/parallelBuilder/DependencyHelper.ts new file mode 100644 index 000000000..9e2164912 --- /dev/null +++ b/packages/sfp-cli/src/impl/parallelBuilder/DependencyHelper.ts @@ -0,0 +1,80 @@ +import ProjectConfig from '../../core/project/ProjectConfig'; +export default class DependencyHelper { + static getParentsToBeFullFilled(packagesWithParents: AdjacentList, packages: string[]): any { + for (let [pkgName, parents] of Object.entries(packagesWithParents)) { + const fulfilledParents = parents.filter((pkg_name) => packages.includes(pkg_name)); + packagesWithParents[pkgName] = fulfilledParents; + } + + return packagesWithParents; + } + + public static getChildsOfAllPackages(projectDirectory: string, filterByPackages?: string[]): AdjacentList { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let dag: AdjacentList = {}; + + for (const sfdx_package of projectConfig['packageDirectories']) { + if (filterByPackages && !filterByPackages.includes(sfdx_package['package'])) { + continue; + } + let dependents: string[] = []; + + for (const pkg of projectConfig['packageDirectories']) { + if (pkg['dependencies'] != null) { + for (const dependent of pkg['dependencies']) { + if ( + dependent['package'] == sfdx_package['package'] && + filterByPackages && + filterByPackages.includes(pkg['package']) + ) { + dependents.push(pkg['package']); + } + } + } + } + dag[sfdx_package['package']] = dependents; + } + return dag; + } + + public static getParentsOfAllPackages(projectDirectory: string, filterByPackages?: string[]): AdjacentList { + let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); + let dag: AdjacentList = {}; + + //Get The packages in the project directory + let packagesInTheProjectDirectoryOnlyByNames: string[] = []; + projectConfig['packageDirectories'].forEach((pkg) => { + packagesInTheProjectDirectoryOnlyByNames.push(pkg['package']); + }); + + for (const sfdx_package of projectConfig['packageDirectories']) { + if (filterByPackages && !filterByPackages.includes(sfdx_package['package'])) { + continue; + } + + let parents: string[] = []; + if (sfdx_package['dependencies'] != null) { + for (const dependent of sfdx_package['dependencies']) { + //See the dependents are a package in the project directory + if ( + packagesInTheProjectDirectoryOnlyByNames.includes(dependent['package']) && + !parents.includes(dependent['package']) && + filterByPackages && + filterByPackages.includes(dependent['package']) + ) + parents.push(dependent['package']); + } + } + dag[sfdx_package['package']] = parents; + } + + return dag; + } + + public static getParentsOfAPackage(packageList: AdjacentList, sfdx_package: string) { + return packageList[sfdx_package]; + } +} +export type AdjacentList = { + [key: string]: string[]; +}; diff --git a/packages/sfp-cli/src/impl/parallelBuilder/UndirectedGraph.ts b/packages/sfp-cli/src/impl/parallelBuilder/UndirectedGraph.ts new file mode 100644 index 000000000..7d3e855fe --- /dev/null +++ b/packages/sfp-cli/src/impl/parallelBuilder/UndirectedGraph.ts @@ -0,0 +1,49 @@ +export default class UndirectedGraph { + private _adjacencyList: { [p: string]: string[] }; + + constructor() { + this._adjacencyList = {}; + } + + get adjacencyList() { + return this._adjacencyList; + } + + addVertex(name: string) { + if (!this._adjacencyList[name]) this._adjacencyList[name] = []; + else throw new Error(`Vertex with name '${name}' already exists`); + } + + addEdge(vertexA: string, vertexB: string): void { + if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex'); + if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`); + if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`); + + if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB); + if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA); + } + + /** + * Returns vertices in graph, using depth-first search from the starting vertex + * @param start + */ + dfs(start: string): string[] { + const vertices: string[] = []; + const visited: { [p: string]: boolean } = {}; + const adjacencyList = this._adjacencyList; + + (function dfsHandler(vertex) { + if (!vertex) return null; + if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`); + visited[vertex] = true; + vertices.push(vertex); + adjacencyList[vertex].forEach((neighbor) => { + if (!visited[neighbor]) { + return dfsHandler(neighbor); + } + }); + })(start); + + return vertices; + } +} diff --git a/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts new file mode 100644 index 000000000..1087c6367 --- /dev/null +++ b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts @@ -0,0 +1,306 @@ +import { Org } from '@salesforce/core'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import isValidSfdxAuthUrl from '../../core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl'; +import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import ArtifactGenerator from '../../core/artifacts/generators/ArtifactGenerator'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import { Result } from 'neverthrow'; +import FetchAnArtifact from '../artifacts/FetchAnArtifact'; +import FetchArtifactSelector from '../artifacts/FetchArtifactSelector'; +import BuildImpl, { BuildProps } from '../parallelBuilder/BuildImpl'; +import PoolCreateImpl from '../../core/scratchorg/pool/PoolCreateImpl'; +import { PoolError } from '../../core/scratchorg/pool/PoolError'; +import { Stage } from '../Stage'; +import PrepareOrgJob from './PrepareOrgJob'; +import * as rimraf from 'rimraf'; +import * as fs from 'fs-extra'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; +import OrgDetailsFetcher from '../../core/org/OrgDetailsFetcher'; +import SFPOrg from '../../core/org/SFPOrg'; +import { EOL } from 'os'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; +import ReleaseDefinitionGenerator from '../release/ReleaseDefinitionGenerator'; +import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; +import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import ReleaseConfig from '../release/ReleaseConfig'; +import { COLOR_KEY_VALUE } from '@flxblio/sfp-logger'; + +const Table = require('cli-table'); + +export default class PrepareImpl { + private artifactFetchedCount: number = 0; + + public constructor(private hubOrg: SFPOrg, private pool: PoolConfig, private logLevel: LoggerLevel) { + // set defaults + if (!this.pool.expiry) this.pool.expiry = 2; + + if (!this.pool.batchSize) this.pool.batchSize = 5; + + if (this.pool.succeedOnDeploymentErrors === undefined) this.pool.succeedOnDeploymentErrors = true; + + if (!this.pool.waitTime) this.pool.waitTime = 6; + + if (!this.pool.maxRetryCount) this.pool.maxRetryCount = 2; + } + + public async exec() { + SFPLogger.log(COLOR_KEY_MESSAGE('Validating Org Authentication Mechanism..'), LoggerLevel.INFO); + let orgDisplayResult = await new OrgDetailsFetcher(this.hubOrg.getUsername()).getOrgDetails(); + + if (!(orgDisplayResult.sfdxAuthUrl && isValidSfdxAuthUrl(orgDisplayResult.sfdxAuthUrl))) + throw new Error( + `Pools have to be created using a DevHub authenticated with auth:web or auth:store or auth:accesstoken:store` + ); + + return this.poolScratchOrgs(); + } + + private async poolScratchOrgs(): Promise> { + //Create Artifact Directory + rimraf.sync('artifacts'); + fs.mkdirpSync('artifacts'); + + let restrictedPackages = null; + let projectConfig = ProjectConfig.getSFDXProjectConfig(null); + + if (this.pool.releaseConfigFile) { + restrictedPackages = await getArtifactsByGeneratingReleaseDefinitionFromConfig(this.pool.releaseConfigFile); + projectConfig = ProjectConfig.cleanupPackagesFromProjectDirectory(null, restrictedPackages); + } + + if (this.pool.installAll) { + await this.getPackageArtifacts(restrictedPackages); + } + + let checkpointPackages = this.getcheckPointPackages(new ConsoleLogger(), projectConfig); + + let externalPackageResolver = new ExternalPackage2DependencyResolver( + this.hubOrg.getConnection(), + projectConfig, + this.pool.keys + ); + let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); + + //Display resolved dependencies + let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, new ConsoleLogger()); + externalDependencyDisplayer.display(); + + let prepareASingleOrgImpl: PrepareOrgJob = new PrepareOrgJob(this.pool, checkpointPackages, externalPackage2s); + + let createPool: PoolCreateImpl = new PoolCreateImpl( + this.hubOrg, + this.pool, + prepareASingleOrgImpl, + this.logLevel + ); + let pool = (await createPool.execute()) as Result; + + if (pool.isOk()) { + await this.displayPoolSummary(pool.value); + } + + return pool; + + async function getArtifactsByGeneratingReleaseDefinitionFromConfig(releaseConfigFile: string) { + let releaseDefinitionGenerator: ReleaseDefinitionGenerator = new ReleaseDefinitionGenerator( + new ConsoleLogger(), + 'HEAD', + releaseConfigFile, + 'prepare', + 'test', + undefined, + true, + false, + true + ); + let releaseDefinition = (await releaseDefinitionGenerator.exec()) as ReleaseDefinitionSchema; + return Object.keys(releaseDefinition.artifacts); + } + } + + //Fetch all checkpoints + private getcheckPointPackages(projectConfig: any, logger: Logger) { + SFPLogger.log('Fetching checkpoints for prepare if any.....', LoggerLevel.INFO, logger); + + let checkPointPackages = []; + + ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig).forEach((pkg) => { + if (pkg.checkpointForPrepare) checkPointPackages.push(pkg['package']); + }); + + return checkPointPackages; + } + + private async displayPoolSummary(pool: PoolConfig) { + let table = new Table({ + head: [ + 'Scratch Org Alias Id', + 'Scratch Org Username', + 'Installed/Requested Count', + 'Last Installed Package', + ], + chars: ZERO_BORDER_TABLE + }); + + for (const scratchOrg of pool.scratchOrgs) { + try { + let scratchOrgAsSFPOrg = await SFPOrg.create({ aliasOrUsername: scratchOrg.username }); + let installedArtifacts = await scratchOrgAsSFPOrg.getInstalledArtifacts(); + if (installedArtifacts && installedArtifacts.length >= 1) { + let installationCount = installedArtifacts.length; + let lastInstalledArifact = installedArtifacts[installedArtifacts.length - 1]; + table.push([ + scratchOrg.alias, + scratchOrg.username, + `${installationCount}/${this.artifactFetchedCount}`, + lastInstalledArifact.Name, + ]); + SFPStatsSender.logGauge(`so.packages.requested`, this.artifactFetchedCount, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + SFPStatsSender.logGauge(`so.packages.installed`, installationCount, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + } else { + table.push([scratchOrg.alias, scratchOrg.username, `NA`, `NA`]); + SFPStatsSender.logGauge(`so.packages.requested`, 0, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + SFPStatsSender.logGauge(`so.packages.installed`, 0, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + } + } catch (error) { + SFPStatsSender.logGauge(`so.packages.requested`, 0, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + SFPStatsSender.logGauge(`so.packages.installed`, 0, { + pool: this.pool.tag, + scratchOrg: scratchOrg.alias, + }); + table.push([scratchOrg.alias, scratchOrg.username, `Unable to compute`, `Unable to fetch`]); + } + } + + if (table.length >= 1) { + SFPLogger.log(EOL, LoggerLevel.INFO); + SFPLogger.log(COLOR_KEY_MESSAGE('Pool Summary:'), LoggerLevel.INFO); + SFPLogger.log(table.toString(), LoggerLevel.INFO); + } + } + + private async getPackageArtifacts(restrictedPackages?: string[]) { + //Filter Packages to be ignored from prepare to be fetched + let packages = ProjectConfig.getAllPackageDirectoriesFromDirectory(null).filter((pkg) => { + return isPkgToBeInstalled(pkg, restrictedPackages); + }); + + let artifactFetcher: FetchAnArtifact; + if (this.pool.fetchArtifacts) { + + let fetchArtifactsLogGroup = new GroupConsoleLogs(`Fetching Artifacts`); + fetchArtifactsLogGroup.begin(); + artifactFetcher = new FetchArtifactSelector( + this.pool.fetchArtifacts.artifactFetchScript, + this.pool.fetchArtifacts.npm?.scope, + this.pool.fetchArtifacts.npm?.npmrcPath + ).getArtifactFetcher(); + + const git: Git = await Git.initiateRepo(); + + //During Prepare, there could be a race condition where a main is merged with a new package + //but the package is not yet available in the validated package list and can cause prepare to fail + for (const pkg of packages) { + try { + let latestGitTagVersion: GitTags = new GitTags(git, pkg.package); + let version = await latestGitTagVersion.getVersionFromLatestTag(); + artifactFetcher.fetchArtifact(pkg.package, 'artifacts', version, true); + this.artifactFetchedCount++; + } catch (error) { + SFPLogger.log( + COLOR_WARNING(`Git Tag for ${pkg.package} missing, This might result in deployment failures`) + ); + } + } + fetchArtifactsLogGroup.end(); + } else { + let buildArtifactsLogGroup = new GroupConsoleLogs(`Building Artifacts`); + buildArtifactsLogGroup.begin(); + //Build All Artifacts + SFPLogger.log(`${EOL}`); + SFPLogger.printHeaderLine('WARNING!!!',COLOR_WARNING,LoggerLevel.INFO); + SFPLogger.log('Building packages, as script to fetch artifacts was not provided',LoggerLevel.WARN); + SFPLogger.log('This is not ideal, as the artifacts are built from the current head of the provided branch',LoggerLevel.WARN); + SFPLogger.log('Pools should be prepared with previously validated packages',LoggerLevel.WARN); + SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO); + + let buildProps: BuildProps = { + configFilePath: this.pool.configFilePath, + devhubAlias: this.hubOrg.getUsername(), + waitTime: 120, + isQuickBuild: true, + isDiffCheckEnabled: false, + buildNumber: 1, + executorcount: 10, + isBuildAllAsSourcePackages: this.pool.disableSourcePackageOverride?false:true, + branch: null, + currentStage: Stage.PREPARE, + }; + + buildProps = includeOnlyPackagesAsPerReleaseConfig(this.pool.releaseConfigFile, buildProps); + + let buildImpl = new BuildImpl(buildProps); + let { generatedPackages, failedPackages } = await buildImpl.exec(); + + if (failedPackages.length > 0) + throw new Error('Unable to build packages, Following packages failed to build' + failedPackages); + + for (let generatedPackage of generatedPackages) { + await ArtifactGenerator.generateArtifact(generatedPackage, process.cwd(), 'artifacts'); + this.artifactFetchedCount++; + } + buildArtifactsLogGroup.end(); + } + + function isPkgToBeInstalled(pkg, restrictedPackages?: string[]): boolean { + let ignoreOnStageFound = pkg.ignoreOnStage?.find((stage) => { + stage = stage.toLowerCase(); + if (stage === 'prepare') return true; + }); + + //if ignored .. skip + if (ignoreOnStageFound) return false; + + if (restrictedPackages) return restrictedPackages.includes(pkg.package); + else return true; + } + + + function includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { + if (releaseConfigFilePath) { + let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); + buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); + printIncludeOnlyPackages(buildProps.includeOnlyPackages); + } + return buildProps; + + + function printIncludeOnlyPackages(includeOnlyPackages: string[]) { + SFPLogger.log( + COLOR_KEY_MESSAGE(`Build will include the below packages as per inclusive filter`), + LoggerLevel.INFO + ); + SFPLogger.log(COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), LoggerLevel.INFO); + } + } + } +} diff --git a/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts b/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts new file mode 100644 index 000000000..eae028d18 --- /dev/null +++ b/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts @@ -0,0 +1,416 @@ +import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../deploy/DeployImpl'; +import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; +import { Stage } from '../Stage'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import ScratchOrg from '../../core/scratchorg/ScratchOrg'; +import { Result, ok, err } from 'neverthrow'; +import PoolJobExecutor, { + JobError, + ScriptExecutionResult, +} from '../../core/scratchorg/pool/PoolJobExecutor'; +import { Connection, Org } from '@salesforce/core'; +import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; +import VlocityPackUpdateSettings from '../../core/vlocitywrapper/VlocityPackUpdateSettings'; +import VlocityInitialInstall from '../../core/vlocitywrapper/VlocityInitialInstall'; +import ScriptExecutor from '../../core/scriptExecutor/ScriptExecutorHelpers'; +import DeploymentSettingsService from '../../core/deployers/DeploymentSettingsService'; +import PackageDetails from '../../core/package/Package2Detail'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; +import SFPOrg from '../../core/org/SFPOrg'; +import { PreDeployHook } from '../deploy/PreDeployHook'; +import SfpPackage from '../../core/package/SfpPackage'; +import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; +import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import { FileLogger } from '@flxblio/sfp-logger'; +const fs = require('fs-extra'); + +const sfp_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; +export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployHook { + public constructor( + protected pool: PoolConfig, + private checkPointPackages: PackageDetails[], + private externalPackage2s?: PackageDetails[] + ) { + super(pool); + } + + async executeJob( + scratchOrg: ScratchOrg, + hubOrg: SFPOrg, + logToFilePath: string, + logLevel: LoggerLevel + ): Promise> { + try { + let scratchOrgAsSfPOrg = await SFPOrg.create({ aliasOrUsername: scratchOrg.username }); + let individualSODeploymentActivityLogger = new FileLogger(logToFilePath); + let packageCollectionInstaller = new InstallUnlockedPackageCollection( + scratchOrgAsSfPOrg, + individualSODeploymentActivityLogger + ); + + //Relax IP ranges on Scractch Org + await this.relaxIPRanges( + scratchOrgAsSfPOrg.getConnection(), + this.pool.relaxAllIPRanges, + this.pool.ipRangesToBeRelaxed, + individualSODeploymentActivityLogger + ); + + //Install sfp package + await this.installsfpArtifactPackage( + scratchOrg, + individualSODeploymentActivityLogger, + packageCollectionInstaller + ); + + //Execute pre installs script + await this.preInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger); + + //Install all external dependencies for non release config type + if (!this.pool.releaseConfigFile) + await this.installAllExternalPackageDependencies( + individualSODeploymentActivityLogger, + scratchOrgAsSfPOrg, + this.externalPackage2s + ); + + //Hook Velocity Deployment + await this.prepareVlocityDataPacks(scratchOrg, individualSODeploymentActivityLogger, logLevel); + + //Deploy All Packages + let deploymentStatus = await this.deployAllPackages( + scratchOrg, + hubOrg, + individualSODeploymentActivityLogger + ); + + //Execute Post Install Script + await this.postInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger, deploymentStatus); + + return ok({ scratchOrgUsername: scratchOrg.username }); + } catch (error) { + return err({ + message: error.message, + scratchOrgUsername: scratchOrg.username, + }); + } + } + + private async deployAllPackages(scratchOrg: ScratchOrg, hubOrg: Org, logger: FileLogger) { + let deploymentSucceed: string; + if (this.pool.installAll) { + let deploymentResult: DeploymentResult; + + let deploymentMode: DeploymentMode; + if (this.pool.enableSourceTracking || this.pool.enableSourceTracking === undefined) { + deploymentMode = DeploymentMode.SOURCEPACKAGES_PUSH; + } else { + deploymentMode = DeploymentMode.SOURCEPACKAGES; + } + + + if(this.pool.disableSourcePackageOverride) + { + deploymentMode = DeploymentMode.NORMAL + } + + deploymentResult = await this.invokeDeployImpl(scratchOrg, hubOrg, logger, deploymentMode); + + SFPStatsSender.logGauge('prepare.packages.scheduled', deploymentResult.scheduled, { + poolName: this.pool.tag, + }); + + SFPStatsSender.logGauge('prepare.packages.succeeded', deploymentResult.deployed.length, { + poolName: this.pool.tag, + }); + + SFPStatsSender.logGauge('prepare.packages.failed', deploymentResult.failed.length, { + poolName: this.pool.tag, + }); + + if (deploymentResult.failed.length > 0 || deploymentResult.error) { + this.pool.succeedOnDeploymentErrors + ? this.handleDeploymentErrorsForPartialDeployment(scratchOrg, deploymentResult, logger) + : this.handleDeploymentErrorsForFullDeployment(scratchOrg, deploymentResult, logger); + deploymentSucceed = 'failed'; + } + deploymentSucceed = 'succeed'; + } + return deploymentSucceed; + } + + private async installsfpArtifactPackage( + scratchOrg: ScratchOrg, + logger: Logger, + packageCollectionInstaller: InstallUnlockedPackageCollection + ) { + SFPLogger.log(`Installing sfp_artifact package to the ${scratchOrg.alias}`, null, logger); + + //Install sfp artifact package + await packageCollectionInstaller.install( + [ + { + name: 'sfp_artifact2', + subscriberPackageVersionId: process.env.sfp_ARTIFACT_PACKAGE + ? process.env.sfp_ARTIFACT_PACKAGE + : sfp_ARTIFACT_PACKAGE, + }, + ], + true + ); + + SFPLogger.log(`Suscessfully Installed sfp_artifact package to the ${scratchOrg.alias}`, null, logger); + } + + private async invokeDeployImpl( + scratchOrg: ScratchOrg, + hubOrg: Org, + logger: FileLogger, + deploymentMode: DeploymentMode + ) { + SFPLogger.log(`Deploying packages to ${scratchOrg.alias}`); + SFPLogger.log(`Deploying packages to ${scratchOrg.alias}`, LoggerLevel.INFO, logger); + + let deployProps: DeployProps = { + targetUsername: scratchOrg.username, + artifactDir: 'artifacts', + waitTime: 120, + currentStage: Stage.PREPARE, + logger: logger, + isTestsToBeTriggered: false, + skipIfPackageInstalled: true, + deploymentMode: deploymentMode, + isRetryOnFailure: this.pool.retryOnFailure, + devhubUserName: hubOrg.getUsername(), + }; + + //Deploy the fetched artifacts to the org + let deployImpl: DeployImpl = new DeployImpl(deployProps); + deployImpl.preDeployHook = this; + let deploymentResult = await deployImpl.exec(); + + return deploymentResult; + } + + //Install external dependencies before installing package + async preDeployPackage( + sfpPackage: SfpPackage, + targetUsername: string, + deployedPackages?:SfpPackage[], + devhubUserName?: string, + logger?: Logger + ): Promise<{ isToFailDeployment: boolean; message?: string }> { + //Install dependencies per package if release config is provided + if (this.pool.releaseConfigFile) { + let sfpOrg = await SFPOrg.create({ aliasOrUsername: targetUsername }); + let hubOrg = await SFPOrg.create({ aliasOrUsername: devhubUserName }); + await this.installExternalPackageDependenciesPerPackage(logger, sfpOrg, hubOrg, this.pool.keys, sfpPackage); + } + return { isToFailDeployment: false }; + } + + private async installAllExternalPackageDependencies( + logger: Logger, + scratchOrgAsSFPOrg: SFPOrg, + externalPackage2s: PackageDetails[] + ) { + SFPLogger.log( + `Installing all external package dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + logger + ); + let packageCollectionInstaller = new InstallUnlockedPackageCollection(scratchOrgAsSFPOrg, logger); + await packageCollectionInstaller.install(externalPackage2s, true, true); + + SFPLogger.log( + `Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + logger + ); + } + + private async installExternalPackageDependenciesPerPackage( + logger: Logger, + scratchOrgAsSFPOrg: SFPOrg, + hubOrg: SFPOrg, + keys: string, + sfpPackage: SfpPackage + ) { + //Resolve external package dependencies + let externalPackageResolver = new ExternalPackage2DependencyResolver( + hubOrg.getConnection(), + ProjectConfig.getSFDXProjectConfig(null), + keys + ); + let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions( + [sfpPackage?.packageName] + ); + + if (sfpPackage) { + SFPLogger.log( + `Installing package dependencies of this ${ + sfpPackage.packageName + } in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + logger + ); + //Display resolved dependenencies + let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, logger); + externalDependencyDisplayer.display(); + } + + let packageCollectionInstaller = new InstallUnlockedPackageCollection(scratchOrgAsSFPOrg, logger); + await packageCollectionInstaller.install(externalPackage2s, true, true); + + if (sfpPackage) { + SFPLogger.log( + `Successfully completed external dependencies of this ${ + sfpPackage.packageName + } in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + logger + ); + } else { + SFPLogger.log( + `Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + logger + ); + } + } + + private handleDeploymentErrorsForFullDeployment( + scratchOrg: ScratchOrg, + deploymentResult: DeploymentResult, + logger: Logger + ) { + //Write to Scratch Org Logs + SFPLogger.log(`Following Packages failed to deploy in ${scratchOrg.alias}`, LoggerLevel.INFO, logger); + SFPLogger.log( + JSON.stringify(deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName)), + LoggerLevel.INFO, + logger + ); + SFPLogger.log( + `Deployment of packages failed in ${scratchOrg.alias}, this scratch org will be deleted`, + LoggerLevel.INFO, + logger + ); + throw new Error( + 'Following Packages failed to deploy:' + + deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) + ); + } + + private handleDeploymentErrorsForPartialDeployment( + scratchOrg: ScratchOrg, + deploymentResult: DeploymentResult, + logger: Logger + ) { + if (this.checkPointPackages.length > 0) { + let isCheckPointSucceded = this.checkPointPackages.some((pkg) => + deploymentResult.deployed.map((packageInfo) => packageInfo.sfpPackage.packageName).includes(pkg.name) + ); + if (!isCheckPointSucceded) { + SFPStatsSender.logCount('prepare.org.checkpointfailed'); + SFPLogger.log( + `One or some of the check point packages failed to deploy, Deleting ${scratchOrg.alias}`, + LoggerLevel.INFO, + logger + ); + throw new Error(`One or some of the check point Packagesfailed to deploy`); + } + } else { + SFPStatsSender.logCount('prepare.org.partial'); + SFPLogger.log( + `Cancelling any further packages to be deployed, Adding the scratchorg ${scratchOrg.alias} to the pool`, + LoggerLevel.INFO, + logger + ); + } + } + + private async relaxIPRanges( + conn: Connection, + isRelaxAllIPRanges: boolean, + relaxIPRanges: string[], + logger: Logger + ): Promise { + if (isRelaxAllIPRanges || relaxIPRanges) { + if (isRelaxAllIPRanges) { + SFPLogger.log( + `Relaxing all IP ranges for scratchOrg with user ${conn.getUsername()}`, + LoggerLevel.INFO + ); + relaxIPRanges = []; + return new DeploymentSettingsService(conn).relaxAllIPRanges(logger); + } else { + SFPLogger.log(`Relaxing IP ranges for scratchOrg with user ${conn.getUsername()}`, LoggerLevel.INFO); + return new DeploymentSettingsService(conn).relaxAllIPRanges(logger, relaxIPRanges); + } + } + } + + //Prepare for vlocity + private async prepareVlocityDataPacks(scratchOrg: ScratchOrg, logger: Logger, logLevel: LoggerLevel) { + if (this.pool.enableVlocity) { + SFPLogger.log(COLOR_KEY_MESSAGE('Installing Vlocity Configurations..'), LoggerLevel.INFO, logger); + let vlocityPackSettingsUpdate: VlocityPackUpdateSettings = new VlocityPackUpdateSettings( + null, + scratchOrg.username, + logger, + logLevel + ); + await vlocityPackSettingsUpdate.exec(false); + + let vlocityInitialInstall: VlocityInitialInstall = new VlocityInitialInstall( + null, + scratchOrg.username, + logger, + logLevel + ); + await vlocityInitialInstall.exec(false); + SFPLogger.log( + COLOR_KEY_MESSAGE('Succesfully completed all vlocity config installation'), + LoggerLevel.INFO, + logger + ); + } + } + + //execute global pre install script + public async preInstallScript(scratchOrg: ScratchOrg, hubOrg: Org, logger: Logger) { + if (fs.existsSync(this.pool.preDependencyInstallationScriptPath)) { + SFPLogger.log( + `Executing pre script for ` + + scratchOrg.alias + + ', script path:' + + this.pool.preDependencyInstallationScriptPath, + LoggerLevel.INFO + ); + await ScriptExecutor.executeScript( + logger, + this.pool.preDependencyInstallationScriptPath, + scratchOrg.username, + hubOrg.getUsername() + ); + } + } + + public async postInstallScript(scratchOrg: ScratchOrg, hubOrg: Org, logger: Logger, deploymentStatus: string) { + if (fs.existsSync(this.pool.postDeploymentScriptPath)) { + SFPLogger.log( + `Executing post script for ` + scratchOrg.alias + ', script path:' + this.pool.postDeploymentScriptPath, + LoggerLevel.INFO + ); + await ScriptExecutor.executeScript( + logger, + this.pool.postDeploymentScriptPath, + scratchOrg.username, + hubOrg.getUsername(), + deploymentStatus + ); + } + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseConfig.ts b/packages/sfp-cli/src/impl/release/ReleaseConfig.ts new file mode 100644 index 000000000..dfa6f13cf --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseConfig.ts @@ -0,0 +1,115 @@ +import * as fs from 'fs-extra'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import Ajv, { _ } from 'ajv'; +import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; +import lodash = require('lodash'); +const yaml = require('js-yaml'); +import { Logger } from '@flxblio/sfp-logger'; +const path = require('path'); + +export default class ReleaseConfig { + private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; + + get releaseDefinitionGeneratorConfigSchema() { + // Return clone of releaseDefinition for immutability + return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); + } + + public constructor(private logger: Logger, pathToReleaseDefinition: string, private isExplicitDependencyCheckEnabled:boolean=false) { + this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); + this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); + + // Easy to handle here than with schema + if ( + this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && + this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts + ) { + throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); + } + // Easy to handle here than with schema + if ( + this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && + this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies + ) { + throw new Error( + 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' + ); + } + + // Workaround for jsonschema not supporting validation based on dependency value + if ( + this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && + !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled + ) + throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); + } + + public getPackagesAsPerReleaseConfig(directory?: string): string[] { + let packages: string[] = []; + let projectConfig = ProjectConfig.getSFDXProjectConfig(directory); + //Read sfdx project json + let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); + for (const sfdxPackage of sfdxPackages) { + if (this.getArtifactPredicate(sfdxPackage)) { + packages.push(sfdxPackage); + } + } + + if(packages.length>0) + { + for (const sfdxPackage of sfdxPackages) { + if (this.getPackageDependencyPredicate(sfdxPackage)) { + packages.push(sfdxPackage); + } + } + } + + + return packages; + } + + private validateReleaseDefinitionGeneratorConfig( + releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema + ): void { + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), + { encoding: 'UTF-8' } + ); + + let validator = new Ajv({ allErrors: true }).compile(schema); + let validationResult = validator(releaseDefinitionGeneratorSchema); + + if (!validationResult) { + let errorMsg: string = + `Release definition generation config does not meet schema requirements, ` + + `found ${validator.errors.length} validation errors:\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } + + private getArtifactPredicate(artifact: string): boolean { + if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { + return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); + } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { + return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); + } else if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { + return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); + } + else return true; + } + + private getPackageDependencyPredicate(artifact: string): boolean { + if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { + return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); + } + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts new file mode 100644 index 000000000..accfb708b --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts @@ -0,0 +1,79 @@ +import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; +import Ajv from 'ajv'; +const yaml = require('js-yaml'); +import lodash = require('lodash'); +import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId'; +import Git from '../../core/git/Git'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +const fs = require('fs-extra'); +const path = require('path'); + +export default class ReleaseDefinition { + get releaseDefinition() { + // Return clone of releaseDefinition for immutability + return lodash.cloneDeep(this._releaseDefinitionSchema); + } + private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) { + this.validateReleaseDefinition(this._releaseDefinitionSchema); + + // Workaround for jsonschema not supporting validation based on dependency value + if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled) + throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); + + if (this._releaseDefinitionSchema.packageDependencies) { + this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies); + } + } + + public static async loadReleaseDefinition(pathToReleaseDefinition: string) { + //Check whether path contains gitRef + let releaseDefinitionSchema: ReleaseDefinitionSchema; + try { + if (pathToReleaseDefinition.includes(':')) { + let git = await Git.initiateRepo(); + await git.fetch(); + let releaseFile = await git.show([pathToReleaseDefinition]); + releaseDefinitionSchema = yaml.load(releaseFile); + } else { + releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8')); + } + } catch (error) { + throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`); + } + + let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema); + return releaseDefinition; + } + + private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) { + for (let pkg in packageDependencies) { + packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]); + } + } + + private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void { + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'), + { encoding: 'UTF-8' } + ); + + let validator = new Ajv({ allErrors: true }).compile(schema); + let validationResult = validator(releaseDefinition); + + if (!validationResult) { + let errorMsg: string = + `Release definition does not meet schema requirements, ` + + `found ${validator.errors.length} validation errors:\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts new file mode 100644 index 000000000..1b283240b --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts @@ -0,0 +1,285 @@ +import { GitError } from 'simple-git'; +import * as fs from 'fs-extra'; +import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import Ajv, { _ } from 'ajv'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger } from '@flxblio/sfp-logger'; +import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; +import lodash = require('lodash'); +import { LoggerLevel } from '@flxblio/sfp-logger'; +import Git from '../../core/git/Git'; +import GitTags from '../../core/git/GitTags'; +const retry = require('async-retry'); +const yaml = require('js-yaml'); +const path = require('path'); + +export default class ReleaseDefinitionGenerator { + private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; + + get releaseDefinitionGeneratorConfigSchema() { + // Return clone of releaseDefinition for immutability + return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); + } + + public constructor( + private logger: Logger, + private gitRef: string, + pathToReleaseDefinition: string, + private releaseName: string, + private branch: string, + private directory?: string, + private noPush: boolean = false, + private forcePush: boolean = false, + private inMemoryMode:boolean = false + ) { + this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); + this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); + + // Easy to handle here than with schema + if ( + this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && + this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts + ) { + throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); + } + // Easy to handle here than with schema + if ( + this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && + this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies + ) { + throw new Error( + 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' + ); + } + + // Workaround for jsonschema not supporting validation based on dependency value + if ( + this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && + !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled + ) + throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); + } + + async exec(): Promise { + return retry( + async (bail, retryNum) => { + try { + return await this.execHandler(); + } catch (err) { + if (err instanceof GitError) { + if (!err.message.includes('failed to push some refs')) { + // Do not retry for Git errors that are not related to push + bail(err); + } else { + SFPLogger.log('Failed to push definition', LoggerLevel.WARN, this.logger); + SFPLogger.log(`Retrying...(${retryNum})`, LoggerLevel.WARN, this.logger); + throw err; + } + } else { + // Do not retry for non-Git errors + bail(err); + } + } + }, + { + retries: 10, + minTimeout: 5, + randomize: true, + } + ); + } + + private async execHandler(): Promise { + let repoDir: string; + let git; + try { + SFPLogger.log(`Processing Artifacts from reference.. ${this.gitRef}`, LoggerLevel.INFO, this.logger); + git = await Git.initiateRepoAtTempLocation(this.logger); + repoDir = git.getRepositoryPath(); + let fetchedArtifacts = await this.fetchFromGitRef(git); + + let releaseDefiniton = await this.generateReleaseDefintion( + fetchedArtifacts.artifacts, + fetchedArtifacts.packageDependencies, + git + ); + return releaseDefiniton; + } catch (error) { + SFPLogger.log(error, LoggerLevel.ERROR, this.logger); + } finally { + git.deleteTempoRepoIfAny(); + } + } + + private async fetchFromGitRef(git: Git) { + let artifacts = {}; + let packageDependencies = {}; + //Create A copy of repository to a particular commit + //If already a duplicate directory switch to the passed git ref + //then switch it back + let headCommit = await git.getCurrentCommitId(); + await git.checkout(this.gitRef, true); + + let projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); + //Read sfdx project json + let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); + for (const sfdxPackage of sfdxPackages) { + let latestGitTagVersion = new GitTags(git, sfdxPackage); + try { + let version = await latestGitTagVersion.getVersionFromLatestTag(); + + if (this.getArtifactPredicate(sfdxPackage)) { + artifacts[sfdxPackage] = version; + } + } catch (error) { + SFPLogger.log( + `Unable to capture version of ${sfdxPackage} due to ${error}`, + LoggerLevel.WARN, + this.logger + ); + } + } + + if (!this.releaseDefinitionGeneratorConfigSchema.excludeAllPackageDependencies) { + let allExternalPackages = ProjectConfig.getAllExternalPackages(projectConfig); + for (const externalPackage of allExternalPackages) { + if ( + this.getDependencyPredicate(externalPackage.alias) && + externalPackage.Package2IdOrSubscriberPackageVersionId.startsWith('04t') + ) { + packageDependencies[externalPackage.alias] = externalPackage.Package2IdOrSubscriberPackageVersionId; + } + } + } + + return { artifacts, packageDependencies }; + } + + private async generateReleaseDefintion(artifacts: any, packageDependencies: any, git: Git): Promise { + artifacts = Object.keys(artifacts) + .sort() + .reduce((obj, key) => { + obj[key] = artifacts[key]; + return obj; + }, {}); + + packageDependencies = Object.keys(packageDependencies) + .sort() + .reduce((obj, key) => { + obj[key] = packageDependencies[key]; + return obj; + }, {}); + + let releaseDefinition: ReleaseDefinitionSchema = { + release: this.releaseName, + skipIfAlreadyInstalled: true, + skipArtifactUpdate:false, + artifacts: artifacts, + }; + + //Add package dependencies + if (Object.keys(packageDependencies).length > 0) releaseDefinition.packageDependencies = packageDependencies; + + //add promotePackagesBeforeDeploymentToOrg + releaseDefinition.promotePackagesBeforeDeploymentToOrg = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.promotePackagesBeforeDeploymentToOrg; + + //override skip if already installed + if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled) + releaseDefinition.skipIfAlreadyInstalled = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled; + + //override skip artifact update + if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate) + releaseDefinition.skipArtifactUpdate = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate; + + //Add changelog info + releaseDefinition.changelog = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.changelog; + + if(this.inMemoryMode) + return releaseDefinition; + + let releaseDefinitonYAML = yaml.dump(releaseDefinition, { + styles: { + '!!null': 'canonical', // dump null as ~ + }, + sortKeys: false, // sort object keys + }); + + SFPLogger.log(COLOR_HEADER(`------------Generated Release Definition for ${this.releaseName}----------------`)); + SFPLogger.log(``); + SFPLogger.log(COLOR_KEY_MESSAGE(releaseDefinitonYAML)); + + let pathToReleaseDefnDirectory = this.createDirectory(this.directory, git.getRepositoryPath()); + fs.writeFileSync(path.join(pathToReleaseDefnDirectory, `${this.releaseName}.yml`), releaseDefinitonYAML); + if (this.branch) { + SFPLogger.log(`Checking out branch ${this.branch}`); + await git.createBranch(this.branch); + await git.commitFile([path.join(pathToReleaseDefnDirectory, `${this.releaseName}.yml`)]); + if (!this.noPush) await git.pushToRemote(this.branch, this.forcePush); + } + + return { releaseDefinitonYAML, pathToReleaseDefnDirectory }; + } + + private createDirectory(directory: string, repoDir: string): string { + if (this.directory) { + if (!fs.pathExistsSync(path.join(repoDir, directory))) { + fs.mkdirpSync(path.join(repoDir, directory)); + } + repoDir = path.join(repoDir, this.directory); + } + return repoDir; + } + + private validateReleaseDefinitionGeneratorConfig( + releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema + ): void { + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), + { encoding: 'UTF-8' } + ); + + let validator = new Ajv({ allErrors: true }).compile(schema); + let validationResult = validator(releaseDefinitionGeneratorSchema); + + if (!validationResult) { + let errorMsg: string = + `Release definition generation config does not meet schema requirements, ` + + `found ${validator.errors.length} validation errors:\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } + + private getArtifactPredicate(artifact: string): boolean { + if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { + return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); + } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { + return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); + } else return true; + } + + private getDependencyPredicate(artifact: string): boolean { + if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies) { + return this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies?.includes(artifact); + } else if (this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies) { + return !this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies?.includes(artifact); + } else return true; + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts new file mode 100644 index 000000000..05d3d8ab9 --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts @@ -0,0 +1,21 @@ +export default interface ReleaseDefinitionGeneratorSchema { + includeOnlyArtifacts?: string[]; + excludeArtifacts?: string[]; + excludeArtifactsWithTag?: string[]; + excludeAllPackageDependencies?:boolean; + excludePackageDependencies?: string[]; + includeOnlyPackageDependencies?: string[]; + releasedefinitionProperties?: { + skipIfAlreadyInstalled: boolean; + skipArtifactUpdate:boolean; + baselineOrg?: string; + promotePackagesBeforeDeploymentToOrg?: string; + changelog?: { + repoUrl?: string; + workItemFilters?: string[]; + workItemUrl?: string; + limit?: number; + showAllArtifacts?: boolean; + }; + }; +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts new file mode 100644 index 000000000..b8f221291 --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts @@ -0,0 +1,21 @@ +export default interface ReleaseDefinitionSchema { + release: string; + skipIfAlreadyInstalled: boolean; + skipArtifactUpdate:boolean; + baselineOrg?: string; + artifacts: { + [p: string]: string; + }; + packageDependencies?: { + [p: string]: string; + }; + promotePackagesBeforeDeploymentToOrg?: string; + changelog?: { + repoUrl?: string; + workItemFilter?:string; + workItemFilters?: string[]; + workItemUrl?: string; + limit?: number; + showAllArtifacts?: boolean; + }; +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts new file mode 100644 index 000000000..50cc5965c --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts @@ -0,0 +1,358 @@ +import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; +import DeployImpl, { DeployProps, DeploymentMode, DeploymentResult } from '../deploy/DeployImpl'; +import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { Stage } from '../Stage'; +import ReleaseError from '../../errors/ReleaseError'; +import ChangelogImpl from '../changelog/ChangelogImpl'; +import SFPStatsSender from '../../core/stats/SFPStatsSender'; +import { Release } from '../changelog/ReleaseChangelog'; +import SFPOrg from '../../core/org/SFPOrg'; +import path = require('path'); +import { EOL } from 'os'; +import Package2Detail from '../../core/package/Package2Detail'; +import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; +import FetchImpl from '../artifacts/FetchImpl'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; + +export interface ReleaseProps { + releaseDefinitions: ReleaseDefinitionSchema[]; + targetOrg: string; + fetchArtifactScript: string; + isNpm: boolean; + scope: string; + npmrcPath: string; + logsGroupSymbol: string[]; + tags: any; + isDryRun: boolean; + waitTime: number; + keys: string; + isGenerateChangelog: boolean; + devhubUserName: string; + branch: string; + directory: string; +} + +export default class ReleaseImpl { + constructor(private props: ReleaseProps, private logger?: Logger) {} + + public async exec(): Promise { + let groupSection = new GroupConsoleLogs('Fetching artifacts').begin(); + let fetchImpl: FetchImpl = new FetchImpl( + 'artifacts', + this.props.fetchArtifactScript, + this.props.scope, + this.props.npmrcPath, + this.logger + ); + await fetchImpl.fetchArtifacts(this.props.releaseDefinitions); + groupSection.end(); + + let installDependenciesResult: InstallDependenciesResult; + installDependenciesResult = await this.installPackageDependencies( + this.props.releaseDefinitions, + this.props.targetOrg, + this.props.keys, + this.props.waitTime + ); + + let deploymentResults = await this.deployArtifacts(this.props.releaseDefinitions); + + //Get all suceeded deploys + let succeededDeploymentResults = []; + let failedDeploymentResults = []; + for (const deploymentResult of deploymentResults) { + if (deploymentResult.result.failed.length === 0) succeededDeploymentResults.push(deploymentResult); + else failedDeploymentResults.push(deploymentResult); + } + + //Compute Changelog + + //There is atleast one succeeded result, so changelog is required + if (succeededDeploymentResults.length > 0) { + //ReleaseName combines all the release together .. even if failed + //Combine all release defns to create release attributes + let releaseName: string = ''; + let workitemFilters = []; + let limit = 30; + let workItemUrl: string; + let showAllArtifacts: boolean = false; + for (const releaseDefinition of this.props.releaseDefinitions) { + releaseName = releaseName.concat(releaseDefinition.release, '-'); + if (releaseDefinition.changelog) { + if(releaseDefinition.changelog.workItemFilters) { + workitemFilters.push(...releaseDefinition.changelog?.workItemFilters); + } + if (releaseDefinition.changelog.limit > limit) limit = releaseDefinition.changelog.limit; + workItemUrl = releaseDefinition.changelog.workItemUrl; + showAllArtifacts = releaseDefinition.changelog.showAllArtifacts; + } + } + //Remove the last '-' from the name + releaseName = releaseName.slice(0, -1); + if (this.props.isGenerateChangelog) { + let groupSection = new GroupConsoleLogs('Release changelog').begin(); + try { + let changelogImpl: ChangelogImpl = new ChangelogImpl( + this.logger, + 'artifacts', + releaseName, + workitemFilters, + limit, + workItemUrl, + showAllArtifacts, + this.props.directory, + false, + this.props.branch, + false, + this.props.isDryRun, + this.props.targetOrg + ); + + let releaseChangelog = await changelogImpl.exec(); + + const aggregatedNumberOfWorkItemsInRelease = this.getAggregatedNumberOfWorkItemsInRelease( + releaseName, + releaseChangelog.releases + ); + + SFPStatsSender.logGauge('release.workitems', aggregatedNumberOfWorkItemsInRelease, { + releaseName: releaseName, + }); + + const aggregatedNumberOfCommitsInRelease = this.getAggregatedNumberOfCommitsInRelease( + releaseName, + releaseChangelog.releases + ); + + SFPStatsSender.logGauge('release.commits', aggregatedNumberOfCommitsInRelease, { + releaseName: releaseName, + }); + } catch (error) { + SFPLogger.log(`Unable to push changelog`, LoggerLevel.WARN, this.logger); + } + + groupSection.end(); + } + } + + if (failedDeploymentResults.length > 0) { + throw new ReleaseError('Release failed', { + succeededDeployments: succeededDeploymentResults, + failedDeployments: failedDeploymentResults, + installDependenciesResult: installDependenciesResult, + }); + } + + return { + succeededDeployments: succeededDeploymentResults, + failedDeployments: failedDeploymentResults, + installDependenciesResult: installDependenciesResult, + }; + } + + /** + * + * @param releases + * @returns aggregated number of work items in a release + */ + private getAggregatedNumberOfWorkItemsInRelease(releaseName: string, releases: Release[]) { + let aggregatedNumberOfWorkItemsInRelease: number = 0; + releases.forEach((release) => { + if (release.names?.includes(releaseName)) { + aggregatedNumberOfWorkItemsInRelease += this.getNumberOfWorkItems(release); + } + }); + return aggregatedNumberOfWorkItemsInRelease; + } + + /** + * + * @param releases + * @returns aggregated number of commits in a release + */ + private getAggregatedNumberOfCommitsInRelease(releaseName: string, releases: Release[]) { + let aggregatedNumberOfCommitsInRelease: number = 0; + releases.forEach((release) => { + if (release.names?.includes(releaseName)) { + aggregatedNumberOfCommitsInRelease += this.getNumberOfCommits(release); + } + }); + return aggregatedNumberOfCommitsInRelease; + } + + private getNumberOfWorkItems(release: Release) { + return Object.keys(release.workItems).length; + } + + private getNumberOfCommits(release: Release) { + let numberOfCommits: number = 0; + + release.artifacts.forEach((artifact) => { + numberOfCommits += artifact.commits.length; + }); + + return numberOfCommits; + } + + private async deployArtifacts( + releaseDefinitions: ReleaseDefinitionSchema[] + ): Promise<{ releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]> { + let deploymentResults: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[] = []; + for (const releaseDefinition of releaseDefinitions) { + let groupSection = new GroupConsoleLogs(`Release ${releaseDefinition.release}`).begin(); + SFPLogger.log(EOL); + + this.displayReleaseInfo(releaseDefinition, this.props); + + //Each release will be downloaded to specific subfolder inside the provided artifact directory + //As each release is a collection of artifacts + let revisedArtifactDirectory = path.join( + 'artifacts', + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + let deployProps: DeployProps = { + targetUsername: this.props.targetOrg, + artifactDir: revisedArtifactDirectory, + waitTime: this.props.waitTime, + tags: this.props.tags, + isTestsToBeTriggered: false, + deploymentMode: DeploymentMode.NORMAL, + skipIfPackageInstalled: releaseDefinition.skipIfAlreadyInstalled, + logsGroupSymbol: this.props.logsGroupSymbol, + currentStage: Stage.DEPLOY, + baselineOrg: releaseDefinition.baselineOrg, + isDryRun: this.props.isDryRun, + disableArtifactCommit: releaseDefinition.skipArtifactUpdate?releaseDefinition.skipArtifactUpdate:false, + promotePackagesBeforeDeploymentToOrg: releaseDefinition.promotePackagesBeforeDeploymentToOrg, + devhubUserName: this.props.devhubUserName, + }; + + let deployImpl: DeployImpl = new DeployImpl(deployProps); + + let deploymentResult = await deployImpl.exec(); + deploymentResults.push({ releaseDefinition: releaseDefinition, result: deploymentResult }); + groupSection.end(); + //Don't continue deployments if a release breaks in between + if (deploymentResult.failed.length > 0) break; + } + + return deploymentResults; + } + + private async installPackageDependencies( + releaseDefinitions: ReleaseDefinitionSchema[], + targetOrg: string, + keys: string, + waitTime: number + ): Promise { + let result: InstallDependenciesResult = { + success: [], + skipped: [], + failed: [], + }; + + let packageDependencies: { [p: string]: string } = {}; + + releaseDefinitions.forEach((releaseDefinition) => { + if (releaseDefinition.packageDependencies) { + packageDependencies = Object.assign(packageDependencies, releaseDefinition.packageDependencies); + } + }); + + let groupSection = new GroupConsoleLogs('Installing package dependencies').begin(); + + try { + let packagesToKeys: { [p: string]: string }; + if (keys) { + packagesToKeys = this.parseKeys(keys); + } + let externalPackage2s: Package2Detail[] = []; + // print packages dependencies to install + for (let pkg in packageDependencies) { + let dependendentPackage: Package2Detail = { name: pkg }; + if (packageDependencies[pkg].startsWith('04t')) + dependendentPackage.subscriberPackageVersionId = packageDependencies[pkg]; + + if (packagesToKeys?.[pkg]) { + dependendentPackage.key = packagesToKeys[pkg]; + } + externalPackage2s.push(dependendentPackage); + } + let sfpOrg = await SFPOrg.create({ aliasOrUsername: targetOrg }); + let packageCollectionInstaller = new InstallUnlockedPackageCollection(sfpOrg, new ConsoleLogger(),this.props.isDryRun); + await packageCollectionInstaller.install(externalPackage2s, true, true); + + groupSection.end(); + return result; + } catch (err) { + console.log(err.message); + + throw new ReleaseError( + 'Failed to install package dependencies', + { installDependenciesResult: result, succeededDeployments: [], failedDeployments: [] }, + err + ); + } + } + + /** + * Parse keys in string format "packageA:key packageB:key packageC:key" + * Returns map of packages to keys + * @param keys + */ + private parseKeys(keys: string) { + let output: { [p: string]: string } = {}; + + keys = keys.trim(); + let listOfKeys = keys.split(' '); + + for (let key of listOfKeys) { + let packageKeyPair = key.split(':'); + if (packageKeyPair.length === 2) { + output[packageKeyPair[0]] = packageKeyPair[1]; + } else { + // Format is incorrect, throw an error + throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); + } + } + + return output; + } + + private displayReleaseInfo(releaseDefinition: ReleaseDefinitionSchema, props: ReleaseProps) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + SFPLogger.log(COLOR_KEY_MESSAGE(`Release: ${releaseDefinition.release}`)); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Skip Packages If Already Installed: ${releaseDefinition.skipIfAlreadyInstalled ? true : false}` + ) + ); + + SFPLogger.log(COLOR_KEY_MESSAGE(`Dry-run: ${props.isDryRun}`)); + + if (releaseDefinition.baselineOrg) + SFPLogger.log(COLOR_KEY_MESSAGE(`Baselined Against Org: ${releaseDefinition.baselineOrg}`)); + + if ( + releaseDefinition.promotePackagesBeforeDeploymentToOrg && + releaseDefinition.promotePackagesBeforeDeploymentToOrg == props.targetOrg + ) + SFPLogger.log(COLOR_KEY_MESSAGE(`Promte Packages Before Deployment Activated?: true`)); + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } +} + +interface InstallDependenciesResult { + success: [string, string][]; + skipped: [string, string][]; + failed: [string, string][]; +} + +export interface ReleaseResult { + succeededDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; + failedDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; + installDependenciesResult: InstallDependenciesResult; +} diff --git a/packages/sfp-cli/src/impl/repo/AlignImpl.ts b/packages/sfp-cli/src/impl/repo/AlignImpl.ts new file mode 100644 index 000000000..d12cf51fa --- /dev/null +++ b/packages/sfp-cli/src/impl/repo/AlignImpl.ts @@ -0,0 +1,20 @@ +import { Logger } from "@flxblio/sfp-logger"; + +export interface AlignRepoProps { + artifactDirectory: string; + workingDirectory?:string +} + +export class AlignImpl { + constructor(private props: AlignRepoProps, private logger?: Logger) { + + } + + async align() + { + //Convert to SFPPacakge + + } + + +} diff --git a/packages/sfp-cli/src/impl/validate/Analyzer.ts b/packages/sfp-cli/src/impl/validate/Analyzer.ts new file mode 100644 index 000000000..09170a45a --- /dev/null +++ b/packages/sfp-cli/src/impl/validate/Analyzer.ts @@ -0,0 +1,22 @@ +import ChangedComponentsFetcher from "../../core/dependency/ChangedComponentsFetcher"; +import Component from "../../core/dependency/Component"; + + +export class Analyzer { + + + + private static changedComponents: Component[]; + + public constructor(protected baseBranch: string) { } + + + /** + * + * @returns array of components that have changed, can be empty + */ + protected async getChangedComponents(): Promise { + if (Analyzer.changedComponents) return Analyzer.changedComponents; + else return new ChangedComponentsFetcher(this.baseBranch).fetch(); + } +} \ No newline at end of file diff --git a/packages/sfp-cli/src/impl/validate/ApexTestValidator.ts b/packages/sfp-cli/src/impl/validate/ApexTestValidator.ts new file mode 100644 index 000000000..1b4e650a6 --- /dev/null +++ b/packages/sfp-cli/src/impl/validate/ApexTestValidator.ts @@ -0,0 +1,203 @@ +import SFPLogger, { COLOR_HEADER, Logger } from "@flxblio/sfp-logger"; +import { CoverageOptions } from "../../core/apex/coverage/IndividualClassCoverage"; +import { TestOptions, RunAllTestsInPackageOptions, RunSpecifiedTestsOption } from "../../core/apextest/TestOptions"; +import TriggerApexTests from "../../core/apextest/TriggerApexTests"; +import SfpPackage, { PackageType } from "../../core/package/SfpPackage"; +import { LoggerLevel } from "@salesforce/core"; +import { ValidationMode } from "./ValidateImpl"; + +export interface ApexTestValidatorOptions +{ + coverageThreshold?:number; + validationMode:ValidationMode; + disableParallelTestExecution?:boolean +} + +export class ApexTestValidator { + + constructor( + private targetUsername: string, + private sfpPackage: SfpPackage, + private props:ApexTestValidatorOptions, + private logger: Logger + ) { } + + + public async validateApexTests( + ): Promise<{ + id: string; + result: boolean; + message: string; + }> { + if (this.sfpPackage.packageDescriptor.skipTesting) + return { id: null, result: true, message: "No Tests To Run" }; + + if (!this.sfpPackage.isApexFound) + return { id: null, result: true, message: "No Tests To Run" }; + + if (this.sfpPackage.packageDescriptor.isOptimizedDeployment == false) + return { + id: null, + result: true, + message: "Tests would have already run", + }; + + let testProps; + + if (this.sfpPackage.packageType == PackageType.Diff) { + testProps = this.getTestOptionsForDiffPackage(this.sfpPackage, this.props); + } else if (this.props.validationMode == ValidationMode.FAST_FEEDBACK || + this.props.validationMode == + ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG) { + testProps = this.getTestOptionsForFastFeedBackPackage( + this.sfpPackage, + this.props); + + } + else + testProps = this.getTestOptionsForFullPackageTest( + this.sfpPackage, + this.props); + + let testOptions: TestOptions = testProps.testOptions; + let testCoverageOptions: CoverageOptions = testProps.testCoverageOptions; + + + if (testProps.testOptions == undefined) { + return { id: null, result: true, message: "No Tests To Run" }; + } + + if (testOptions == undefined) { + return { id: null, result: true, message: "No Tests To Run" }; + } + + //override any behaviour if the override is from the deploy this.props + if (this.props.disableParallelTestExecution) testOptions.synchronous = true; + if (this.sfpPackage.packageType == PackageType.Diff) testOptions.synchronous = true; + this.displayTestHeader(this.sfpPackage); + + const triggerApexTests: TriggerApexTests = new TriggerApexTests( + this.targetUsername, + testOptions, + testCoverageOptions, + null, + this.logger, + ); + + return triggerApexTests.exec(); + } + + private getTestOptionsForFullPackageTest( + sfpPackage: SfpPackage, + props: ApexTestValidatorOptions, + ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { + + + const testOptions = new RunAllTestsInPackageOptions( + this.sfpPackage, + 60, + ".testresults", + ); + const testCoverageOptions = { + isIndividualClassCoverageToBeValidated: false, + isPackageCoverageToBeValidated: + !this.sfpPackage.packageDescriptor.skipCoverageValidation, + coverageThreshold: this.props.coverageThreshold || 75, + }; + return { testOptions, testCoverageOptions }; + } + + private getTestOptionsForDiffPackage( + sfpPackage: SfpPackage, + props: ApexTestValidatorOptions, + ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { + + //No impacted test class available + if (!this.sfpPackage.apexTestClassses || this.sfpPackage.apexTestClassses.length == 0) { + SFPLogger.log( + `${COLOR_HEADER( + "Unable to find any impacted test classses,skipping tests, You might need to use thorough option", + )}`, + ); + return { testOptions: undefined, testCoverageOptions: undefined }; + } + + let isImpactedApexClassAvailable:boolean = true; + //Unable to find impacted apex class in the diff package + if(!this.sfpPackage.apexClassWithOutTestClasses || this.sfpPackage.apexClassWithOutTestClasses.length==0) + { + isImpactedApexClassAvailable = false; + SFPLogger.log( + `${COLOR_HEADER( + "Unable to find any impacted classses in the diff package,skipping tests, Ignoring coverage validation", + )}`); + } + + SFPLogger.log( + `${COLOR_HEADER( + "Diff package detected: triggering impacted test classes", + )}`, + ); + + const testOptions = new RunSpecifiedTestsOption( + 60, + ".testResults", + this.sfpPackage.apexTestClassses.join(), + true, + ); + const testCoverageOptions = { + isIndividualClassCoverageToBeValidated: isImpactedApexClassAvailable?true:false, + isPackageCoverageToBeValidated: false, + coverageThreshold: this.props.coverageThreshold || 75, + classesToBeValidated: this.sfpPackage.apexClassWithOutTestClasses + }; + return { testOptions, testCoverageOptions }; + } + + //TODO: Need to fix test options for earlier behaviour for fast feedback + private getTestOptionsForFastFeedBackPackage( + sfpPackage: SfpPackage, + props: ApexTestValidatorOptions, + ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { + + //No impacted test class available + if (!this.sfpPackage.apexTestClassses || this.sfpPackage.apexTestClassses.length == 0) { + SFPLogger.log( + `${COLOR_HEADER( + "Unable to find any impacted test classses,skipping tests, You might need to use thorough option", + )}`, + ); + return { testOptions: undefined, testCoverageOptions: undefined }; + } + + SFPLogger.log( + `${COLOR_HEADER( + "Diff mode activated, Only impacted test class will be triggered", + )}`, + ); + + const testOptions = new RunSpecifiedTestsOption( + 60, + ".testResults", + this.sfpPackage.apexTestClassses.join(), + true, + ); + const testCoverageOptions = { + isIndividualClassCoverageToBeValidated: false, + isPackageCoverageToBeValidated: false, + coverageThreshold: 0 + }; + return { testOptions, testCoverageOptions }; + } + + + private displayTestHeader(sfpPackage: SfpPackage) { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + `Triggering Apex tests for ${this.sfpPackage.packageName}`, + LoggerLevel.INFO, + ); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + +} \ No newline at end of file diff --git a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts new file mode 100644 index 000000000..ff804e593 --- /dev/null +++ b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts @@ -0,0 +1,744 @@ +import BuildImpl, { BuildProps } from "../parallelBuilder/BuildImpl"; +import DeployImpl, { + DeploymentMode, + DeployProps, + DeploymentResult, +} from "../deploy/DeployImpl"; +import ArtifactGenerator from "../../core/artifacts/generators/ArtifactGenerator"; +import { Stage } from "../Stage"; +import SFPLogger, { + COLOR_KEY_VALUE, + COLOR_TRACE, + ConsoleLogger, + Logger, + LoggerLevel, +} from "@flxblio/sfp-logger"; +import { + PackageInstallationResult, + PackageInstallationStatus, +} from "../../core/package/packageInstallers/PackageInstallationResult"; +import { PackageDiffOptions } from "../../core/package/diff/PackageDiffImpl"; +import PoolFetchImpl from "../../core/scratchorg/pool/PoolFetchImpl"; +import { Org } from "@salesforce/core"; +import InstalledArtifactsDisplayer from "../../core/display/InstalledArtifactsDisplayer"; +import ValidateError from "../../errors/ValidateError"; +import ScratchOrg from "../../core/scratchorg/ScratchOrg"; +import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; +import { COLOR_WARNING } from "@flxblio/sfp-logger"; +import { COLOR_ERROR } from "@flxblio/sfp-logger"; +import { COLOR_HEADER } from "@flxblio/sfp-logger"; +import { COLOR_SUCCESS } from "@flxblio/sfp-logger"; +import { COLOR_TIME } from "@flxblio/sfp-logger"; +import SFPStatsSender from "../../core/stats/SFPStatsSender"; +import ScratchOrgInfoFetcher from "../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher"; +import ScratchOrgInfoAssigner from "../../core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner"; +import ValidateResult from "./ValidateResult"; +import PoolOrgDeleteImpl from "../../core/scratchorg/pool/PoolOrgDeleteImpl"; +import SFPOrg from "../../core/org/SFPOrg"; +import SfpPackage, { + PackageType, +} from "../../core/package/SfpPackage"; + +import getFormattedTime from "../../core/utils/GetFormattedTime"; +import { PostDeployHook } from "../deploy/PostDeployHook"; +import * as rimraf from "rimraf"; +import ProjectConfig from "../../core/project/ProjectConfig"; +import InstallUnlockedPackageCollection from "../../core/package/packageInstallers/InstallUnlockedPackageCollection"; +import ExternalPackage2DependencyResolver from "../../core/package/dependencies/ExternalPackage2DependencyResolver"; +import ExternalDependencyDisplayer from "../../core/display/ExternalDependencyDisplayer"; +import { PreDeployHook } from "../deploy/PreDeployHook"; +import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; +import ReleaseConfig from "../release/ReleaseConfig"; +import { mapInstalledArtifactstoPkgAndCommits } from "../../utils/FetchArtifactsFromOrg"; +import { ApexTestValidator } from "./ApexTestValidator"; +import OrgInfoDisplayer from "../../ui/OrgInfoDisplayer"; +import FileOutputHandler from "../../outputs/FileOutputHandler"; + + +export enum ValidateAgainst { + PROVIDED_ORG = "PROVIDED_ORG", + PRECREATED_POOL = "PRECREATED_POOL", +} +export enum ValidationMode { + INDIVIDUAL = "individual", + FAST_FEEDBACK = "fastfeedback", + THOROUGH = "thorough", + FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG = "ff-release-config", + THOROUGH_LIMITED_BY_RELEASE_CONFIG = "thorough-release-config", +} + +export interface ValidateProps { + installExternalDependencies?: boolean; + validateAgainst: ValidateAgainst; + validationMode: ValidationMode; + releaseConfigPath?: string; + coverageThreshold: number; + logsGroupSymbol: string[]; + targetOrg?: string; + hubOrg?: Org; + pools?: string[]; + shapeFile?: string; + isDeleteScratchOrg?: boolean; + keys?: string; + baseBranch?: string; + diffcheck?: boolean; + disableArtifactCommit?: boolean; + orgInfo?: boolean; + disableSourcePackageOverride?: boolean; + disableParallelTestExecution?: boolean; +} + +export default class ValidateImpl implements PostDeployHook, PreDeployHook { + + private logger = new ConsoleLogger(); + private orgAsSFPOrg: SFPOrg; + + constructor(private props: ValidateProps) { } + + public async exec(): Promise { + rimraf.sync("artifacts"); + + let deploymentResult: DeploymentResult; + let scratchOrgUsername: string; + try { + + if (this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG) { + scratchOrgUsername = this.props.targetOrg; + } else if ( + this.props.validateAgainst === ValidateAgainst.PRECREATED_POOL + ) { + if (process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG) + scratchOrgUsername = + process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG; + else + scratchOrgUsername = await this.fetchScratchOrgFromPool( + this.props.pools, + this.props.orgInfo, + ); + } else throw new Error(`Unknown mode ${this.props.validateAgainst}`); + + //Create Org + this.orgAsSFPOrg = await SFPOrg.create({ + aliasOrUsername: scratchOrgUsername, + }); + + + //Print Org Info for validateAgainstOrg modes + //TODO: Not ideal need to unify sfpOrg and scratchOrg and then make this a global method + if (this.props.orgInfo && this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG){ + OrgInfoDisplayer.printOrgInfo(this.orgAsSFPOrg); + OrgInfoDisplayer.writeOrgInfoToMarkDown(this.orgAsSFPOrg); + } + + + //Fetch Artifacts in the org + let packagesInstalledInOrgMappedToCommits: { [p: string]: string }; + + if (this.props.validationMode !== ValidationMode.INDIVIDUAL) { + let installedArtifacts = await this.orgAsSFPOrg.getInstalledArtifacts(); + if (installedArtifacts.length == 0) { + SFPLogger.log( + COLOR_ERROR("Failed to query org for sfp Artifacts"), + ); + } + packagesInstalledInOrgMappedToCommits = + await mapInstalledArtifactstoPkgAndCommits(installedArtifacts); + this.printArtifactVersions(this.orgAsSFPOrg, installedArtifacts); + } + //In individual mode, always build changed packages only especially for validateAgainstOrg + if (this.props.validationMode == ValidationMode.INDIVIDUAL) + this.props.diffcheck = true; + + let builtSfpPackages = await this.buildChangedSourcePackages( + packagesInstalledInOrgMappedToCommits, + ); + deploymentResult = await this.deploySourcePackages(scratchOrgUsername); + + if (deploymentResult.failed.length > 0 || deploymentResult.error) + throw new ValidateError("Validation failed", { deploymentResult }); + + return { + deploymentResult + } + } catch (error) { + if ( + error.message?.includes( + `No changes detected in the packages to be built`, + ) + ) { + SFPLogger.log( + `WARNING: No changes detected in any of the packages, Validation is treated as a success`, + LoggerLevel.WARN, + ); + return; + } else if (error instanceof ValidateError) + SFPLogger.log(`Validation failed due to : ${error}`, LoggerLevel.DEBUG); + else SFPLogger.log(`Failure Reason: ${error}`, LoggerLevel.ERROR); + throw error; + } finally { + await this.handleScratchOrgStatus( + scratchOrgUsername, + deploymentResult, + this.props.isDeleteScratchOrg, + ); + } + } + + private async printArtifactVersions( + orgAsSFPOrg: SFPOrg, + installedArtifacts: any, + ) { + let groupSection = new GroupConsoleLogs( + `Artifacts installed in the Org ${orgAsSFPOrg.getUsername()}`, + ).begin(); + + InstalledArtifactsDisplayer.printInstalledArtifacts( + installedArtifacts, + null, + ); + + groupSection.end(); + } + + + private async installPackageDependencies( + sfdxProjectConfig: any, + scratchOrgAsSFPOrg: SFPOrg, + sfpPackage: SfpPackage, + deployedPackages?: SfpPackage[], + ) { + let deployedPackagesAsStringArray: Array = []; + for (const deployedPackage of deployedPackages) { + deployedPackagesAsStringArray.push(deployedPackage.package_name); + } + + //Resolve external package dependencies + let externalPackageResolver = new ExternalPackage2DependencyResolver( + this.props.hubOrg.getConnection(), + sfdxProjectConfig, + this.props.keys, + ); + let externalPackage2s = + await externalPackageResolver.resolveExternalPackage2DependenciesToVersions( + [sfpPackage.packageName], + deployedPackagesAsStringArray, + ); + + SFPLogger.log( + `Installing package dependencies of this ${sfpPackage.packageName + } in ${scratchOrgAsSFPOrg.getUsername()}`, + LoggerLevel.INFO, + new ConsoleLogger(), + ); + //Display resolved dependenencies + let externalDependencyDisplayer = new ExternalDependencyDisplayer( + externalPackage2s, + new ConsoleLogger(), + ); + externalDependencyDisplayer.display(); + + let packageCollectionInstaller = new InstallUnlockedPackageCollection( + scratchOrgAsSFPOrg, + new ConsoleLogger(), + ); + await packageCollectionInstaller.install(externalPackage2s, true, true); + + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Successfully completed external dependencies of this ${sfpPackage.packageName + } in ${scratchOrgAsSFPOrg.getUsername()}`, + ), + ); + } + + private async handleScratchOrgStatus( + scratchOrgUsername: string, + deploymentResult: DeploymentResult, + isToDelete: boolean, + ) { + //No scratch org available.. just return + if (scratchOrgUsername == undefined) return; + + if (isToDelete) { + //If deploymentResult is not available, or there is 0 packages deployed, we can reuse the org + if (!deploymentResult || deploymentResult.deployed.length == 0) { + SFPLogger.log( + `Attempting to return scratch org ${scratchOrgUsername} back to pool`, + LoggerLevel.INFO, + ); + const scratchOrgInfoAssigner = new ScratchOrgInfoAssigner( + this.props.hubOrg, + ); + try { + const result = await scratchOrgInfoAssigner.setScratchOrgStatus( + scratchOrgUsername, + "Return", + ); + if (result) + SFPLogger.log( + `Succesfully returned ${scratchOrgUsername} back to pool`, + LoggerLevel.INFO, + ); + else + SFPLogger.log( + COLOR_WARNING( + `Unable to return scratch org to pool, Please check permissions or update sfpower-pool-package to latest`, + ), + ); + } catch (error) { + SFPLogger.log( + COLOR_WARNING( + `Unable to return scratch org to pool, Please check permissions or update sfpower-pool-package to latest`, + ), + ); + } + } else { + try { + if (scratchOrgUsername && this.props.hubOrg.getUsername()) { + await deleteScratchOrg(this.props.hubOrg, scratchOrgUsername); + } + } catch (error) { + SFPLogger.log(COLOR_WARNING(error.message)); + } + } + } + async function deleteScratchOrg(hubOrg: Org, scratchOrgUsername: string) { + SFPLogger.log( + `Deleting scratch org ${scratchOrgUsername}`, + LoggerLevel.INFO, + ); + const poolOrgDeleteImpl = new PoolOrgDeleteImpl( + hubOrg, + scratchOrgUsername, + ); + await poolOrgDeleteImpl.execute(); + } + } + + private async deploySourcePackages( + scratchOrgUsername: string, + ): Promise { + const deployStartTime: number = Date.now(); + + const deployProps: DeployProps = { + targetUsername: scratchOrgUsername, + artifactDir: "artifacts", + waitTime: 120, + deploymentMode: + this.props.disableSourcePackageOverride == true + ? DeploymentMode.NORMAL + : DeploymentMode.SOURCEPACKAGES, + isTestsToBeTriggered: true, + skipIfPackageInstalled: false, + logsGroupSymbol: this.props.logsGroupSymbol, + currentStage: Stage.VALIDATE, + disableArtifactCommit: this.props.disableArtifactCommit, + selectiveComponentDeployment: + this.props.validationMode == ValidationMode.FAST_FEEDBACK || this.props.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG + + }; + + + + + const deployImpl: DeployImpl = new DeployImpl(deployProps); + deployImpl.postDeployHook = this; + deployImpl.preDeployHook = this; + + const deploymentResult = await deployImpl.exec(); + + const deploymentElapsedTime: number = Date.now() - deployStartTime; + printDeploySummary(deploymentResult, deploymentElapsedTime); + + return deploymentResult; + + function printDeploySummary( + deploymentResult: DeploymentResult, + totalElapsedTime: number, + ): void { + let groupSection = new GroupConsoleLogs(`Deployment Summary`).begin(); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `${deploymentResult.deployed.length + } packages deployed in ${COLOR_TIME( + getFormattedTime(totalElapsedTime), + )} with {${COLOR_ERROR( + deploymentResult.failed.length, + )}} failed deployments`, + ), + ); + + if (deploymentResult.failed.length > 0) { + SFPLogger.log( + COLOR_ERROR( + `\nPackages Failed to Deploy`, + deploymentResult.failed.map( + (packageInfo) => packageInfo.sfpPackage.packageName, + ), + ), + ); + + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`### 💣 Deployment Failed 💣`); + let firstPackageFailedToValdiate = deploymentResult.failed[0]; + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package validation failed for **${firstPackageFailedToValdiate.sfpPackage.packageName}** due to`); + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,""); + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,deploymentResult.error); + + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package that are not validated:`); + deploymentResult.failed.map( + (packageInfo, index) => { + if (index!=0) + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`**${packageInfo.sfpPackage.packageName}**`); + } + ); + } + + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + groupSection.end(); + } + } + + private async buildChangedSourcePackages(packagesInstalledInOrgMappedToCommits: { + [p: string]: string; + }): Promise { + let groupSection = new GroupConsoleLogs("Building Packages").begin(); + + const buildStartTime: number = Date.now(); + + + + + const buildProps: BuildProps = { + buildNumber: 1, + executorcount: 10, + waitTime: 120, + isDiffCheckEnabled: this.props.diffcheck, + isQuickBuild: true, + isBuildAllAsSourcePackages: !this.props.disableSourcePackageOverride, + currentStage: Stage.VALIDATE, + baseBranch: this.props.baseBranch, + devhubAlias: this.props.hubOrg?.getUsername() + }; + + //Build DiffOptions + const diffOptions: PackageDiffOptions = buildDiffOption(this.props); + buildProps.diffOptions = diffOptions; + + + //compute pkg overides + buildProps.overridePackageTypes = computePackageOverrides(this.props) + + + //Compute packages to be included + buildProps.includeOnlyPackages = fetchPackagesAsPerReleaseConfig( + this.logger, + this.props, + ); + if (buildProps.includeOnlyPackages) { + printIncludeOnlyPackages(buildProps.includeOnlyPackages); + } + + const buildImpl: BuildImpl = new BuildImpl(buildProps); + const { generatedPackages, failedPackages } = await buildImpl.exec(); + + if (failedPackages.length > 0) + throw new Error(`Failed to create packages ${failedPackages}`); + + if (generatedPackages.length === 0) { + throw new Error( + `No changes detected in the packages to be built\nvalidate will only execute if there is a change in atleast one of the packages`, + ); + } + + for (const generatedPackage of generatedPackages) { + try { + await ArtifactGenerator.generateArtifact( + generatedPackage, + process.cwd(), + "artifacts", + ); + } catch (error) { + SFPLogger.log( + COLOR_ERROR( + `Unable to create artifact for ${generatedPackage.packageName}`, + ), + ); + throw error; + } + } + const buildElapsedTime: number = Date.now() - buildStartTime; + + printBuildSummary(generatedPackages, failedPackages, buildElapsedTime); + + groupSection.end(); + + return generatedPackages; + + + function computePackageOverrides(props: ValidateProps): { [key: string]: PackageType } { + let overridedPackages: { [key: string]: PackageType } = {}; + const allPackages = ProjectConfig.getAllPackages(null); + const projectConfig = ProjectConfig.getSFDXProjectConfig(null); + for (const pkg of allPackages) { + + if (ProjectConfig.getPackageType(projectConfig, pkg) !== PackageType.Data) { + if ( + props.validationMode === + ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + props.validationMode === + ValidationMode.FAST_FEEDBACK + ) { + overridedPackages[pkg] = PackageType.Diff + } + else { + if (!props.disableSourcePackageOverride) { + if (ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Data || ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Diff) + overridedPackages[pkg] = PackageType.Source + } + } + } + } + return overridedPackages; + } + + function fetchPackagesAsPerReleaseConfig( + logger: Logger, + props: ValidateProps, + ) { + if ( + props.validationMode === + ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + props.validationMode === + ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG + ) { + let releaseConfig: ReleaseConfig = new ReleaseConfig( + logger, + props.releaseConfigPath, + true + ); + return releaseConfig.getPackagesAsPerReleaseConfig(); + } + } + + //generate diff Option + function buildDiffOption(props: ValidateProps) { + const diffOptions: PackageDiffOptions = new PackageDiffOptions(); + //In fast feedback ignore package descriptor changes + if ( + props.validationMode === ValidationMode.FAST_FEEDBACK + ) { + diffOptions.skipPackageDescriptorChange = true; + diffOptions.useLatestGitTags = false; + diffOptions.packagesMappedToLastKnownCommitId = + packagesInstalledInOrgMappedToCommits; + } + else if (props.validationMode === ValidationMode.THOROUGH) { + diffOptions.skipPackageDescriptorChange = false; + diffOptions.useLatestGitTags = false; + diffOptions.packagesMappedToLastKnownCommitId = + packagesInstalledInOrgMappedToCommits; + } else if (props.validationMode === ValidationMode.INDIVIDUAL) { + diffOptions.skipPackageDescriptorChange = false; + //Dont send whats installed in orgs, use only the changed package from last know git tags + diffOptions.useLatestGitTags = true; + diffOptions.packagesMappedToLastKnownCommitId = null; + } else if ( + props.validationMode === + ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG + ) { + diffOptions.skipPackageDescriptorChange = false; + diffOptions.useLatestGitTags = false; + diffOptions.packagesMappedToLastKnownCommitId = + packagesInstalledInOrgMappedToCommits; + } else if ( + props.validationMode === + ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG + ) { + diffOptions.skipPackageDescriptorChange = true; + diffOptions.useLatestGitTags = false; + diffOptions.packagesMappedToLastKnownCommitId = + packagesInstalledInOrgMappedToCommits; + } + return diffOptions; + } + + function printBuildSummary( + generatedPackages: SfpPackage[], + failedPackages: string[], + totalElapsedTime: number, + ): void { + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log( + COLOR_SUCCESS( + `${generatedPackages.length} packages created in ${COLOR_TIME( + getFormattedTime(totalElapsedTime), + )} with {${COLOR_ERROR(failedPackages.length)}} errors`, + ), + ); + + if (failedPackages.length > 0) { + SFPLogger.log(COLOR_ERROR(`Packages Failed To Build`, failedPackages)); + } + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + } + + function printIncludeOnlyPackages(includeOnlyPackages: string[]) { + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Build will include the below packages as per inclusive filter`, + ), + LoggerLevel.INFO, + ); + SFPLogger.log( + COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), + LoggerLevel.INFO, + ); + } + } + + private async fetchScratchOrgFromPool( + pools: string[], + displayOrgInfo?: boolean, + ): Promise { + let scratchOrgUsername: string; + + for (const pool of pools) { + let scratchOrg: ScratchOrg; + try { + const poolFetchImpl = new PoolFetchImpl( + this.props.hubOrg, + pool.trim(), + false, + true, + ); + scratchOrg = (await poolFetchImpl.execute()) as ScratchOrg; + } catch (error) { + SFPLogger.log(error.message, LoggerLevel.TRACE); + } + if (scratchOrg && scratchOrg.status === "Assigned") { + scratchOrgUsername = scratchOrg.username; + SFPLogger.log( + COLOR_KEY_MESSAGE( + `Fetched scratch org ${scratchOrgUsername} from ${COLOR_KEY_VALUE( + pool, + )}`, + ), + LoggerLevel.INFO, + this.logger, + ); + + if (displayOrgInfo) { + OrgInfoDisplayer.printScratchOrgInfo(scratchOrg); + OrgInfoDisplayer.writeScratchOrgInfoToMarkDown(scratchOrg); + } + + this.getCurrentRemainingNumberOfOrgsInPoolAndReport(scratchOrg.tag); + break; + } + } + + if (scratchOrgUsername) return scratchOrgUsername; + else + throw new Error( + `Failed to fetch scratch org from ${pools}, Are you sure you created this pool using a DevHub authenticated using auth:sfdxurl or auth:web or auth:accesstoken:store`, + ); + + + } + + private async getCurrentRemainingNumberOfOrgsInPoolAndReport(tag: string) { + try { + const results = await new ScratchOrgInfoFetcher( + this.props.hubOrg, + ).getScratchOrgsByTag(tag, false, true); + + const availableSo = results.records.filter( + (soInfo) => soInfo.Allocation_status__c === "Available", + ); + + SFPStatsSender.logGauge("pool.available", availableSo.length, { + poolName: tag, + }); + } catch (error) { + //do nothing, we are not reporting anything if anything goes wrong here + } + } + + async preDeployPackage( + sfpPackage: SfpPackage, + targetUsername: string, + deployedPackages?: SfpPackage[], + devhubUserName?: string, +): Promise<{ isToFailDeployment: boolean; message?: string }> { + + const shouldInstallDependencies = (mode: ValidationMode) => { + if (this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG && + !this.props.installExternalDependencies) { + return false; + } + + const isThoroughValidation = mode === ValidationMode.THOROUGH || + mode === ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG; + + const isFastFeedbackWithExternalDependencies = + (mode === ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + mode === ValidationMode.FAST_FEEDBACK) && + this.props.installExternalDependencies; + + return isThoroughValidation || + mode === ValidationMode.INDIVIDUAL || + isFastFeedbackWithExternalDependencies; + }; + + if (shouldInstallDependencies(this.props.validationMode)) { + const projectConfig = this.props.validationMode === ValidationMode.INDIVIDUAL ? + ProjectConfig.cleanupMPDFromProjectDirectory(null, sfpPackage.package_name) : + ProjectConfig.getSFDXProjectConfig(null); + + await this.installPackageDependencies( + projectConfig, + this.orgAsSFPOrg, + sfpPackage, + deployedPackages, + ); + } + + return { isToFailDeployment: false }; +} + + + async postDeployPackage( + sfpPackage: SfpPackage, + packageInstallationResult: PackageInstallationResult, + targetUsername: string, + deployedPackages?: SfpPackage[], + devhubUserName?: string, + ): Promise<{ isToFailDeployment: boolean; message?: string }> { + //Trigger Tests after installation of each package + if (sfpPackage.packageType && sfpPackage.packageType != PackageType.Data) { + if ( + packageInstallationResult.result === PackageInstallationStatus.Succeeded + ) { + //Get Changed Components + const apextestValidator = new ApexTestValidator(targetUsername, sfpPackage, this.props, this.logger); + const testResult = await apextestValidator.validateApexTests(); + + if (!testResult.result) { + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`### 💣 Validation Failed 💣`); + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package validation failed for **${sfpPackage.packageName}**`); + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Reasons:`); + FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`${testResult.message}`); + } + + return { + isToFailDeployment: !testResult.result, + message: testResult.message, + }; + } + } + return { isToFailDeployment: false }; + } + + +} diff --git a/packages/sfp-cli/src/impl/validate/ValidateResult.ts b/packages/sfp-cli/src/impl/validate/ValidateResult.ts new file mode 100644 index 000000000..a8c360812 --- /dev/null +++ b/packages/sfp-cli/src/impl/validate/ValidateResult.ts @@ -0,0 +1,8 @@ +import { DeploymentResult, PackageInfo } from '../deploy/DeployImpl'; +import DependencyViolation from '../../core/dependency/DependencyViolation'; + +export default interface ValidateResult { + deploymentResult?: DeploymentResult; + dependencyViolations?: DependencyViolation[]; + testFailures?: PackageInfo[]; +} diff --git a/packages/sfp-cli/src/index.ts b/packages/sfp-cli/src/index.ts new file mode 100644 index 000000000..ff8b4c563 --- /dev/null +++ b/packages/sfp-cli/src/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/packages/sfp-cli/src/outputs/FileOutputHandler.ts b/packages/sfp-cli/src/outputs/FileOutputHandler.ts new file mode 100644 index 000000000..1d473cf3d --- /dev/null +++ b/packages/sfp-cli/src/outputs/FileOutputHandler.ts @@ -0,0 +1,35 @@ +import * as fs from 'fs-extra'; +import { EOL } from 'os'; +import path from 'path'; + +export default class FileOutputHandler { + static instance: FileOutputHandler; + + public static getInstance() { + if (!FileOutputHandler.instance) + FileOutputHandler.instance = new FileOutputHandler('.sfp/outputs'); + + return FileOutputHandler.instance; + } + + + private constructor(private containerFolder: string) { + fs.mkdirpSync(this.containerFolder); + } + + public writeOutput(fileName: string, output: string ) { + if (!fs.existsSync(path.join(this.containerFolder, fileName))) { + fs.createFileSync(path.join(this.containerFolder, fileName)); + } + fs.writeFileSync(path.join(this.containerFolder, fileName), output); + }; + + public appendOutput(fileName: string,output: string) { + if (!fs.existsSync(path.join(this.containerFolder, fileName))) { + fs.createFileSync(path.join(this.containerFolder, fileName)); + } + fs.appendFileSync(path.join(this.containerFolder, fileName), EOL); + fs.appendFileSync(path.join(this.containerFolder, fileName), output); + } + +} \ No newline at end of file diff --git a/packages/sfp-cli/src/ui/GroupConsoleLogs.ts b/packages/sfp-cli/src/ui/GroupConsoleLogs.ts new file mode 100644 index 000000000..42f284f3c --- /dev/null +++ b/packages/sfp-cli/src/ui/GroupConsoleLogs.ts @@ -0,0 +1,58 @@ +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; +import { EOL } from 'os'; + +//TODO: Move to sfpconsole package +export default class GroupConsoleLogs { + private static logGroupSymbols?: string[]; + + constructor(private section: string,private logger?:Logger) {} + + public static setLogGroupsSymbol(logGroupSymbols: string[]) { + GroupConsoleLogs.logGroupSymbols = logGroupSymbols; + } + + public begin():GroupConsoleLogs { + let sectionStart = this.getSectionStart(); + if (sectionStart && sectionStart.length > 0) SFPLogger.log(sectionStart, LoggerLevel.INFO,this.logger); + return this; + } + + public end():GroupConsoleLogs { + let sectionEnd = this.getSectionEnd(); + if (sectionEnd && sectionEnd.length > 0) SFPLogger.log(sectionEnd, LoggerLevel.INFO,this.logger); + return this; + } + + private getSectionStart() { + if (process.env.BUILDKITE_BUILD_NUMBER) { + return `--- ${this.section}`; + } else if (process.env.GITHUB_ACTION) { + return `::group::${this.section}`; + } else if (process.env.GITLAB_CI) { + return `\e[0Ksection_start:${Date.now()}:${this.section}\r\e[0K${this.section}`; + } else if (process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) { + return `##[group]${this.section}`; + } else if (GroupConsoleLogs.logGroupSymbols && GroupConsoleLogs.logGroupSymbols[0]) { + return `${GroupConsoleLogs.logGroupSymbols[0]} ${this.section}`; + } else { + return `${EOL}${COLOR_KEY_MESSAGE(this.section)}${EOL}`; + } + } + + private getSectionEnd() { + if (process.env.BUILDKITE_BUILD_NUMBER) { + return undefined; + } else if (process.env.GITHUB_ACTION) { + return `::endgroup::`; + } else if (process.env.GITLAB_CI) { + return `\e[0Ksection_end:${Date.now()}:${this.section}\r\e[0K`; + } else if (process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) { + return `##[endgroup]`; + } else if (GroupConsoleLogs.logGroupSymbols && GroupConsoleLogs.logGroupSymbols[1]) { + return `${GroupConsoleLogs.logGroupSymbols[1]}`; + } else { + return `${EOL}`; + } + } +} diff --git a/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts b/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts new file mode 100644 index 000000000..f3ef01d3e --- /dev/null +++ b/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts @@ -0,0 +1,156 @@ +import SFPLogger, { COLOR_HEADER, COLOR_KEY_VALUE, COLOR_KEY_MESSAGE, COLOR_TRACE } from "@flxblio/sfp-logger"; +import SFPOrg from "../core/org/SFPOrg"; +const Table = require("cli-table"); +import { LoggerLevel } from "@salesforce/core"; +import GroupConsoleLogs from "./GroupConsoleLogs"; +import { COLON_MIDDLE_BORDER_TABLE } from "./TableConstants"; +import ScratchOrg from "../core/scratchorg/ScratchOrg"; +import { Align, getMarkdownTable } from "markdown-table-ts"; +import fs from "fs-extra"; +import FileOutputHandler from "../outputs/FileOutputHandler"; + +export default class OrgInfoDisplayer { + + public static printScratchOrgInfo(scratchOrg: ScratchOrg): void { + let groupSection = new GroupConsoleLogs(`Display Org Info`).begin(); + + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + SFPLogger.log(COLOR_KEY_VALUE(`-- Org Details:--`)); + const table = new Table({ + chars: COLON_MIDDLE_BORDER_TABLE, + style: { "padding-left": 2 }, + }); + table.push([COLOR_HEADER(`Org Id`), COLOR_KEY_MESSAGE(scratchOrg.orgId)]); + table.push([ + COLOR_HEADER(`Login URL`), + COLOR_KEY_MESSAGE(scratchOrg.loginURL), + ]); + table.push([ + COLOR_HEADER(`Username`), + COLOR_KEY_MESSAGE(scratchOrg.username), + ]); + table.push([ + COLOR_HEADER(`Password`), + COLOR_KEY_MESSAGE(scratchOrg.password), + ]); + table.push([ + COLOR_HEADER(`Auth URL`), + COLOR_KEY_MESSAGE(scratchOrg.sfdxAuthUrl), + ]); + table.push([ + COLOR_HEADER(`Expiry`), + COLOR_KEY_MESSAGE(scratchOrg.expiryDate), + ]); + SFPLogger.log(table.toString(), LoggerLevel.INFO); + + SFPLogger.log( + COLOR_TRACE( + `You may use the following commands to authenticate to the org`, + ), + LoggerLevel.INFO, + ); + SFPLogger.log( + COLOR_TRACE(`cat ${scratchOrg.sfdxAuthUrl} > ./authfile`), + LoggerLevel.INFO, + ); + SFPLogger.log( + COLOR_TRACE(`sfdx auth sfdxurl store --sfdxurlfile authfile`), + LoggerLevel.INFO, + ); + SFPLogger.log( + COLOR_TRACE(`sfdx force org open --u ${scratchOrg.username}`), + LoggerLevel.INFO, + ); + + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + + + + + groupSection.end(); + } + + public static writeScratchOrgInfoToMarkDown(scratchOrg: ScratchOrg): void { + const pathToMarkDownFile = `org-info.md`; + const fileOutputHandler = FileOutputHandler.getInstance(); + fileOutputHandler.writeOutput(pathToMarkDownFile, `\nPlease find the validation org details below`); + let tableData = { + table: { + head: [ + 'Org Info', + '', + ], + body: [] + }, + alignment: [Align.Left, Align.Left, Align.Left, Align.Right], + }; + tableData.table.body.push([`Org Id`, scratchOrg.orgId]); + tableData.table.body.push([`Login URL`, scratchOrg.loginURL]); + tableData.table.body.push([`Username`, scratchOrg.username]); + tableData.table.body.push([`Password`, scratchOrg.password]); + tableData.table.body.push([`Expiry`, scratchOrg.expiryDate]); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\n\n${getMarkdownTable(tableData)}`); + + fileOutputHandler.appendOutput(pathToMarkDownFile, + `\n\nYou may use the following commands to authenticate to the org`,); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); + fileOutputHandler.appendOutput(pathToMarkDownFile, `cat ${scratchOrg.sfdxAuthUrl} > ./authfile`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx auth sfdxurl store --sfdxurlfile authfile`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx force org open --u ${scratchOrg.username}`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); + + } + + public static printOrgInfo(org: SFPOrg): void { + let groupSection = new GroupConsoleLogs(`Display Org Info`).begin(); + + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + SFPLogger.log(COLOR_KEY_VALUE(`-- Org Details:--`)); + const table = new Table({ + chars: COLON_MIDDLE_BORDER_TABLE, + style: { "padding-left": 2 }, + }); + table.push([COLOR_HEADER(`Org Id`), COLOR_KEY_MESSAGE(org.getOrgId())]); + table.push([ + COLOR_HEADER(`Instance URL`), + COLOR_KEY_MESSAGE(org.getConnection().instanceUrl), + ]); + table.push([ + COLOR_HEADER(`Username`), + COLOR_KEY_MESSAGE(org.getUsername()), + ]); + table.push([ + COLOR_HEADER(`Front Door URL`), + COLOR_KEY_MESSAGE(org.getConnection().getAuthInfo().getOrgFrontDoorUrl()) + ]); + SFPLogger.log(table.toString(), LoggerLevel.INFO); + + + + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); + + groupSection.end(); + } + + public static writeOrgInfoToMarkDown(org: SFPOrg): void { + const pathToMarkDownFile = `org-info.md`; + const fileOutputHandler = FileOutputHandler.getInstance(); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\nPlease find the validation org details below`); + let tableData = { + table: { + head: [ + 'Org Details', + '', + ], + body: [] + }, + alignment: [Align.Left, Align.Left, Align.Left,Align.Right], + }; + tableData.table.body.push([`Org Id`,org.getOrgId()]); + tableData.table.body.push([`Username`,org.getUsername()]); + tableData.table.body.push([`Login to the org`, `[Click Here](${org.getConnection().getAuthInfo().getOrgFrontDoorUrl()})`]); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\n\n${getMarkdownTable(tableData)}`); + + } + +} \ No newline at end of file diff --git a/packages/sfp-cli/src/ui/TableConstants.ts b/packages/sfp-cli/src/ui/TableConstants.ts new file mode 100644 index 000000000..cb902721b --- /dev/null +++ b/packages/sfp-cli/src/ui/TableConstants.ts @@ -0,0 +1,37 @@ +export const ZERO_BORDER_TABLE = { + top: ' ', + 'top-mid': ' ', + 'top-left': ' ', + 'top-right': ' ', + bottom: ' ', + 'bottom-mid': ' ', + 'bottom-left': ' ', + 'bottom-right': ' ', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ' ', +}; + + + +export const COLON_MIDDLE_BORDER_TABLE = { + top: '', + 'top-mid': '', + 'top-left': '', + 'top-right': '', + bottom: '', + 'bottom-mid': '', + 'bottom-left': '', + 'bottom-right': '', + left: '', + 'left-mid': '', + mid: '', + 'mid-mid': '', + right: '', + 'right-mid': '', + middle: ':', +}; diff --git a/packages/sfp-cli/src/utils/FetchArtifactsFromOrg.ts b/packages/sfp-cli/src/utils/FetchArtifactsFromOrg.ts new file mode 100644 index 000000000..255a0007d --- /dev/null +++ b/packages/sfp-cli/src/utils/FetchArtifactsFromOrg.ts @@ -0,0 +1,31 @@ + +export async function mapInstalledArtifactstoPkgAndCommits( + installedArtifacts: any, +) { + let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; + if (installedArtifacts != null) { + packagesMappedToLastKnownCommitId = + getPackagesToCommits(installedArtifacts); + } + return packagesMappedToLastKnownCommitId; + + function getPackagesToCommits(installedArtifacts: any): { + [p: string]: string; + } { + const packagesToCommits: { [p: string]: string } = {}; + + // Construct map of artifact and associated commit Id + installedArtifacts.forEach((artifact) => { + packagesToCommits[artifact.Name] = artifact.CommitId__c; + //Override for debugging purposes + if (process.env.VALIDATE_OVERRIDE_PKG) + packagesToCommits[process.env.VALIDATE_OVERRIDE_PKG] = + process.env.VALIDATE_PKG_COMMIT_ID; + }); + + if (process.env.VALIDATE_REMOVE_PKG) + delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; + + return packagesToCommits; + } +} diff --git a/packages/sfp-cli/src/utils/Get18DigitSalesforceId.ts b/packages/sfp-cli/src/utils/Get18DigitSalesforceId.ts new file mode 100644 index 000000000..bd2b5df48 --- /dev/null +++ b/packages/sfp-cli/src/utils/Get18DigitSalesforceId.ts @@ -0,0 +1,19 @@ +export default function get18DigitSalesforceId(recordId: string) { + if (recordId && recordId.length === 18) { + return recordId; + } else if (recordId && recordId.length === 15) { + let addon = ''; + for (let block = 0; block < 3; block++) { + let loop = 0; + for (let position = 0; position < 5; position++) { + let current = recordId.charAt(block * 5 + position); + if (current >= 'A' && current <= 'Z') loop += 1 << position; + } + addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop); + } + let convertedId = recordId + addon; + return convertedId; + } else { + throw new Error(`Invalid Salesforce Id ${recordId}`); + } +} diff --git a/packages/sfp-cli/tests/ProjectValidation.test.ts b/packages/sfp-cli/tests/ProjectValidation.test.ts new file mode 100644 index 000000000..a3a2f6da0 --- /dev/null +++ b/packages/sfp-cli/tests/ProjectValidation.test.ts @@ -0,0 +1,414 @@ +import ProjectConfig from '../src/core/project/ProjectConfig'; +import { jest, expect } from '@jest/globals'; +import ProjectValidation from '../src/ProjectValidation'; + +describe('Given a sfdx-project.json, it should be validated against the scehma', () => { + it('should not throw an error for a valid sfdx-project.json without any sfp decorators', () => { + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '04t000000000000' }, + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + expect(() => { + new ProjectValidation().validateSFDXProjectJSON(); + }).not.toThrow(); + }); + + it('should not throw an error for a sfdx-project.json where a package directory is missing package name', () => { + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/bi', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '04t000000000000' }, + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + expect(() => { + new ProjectValidation().validateSFDXProjectJSON(); + }).not.toThrow(); + }); + + it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are used', () => { + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + skipCoverageValidation: true, + skipTesting: true, + isOptimizedDeployment: false, + destructiveChangePath: 'test/1.xml', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + postDeploymentScript: 'test/1.bat', + preDeploymentScript: 'test/2.bat', + assignPermSetsPreDeployment: ['PS1', 'PS2'], + assignPermSetsPostDeployment: ['PS3', 'PS4'], + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: true, + alwaysDeploy: true, + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + aliasfy: true, + skipDeployOnOrgs: ['uat'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '04t000000000000' }, + plugins: { + ignoreFiles: { + prepare: 'path/to/.forceignore', + validate: 'path/to/.forceignore', + quickbuild: 'path/to/.forceignore', + build: 'path/to/.forceignore', + }, + }, + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + expect(() => { + new ProjectValidation().validateSFDXProjectJSON(); + }).not.toThrow(); + }); + + it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are incorrectly used', () => { + //As the errors are moved to warning, it will not throw an error + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build', 'test'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + skipCoverageValidation: true, + skipTesting: 'true', + isOptimizedDeployment: false, + destructiveChangePath: true, + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + postDeploymentScript: 'test/1.bat', + preDeploymentScript: 'test/2.bat', + assignPermsetsPreDeployment: ['PS1', 'PS2'], + assignPermsetsPostDeployment: ['PS3', 'PS4'], + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + alwaysDeploy: true, + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + aliasfy: 'false', + skipDeployOnOrgs: ['uat'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '04t000000000000' }, + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + expect(() => { + new ProjectValidation().validateSFDXProjectJSON(); + }).not.toThrow(); + }); + + it('should not throw an package-specific error for sfdx-project.json when version number is used correctly', () => { + // sfdx-project.json includes one source package with specific build number (valid) and one unlocked package using NEXT keyword (also valid) + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + type: 'source', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.NEXT', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { core: '04t000000000000' }, + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + expect(() => { + new ProjectValidation().validatePackageBuildNumbers(); + }).not.toThrow(); + }); + + it('should throw a package-specific error for sfdx-project.json when version number is used incorrectly', () => { + // sfdx-project.json includes two source packages. One with specific build number (valid), one using NEXT keyword (invalid) + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + type: 'source', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/domains/core', + package: 'invalid_core_pkg', + default: false, + type: 'source', + versionName: 'core', + versionNumber: '1.0.0.NEXT', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + + let excep; + try { + new ProjectValidation().validatePackageBuildNumbers(); + } catch (error) { + excep = error; + } + + expect(excep); + expect(excep.message).toContain('invalid_core_pkg'); + }); + + it('should throw a package-specific error for sfdx-project.json when package name is more than 38 characters', () => { + // sfdx-project.json includes two source packages. One with normal package name, one name is more than 38 characters (invalid) + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + type: 'source', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/ordering-systems', + package: 'feature-mgmt-and-ordering-systems-org-dep', + default: false, + versionName: 'ordering-systems', + versionNumber: '1.0.0.0', + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + + let excep; + try { + new ProjectValidation().validatePackageNames(); + } catch (error) { + excep = error; + } + + expect(excep); + expect(excep.message).toContain('Package name exceed maximum length of 38 characters'); + }); + + it('should throw a package-specific error for sfdx-project.json when package name contains invalid characters', () => { + // sfdx-project.json includes two source packages. One with normal package name, one name contains & (invalid) + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + type: 'source', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/ordering-systems', + package: 'feature-mgmt-&-ordering-systems-org', + default: false, + versionName: 'ordering-systems', + versionNumber: '1.0.0.0', + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + }; + + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return sfdx_project; + }); + + let excep; + try { + new ProjectValidation().validatePackageNames(); + } catch (error) { + excep = error; + } + + expect(excep); + expect(excep.message).toContain('Package names can only contain alphanumeric characters and the symbols - . _ ~.'); + }); +}); diff --git a/packages/sfp-cli/tests/core/apextest/ApexTestSuite.test.ts b/packages/sfp-cli/tests/core/apextest/ApexTestSuite.test.ts new file mode 100644 index 000000000..ac9e026b3 --- /dev/null +++ b/packages/sfp-cli/tests/core/apextest/ApexTestSuite.test.ts @@ -0,0 +1,77 @@ +import { jest, expect } from '@jest/globals'; +const fs = require('fs-extra'); +import ApexTestSuite from '../../../src/core/apextest/ApexTestSuite'; +import * as globSync from 'glob'; + + + +describe('Provided an apex test suite from a source directory', () => { + it('should return all the apexclasses', () => { + + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/test.testSuite-meta.xml'); + }); + + + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + + + AccountAccountRelationTriggerTest + AccountContactRelationTriggerTest + AccountTeamMemberTriggerTest + AccountTriggerTest + ContactTriggerTest + + `; + }); + + let resultTestClasses = new Array(); + resultTestClasses.push(`AccountAccountRelationTriggerTest`); + resultTestClasses.push(`AccountContactRelationTriggerTest`); + resultTestClasses.push(`AccountTeamMemberTriggerTest`); + resultTestClasses.push(`AccountTriggerTest`); + resultTestClasses.push(`ContactTriggerTest`); + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); + }); + + it('should throw an error if apex test suite is not avaiable in the directory', async () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return []; + }); + + + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + + expect(apexTestSuite.getConstituentClasses()).rejects.toThrowError(); + }); + + it('should return apexclass even if there is only one', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/test.testSuite-meta.xml');; + }); + + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + + + AccountAccountRelationTriggerTest + + `; + }); + + let resultTestClasses = new Array(); + resultTestClasses.push(`AccountAccountRelationTriggerTest`); + + let apexTestSuite = new ApexTestSuite(`dir`, `test`); + expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); + }); +}); diff --git a/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts b/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts new file mode 100644 index 000000000..f30a3ab4f --- /dev/null +++ b/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts @@ -0,0 +1,52 @@ +import { jest, expect } from '@jest/globals'; +import ArtifactFetcher from '../../../src/core/artifacts/ArtifactFetcher'; +import * as globSync from 'glob'; + +describe('Provided a path to the artifacts folder containing sfp artifact', () => { + it('should return all the artifacts, if a package name is not provided', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core2_sfp_artifact_1.0.0-2.zip', + '/path/to/core3_sfp_artifact_1.0.0-3.zip', + '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + ]; + }); + + + let artifacts = ArtifactFetcher.findArtifacts('artifacts'); + expect(artifacts).toEqual( + [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core2_sfp_artifact_1.0.0-2.zip', + '/path/to/core3_sfp_artifact_1.0.0-3.zip', + '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + ] + ); + }); + + it('provided only one artifact exists for a package and a package name is provided, it should just return the one artifact', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return new Array('/path/to/core_sfp_artifact_1.0.0-2.zip'); + }); + + let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); + expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-2.zip')); + }); + + it('provided multiple artifacts of the same package exists and a package name is provied, it should return the latest', () => { + + jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { + return [ + '/path/to/core_sfp_artifact_1.0.0-2.zip', + '/path/to/core_sfp_artifact_1.0.0-3.zip', + '/path/to/core_sfp_artifact_1.0.0-4.zip', + '/path/to/core_sfp_artifact_1.0.0-5.tgz' + ]; + }); + let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); + expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-5.tgz')); + }); +}); diff --git a/packages/sfp-cli/tests/core/coverage/IndividualClassCoverage.test.ts b/packages/sfp-cli/tests/core/coverage/IndividualClassCoverage.test.ts new file mode 100644 index 000000000..f2be12f57 --- /dev/null +++ b/packages/sfp-cli/tests/core/coverage/IndividualClassCoverage.test.ts @@ -0,0 +1,167 @@ +import IndividualClassCoverage from '../../../src/core/apex/coverage/IndividualClassCoverage'; +import { expect } from '@jest/globals'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; + +describe('Given a test coverage report', () => { + it('should be able to get a list of all classes and its test coverage', () => { + let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( + testCoverage, + new ConsoleLogger() + ); + let expectedValue = [ + { name: 'CustomerServices', coveredPercent: 87 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'ReservationManagerController', coveredPercent: 72 }, + { name: 'ReservationManager', coveredPercent: 93 }, + ]; + expect(individualClasCoverage.getIndividualClassCoverage()).toEqual(expectedValue); + }); + + it('given a coverage threshold, provide a list of classes that do not satisfy the threshold', () => { + let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( + testCoverage, + new ConsoleLogger() + ); + let validationResult = individualClasCoverage.validateIndividualClassCoverage( + individualClasCoverage.getIndividualClassCoverage(), + 75 + ); + expect(validationResult.classesWithInvalidCoverage).toContainEqual({ + name: 'ReservationManagerController', + coveredPercent: 72, + }); + }); +}); + +let testCoverage = [ + { + id: '01p0w000001qr8HAAQ', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87, + }, + { + id: '01p0w000001qr8JAAQ', + name: 'MarketServices', + totalLines: 3, + lines: { + '3': 1, + '4': 1, + '16': 1, + }, + totalCovered: 3, + coveredPercent: 100, + }, + { + id: '01p0w000001qr8NAAQ', + name: 'ReservationManagerController', + totalLines: 32, + lines: { + '4': 1, + '7': 1, + '8': 1, + '17': 1, + '22': 1, + '23': 1, + '25': 1, + '26': 1, + '27': 1, + '28': 1, + '29': 1, + '30': 1, + '31': 1, + '32': 1, + '33': 1, + '34': 1, + '35': 1, + '36': 1, + '37': 1, + '39': 1, + '41': 1, + '42': 0, + '43': 0, + '44': 0, + '45': 0, + '46': 0, + '47': 0, + '48': 0, + '50': 0, + '52': 0, + '56': 1, + '57': 1, + }, + totalCovered: 23, + coveredPercent: 72, + }, + { + id: '01p0w000001qr8MAAQ', + name: 'ReservationManager', + totalLines: 28, + lines: { + '3': 1, + '6': 1, + '7': 1, + '8': 1, + '9': 1, + '10': 1, + '12': 1, + '13': 1, + '15': 1, + '20': 1, + '24': 1, + '25': 1, + '26': 1, + '27': 1, + '29': 1, + '30': 1, + '31': 1, + '34': 1, + '35': 1, + '36': 1, + '37': 1, + '39': 1, + '40': 1, + '41': 1, + '42': 1, + '43': 0, + '44': 0, + '48': 1, + }, + totalCovered: 26, + coveredPercent: 93, + }, +]; diff --git a/packages/sfp-cli/tests/core/git/GitTags.test.ts b/packages/sfp-cli/tests/core/git/GitTags.test.ts new file mode 100644 index 000000000..e87764aaa --- /dev/null +++ b/packages/sfp-cli/tests/core/git/GitTags.test.ts @@ -0,0 +1,83 @@ +import { jest, expect } from '@jest/globals'; +import GitTags from '../../../src/core/git/GitTags'; +import Git from '../../../src/core/git/Git'; + +import child_process = require('child_process'); + +let tags: string[]; +jest.mock('../../../src/core/git/Git', () => { + class Git { + tag = jest.fn().mockReturnValue(tags); + log = jest.fn().mockReturnValue(gitLog); + getRepositoryPath() + { + return process.cwd(); + } + static async initiateRepo(){ + return new Git(); + } + } + + return Git; +}); + +describe('Given a package, listTagsOnBranch', () => { + beforeEach(() => { + const childProcessMock = jest.spyOn(child_process, 'execSync'); + childProcessMock.mockImplementation(() => showRefs); + }); + + it('should return tags belonging to package, on current branch', async () => { + tags = coreTags; + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual(coreTags.slice(0, 4)); + }); + + it('should return an empty array if there are no tags', async () => { + tags = []; + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual([]); + }); + + it('should return an empty array if there are no tags belonging to package, on current branch', async () => { + tags = coreTags.slice(4); + let git: Git = await Git.initiateRepo(); + const gitTags: GitTags = new GitTags(git, 'core'); + expect(await gitTags.listTagsOnBranch()).toEqual([]); + }); +}); + +// Last two tags are not found on the current branch +const coreTags = [ + 'core_v1.0.0.11', + 'core_v1.0.0.43', + 'core_v1.0.0.48', + 'core_v1.0.0.53', + 'core_v1.0.0.85', + 'core_v1.0.0.163', +]; + +// Commits on current branch +const gitLog = [ + '9d7795b9e2391a93b72ae7cf391f55eac5a869c1', + '65ed6f19bb87d31e56efd49cd50a6a19ba172626', + '9e244f0048f53858fe5e5aff210805389f10e523', + '544b52bea434aed68770adb23c168bb89a35b031', +]; + +const showRefs = Buffer.from( + 'fc29c8bedb5cc32b425825aeec6c5ae054704b85 refs/tags/core_v1.0.0.11\n' + + '9d7795b9e2391a93b72ae7cf391f55eac5a869c1 refs/tags/core_v1.0.0.11^{}\n' + + '4fcb4b948d174e721093ff63ffff59cb220ddd7b refs/tags/core_v1.0.0.43\n' + + '65ed6f19bb87d31e56efd49cd50a6a19ba172626 refs/tags/core_v1.0.0.43^{}\n' + + 'ed45cbda7daee5152db1353960fe0ae3b8ad5ed2 refs/tags/core_v1.0.0.48\n' + + '9e244f0048f53858fe5e5aff210805389f10e523 refs/tags/core_v1.0.0.48^{}\n' + + '9eb7e59ef46890495b4c7d9e6cfb2c5e2ef85851 refs/tags/core_v1.0.0.53\n' + + '544b52bea434aed68770adb23c168bb89a35b031 refs/tags/core_v1.0.0.53^{}\n' + + '4af7e0c6b1f663e5b1c2ecc9e424fba2af8e0d63 refs/tags/core__v1.0.0.85\n' + + '46dd375e91d5c00a0f9b64ee38350171f9cf4e50 refs/tags/core_v1.0.0.85^{}\n' + + '1a5c15c8decb0a939447aebf057e1d0889f4eeb6 refs/tags/core_v1.0.0.163\n' + + '86f2f2d107564b053c40abe66555c354f3b7f0f8 refs/tags/core_v1.0.0.163^{}\n' +); diff --git a/packages/sfp-cli/tests/core/org/ArtifactsToOrg.test.ts b/packages/sfp-cli/tests/core/org/ArtifactsToOrg.test.ts new file mode 100644 index 000000000..d4b739399 --- /dev/null +++ b/packages/sfp-cli/tests/core/org/ArtifactsToOrg.test.ts @@ -0,0 +1,214 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { ConsoleLogger, VoidLogger } from '@flxblio/sfp-logger'; +import { AnyJson, ensureJsonMap, JsonMap, ensureString } from '@salesforce/ts-types'; +import SFPOrg from '../../../src/core/org/SFPOrg'; +import SfpPackage from '../../../src/core/package/SfpPackage'; + + +const $$ = new TestContext(); +const createOrg = async () => { + + const testData = new MockTestOrgData(); + await $$.stubAuths(testData); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + + return await SFPOrg.create({ aliasOrUsername: testData.username }); +}; + +describe('Fetch a list of sfp artifacts from an org', () => { + it('Return a blank list of sfp artifact, if there are no previously installed artifacts ', async () => { + let org = await createOrg(); + + let records = { records: [] }; + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(records); + }; + + let artifacts = await org.getInstalledArtifacts(); + expect(artifacts).toEqual([]); + }); + + it('Return a list of sfp artifact, if there are previously installed artifacts ', async () => { + let org = await createOrg(); + + let records = { records:[ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'sfp-package', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }, + ]}; + + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(records); + }; + + let artifacts = await org.getInstalledArtifacts(); + let expectedpackage = { + Id: 'a0zR0000003F1FuIAK', + Name: 'sfp-package', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }; + expect(artifacts).toEqual([expectedpackage]); + }); + + it('When unable to fetch, it should return a blank list', async () => { + let org = await createOrg(); + + $$.fakeConnectionRequest = (request) => { + return Promise.reject('Failed'); + }; + + let artifacts = await org.getInstalledArtifacts(); + expect(artifacts).toEqual([]); + },45000); +}); + +describe('Update a sfp artifact to an org', () => { + it('Update a sfp artifact, installing it the first time', async () => { + let org = await createOrg(); + + let records = { records: [] }; + + let pushResult = { + id: 'a0zR0000003F1FuIAK', + success: true, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request = ensureJsonMap(request); + if (_request.method == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function () { + throw new Error('Function not implemented.'); + }, + }; + + let result = await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); + expect(result).toEqual(pushResult.id); + }); + + it('Update a sfp artifact, installing a newer version of it', async () => { + let org = await createOrg(); + + let records = { records : [ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'core', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + } + ]}; + + let pushResult: AnyJson = { + id: 'a0zR0000003F1FuIAK', + success: true, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request: JsonMap = ensureJsonMap(request); + if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function (): any { + throw new Error('Function not implemented.'); + }, + }; + + let result = await org.updateArtifactInOrg(new ConsoleLogger(), sfpPackage); + + expect(result).toEqual(pushResult.id); + }); + + it('Update a sfp artifact and resulting an error,should throw an exception', async () => { + let org = await createOrg(); + + let records={ records : [ + { + Id: 'a0zR0000003F1FuIAK', + Name: 'core', + CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', + Version__c: '1.0.0.NEXT', + Tag__c: 'undefined', + }, + ]}; + + let pushResult: AnyJson = { + success: false, + errors: [], + }; + + $$.fakeConnectionRequest = (request) => { + const _request: JsonMap = ensureJsonMap(request); + if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); + else return Promise.resolve(pushResult); + }; + + let sfpPackage: SfpPackage = { + package_name: 'core', + repository_url: 'https://example.com', + package_version_number: '1.0.0.NEXT', + sourceVersion: '3232x232xc3e', + projectDirectory: '', + workingDirectory: '', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: '', + toJSON: function () { + throw new Error('Function not implemented.'); + }, + }; + + try { + await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); + } catch (error) { + expect(error.message).toContain('Aborted'); + } + }); +}); diff --git a/packages/sfp-cli/tests/core/org/ListAllPackages.test.ts b/packages/sfp-cli/tests/core/org/ListAllPackages.test.ts new file mode 100644 index 000000000..0c6af8b2b --- /dev/null +++ b/packages/sfp-cli/tests/core/org/ListAllPackages.test.ts @@ -0,0 +1,59 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AnyJson } from '@salesforce/ts-types'; +import SFPOrg from '../../../src/core/org/SFPOrg'; +import { OrgConfigProperties } from '@salesforce/core'; + +const $$ = new TestContext(); + +describe('Retrieve all packages from devhub', () => { + it('should return all the packages provided a devhub', async () => { + + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { + records: [ + { + attributes: { + type: 'Package2', + url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005000k9bNSXQ', + }, + Id: '0Ho1P005000k9bNSXQ', + Name: 'async-framework', + Description: null, + NamespacePrefix: null, + ContainerOptions: 'Unlocked', + IsOrgDependent: false, + }, + { + attributes: { + type: 'Package2', + url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005100k9bNSXQ', + }, + Id: '0Ho1P005100k9bNSXQ', + Name: 'async-framework2', + Description: null, + NamespacePrefix: null, + ContainerOptions: 'Unlocked', + IsOrgDependent: true, + }, + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + const org: SFPOrg = await SFPOrg.create({ aliasOrUsername: testData.username }); + + let packages = await org.listAllPackages(); + expect(packages).toHaveLength(2); + expect(packages[0].Name).toMatch('async-framework'); + expect(packages[0].Id).toMatch('0Ho1P005000k9bNSXQ'); + expect(packages[0].IsOrgDependent).toMatch('No'); + expect(packages[1].IsOrgDependent).toMatch('Yes'); //Translate true to Yes + }); +}); diff --git a/packages/sfp-cli/tests/core/package/Package2VersionFetcher.test.ts b/packages/sfp-cli/tests/core/package/Package2VersionFetcher.test.ts new file mode 100644 index 000000000..2b7589393 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/Package2VersionFetcher.test.ts @@ -0,0 +1,79 @@ +import { expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo } from '@salesforce/core'; +import Package2VersionFetcher from '../../../src/core/package/version/Package2VersionFetcher'; +import { AnyJson } from '@salesforce/ts-types'; + +const $$ = new TestContext(); + +let conn: Connection; + +describe("Given a PackageDependencyResolver", () => { + + beforeEach(async () => { + const testData = new MockTestOrgData(); + + testData.makeDevHub(); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: any = { + records: [ + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' + }, + SubscriberPackageVersionId: '04t5i000000V2DiAAK', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 17, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'king' + }, + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' + }, + SubscriberPackageVersionId: '04t5i000000UyCJAA0', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 16, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'king' + } + ], + }; + $$.fakeConnectionRequest = (request: any): Promise => { + return Promise.resolve(records); + }; + conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + }) + it('should return an array of Package2Version records if matching records found', async () => { + // Mock the query method in QueryHelper to return some dummy data + const package2VersionFetcher = new Package2VersionFetcher(conn); + + const result = await package2VersionFetcher.fetchByPackageBranchAndName('king', 'core'); + + expect(result[0].Package2.Name).toEqual('core'); + expect(result[0].Branch).toEqual('king'); + }); + +}); + diff --git a/packages/sfp-cli/tests/core/package/PackageDiffImpl.test.ts b/packages/sfp-cli/tests/core/package/PackageDiffImpl.test.ts new file mode 100644 index 000000000..75a8ed5e4 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/PackageDiffImpl.test.ts @@ -0,0 +1,295 @@ +import { jest, expect } from '@jest/globals'; +const fs = require('fs'); +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import PackageDiffImpl, { PackageDiffOptions } from '../../../src/core/package/diff/PackageDiffImpl'; +import ProjectConfig from '../../../src/core/project/ProjectConfig'; + +let gitTags: string[] = []; +let gitDiff: string[] = []; +let gitShow: string = ''; + +jest.mock('../../../src/core/git/Git', () => { + class Git { + diff = jest.fn().mockReturnValue(gitDiff); + show = jest.fn().mockReturnValue(gitShow); + static async initiateRepo(){ + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let ignoreFilterResult: string[] = []; +jest.mock('../../../src/core/ignore/IgnoreFiles', () => { + class IgnoreFiles { + filter = jest.fn().mockReturnValue(ignoreFilterResult); + } + + return IgnoreFiles; +}); + +describe('Determines whether a given package has changed', () => { + beforeEach(() => { + const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + projectConfigMock.mockImplementation(() => { + return JSON.parse(packageConfigJson); + }); + + const fsMock = jest.spyOn(fs, 'readFileSync'); + fsMock.mockImplementation(() => { + return '**README.md'; + }); + }); + + it('should throw error if package does not exist', () => { + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl( + new ConsoleLogger(), + 'UNKNOWN-PACKAGE', + null, + ); + expect(() => packageDiffImpl.exec()).rejects.toThrowError(); + }); + + it('should return true if package metadata has changed', async () => { + gitTags = coreTags; + gitDiff = [`packages/domains/core/X/Y/Z/A-meta.xml`]; + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Found change(s) in package`); + + packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core-b', null); + result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + + }); + + it('should return true if package descriptor has changed', async () => { + gitTags = coreTags; + gitDiff = ['sfdx-project.json']; + gitShow = packageDescriptorChange; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Package Descriptor Changed`); + }); + + it('should return false even if package descriptor has changed when asked to ignore ', async () => { + gitTags = coreTags; + gitDiff = ['sfdx-project.json']; + gitShow = packageDescriptorChange; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,{skipPackageDescriptorChange:true}); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + }); + + it('should return false if only config file has changed', async () => { + gitDiff = ['config/project-scratch-def.json']; + + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + gitTags = coreTags; + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + expect(result.reason).toEqual(`No changes found`); + }); + + it('should return true if package does not have any tags', async () => { + gitTags = []; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Previous version not found`); + }); + + it('should return true if packageToCommits is an empty object', async () => { + let packageDiffOptions = new PackageDiffOptions(); + packageDiffOptions.packagesMappedToLastKnownCommitId={}; + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,packageDiffOptions); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(true); + expect(result.reason).toEqual(`Previous version not found`); + }); + + it('should return false if package metadata and package config has not changed', async () => { + gitTags = coreTags; + gitDiff = [`packages/access-mgmt/X/Y/Z/A-meta.xml`, `packages/bi/X/Y/Z/B-meta.xml`]; + // No change in package config + gitShow = packageConfigJson; + + // Assume passthrough filter for ignore + ignoreFilterResult = gitDiff; + + let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); + let result = await packageDiffImpl.exec(); + expect(result.isToBeBuilt).toEqual(false); + expect(result.reason).toEqual(`No changes found`); + }); +}); + +const coreTags = [ + `core_v1.0.0.2`, + `core_v1.0.0.3`, + `core_v1.0.0.5`, + `core_v1.0.0.6`, + `core_v1.0.0.7`, + `core_v1.0.0.8`, + `core_v1.0.0.9`, + `core_v1.0.0.10`, +]; + +const packageConfigJson: string = ` +{ + "packageDirectories": [ + { + "path": "packages/temp", + "default": true, + "package": "temp", + "versionName": "temp", + "versionNumber": "1.0.0.0", + "ignoreOnStage": ["prepare","validate","build"] + }, + { + "path": "packages/domains/core", + "package": "core", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA", + "PermSetB", + "PermSetC" + ] + }, + { + "path": "packages/domains/core-b", + "package": "core-b", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA", + "PermSetB", + "PermSetC" + ] + }, + { + "path": "packages/frameworks/mass-dataload", + "package": "mass-dataload", + "default": false, + "type":"data", + "versionName": "mass-dataload", + "versionNumber": "1.0.0.0" + }, + { + "path": "packages/access-mgmt", + "package": "access-mgmt", + "default": false, + "versionName": "access-mgmt", + "versionNumber": "1.0.0.0", + "reconcileProfiles": "true" + }, + { + "path": "packages/bi", + "package": "bi", + "default": false, + "versionName": "bi", + "versionNumber": "1.0.0.0", + "ignoreOnStage":["prepare","validate"] + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "50.0", + "packageAliases": { + "bi":"0x002232323232", + "core":"0H04X00000000XXXXX" + } +}`; + +const packageDescriptorChange: string = ` +{ + "packageDirectories": [ + { + "path": "packages/temp", + "default": true, + "package": "temp", + "versionName": "temp", + "versionNumber": "1.0.0.0", + "ignoreOnStage": ["prepare","validate","build"] + }, + { + "path": "packages/domains/core", + "package": "core", + "default": false, + "versionName": "covax", + "versionNumber": "1.0.0.0", + "assignPermSetsPreDeployment": [ + "PermSetA" + ] + }, + { + "path": "packages/frameworks/mass-dataload", + "package": "mass-dataload", + "default": false, + "type":"data", + "versionName": "mass-dataload", + "versionNumber": "1.0.0.0" + }, + { + "path": "packages/access-mgmt", + "package": "access-mgmt", + "default": false, + "versionName": "access-mgmt", + "versionNumber": "1.0.0.0", + "reconcileProfiles": "true" + }, + { + "path": "packages/bi", + "package": "bi", + "default": false, + "versionName": "bi", + "versionNumber": "1.0.0.0", + "ignoreOnStage":["prepare","validate"] + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "50.0", + "packageAliases": { + "bi":"0x002232323232", + "core":"0H04X00000000XXXXX" + } +} +`; diff --git a/packages/sfp-cli/tests/core/package/PackageManifest.test.ts b/packages/sfp-cli/tests/core/package/PackageManifest.test.ts new file mode 100644 index 000000000..e9acf2b69 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/PackageManifest.test.ts @@ -0,0 +1,300 @@ +import fs from 'fs-extra'; +import { jest, expect } from '@jest/globals'; +import PackageManifest from '../../../src/core/package/components/PackageManifest'; + +describe('Given a mdapi directory that contains manifest file', () => { + beforeEach(() => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML; + }); + }); + + it('should return the manifest in json format', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON); + }); + + it('should return the manifest in xml format', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.manifestXml).toEqual(packageManifestXML); + }); + + it('should return true if there is apex', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isApexInPackage()).toBe(true); + }); + + it('should return undefined if there are no triggers', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.fetchTriggers()).toBe(undefined); + }); + + it('should return false if there are no profiles', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isProfilesInPackage()).toBe(false); + }); + + it('should return false if there are no permission set groups', async () => { + const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); + expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(false); + }); +}); + +describe('Given a list of components', () => { + it('should create a package manifest from scratch', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest).toBeInstanceOf(PackageManifest); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON_b); + expect(packageManifest.manifestXml).toEqual(packageManifestXML_b); + }); + + it('should fetch triggers', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.fetchTriggers()).toEqual(['ContractTrigger']); + }); + + it('should return true if there are permission set groups ', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(true); + }); + + it('should return true if there are profiles', () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + + expect(packageManifest.isProfilesInPackage()).toBe(true); + }); + + it('should return true if there are types supported by profiles', async () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + expect(packageManifest.isPayLoadContainTypesSupportedByProfiles()).toBe(true); + }); + + it('should return true if there are types other than', async () => { + const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); + expect(packageManifest.isPayloadContainTypesOtherThan('Profile')).toBe(true); + }); +}); + +describe('Given a manifest json payload', () => { + it('should create an instance of PackageManifest', async () => { + const packageManifest: PackageManifest = await PackageManifest.createWithJSONManifest(packageManifestJSON); + + expect(packageManifest).toBeInstanceOf(PackageManifest); + expect(packageManifest.manifestJson).toEqual(packageManifestJSON); + expect(packageManifest.manifestXml).toEqual(packageManifestXML); + }); +}); + +const components: { fullName: string; type: string }[] = [ + { + fullName: 'ContractService', + type: 'ApexClass', + }, + { + fullName: 'ContractTrigger', + type: 'ApexTrigger', + }, + { + fullName: 'ContractVariables__mdt-ContractVariables Layout', + type: 'Layout', + }, + { + fullName: 'Contract.Reason__c', + type: 'CustomField', + }, + { + fullName: 'Contract.ContractTerm__c', + type: 'CustomField', + }, + { + fullName: 'Contract', + type: 'CustomObject', + }, + { + fullName: 'ContractPermissionSetGroup', + type: 'PermissionSetGroup', + }, + { + fullName: 'Contractor', + type: 'Profile', + }, +]; + +const packageManifestJSON_b = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: [ + { + name: 'ApexClass', + members: ['ContractService'], + }, + { + name: 'ApexTrigger', + members: ['ContractTrigger'], + }, + { + name: 'Layout', + members: ['ContractVariables__mdt-ContractVariables Layout'], + }, + { + name: 'CustomField', + members: ['Contract.Reason__c', 'Contract.ContractTerm__c'], + }, + { + name: 'CustomObject', + members: ['Contract'], + }, + { + name: 'PermissionSetGroup', + members: ['ContractPermissionSetGroup'], + }, + { + name: 'Profile', + members: ['Contractor'], + }, + ], + version: '50.0', + }, +}; + +const packageManifestXML_b: string = ` + + + ApexClass + ContractService + + + ApexTrigger + ContractTrigger + + + Layout + ContractVariables__mdt-ContractVariables Layout + + + CustomField + Contract.Reason__c + Contract.ContractTerm__c + + + CustomObject + Contract + + + PermissionSetGroup + ContractPermissionSetGroup + + + Profile + Contractor + + 50.0 +`; + +const packageManifestJSON = { + Package: { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [ + { + name: 'AuraDefinitionBundle', + members: ['openRecordAction', 'selectObject'], + }, + { + name: 'ApexClass', + members: [ + 'CustomerServices', + 'CustomerServicesTest', + 'MarketServices', + 'MarketServicesTest', + 'TestDataFactory', + ], + }, + { + name: 'CustomMetadata', + members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], + }, + { + name: 'Layout', + members: 'Customer_Fields__mdt-Customer Fields Layout', + }, + { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, + { + name: 'LightningMessageChannel', + members: ['Flow_Status_Change', 'Tile_Selection'], + }, + { name: 'CustomObject', members: 'Customer_Fields__mdt' }, + { + name: 'CustomField', + members: [ + 'Customer_Fields__mdt.Customer_City__c', + 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', + 'Customer_Fields__mdt.Customer_Email__c', + 'Customer_Fields__mdt.Customer_Name__c', + 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', + 'Customer_Fields__mdt.Customer_State__c', + 'Customer_Fields__mdt.Customer_Status__c', + 'Customer_Fields__mdt.Sobject_Type__c', + ], + }, + ], + version: '50.0', + }, +}; + +const packageManifestXML: string = ` + + + AuraDefinitionBundle + openRecordAction + selectObject + + + ApexClass + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + + CustomMetadata + Customer_Fields.Contact_Customer_Fields + Customer_Fields.Lead_Customer_Fields + + + Layout + Customer_Fields__mdt-Customer Fields Layout + + + LightningComponentBundle + errorPanel + ldsUtils + + + LightningMessageChannel + Flow_Status_Change + Tile_Selection + + + CustomObject + Customer_Fields__mdt + + + CustomField + Customer_Fields__mdt.Customer_City__c + Customer_Fields__mdt.Customer_Draft_Status_Values__c + Customer_Fields__mdt.Customer_Email__c + Customer_Fields__mdt.Customer_Name__c + Customer_Fields__mdt.Customer_Reservation_Status_Value__c + Customer_Fields__mdt.Customer_State__c + Customer_Fields__mdt.Customer_Status__c + Customer_Fields__mdt.Sobject_Type__c + + 50.0 +`; diff --git a/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts b/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts new file mode 100644 index 000000000..fa6936479 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts @@ -0,0 +1,374 @@ +import { jest, expect } from '@jest/globals'; +import SfpPackage, { PackageType, SfpPackageParams } from '../../../src/core/package/SfpPackage'; +import SfpPackageBuilder, { PackageCreationParams } from '../../../src/core/package/SfpPackageBuilder'; +import * as fs from "fs-extra"; +import { Logger } from '@flxblio/sfp-logger'; + + +let packageType = PackageType.Source; +jest.mock('../../../src/core/project/ProjectConfig', () => { + class ProjectConfig { + static getSFDXPackageDescriptor(projectDirectory, sfdx_package) { + return { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + } + + static getSFDXProjectConfig(projectDirectory) { + return { + packageDirectories: [ + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + }; + } + static getPackageType(projectConfig: any, sfdxPackage: string) { + return packageType; + } + } + return ProjectConfig; +}); + +jest.mock('../../../src/core/package/generators/SfpPackageContentGenerator', () => { + class SfpPackageContentGenerator { + static async generateSfpPackageDirectory( + projectDirectory: string, + projectConfig: any, + sfdx_package: string, + packageDirectory: string, + destructiveManifestFilePath?: string, + configFilePath?: string, + pathToReplacementForceIgnore?: string + ): Promise { + return '.sfp/3sIRD_source'; + } + } + + return SfpPackageContentGenerator; +}); + +jest.mock('../../../src/core/package/packageFormatConvertors/SourceToMDAPIConvertor', () => { + class SourceToMDAPIConvertor { + convert = jest.fn().mockReturnValueOnce(Promise.resolve({ packagePath: 'mdapidir' })); + } + return SourceToMDAPIConvertor; +}); + +jest.mock('../../../src/core/package/components/MetadataCount', () => { + class MetadataCount { + static getMetadataCount = jest.fn().mockReturnValue(Promise.resolve(20)); + } + return MetadataCount; +}); + +jest.mock('../../../src/core/apex/parser/ApexTypeFetcher', () => { + class ApexTypeFetcher { + getClassesClassifiedByType = jest.fn(); + getTestClasses = jest + .fn() + .mockReturnValue( + new Array( + 'AccountTriggerHandlerTest', + 'Generate_Dose_Admin_PdfTest', + 'RecordHunterController_Test', + 'SObjectController2Test', + 'Send_Receipt_Test', + 'TestDataFactory', + 'TestFileRestriction', + 'appoinmentSchedulerControllerTest' + ) + ); + + getClassesOnlyExcludingTestsAndInterfaces = jest + .fn() + .mockReturnValue( + new Array( + 'AccountTriggerHandler', + 'Data_TableV2_Controller', + 'Generate_Dose_Admin_Pdf', + 'Generate_QR_Code', + 'RecordHunterController', + 'RecordHunterField', + 'RecordHunterLexer', + 'SObjectController2', + 'Send_Receipt' + ) + ); + } + + return ApexTypeFetcher; +}); + +jest.mock('../../../src/core/package/packageCreators/CreateUnlockedPackageImpl', () => { + class CreateUnlockedPackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) {} + + public async exec(): Promise { + return this.sfpPackage; + } + } + return CreateUnlockedPackageImpl; +}); + +// jest.mock('../../src/package/packageCreators/CreatePackage', () => { +// class CreatePackage { +// public constructor( +// protected projectDirectory: string, +// protected sfpPackage: SfpPackage, +// protected packageCreationParams: PackageCreationParams, +// protected logger?: Logger, +// protected params?: SfpPackageParams +// ) {} +// } +// return CreatePackage; +// }); + +jest.mock('../../../src/core/package/packageCreators/CreateSourcePackageImpl', () => { + + + class CreateSourcePackageImpl { + public constructor( + protected projectDirectory: string, + protected sfpPackage: SfpPackage, + protected packageCreationParams: PackageCreationParams, + protected logger?: Logger, + protected params?: SfpPackageParams + ) { + + } + + public async exec(): Promise { + this.sfpPackage.packageType = PackageType.Source; + return this.sfpPackage; + } + getTypeOfPackage() {} + isEmptyPackage(projectDirectory: string, packageDirectory: string){} + preCreatePackage(sfpPackage: SfpPackage) {} + createPackage(sfpPackage: SfpPackage) {} + postCreatePackage(sfpPackage: SfpPackage) {} + printAdditionalPackageSpecificHeaders() {} + } + return CreateSourcePackageImpl; +}); + +describe.skip('Given a sfdx package, build a sfp package', () => { + it('should build a sfp package', async () => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML; + }); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + null, + null, + 'ESBaseCodeLWC' + ); + expect(sfpPackage.isProfilesFound).toStrictEqual(false); + expect(sfpPackage.isApexFound).toStrictEqual(true); + expect(sfpPackage.isPermissionSetGroupFound).toStrictEqual(true); + expect(sfpPackage.triggers).toBeUndefined(); + expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); + expect(sfpPackage.payload).toStrictEqual(packageManifestJSON); + expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); + expect(sfpPackage.packageDescriptor).toStrictEqual({ + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }); + expect(sfpPackage.apexTestClassses).toStrictEqual( + new Array( + 'AccountTriggerHandlerTest', + 'Generate_Dose_Admin_PdfTest', + 'RecordHunterController_Test', + 'SObjectController2Test', + 'Send_Receipt_Test', + 'TestDataFactory', + 'TestFileRestriction', + 'appoinmentSchedulerControllerTest' + ) + ); + expect(sfpPackage.apexClassWithOutTestClasses).toStrictEqual( + new Array( + 'AccountTriggerHandler', + 'Data_TableV2_Controller', + 'Generate_Dose_Admin_Pdf', + 'Generate_QR_Code', + 'RecordHunterController', + 'RecordHunterField', + 'RecordHunterLexer', + 'SObjectController2', + 'Send_Receipt' + ) + ); + }); + + it('should build a sfp package when there is only one type', async () => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return packageManifestXML2; + }); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( + null, + null, + 'ESBaseCodeLWC' + ); + expect(sfpPackage.isProfilesFound).toStrictEqual(true); + expect(sfpPackage.isApexFound).toStrictEqual(false); + expect(sfpPackage.triggers).toBeUndefined(); + expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); + expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); + expect(sfpPackage.packageDescriptor).toStrictEqual({ + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }); + expect(sfpPackage.isPayLoadContainTypesSupportedByProfiles).toStrictEqual(false); + }); +}); + +let packageManifestJSON = { + Package: { + $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, + types: [ + { + name: 'AuraDefinitionBundle', + members: ['openRecordAction', 'selectObject'], + }, + { + name: 'ApexClass', + members: [ + 'CustomerServices', + 'CustomerServicesTest', + 'MarketServices', + 'MarketServicesTest', + 'TestDataFactory', + ], + }, + { + name: 'CustomMetadata', + members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], + }, + { + name: 'Layout', + members: 'Customer_Fields__mdt-Customer Fields Layout', + }, + { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, + { + name: 'LightningMessageChannel', + members: ['Flow_Status_Change', 'Tile_Selection'], + }, + { name: 'CustomObject', members: 'Customer_Fields__mdt' }, + { name: 'PermissionSetGroup', members: 'TestPermissionSetGroup' }, + { + name: 'CustomField', + members: [ + 'Customer_Fields__mdt.Customer_City__c', + 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', + 'Customer_Fields__mdt.Customer_Email__c', + 'Customer_Fields__mdt.Customer_Name__c', + 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', + 'Customer_Fields__mdt.Customer_State__c', + 'Customer_Fields__mdt.Customer_Status__c', + 'Customer_Fields__mdt.Sobject_Type__c', + ], + }, + ], + version: '50.0', + }, +}; + +let packageManifestXML: string = ` + + + + AuraDefinitionBundle + openRecordAction + selectObject + + + ApexClass + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + + CustomMetadata + Customer_Fields.Contact_Customer_Fields + Customer_Fields.Lead_Customer_Fields + + + Layout + Customer_Fields__mdt-Customer Fields Layout + + + LightningComponentBundle + errorPanel + ldsUtils + + + LightningMessageChannel + Flow_Status_Change + Tile_Selection + + + CustomObject + Customer_Fields__mdt + + + PermissionSetGroup + TestPermissionSetGroup + + + CustomField + Customer_Fields__mdt.Customer_City__c + Customer_Fields__mdt.Customer_Draft_Status_Values__c + Customer_Fields__mdt.Customer_Email__c + Customer_Fields__mdt.Customer_Name__c + Customer_Fields__mdt.Customer_Reservation_Status_Value__c + Customer_Fields__mdt.Customer_State__c + Customer_Fields__mdt.Customer_Status__c + Customer_Fields__mdt.Sobject_Type__c + + 50.0 + +`; + +let packageManifestXML2: string = ` + + + + Profile + CustomerServices + CustomerServicesTest + MarketServices + MarketServicesTest + TestDataFactory + + 50.0 + +`; diff --git a/packages/sfp-cli/tests/core/package/analysers/FHTAnalyzer.test.ts b/packages/sfp-cli/tests/core/package/analysers/FHTAnalyzer.test.ts new file mode 100644 index 000000000..437c055d5 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/analysers/FHTAnalyzer.test.ts @@ -0,0 +1,360 @@ +import { jest, expect } from '@jest/globals'; +import FHTAnalyser from '../../../../src/core/package/analyser/FHTAnalyzer'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; +import { VoidLogger } from '@flxblio/sfp-logger'; + +let isYamlFileFound: boolean = true; + +describe('FHT Analyzer', () => { + beforeEach(() => { + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + Account: + - Name + - Phone + Contact: + - Name + - Phone + `; + }); + const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); + fsExistSyncMock.mockImplementationOnce(() => { + return isYamlFileFound; + }); + }); + + it('Should not be enabled for data packages', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Data, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); + }); + + it('Should be enabled for source packages by default', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Source, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it('Should be enabled for unlocked packages by default', async () => { + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + }); + + it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); + }); + + it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); + expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(fhtFields).not.toHaveProperty('Test__c'); + }); + + it(' When no yaml is provided, package has history enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = false; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let fhtAnalyzer = new FHTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFHTFieldFound']).toBe(true); + expect(sfpPackage['fhtFields']).toBeDefined(); + let fhtFields = sfpPackage['fhtFields']; + expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); + }); +}); diff --git a/packages/sfp-cli/tests/core/package/analysers/FTAnalyzer.test.ts b/packages/sfp-cli/tests/core/package/analysers/FTAnalyzer.test.ts new file mode 100644 index 000000000..bc78d22b0 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/analysers/FTAnalyzer.test.ts @@ -0,0 +1,363 @@ +import { jest, expect } from '@jest/globals'; +import FTAnalyser from '../../../../src/core/package/analyser/FTAnalyzer'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; +import { VoidLogger } from '@flxblio/sfp-logger'; + +let isYamlFileFound: boolean = true; + +describe('FT Analyzer', () => { + beforeEach(() => { + const fsReadMock = jest.spyOn(fs, 'readFileSync'); + fsReadMock.mockImplementationOnce(() => { + return ` + Account: + - Name + - Phone + Contact: + - Name + - Phone + `; + }); + const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); + fsExistSyncMock.mockImplementationOnce(() => { + return isYamlFileFound; + }); + }); + + it('Should not be enabled for data packages', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Data, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); + }); + + it('Should be enabled for source packages by default', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Source, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it('Should be enabled for unlocked packages by default', async () => { + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: process.cwd(), + workingDirectory: 'force-app', + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); + }); + + it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + }); + + it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); + }); + + it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = true; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + false + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); + expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); + expect(ftFields).not.toHaveProperty('Test__c'); + }); + + it(' When no yaml is provided, package has feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { + + + isYamlFileFound = false; + + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/main/default/object/Test__c/fields', + children: [ + { + name: 'AccountManager__c.field-meta.xml', + data: Buffer.from(` + + AccountManager__c + false + Account.AccountOwner__c + BlankAsZero + + false + false + true + false + Text + false + `), + }, + ], + }, + ]; + const customField = SourceComponent.createVirtualComponent( + { + name: 'AccountManager__c', + type: registry.types.customobject.children.types.customfield, + xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', + parent: SourceComponent.createVirtualComponent({ + name: 'Test__c', + type: registry.types.customobject, + xml: '/main/default/object/Test__c.object-meta.xml', + }), + }, + virtualFs + ); + + set.add(customField); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementationOnce(() => { + return set; + }); + + let ftAnalyzer = new FTAnalyser(); + let sfpPackage: SfpPackage = { + projectDirectory: '', + packageDirectory: 'force-app', + workingDirectory: process.cwd(), + mdapiDir: '', + destructiveChangesPath: '', + resolvedPackageDirectory: '', + version: '', + packageName: '', + versionNumber: '', + packageType: PackageType.Unlocked, + package_name: '', + toJSON: function (): any { + return ''; + }, + }; + sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); + expect(sfpPackage['isFTFieldFound']).toBe(true); + expect(sfpPackage['ftFields']).toBeDefined(); + let ftFields = sfpPackage['ftFields']; + expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); + }); +}); diff --git a/packages/sfp-cli/tests/core/package/coverage/PackageTestCoverage.test.ts b/packages/sfp-cli/tests/core/package/coverage/PackageTestCoverage.test.ts new file mode 100644 index 000000000..fa3ab1d6e --- /dev/null +++ b/packages/sfp-cli/tests/core/package/coverage/PackageTestCoverage.test.ts @@ -0,0 +1,330 @@ +import PackageTestCoverage from '../../../../src/core/package/coverage/PackageTestCoverage'; +import { jest, expect } from '@jest/globals'; +import { ConsoleLogger, Logger } from '@flxblio/sfp-logger'; +import ApexClassFetcher from '../../../../src/core/apex/ApexClassFetcher'; +import ApexTriggerFetcher from '../../../../src/core/apex/ApexTriggerFetcher'; +import ApexCodeCoverageAggregateFetcher from '../../../../src/core/apex/coverage/ApexCodeCoverageAggregateFetcher'; + +import { AuthInfo, ConfigAggregator, Connection, Org, OrgConfigProperties } from '@salesforce/core'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; +const $$ = new TestContext(); + +let packageType = PackageType.Unlocked; + + + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.apexClassWithOutTestClasses = new Array('CustomerServices', 'MarketServices'); + sfpPackage.triggers = new Array('AccountTrigger'); + sfpPackage.packageType = packageType; + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + + +const setupConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; + } + + + +describe('Given a sfp package and code coverage report, a package coverage calculator', () => { + it('should be able to provide the coverage of a provided unlocked package', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); + }); + + it('should able to validate whether the coverage of unlocked package is above a certain threshold', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 80; + let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should able to validate whether the coverage of unlocked package is above mandatory threshold', async () => { + const conn = await setupConnection(); + + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 75; + let result = await packageTestCoverage.validateTestCoverage(); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should be able to provide the coverage of a provided source package', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); + }); + + it('should able to validate whether the coverage of source package is above a certain threshold', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 80; + let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should able to validate whether the coverage of source package is above mandatory threshold', async () => { + const conn = await setupConnection(); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + succesfulTestCoverage, + new ConsoleLogger(), + conn + ); + let requiredCoverage = 75; + let result = await packageTestCoverage.validateTestCoverage(); + expect(result.result).toBe(true); + expect(result.packageTestCoverage).toBe(89); + expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); + expect(result.classesCovered).toStrictEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 100 }, + { name: 'AccountTrigger', coveredPercent: 100 }, + ]); + expect(result.classesWithInvalidCoverage).toBeUndefined(); + }); + + it('should account for untouched classes and triggers when calculating package test coverage', async () => { + const conn = await setupConnection(); + + jest.spyOn(ApexClassFetcher.prototype, 'fetchApexClassByName').mockResolvedValue([ + { Id: '01p0w000001n1SfAAI', Name: 'MarketServices' }, + ]); + jest.spyOn(ApexTriggerFetcher.prototype, 'fetchApexTriggerByName').mockResolvedValue([ + { Id: '01p2O000003s9qcQAA', Name: 'AccountTrigger' }, + ]); + jest.spyOn(ApexCodeCoverageAggregateFetcher.prototype, 'fetchACCAById').mockResolvedValue([ + { ApexClassOrTriggerId: '01p0w000001n1SfAAI', NumLinesCovered: 0, NumLinesUncovered: 3, Coverage: {} }, + { ApexClassOrTriggerId: '01p2O000003s9qcQAA', NumLinesCovered: 0, NumLinesUncovered: 4, Coverage: {} }, + ]); + + packageType = PackageType.Source; + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); + let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( + sfpPackage, + testCoverageWithUntouchedClasses, + new ConsoleLogger(), + conn + ); + let result = await packageTestCoverage.validateTestCoverage(); + + expect(result.result).toBe(false); + expect(result.packageTestCoverage).toBe(71); + expect(result.classesCovered).toEqual([ + { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, + { name: 'MarketServices', coveredPercent: 0 }, + { name: 'AccountTrigger', coveredPercent: 0 }, + ]); + expect(result.classesWithInvalidCoverage).toEqual([ + { name: 'MarketServices', coveredPercent: 0 }, + { name: 'AccountTrigger', coveredPercent: 0 }, + ]); + }); +}); + +let succesfulTestCoverage = [ + { + id: '01p0w000001n1SdAAI', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87.09677419354838, + }, + { + id: '01p0w000001n1SfAAI', + name: 'MarketServices', + totalLines: 3, + lines: { + '3': 1, + '4': 1, + '16': 1, + }, + totalCovered: 3, + coveredPercent: 100, + }, + { + id: '01p2O000003s9qcQAA', + name: 'AccountTrigger', + totalLines: 4, + lines: { + '3': 1, + '5': 1, + '10': 1, + '11': 1, + }, + totalCovered: 4, + coveredPercent: 100, + }, +]; + +const testCoverageWithUntouchedClasses = [ + { + id: '01p0w000001n1SdAAI', + name: 'CustomerServices', + totalLines: 31, + lines: { + '3': 1, + '4': 1, + '5': 1, + '13': 1, + '15': 1, + '16': 1, + '17': 1, + '18': 1, + '19': 1, + '20': 1, + '21': 1, + '22': 1, + '25': 1, + '31': 1, + '34': 1, + '37': 1, + '40': 1, + '43': 0, + '46': 0, + '49': 1, + '57': 1, + '58': 1, + '59': 1, + '60': 1, + '61': 1, + '62': 1, + '63': 1, + '64': 1, + '65': 0, + '66': 1, + '67': 0, + }, + totalCovered: 27, + coveredPercent: 87.09677419354838, + }, +]; diff --git a/packages/sfp-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts b/packages/sfp-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts new file mode 100644 index 000000000..0a27c92a1 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts @@ -0,0 +1,346 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; +import PackageDependencyResolver from '../../../../src/core/package/dependencies/PackageDependencyResolver'; +const $$ = new TestContext(); + +const setupFakeConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(response); + }; + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; +} + +jest.mock('../../../../src/core/git/Git', () => { + class Git { + static async initiateRepo() + { + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let conn: Connection; +let gitTags; +let response; + +describe("Given a PackageDependencyResolver", () => { + + beforeEach(async () => { + conn = await setupFakeConnection(); + gitTags = coreGitTags; + response = coreResponse; + }) + + it("should resolve package dependencies to current branch", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management", "contact-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.2"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.2"); + }); + + it("should skip dependency resolution for packages that are not queued for build", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should skip dependencies on packages from the same build", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core", "candidate-management", "contact-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + + packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); + coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); + expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should skip dependencies on a subscriber package version id", async () => { + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + const packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); + const techFrameworkDependency = packageDescriptor.dependencies.find(dependency => dependency.package.startsWith("tech-framework")); + expect(techFrameworkDependency.versionNumber).toBeUndefined(); + }); + + it("should throw if dependency package version cannot be found for current branch ", async () => { + gitTags = []; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + + it("should throw if there are no validated dependency package versions", async () => { + response = {records: []}; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + + it("should throw if there are no validated dependency package id", async () => { + response = {records: []}; + const packageDependencyResolver = new PackageDependencyResolver(conn, falseProjectConfig, ["contact-management"]); + expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); + }); + it('should return the latest branched package version id if matching records found', async () => { + // Mock the query method in QueryHelper to return some dummy data + response = { + records: [ + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' + }, + SubscriberPackageVersionId: '04t5i000000V2DiAAK', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 17, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'inspection' + }, + { + attributes: { + type: 'Package2Version', + url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' + }, + SubscriberPackageVersionId: '04t5i000000UyCJAA0', + Package2Id: '0Ho5i000000sYaWCAU', + Package2: { attributes: [Object], Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 0, + MinorVersion: 1, + PatchVersion: 0, + BuildNumber: 16, + CodeCoverage: { apexCodeCoveragePercentage: 100 }, + HasPassedCodeCoverageCheck: true, + Branch: 'inspection' + } + ], + }; + const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["inspections"]); + const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); + + expect(resolvedProjectConfig.packageAliases['core@0.1.0.17-inspection']).toEqual('04t5i000000V2DiAAK'); + }); + + // TODO: test cache +}); + +let coreGitTags = ['core_v1.0.0.2']; + +let coreResponse = { + records: [ + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx3', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 3, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx2', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 2, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + { + SubscriberPackageVersionId: '04t1P00000xxxxxxx1', + Package2Id: '0Ho4a00000000xxxxx', + Package2: { Name: 'core' }, + IsPasswordProtected: false, + IsReleased: false, + MajorVersion: 1, + MinorVersion: 0, + PatchVersion: 0, + BuildNumber: 1, + CodeCoverage: { apexCodeCoveragePercentage: 80 }, + HasPassedCodeCoverageCheck: true + }, + ] +} + +const projectConfig = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST', + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/inspections', + package: 'inspections', + default: false, + versionName: 'inspections-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST', + branch: 'inspection' + } + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "core": '0Ho4a00000000xxxxx', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2' + } +}; + +const falseProjectConfig = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2' + } +}; + diff --git a/packages/sfp-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts b/packages/sfp-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts new file mode 100644 index 000000000..ff8343eb2 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts @@ -0,0 +1,235 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; +import TransitiveDependencyResolver from '../../../../src/core/package/dependencies/TransitiveDependencyResolver'; +const $$ = new TestContext(); + +const setupFakeConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(response); + }; + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; +} + +jest.mock('../../../../src/core/git/Git', () => { + class Git { + static async initiateRepo() + { + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let conn: Connection; +let gitTags; +let response; + +describe("Given a TransitiveDependencyResolver", () => { + + beforeEach(async () => { + conn = await setupFakeConnection(); + + }) + + it("should resolve missing package dependencies with transitive dependency", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + let resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let dependencies = resolvedDependencies.get('candidate-management'); + expect(dependencies?.find(dependency => dependency.package === "temp")).toBeTruthy(); + expect(dependencies?.find(dependency => dependency.package === "temp")?.versionNumber).toBe("1.0.0.LATEST"); + }); + + it("should resolve package dependencies in the same order as its dependent packages", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let baseIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "base"); + expect(baseIndex).toBe(2); + let tempIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "temp"); + expect(tempIndex).toBe(3); + let coreIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "core"); + expect(coreIndex).toBe(4); + + }); + + + it("should resolve package dependencies with a higher version of a given package if a higher version is specified", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + + let dependencies = resolvedDependencies.get('quote-management'); + expect(dependencies?.find(dependency => dependency.package === "core")?.versionNumber).toBe("1.2.0.LATEST"); + + }); + + it("should have only one version of a package", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + expect(verifyUniquePkgs(resolvedDependencies.get('quote-management'))).toBeTruthy(); + + }); + + it("should expand the dependencies of external packages", async () => { + const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); + const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); + let externalDependencyIndex = resolvedDependencies.get('contact-management')?.findIndex(dependency => dependency.package === "sfdc-framework"); + expect(externalDependencyIndex).toBe(0); + + }); + + function verifyUniquePkgs(arr) { + let pkgs = {}; + for (let i = 0; i < arr.length; i++) { + if (arr[i].hasOwnProperty('package')) { + if (pkgs.hasOwnProperty(arr[i].package)) { + return false; + } + pkgs[arr[i].package] = true; + } + } + return true; + } + + + // TODO: test cache +}); + +const projectConfig = { + packageDirectories: [ + { + path: 'packages/base', + default: true, + package: 'base', + versionName: 'temp', + versionNumber: '1.0.2.NEXT', + }, + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'base', + versionNumber: '1.0.2.LATEST' + } + ] + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'temp', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + }, + { + package: 'candidate-management', + versionNumber: '1.0.0.LATEST' + }, + ] + }, + { + path: 'packages/quote-management', + package: 'quote-management', + default: false, + versionName: 'quote-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.2.0.LATEST' + }, + { + package: 'candidate-management', + versionNumber: '1.0.0.LATEST' + }, + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "candidate-management": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2', + "sfdc-framework":"04t1000x00x00x" + }, + "plugins": { + "sfp": { + "disableTransitiveDependencyResolver": false, + "externalDependencyMap": { + "tech-framework@2.0.0.38": [ + { + "package": "sfdc-framework" + } + ] + } + } + } +}; + diff --git a/packages/sfp-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts b/packages/sfp-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts new file mode 100644 index 000000000..cce32d2ff --- /dev/null +++ b/packages/sfp-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts @@ -0,0 +1,500 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext, } from '@salesforce/core/lib/testSetup'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { AnyJson } from '@salesforce/ts-types'; +import SFPOrg from '../../../../src/core/org/SFPOrg'; +import { ComponentSet, VirtualDirectory, VirtualTreeContainer } from '@salesforce/source-deploy-retrieve'; +import EntitlementVersionFilter from '../../../../src/core/package/deploymentFilters/EntitlementVersionFilter'; +import { OrgConfigProperties } from '@salesforce/core'; + +const fs = require('fs-extra'); + + +const $$ = new TestContext(); +const createOrg = async () => { + const testData = new MockTestOrgData(); + + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + + return await SFPOrg.create({ aliasOrUsername: testData.username }); +}; + +let entitlementSetting:any={}; +jest.mock('../../../../src/core/metadata/MetadataFetcher', () => { + class MetadataFetcher { + getSetttingMetadata= jest.fn().mockReturnValue(entitlementSetting) + } + + return MetadataFetcher; +}); + + +describe('Filter entitlements during deployment', () => { + + beforeEach(() => { + const fsMock = jest.spyOn(fs, 'writeFileSync'); + fsMock.mockImplementationOnce(() => { + return ; + }); + }); + + it('Should return a component set by filtering entitlement versions which are existing in the org', async () => { + + let org = await createOrg(); + let records: AnyJson = { + records: [ + { + Name: 'TestEntitlement1', + NameNorm: 'testentitlement1_v1', + VersionNumber: 1, + VersionMaster:'5522N000000c01Q', + } + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_2) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + entitlementSetting={ + "enableEntitlementVersioning":true + }; + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); + + + + }); + + it('Should only return component sets when the version number is higher than whats existing in the org', async () => { + entitlementSetting={enableEntitlementVersioning:true}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + { + Name: 'TestEntitlement1', + NameNorm: 'testentitlement1_v1', + VersionNumber: 1, + VersionMaster:'5522N000000c01Q', + }, + { + Name: 'TestEntitlement2', + NameNorm: 'testentitlement2_v1', + VersionNumber: 1, + VersionMaster:'5522O000000LlFu', + } + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_2) + }, + { + name: 'testentitlement2_v2.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_2_V2) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeUndefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v2`)).toBeDefined(); + + + + }); + + + it('should return all components when there are no existing versions in the org', async () => { + entitlementSetting={enableEntitlementVersioning:true}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'testentitlement1_v1.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_1) + }, + { + name: 'testentitlement2_v1.entitlementProcess', + data: Buffer.from(TESTENTITLEMENT_1) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeDefined(); + expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); + + + + }); + + it('should return all components when entitlement versioning is not enabled in the org', async () => { + entitlementSetting={enableEntitlementVersioning:undefined}; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'TestEntitlement.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); + + + + + }); + + it('should return the same components when unable to fetch entitlement settings', async () => { + entitlementSetting=undefined; + let org = await createOrg(); + let records: AnyJson = { + records: [ + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + + const virtualFs: VirtualDirectory[] = [ + { + dirPath: '/metadata/entitlementProcesses', + children: [ + { + name: 'TestEntitlement.entitlementProcess-meta.xml', + data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) + } + ] + } + ] + + + + // resolve components of a virtual tree + const virtualTree = new VirtualTreeContainer(virtualFs); + const componentSet = ComponentSet.fromSource({ + fsPaths: ['/metadata/entitlementProcesses'], + tree: virtualTree, + }); + let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); + let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); + + let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); + expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); + + + + + }); + +}); + + +const TESTENTITLEMENT_1=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement1 + 5522O000000LlFu + 1 + +` + +const TESTENTITLEMENT_2=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement2 + 5522O000000LlFu + 1 + +` + +const TESTENTITLEMENT_2_V2=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement2 + 5522O000000LlFu + 2 + +` + +const TESTENTITLEMENT_NO_VERSION_NUMBER=` + + Case + true + SLA Management of Case Resolution Time for AdCreation HK queue + Case.CreatedDate + + Case.IsClosed + equals + true + + true + + First Response to Customer + 999999 + false + + + + Case.Status + equals + New, Open, On Hold + + + Case.Type + equals + Hirer, Candidate, Internal, Partner + + + Case.Priority + equals + Urgent, Normal + + Case Resolution Time + 960 + + + Update_SLA_Breached_to_True + FieldUpdate + + 0 + Minutes + + false + + TestEntitlement + +` diff --git a/packages/sfp-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts b/packages/sfp-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts new file mode 100644 index 000000000..5bfa5628e --- /dev/null +++ b/packages/sfp-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts @@ -0,0 +1,39 @@ +import ArtifactFetcher from '../../../../src/core/artifacts/ArtifactFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; +import PackageMergeManager from '../../../../src/core/package/packageMerger/PackageMergeManager' +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import { ComponentSet } from '@salesforce/source-deploy-retrieve'; +import { jest, expect } from '@jest/globals'; + +const path = require('path'); + +describe('Given multiple sfpPackages, packageManager should be', () => { + it('able to merge into a single package', async () => { + const set = new ComponentSet(); + set.add({ fullName: 'MyClass', type: 'ApexClass' }); + set.add({ fullName: 'MyLayout', type: 'Layout' }); + + const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); + componentSetMock.mockImplementation(() => { + return set; + }); + // TODO: Complete along with PackageMergeManager Feature + // let artifacts = ArtifactFetcher.fetchArtifacts(path.join(__dirname, 'artifacts1'), undefined, undefined); + // let sfpPackages: SfpPackage[] = []; + + // for (const artifact of artifacts) { + // let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); + // sfpPackages.push(sfpPackage); + // } + + // let packageMerger = new PackageMergeManager(sfpPackages); + // let mergeResult = await packageMerger.mergePackages(); + + // expect(mergeResult.mergedPackages.length).toBeGreaterThanOrEqual(2); + // expect(mergeResult.mergedPackage.apexTestClassses?.length).toBeGreaterThanOrEqual(7); + // expect(mergeResult.mergedPackage.isApexFound).toBeTruthy(); + + + }); +}); diff --git a/packages/sfp-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip b/packages/sfp-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip new file mode 100644 index 0000000000000000000000000000000000000000..b5436df6dd5882319d3577edc14132a05275fe3f GIT binary patch literal 8405 zcmeHLc{mi>8y*bV2FXqcNtQt*OVP;A*s@)OF-FEV%vhsE#LbPscOQjDOzu`_A`$=e*}N)TIEj007j~07HPVX@3$B zyo($Fcmf0fWB~vG9EC>gv&A@ipnMT%3>=O0@WR-_&|XMK7~D&8`G>6=!VBgA^MZk$ zF(~(wCQww@VW#p)F@bE&ckCUw(zL=U<037{XmVC_9&h!HV&DBr`VgbV03Q&QYcx84 zs;A6Y(?tDC!PU7CGuK|c1HqB&T{#gv&A6sg-|Zat^=h7%FuLAjvEkp z8XbrFGnH>~ew;o~>*SYism#xLxw8XynH${~)FU=Nj+6B%y;h9{ zu52pht}Uve$*oPY&=(VK@j{;a^p(>1c+Y=IFZGiSjx{%2(Q*L=cZ|CUtu{dh0Equ% z%fX#s?#B_XsN-K+?LwrAOSKf!{n&3S`i>| zXa8=>OIIU&$DhCOwTkj|3ad2K&Im8x?lmd#(n826D5r8UTr{)~%_aFtTLg3Uj>?r( z@Nm2s;wt;%j>JP;lO`f1OjvVlHI4IcrUgAYWI~_W@9jEWQ=!IS9@#&^qo*^cTt0Gv z_wufG&Rg1O^U2q4sf*$oijA`mWyDh|*+zKTEY3`Xo_`5cQW$WBfdZo_>FBD>7?u0? zwdZ3xllR=ZVF30KvW$k7%;g_E1d(?`WiPNVZxZ0kToU%>+uBX|weehHP~K=bLUI{m zX|$UW2dg{?dz?lXZ|TiKfE`f;B;;{-!a0y&gm>qbW*V7i1-8;CGkX{V-(YL@(&K5! zOAbm6_Uv@4$irWrnin1y;%2xg%o;0$zdeX8`}Dr()Fq|N8(6lF*Y=$~*b|-*I8}pw zPp0K~xk=EX>2>!sV@P21wV|{G_TS$Z9*(v+`W|^DyCVoas+n2%>?7!$haeQ42(zz_ z=^9H1zdb6L3QK$f0Y5m$V5uZuJW6R8g*33Li+N~-ch%-*2xY+~N2fF-)V1ddIq6s&ot-up;Za&zejw=aBBL54K>Y)ibW zd-ciStMIo6$OBZ(9Hm?9s$>isGg?Y4y;Sd=MhzN-$fUTW1Y#{o(B6-ESGO>2mJGxeC+@@%H0up zd{rZum38gcCNzR91puJ7*+%$^VgsTAN1$UBgKsYW9VzdgXiZF=2%Ibp( zbUT$G+Ek(B(WXVlZT(u{{Bv;4SGvinfwS=(;a%?~gVU}ho*pl+>4q@#_Ges&1P@4W z@9frMvy*Db^K7{09Hjxe5?^$?oJysogl)Ja{hqFqWiY1{P@S^&1?-k;Uqo}*M1cHn zyR<2BZimQ@{%)dY{lrTyFIWg#BNoRhhCY__VfITfzg|dm~*PejNxu^FUa8o*&*?Ej`c(4;cE_ z@%~ef_qEkLvbAb@dL!X3zsB>Y-`8sk3fWpgePFIg!mH}neE!t=Tr0mMH(O3Om^;!D zf$>^>4eLno$u8zkp9M+RY(}W`5 z_^4FFsn5zEs{9f@KWv_9ShyrB6VK1|s9uD>FbN3L$cN}0DQFq2VI|K|8s;oaHom5? zNUdlXHq0LgwWc>L^9yNX;L^9G&Fr_f?mY2nL2^t{0Yob)Zkyf*f7Ma^K{z6MA~jVU zHQ62^ITJR2v+K2xyP4AinCNte1Et+tS$-QdUhVm#yqt01G=yTN`1(xnO?*O4FZ5Bw zc>@!&aT{*?LX8VZNWZ8YOvI(~Tl60(PopnAx~m)fXaJ*&TN)YI4(h-Zp0QXwr| zN@B&EvwC*|249C?Eu?m8fpz$}w9nh~>rrzA%d;u_GuU^=ybc-fa%s0LDlQg#C_1WG zu!ysQ%iWiJNzHQUb6%n#opp{O9#nt>f$O`A=oMHxr1AO!b$7$!uTV>dPIRfOJLcP) zE5}sq>2+coF=!XPornQG9Bbz@xYEQ_%}Yb_(DGStF-n@`PxX`m4e5R;&E!Wa zZKgRFdKR@C=cwvS-(AR67`8jx0r85BdDYVD>(2UEYEJ$cmxTVw)GOvuC#+P>pta=W z0=IU{slQ0J=VcBs;E3bFT+hhN;@7$aI($-fTi5P+`m`!_rTO0M&W_xo(!krGp6F`_ zK4XriJ`jG&_;O)X#UQ=TC!KBPNWaGR*de<0w}0=Z_Y4jHw)Ja|kWGtu3;~At*q4B# z-8R5G@FQV;!*hcn-8TSL**Yl7p7=~8oqKC{K=a>&L*Q_fx4YK{8R-9aB#uags{<*a zrAuD?Wp*TxFiHJ{kK2FF^))|zZ#R1c+SV2h{t|-((QF0#xw#^u8r`e;S=441X=^HK zwfV9{^-N3)9$zpYQxup})VSaGE+hJ`9gqR=5i*80`7YEMM_xU#- zsuMpl(F_(boh0kPGYLD{hV@g=craZSHxsb(sQO<^orVl{iVxb*r7LTF(Bfg+@kYg5 z9>W4-W`Uw;u9>7-;S)E9$tLgt;}8_HH*N!jIgj`xofKf;s!AjZ~`I{xVayz~^ zB#5Tu^1=mmZx-@+OKqcEh}Xx` zBIXjgZIijIa)wrB^nEFa-q7;G1@&$T|9hv1l*`hfe$RDynTYU>3(6));!SnZid?`e zoQ#dwh;QrVg$weh+Y;OAm-a@4kYzT)H!esAv?aooFF_LB+PNgYO_mn1GdLMHNk@8I zkieHpwfe2H437(P{BiKVeYubr*QP^MyGx6h&Xw((Ooya>SN8a7^}7s?3+mrA^lB}< zQTRl)xU`7jv+mez_+PZ+a_DP!W##x={|GE`w!Uh~_3?>nk`(sME#ZIFmg|!c)g_69 zjBrJ6YVKDE;x8m5t+_rKQEigQZ2mnNNqeqON>raD((3@uuw^Iy_kY+So!tNc literal 0 HcmV?d00001 diff --git a/packages/sfp-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip b/packages/sfp-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip new file mode 100644 index 0000000000000000000000000000000000000000..6adbcf2731d852b7133e9e771c7a5152ba9df920 GIT binary patch literal 35211 zcmeHQcRbeZ_qVgj%BJkS$=-WpQ$qG0*)ngNtgMh(vO>tpC^J+>NOtzh%E&CgTe=g{ z^YnaE{qg&}UcGK9pYy)X^*-l1*SXGh$V)>)VSs_b!h*?zk*nk_p~5IYfq|7$f`RdX zfq@ws=-AoY7|>Z5S=g~?+ZtM1IU3m5>e-lB+u3UC*w~pE>gd@qfWFYSFtF3n*Rj)~ zH?_60oWG)B)z6OY*7gwAhxb_oLxJLYuI;RjfIo~y2@i&^fKpV87#e4U=_uyrB8mMY zQfVwqZU8jtrB-qG+qM!x{!#9Ui7)uaD0J~7+nqctui~By41sV$QEh?~^i=lt_YAQVBfvw$|-{8 z1BP#?>PI=E9z7@WQZ3i)Jf(-#Wg6P=uxXFeVxiFDHMFO zjo&(;&8LSFK%|M44v{Uc)_8#7xrcD7Z#8L>Mm{T>p0=j(PamAo>!Fi;?4c3rT;HHg z6`A!yjT8!5ZO89ca*wDC1r%H%@z%t`%Db3HsY@TgI0B$!A58QW&yly4)Uu(aX-=9! zEv|c0uJ5p<@WIPddRA`+&Cg}P5l>usYE)X*&y=&ap+(fxRN{w%!Q1Lqy_vV&nfLDe zC9k46Uli3)^s-u+4DT@kx1vBJXMAN(Bb`f=QxGI?-RxHh&J#f_tteV3KMb`F$8C+C z*g@|J&!m~<5ixyvm*-|M`P+<$`)KzmAL<6$sX9n=vNEb6mnz~Eo?l@G+ za%_6ddcL21h-?uu&_sk2uTh>VbvMhj@Y7_3B*M;=cQuqW$1-O)KMPJnX(4U5PRwO2 zqnN54wE@n+fIgGe#Q_HGai3ce?B}?%Vr|4qc#|q0WhhZG8DYsx=bJLcwokdRDXJ;r zCXH8-h>cuKNKhTI-l~i`kAEj(Nba^Kw!i#}YpUCG8I!wQQDw-DHe)NJ$XuX{q6G&7WBu2z zO3zrw(#XKv%ILF;(hT88sU^m!Uw4PE&6Wk*W-t$3uzWUB+-^$SfD!O2{jH{eg^X4C zz~EvPm7tar7#WjzS@g9*N~PCS6?OfWOzbn&#rhLUp60)j(#(C|LIoq(Ir@qG%-QJ( zDTS!Z9~y3lfZ-9b)T&D@M=6V6xh}*>#U5oX)D3pg<&~bm@M~|WRIEIX;rSa`X-w@6 z?_AEKrU>%26U5&^Ig71dgopPy-IOi~yhfTw+)-|l12lZF&z>4M;;#=K@T-64sco(7 zZS)KnK(E?&`t1fhwbno_-iH7KZS?R%8I|>&AC zlgQd6>*&@+_bp`5zf&T)r<2?%NdM9o`3m>Nl6h$PTPBw@8lzhjD$FJEko_>yQX}p* zCpLEHUC4j+rr(9Bw%2d=+JM6Y-+Mi93c+q{ESa{5UhT-?p^%vQ?#m90HF&sE;5Jw+-@mJHT>mqDg*9G{-kLj?EA z#=A2(y02bsbR{IqAmzA73|%mPa%-sdZBMY-tKB&vHOEh8>YBZ&XWn=_L4v07I3xbO zL409^o|UDciO~^as8;r|N$!~!Bp8^?&l2Oy8?9}uObztx=zu|kj-8${oxXwLXVVLb z;J2z}L~U^76CLM7AmA31gz&*$Kx5SWQ;)@?u!SKH-!>#dzXus&r3q5S@41@1t`m0?X+Xh_a>FCr-{X+vC+)kS|6zGNDvD(%o{|v?MRo(QJ0;I0a5e;^m*i`KTv&GEzvina6t|HrNw5z>PmvVq&qlbOq zKNiL-Z3%eY<1&v!tIfVaRzYGtb<0M>9~Mb#?Afp_HO39{p0{0D(brzw@5kSm>CJwg zYf!fE#722o+WO|qCr5&MdyWm5lS#n!vs3nsDcc^Q!nZy`?07M;>wT(ib{;l?z?E!bo8CUKKeAdX-tGzcqZZj-! zaU#Jp&}wH4>rM5PY>|gXyuWvk)@r3Yl;MN_W=`KUsims%OC9R99)0L*?^uboY$`+s z+wyZ4q1FT;Ka?bW@Xo17tbZ%p7P^=hNwny_fku3HGol_+f8`9^qMejegaC1Md3qC^ZXs?z6+VJrPqVtZf2 z;&VpU?Tw!HS?n|GzEWILLeoM$&sF#-O+$~pfngFBBXT!CnFQf#u6zYjVHy&BQ-3ic zCq@rbh1`Y4r~dIVund0h`$R;*?_i3(HkdL$P|L=mTT*+ zRt>SBR(+((#Fod`7T0im_3)B!hQWKRz;A$gTX0um*I#E&l%W^*U(3s0PkHGq7p%IL zJ%o31_{jFNWc-pBJQ6vY$_P6Q0$(Ktq$A%?zw#&nWy4zb$mgRCy*bc_>>aVViTBYL+~iBsth)AFMRlf^wyiRJ@Oi;0a}q zqqcUJ>79hv+B!QbCkg3i7mIT!*c|cO-#m8ie$k&0+IV|G@MQvuZwTAPwzntG1=CL} z&PMO+JRJ8k|30<*WqW7~e4U|WLG z(F3L~ejrQfm&>xyF|quCK#kK8sAsNYYin>YdHYd?hP(?d-JWRz_xL`iD_Gdx*3Qa8 z_RAT8*#6Oil7XF_iKUUPyp5HEiN1jiy`H(Py`r?GHzVqxZO~;jWnV}Ug?p;mQKI~& z$exIVXlf;bAKIz2ZPxn&WdYUZ0`6h!IFUw|A#mm{_B{`X5xF-4jbjfp;wd6TMCTei zsbS43Kp}RmJ+*J>Ri&H-?u0sajVGq>C{$Y_*_o#om|6ok-IIzmsYIcp^}At&>KoBY zP|hpUD5R1jNJqVe8W?|aCt31o+a|=4mb;Fqe3Hv}2vsl|v1vP!;GkW+H!oY_xX!s0 zZYq}tF*xZdPb3jB9RO9s??lDOM=Ex<5O3mg_>pvMjL*ywbVA~wpa|vED(<}0l;h>P z=?K=(x!l*gP)wFiBjcjN@0dH7!!EhIFneEGuKyj3ALmCz_R1N+i>JEv?~Nktn0o5) z86{WBh8mv+Z+fItX6qzt_(?CH0XdER>9l30@eTw|<3r$|kiTR)>GqC==$$OgWkYJ< zfjJ+M#m%7bie7bPk&dVf8_=_ElJ{WxNbTNqw3W)Aono)UOR|_uy{&{zHL3g{mtD$l z-1c1OBh}J(2DZwD*K142UQQ7Pj@w8mKR9R02`>Na?#wN5qM|lPc+_J#C& zB-adOLat>*6kSgk4QnSmb1jP+P+tp1VXc%AA`wX~Nl`y2DIExgQbN1Cn{1#0r<}L;);%x3#f=JN~0bo6HeOQ?pC><;$G_-gw2im^HDguCGDoai8VzyOsC1Gi&1(`^O0&t9qcpz+8T(awILR%?&IJ zEbVmcOsp*TJXW-lpye1NV&yg_4;SY}6j*qu7E1tO3FVbJNQ}5V-)J)7yBf4uo7+-_ z`Wj;RDLfm*wtflcoqHA$dg`*oUW80b8bkBv>v)r*YBCfEi_-GEgUJ+i5)$(kyja?_ zoAQ48EfyW)us7MDpntuo7-E1XDTIk}xD#Hrx!2TqQUh7HgfUmDKyYzuVqEJjFYgx zvZbG4_1bfI?#0;v*JZU~6w%kj2`)0Xtfh@?)t{8{-F9)w8M`FX#aynC;WY&lrS-{V zbr`k?yfvz09GUVuEpFx`0#-pKFcuS~PxClW%LZX4__@w4%JmMK8oPFT1a&p%4kVc~ z5f;ZZxt`;1Oj}M2zSCN`WK+Kxlp{84=xPO>jgp4HyYXhF4PjbO!Rf}^hVAu{)u?xc zC@C;hx81e^=%F0LI+NeYM58g6P-_R9IvAQrUg?c*fQE_%G}Pa-1bhjd_e`@GXqv!?xpF0_N>E;e5LMLlO0gn+Zr3X0v&#WWdL(+d zcd0!dA|clZFhtJ^UvM@uGJ5ucIutTsWW*CwC8tXUz9*)qnmY!b1|z=6kr@(#LBcK< z^+P5b`eT!;&<2S%VgMUO6%Nk_b&g<@IiqJix>L0z0WmeY_%F0*`Z>UIyq!buL}@D6 z(B6pS8$_z-X-_QtNL1kwaknEo{R*|(q7Iot8g@3G$_{7V#f&Cs4B3zLRyZ415pLh- z-D=9#j~#i2^0ID|6{c@!GV|l`-B)Fy6MbYV)E`7yKU|lqFk;hS6CR|6JR_sN))crA zY>4YekcdFmM!bZ`-O5Da`e3=Qgogv8|J+TUO5PD;8p^XmrV?irx!G57vDWJov|ae< zC!DPM9>{7)GH2!VaYCB4E#Wu7h_q}H1&6v7z~?Y@n8Htm7~A6@-H^T{!Pc~@KOnP4 zCRW?(3LzpN43qGIk`;lN*yc`tKB;#Wxv^{*>RJ%^on5y}-SDqp=1hU7l~as939#lo zUpKivwdnq^=17S7ZPfI8mbh=o@wZz}SK|Yz3gFTf478r#s+_}{&afI}uf5I5#~@DX zb9~hZ?}rsa+yw#9rYU6e-9Fg6no^YDXzPWNMq7sLvSKSL4QsRV}m)wJA5(StLz_gek%W-d&hDzwS1*-Rj6kQQ1p9V^ysV zxPj_Aw+2aM=atp|PH@TW{aD?b>ZgH~*0s{KO^)UkX9UHfJoH{(XmfG!B?oAE1-Z?x zKh6JSlk7jn;bClcUeB{H??&pn^2(Ph*YIPyj;IrDv^j%5XMOZd8 zVIfVLv}80tNO{WKbFqYziFRo+?bMO@VEB?Ia}yaaJl1=&8M6|Sx8OM$WxMk0*^%>{ z;+;bSR1;)UuJ8KZMM2GV5kFSSmtIe{n##*&pMnF{>C}H#eI*-kG)Yt_>mSZp;K689v@{UYwYLtE#Z(8g0UPkI`p?RTZWK zZ=h{AJT#W#wp39{I@T^zj9kwZofdbIif6CO(3l_%VUZxbT{bAb2oX}3sBY9zrJr$? zqu(0QG(mTMfmI7SdANMc3DGja$d~X6P4^9sbt7LW7nwzE^%lhy-7F|1doI#ZNp|Y1 z;?p0f8{xE?W<8RdwtrAVbV^oXrMp)TbdZKTZjPsvRsae9j#Ye3#_n%OBmHM=hk&Me z8EB>vr(>c&0`nb!^!xw+t9@F8x5(8qBKj=4!P7X#d!Y(Z-r*&lhl4^}0<)Z5z+KLG zmODJ(+`+r*8OHMVr3Cx-;;>F?mUR%f{h$LpWjU)g&q7z@_Q0L>= z6hqzKtVjv>_Hxpf7C4>bnf6rEck(Ja2Xm20FQ%jvB6YDqVsc!MDOZNx4(5D=DM3OU z?8AHsD#G)A^{sP3)#qK{F`(Px9!<%OKk;nj54i9l3FaP0!)>ZCUT2rGs3*51G?{Ni ztC4Oy3+=8FsRs|0(>%2vN#cDG=9cKv);b;1gT2H7TjpFmf>Vo90w6*=RHve&)8tcNC%$TD=>NMeP#1$ zAFsA9CTXxohr~{Z47DPq7~ZeHFIhnX&yYazu$I!obxx4Bg@2+%;8w zhb2%GYkgzzeBq#;3bpDX(Nxi7l%#aSASI5|;Dfn&UR(*iD-NY8wsS`fI#_sY7>SYg z=7z^)RaTBoX16B?2U_LbDMV|HzUIcf>esnWK5p!1i_&6Wq~Fdjw1X%1=kxNYz-(!q zW7)x|gI}KMVZ+nNP#psks>-YsY~M_WR}R zJtTPV%;z6Ye3XHj+1tbV-l{RJV?^{@bcP=st)4~*7U;d!E-Y;V&utdijhmpaZX-qM zyxwdQVd2Z17)<(PcXwjVFRWgdy;3}^_124qGtVO!thh0}I?l6H!o<+QsZwr;QPwC4 zUMS&wKUA8S+a!*76}|n++mtbv$^4WawDNA%>M8cJS%DxEhnmNZG*h_-sspsTg@Kq4 zP#=&%OMLbScJDhvPYy2ZJ9|HLGq8%9Wxo+)fy3gEm zew3p7QL1=VWuC&dO=wNZ15g<&D%t-;YQZLc4y11w3>et2-{c&k@R#NIyNM|f zcUx3yEP;nPz?zs!bh`Lq$ac~qlgNwtvXCZI?YK=6=uv4YrlW6f7fJRbJ`?EE;ZzCv zX#RA4Ae6#1RH_kuO^Q?pu{SXWn*5b&2f-^?DiWz0bTmx~S9QH|LC)qp+@aBhBs4FYZ#Q@;Z`K)l zBU)FSCF**I!6+KBv2;~S4! z!@;`HduWFhBxsB~djcm-jWQQM*1Q;nRMM+1d|ZHUuj5Hi6GksuQ`IJ*YF&-+%qv1; z1+KXw2HsM$8--UrKSiCwv4@9yR*3zYFPE#WcHiv#g2oEGYhlT0Yk9)cHzrGHI#MDm zu1TqqMWks))D`nRZo;IvYMnakGcTD{nfg%e`6t-cENccR;o4NqqMLA~?Tz&WcfY#m z<3|$#r)!-5hGr*NYLTaFC>~LPSKNPrcb(^9|za)q1 zg(4tPL__^PzX(lv+q_obuKiqBlC?s^(>HQL`H&J8#aC2Jr^s#@whpvP&dm(uw9B({ zXg{75N{J1pXIjAI>bDh=fZ~ARBgs%4LknbnYzw>b3ev0-SG!7^*zckN+?+}Ycws9A zS%_@Be7Zgchk%iE2RokmyK#gh5*g2ljC5SQ(px%ij4iehXeb0mU0w;!kIw+=><7X8 zUkBF_L?GN8Wv3@x&#Ov8)Zr@vWKxy0F4Z{5!!v<(m&9Z%nhQ{SMJ=A~4k!%LL3z~j zy(pg9oA~5bc@ZAjK z9`wDxG_9~(v1Zu`O>g96XX7fSx6x|p6iX?|6G^VSQi&RS&knKI2JW_;shNh1_2%=@ z8d-X6RF>RmKXL{Hp^v_mfqb+k54xVk`CfR!g}Io4QKHPr_c*K^?UTnVJCVq^+1>h@ zf@L+S$rm3)Xrzy8Ug}^wZ^#%6PK=2`^YcK z#gk)>(%srw=Hq{nezv{(3B`ifvH~ZF!jf8)U9Gz2(&1TfvBm$STv1EMrP&8$=nHe!N?wa*^x^70=%k;O{W|&g4 z7Lbr~TWbN>&$uEt=@P?QO@!_sb2FT=SYV>u-Y~F`etjAGw#NLj9a`iD1ZabI+?WA> zP?LYJP4DX|vAMJ&52zmzAmbc=m!3o|j}xwCuUgD!(K(3Ml))K{ftu3k{V2M5e=f|j zIJ=<8)SFMpOf}Cxr^3IT zX<6(xtnfgVT?EFAzjPP(b@lk{%|VX!Z~^LZ##zX}kn;uBovvU$62V#m=ip$%wX!)^ z{vNVP9>&-lVW!9uan};zKH8dj{L47bFm@Fc0q8K^f_$6nHtg0Uc0*_bYj-6gua|`k z`XKY5L)KWM%ED$)TUVHK)%Abxfq2(jKN&DQt~0bL<`X&Xsb?wP%NS9 zDLkyPZh3$x{ zmtL`Rl9u-lb*-BuVWxsNXBliR zEkhGbClZ6Gkd1(`=|U#zFi))XxFtGFC%B1GLEtz*G0g)0-`j@Go(*n7NM8;bZr`@0@(* z9@fW*=su;U>_(*1$ttTf1BczIGD;3Lw;5I9Cw9ADbJS+_EkjY`mAnBcG-HkXd|hvi zwr%G~kro`JZfG#7rVwr|ZbQC>OuR?Ht{6S^$GTd{aV&BsI0D&qYYF58s zE9iJ@aDD_GVx%4`rQ20l#GOk34G5*zg!z4T2@zFsD=?-{YOzQsuRXDaF705kPvjJS zp}e9lw6zg?^}_hIh1Eq|H(n)Y{VAB{kWcO{yEiVa=N55Zx@LKe&f(2v8R`2z)@#8G z?eHs@p|=M3kkyes^qmbw@$%TVQ;)Hfre6Hu4|Pf5#d0u~9HKRc%ouaIaf)U6Ir?yZ zTcZK*3hjY6m}VOu;!D0;-H0X6*VHqHC4pz|6fSac>~&LFHWB1Fq?ec$kb5fx#;h6G zz`AhS3w-1_v)0wnyXS$tK+zDvb*sdMfG zqS&jV5B~#bj>0>7>TVF;A_c_++>xwc$S%lG#X*x=?O zZg>lPTV3TNW>lZs887shSta}idw$sJ>5jQE9gJk6&ev6*i3?qN4-#tcd=zTT->K&c zBC&N3FC>rLF2B^Ev#1!(QD;rzuYnWZV%`HgSYu=QY&NK^l9kTO{jNSzjgOy(U~CgU zbx{yY56jY7om`(c2$Kw(_{=)hO_S&DkNdfpT+q9<8j~}go$H>iideNHtwL7Xjmx(= zn@iDV^l^yRIb&RGHflibUd7jP-{W*R#hu@YbolOBJAD!a7AlYtQ-6pRUqF2ctB#+t zhuqq~lKQz8W7ZQ@sL3A1H;8apxlHwreuujGT+@*9e19Z+6#w<=Qi3*jZnHa^PYjBM zW#~69J8-tJKx_Lw-<+p)xy-;|$--8O{%AVV$6=;A8uyB8yg`VBV}?C^m#h+jZlDRy z6}RXq4z8!&bUxH*&*wyt8oPK`Sc>yelHkRPd!xiWg6?Gq$@0FSxsIZNPJ#VVn7dyQ zN0UO>up&FUo=^%m6PMJ@$CNS)VyTWgLqWVrt+AXkj)7>ricL)C1iubo4BUV33J zgfANX-cz^O#LBP7o5v}2Itjbahjk~rwbKbTJ_`lyD?!5dy%?!&Hh(?PdpQ94>Ut_( z?2z#9ChU~IoT*!c3GU@kMAtbR%1j|fq0>@QpgAtgLW^;m5~oMRQHxeqo36a5gpR zuy((#r1t&8+WmVY?tLZ_&aB()6;@jUndtJnbai<9`IU&5r1yw8IEC@Z459-eAO*qK zQltw(W8BxRV5F*7JDt3kJ+TDSD%MQ~XCU6!F#@u?=d`ZxMrgZ*dVYnsoqQ?vUhy3E=wDWc{F(dZuOAI}(fkmu9f_(Yf8a@EZi7mK=+F{pC-{h*F%Y+sGoZWQyQKvJBJ zF`=f$E6q(T1vegCS^L^x>-e_sm)?l^nhW`kb$?%{e>?qXh?FK?0cjTwq@VZc)9**w zJrE7u!UThW6>&g+DB6;Zj$P>q>lNINAliixm7V~n>?oamH^9lUV!ns#QS4Lr=&gsJ zl4A}n0nyuZmuaj_* zLI8tpZlnteWx12|gPEzt8vf->9$Iu;n9H}B64`NuKO*^mG7H44feLDXCY&m~hmErB z48hmrQr4~9x%qadJEY~^oM=?GLVw)dKAnM?F_aq^q~3EHQtO*9lzD7dU+b((sUzOZ zdw89N!}bTazk~k{jsNW=&E?H~Q41uf4X}{tH>@W=PUC=RId&=Q&*-tnXJlj;X)`#9(l&c7 zzPiVxpI6TjC06`K0|UY!9LEwDOKmXnA?qUt_R=zT{1SF9&sqcB{nxlO4dug zKGf0`D3la426hl=yUZqo4R}p5wjR83EK=g^F7lMwKI5$CG>A#&|D^h=_90O0;VzY-~=io=;8@d_t|1a zr0I%s6wbEoT)z(f zK#^q*nTyIi7KVQy6=|HhFd{3WYsDDgNxVQgfdP94r%|wxz#U;NwJlR=x|nK0?_OR( ztbUE(s>hBEwaHWS{L0|u4`cmVZpB^_=pd?4ZYK8OzVdN5S5dBJSph0%XE zmapA=4}<@USo_&mf7{LXMl=4S{B|%bwpJ{*ul>bTa;iicP zVvpN5$5*j?46;4@lVT70?;Qx)pUR_c{XlZk08Rg0$akCk9Y{VtyuHS7`_JC+z<~bx zr-*ydCho9p9BmW_5|Rc``e_kI+s6H9I7}cxpS^J~=Fbl2bEh@XP>ySBuh-iCv!|{8 z|ML288khZOAO~#Ulf;Jg9|rP`q;KaGn5RE^fP1~z4hER;E5&~4%yzQuy?Z(bvSH8t z!XbZ_{iPW2WB_~jb`AhIpALY7JR=CmzB@SDyA1>-4X}K=Kn`!U#ZK2 zF7PuAP=j+Sa|cr0zefBuDn1JRXqPY$dSH}=d#cdCsCTah^C+folc9UJWQsRo4j~SgO#Qf1 z$-xl*Nta->r!oXkF~g659IVZIk-78f0{M9)9|1V*8ZChP_HW5{@~@}-w?zF60JLE^0J3i}M|&n5%;x0j z0@>TS{L2msM=>95EpUL@mgQ8H_Y;`EvncK>{OAq;1MpeE?DHwk{14E977AHA*(0-grozxX>)AGy5!Bc<+Lz6Cu%rE>oPc;8Xu@sMNh z4($H3w-_-2lYhT#^1r-j??xYsG#2|@_`Oan*={xOgzs`TjnM-bpNfR)gxqdlAw{W;YhUgNMt{y5kZ zReba^-hqlmMSm0OlL|5ZiNAZd%0N#VfJXc;fcqUaA76tGyZ@`eGv`zCWhbREj$ZaU zP-5@tgAv=`Jpa_yuY>jLpR{QUJWD?%ZGyJwKLWFNM`-`qTiKURAIwp0eiQucuS!Sn z41w^a0o;MVviOu$bqw9nZ~ROi!x04ibLh4!`}@(KkjOZC0SAOL4G;x9`~BT2{-^6W zKces9=vYzyG|>NJ8so5gY&<;>C#5ouUQjuhPZ5Pv(+CL6cjHb_N#eoW?Hl*E+iG7B zOyFl4;4W~Z_3N2;Ca{)q~251E)(0&W#!=c>2(e2@5y9+9R6zGYn zJ$j$uK((@}r;hkX(el4h@m@JT=t%=S1$v@W=EA=Le4?t4R>dD6UsnH3$WMxz|BbTu pYOFy|8bA%0IQ}il{wK)as2du1-C*xm^U8qD08fL0ukQWr{{TM{Zeaib literal 0 HcmV?d00001 diff --git a/packages/sfp-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts b/packages/sfp-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts new file mode 100644 index 000000000..dd2c050fe --- /dev/null +++ b/packages/sfp-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts @@ -0,0 +1,55 @@ +import { jest, expect } from '@jest/globals'; +import { Logger } from '@flxblio/sfp-logger'; +import AssignPermissionSetFetcher from '../../../../src/core/package/propertyFetchers/AssignPermissionSetFetcher'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new AssignPermissionSetFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + +describe('Given a package descriptor with assignPermSetsPreDeployment or assignPermSetsPostDeployment', () => { + it('Should set assignPermSetsPreDeployment property in SfpPackage', async () => { + let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + assignPermissionSetFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.assignPermSetsPreDeployment).toStrictEqual(['PermSetB']); + }); + + it('Should set assignPermSetsPostDeployment property in SfpPackage', async () => { + let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + assignPermissionSetFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.assignPermSetsPostDeployment).toStrictEqual(['PermSetA']); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + assignPermSetsPostDeployment: ['PermSetA'], + assignPermSetsPreDeployment: ['PermSetB'], +}; diff --git a/packages/sfp-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts b/packages/sfp-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts new file mode 100644 index 000000000..9f8d33dd4 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts @@ -0,0 +1,85 @@ +import { jest, expect } from '@jest/globals'; +import DestructiveManifestPathFetcher from '../../../../src/core/package/propertyFetchers/DestructiveManifestPathFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +const fs = require('fs-extra'); +import { Logger } from '@flxblio/sfp-logger'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new DestructiveManifestPathFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + + +describe('Given a package descriptor with a destructiveChangePath', () => { + beforeEach(() => { + jest.spyOn(fs, 'readFileSync').mockImplementation(() => { + return destructiveChangesXml; + }); + }); + + it('Should set destructiveChangesPath property in SfpPackage', async () => { + let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.destructiveChangesPath).toBe('destructiveChanges.xml'); + }); + + it('Should set destructiveChanges property in SfpPackage', async () => { + let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.destructiveChanges).toEqual(destructiveChanges); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + destructiveChangePath: 'destructiveChanges.xml', +}; + +const destructiveChangesXml: string = ` + + + + MyCustomObject__c + CustomObject + + +`; +const destructiveChanges: any = { + Package: { + $: { + xmlns: 'http://soap.sforce.com/2006/04/metadata', + }, + types: { + members: 'MyCustomObject__c', + name: 'CustomObject', + }, + }, +}; diff --git a/packages/sfp-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts b/packages/sfp-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts new file mode 100644 index 000000000..d7b7a5c22 --- /dev/null +++ b/packages/sfp-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts @@ -0,0 +1,48 @@ +import { jest, expect } from '@jest/globals'; +import { Logger } from '@flxblio/sfp-logger'; +import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; +import ReconcileProfilePropertyFetcher from '../../../../src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher'; +import SfpPackage from '../../../../src/core/package/SfpPackage'; +import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; + +jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { + class SfpPackageBuilder { + + public assignPermSetsPreDeployment?: string[]; + public assignPermSetsPostDeployment?: string[]; + + public static async buildPackageFromProjectDirectory( + logger: Logger, + projectDirectory: string, + sfdx_package: string + ) { + let propertyFetchers: PropertyFetcher[] = [new ReconcileProfilePropertyFetcher()]; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.packageDescriptor = packageDescriptor; + for (const propertyFetcher of propertyFetchers) { + await propertyFetcher.getsfpProperties(sfpPackage, logger); + } + + return sfpPackage; + } + } + + return SfpPackageBuilder; +}); + +describe('Given a package descriptor with reconcileProfiles', () => { + it('Should set reconcileProfiles property in SfpPackage', async () => { + let reconcileProfilePropertyFetcher: ReconcileProfilePropertyFetcher = new ReconcileProfilePropertyFetcher(); + let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); + reconcileProfilePropertyFetcher.getsfpProperties(sfpPackage); + expect(sfpPackage.reconcileProfiles).toBe(false); + }); +}); + +const packageDescriptor: any = { + path: 'force-app', + package: 'force-app', + versionNumber: '1.0.0.NEXT', + reconcileProfiles: false, +}; diff --git a/packages/sfp-cli/tests/core/permsets/AssignPermissionSets.test.ts b/packages/sfp-cli/tests/core/permsets/AssignPermissionSets.test.ts new file mode 100644 index 000000000..8c8660ca4 --- /dev/null +++ b/packages/sfp-cli/tests/core/permsets/AssignPermissionSets.test.ts @@ -0,0 +1,198 @@ +const child_process = require('child_process'); +import AssignPermissionSetsImpl from '../../../src/core/permsets/AssignPermissionSetsImpl'; +import { jest, expect } from '@jest/globals'; +import { VoidLogger } from '@flxblio/sfp-logger'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; + +const $$ = new TestContext(); + +jest.mock('../../../src/core/permsets/PermissionSetFetcher', () => { + class PermissionSetFetcher { + constructor(private username: string, private conn: Connection) {} + fetchAllPermsetAssignment(): any[] { + return [ + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', + }, + Id: '0Pa2s000000PC8fCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', + }, + Name: 'Salesforce_DX_Permissions', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: 'test-sfvulqawd2w0@example.com', + }, + }, + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', + }, + Id: '0Pa2s000000PC8aCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', + }, + Name: 'X00ex00000018ozT_128_09_43_34_1', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: 'test-sfvulqawd2w0@example.com', + }, + }, + ]; + } + } + return PermissionSetFetcher; +}); + +describe('Given a set of permsets, assign it to the user who is deploying the packages', () => { + it('should assign a set of permset, if its not previously assigned', async () => { + + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(2); + expect(results.failedAssignments).toHaveLength(0); + }); + + it('should assign a partial set of permset, if any of them fails', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 0, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Succesfully applied the permsets" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(1); + expect(results.failedAssignments).toHaveLength(1); + }); + + it('should assign none, if all of them fails', async () => { + const testData = new MockTestOrgData(); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( + connection, + ['test1', 'test2'], + null, + new VoidLogger() + ); + const child_processMock = jest.spyOn(child_process, 'execSync'); + child_processMock + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }) + .mockImplementationOnce(() => { + return Buffer.from(`{ + "status": 1, + "result": { + "successes": [{ + "name": "test-sfvulqawd2w0@example.com", + "message": "Permset cannot be applied" + }] + } + }`); + }); + + let results = await assignPermSetImpl.exec(); + expect(results.successfullAssignments).toHaveLength(0); + expect(results.failedAssignments).toHaveLength(2); + }); +}); diff --git a/packages/sfp-cli/tests/core/permsets/PermissionSetFetcher.test.ts b/packages/sfp-cli/tests/core/permsets/PermissionSetFetcher.test.ts new file mode 100644 index 000000000..cc8bffb51 --- /dev/null +++ b/packages/sfp-cli/tests/core/permsets/PermissionSetFetcher.test.ts @@ -0,0 +1,115 @@ +import { expect } from '@jest/globals'; +import PermissionSetFetcher from '../../../src/core/permsets/PermissionSetFetcher'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AnyJson } from '@salesforce/ts-types'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +const $$ = new TestContext(); + +describe('Retrieve assigned permsets provided username and a target org', () => { + it('should return all the permsets for the provided username', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + + let records: AnyJson = { + records: [ + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', + }, + Id: '0Pa2s000000PC8fCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', + }, + Name: 'Salesforce_DX_Permissions', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: testData.username, + }, + }, + { + attributes: { + type: 'PermissionSetAssignment', + url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', + }, + Id: '0Pa2s000000PC8aCAG', + PermissionSet: { + attributes: { + type: 'PermissionSet', + url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', + }, + Name: 'X00ex00000018ozT_128_09_43_34_1', + }, + Assignee: { + attributes: { + type: 'User', + url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', + }, + Username: testData.username, + }, + }, + ], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); + expect(permsetRecords).toHaveLength(2); + }); + + it('should return an empty array, if no permsets are assigned', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + + let records: AnyJson = { records: [] }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); + expect(permsetRecords).toHaveLength(0); + }); + + it('should throw an error, if unable to query permsets', async () => { + const testData = new MockTestOrgData(); + + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { records: [] }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + throw new Error('Unable to fetch records'); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); + + try { + await permsetListImpl.fetchAllPermsetAssignment(); + } catch (error) { + expect(error).toBeDefined(); + } + }, 500000); +}); diff --git a/packages/sfp-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts b/packages/sfp-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts new file mode 100644 index 000000000..6afcb47cd --- /dev/null +++ b/packages/sfp-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts @@ -0,0 +1,35 @@ +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; +import { AnyJson } from '@salesforce/ts-types'; +const $$ = new TestContext(); +import PermissionSetGroupUpdateAwaiter from '../../../src/core/permsets/PermissionSetGroupUpdateAwaiter'; +import { expect } from '@jest/globals'; + +describe('Await till permissionsets groups are updated', () => { + it('should return if all permsets groups are updated', async () => { + const testData = new MockTestOrgData(); + + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + await $$.stubAuths(testData); + $$.setConfigStubContents('AuthInfoConfig', { + contents: await testData.getConfig(), + }); + + let records: AnyJson = { + records: [], + }; + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + return Promise.resolve(records); + }; + + const connection: Connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + + let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( + connection, + null + ); + await expect(permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated()).resolves.toBeUndefined(); + }); +}); diff --git a/packages/sfp-cli/tests/core/project/ProjectConfig.test.ts b/packages/sfp-cli/tests/core/project/ProjectConfig.test.ts new file mode 100644 index 000000000..2bb7616a2 --- /dev/null +++ b/packages/sfp-cli/tests/core/project/ProjectConfig.test.ts @@ -0,0 +1,278 @@ +const fs = require("fs-extra"); +import { jest, expect } from '@jest/globals'; +import { PackageType } from '../../../src/core/package/SfpPackage'; +import ProjectConfig from '../../../src/core/project/ProjectConfig'; + +describe('Given a project directory or sfdx-project.json with multiple packages', () => { + //given the below sfdx-project.json + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0x002232323232' }, + }; + + beforeEach(() => { + const fsextraMock = jest.spyOn(fs, 'readFileSync'); + fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { + return JSON.stringify(sfdx_project); + }); + }); + + it('Get the package id of an unlocked package', () => { + expect(ProjectConfig.getPackageId(sfdx_project, 'bi')).toBe('0x002232323232'); + }); + + it('Throws an error, if the package id is missing in PackageAlias', () => { + expect(() => { + ProjectConfig.getPackageId(sfdx_project, 'bi2'); + }).toThrowError('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); + }); + + it('Fetches all the package', () => { + const manifestHelperMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); + manifestHelperMock.mockImplementation((projectDirectory: string) => { + return sfdx_project; + }); + expect(ProjectConfig.getAllPackages(null)).toStrictEqual([ + 'temp', + 'core', + 'mass-dataload', + 'access-mgmt', + 'bi', + ]); + }); + + it('Fetches all the package from a project config', () => { + + expect(ProjectConfig.getAllPackagesFromProjectConfig(sfdx_project)).toStrictEqual([ + 'temp', + 'core', + 'mass-dataload', + 'access-mgmt', + 'bi', + ]); + }); + + it('Get manifest, provided a directory', () => { + expect(ProjectConfig.getSFDXProjectConfig(null)).toStrictEqual(sfdx_project); + }); + + it('Gets the type of a package', () => { + expect(ProjectConfig.getPackageType(sfdx_project, 'bi')).toBe(PackageType.Unlocked); + expect(ProjectConfig.getPackageType(sfdx_project, 'core')).toBe(PackageType.Source); + expect(ProjectConfig.getPackageType(sfdx_project, 'mass-dataload')).toBe(PackageType.Data); + }); + + + + + it('Gets the package descriptor of a provided package,provided directory', () => { + let corePackage = { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + expect(ProjectConfig.getSFDXPackageDescriptor(null, 'core')).toStrictEqual(corePackage); + }); + + it('Gets the package descriptor of a provided package', () => { + let corePackage = { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }; + expect(ProjectConfig.getPackageDescriptorFromConfig('core', sfdx_project)).toStrictEqual(corePackage); + }); + + it('Gets the default package, provided directory', () => { + let defaultPackage = { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }; + + expect(ProjectConfig.getDefaultSFDXPackageDescriptor(null)).toStrictEqual(defaultPackage); + }); + + it('Cleans any other package, than the one provided', () => { + let cleaned_sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0x002232323232' }, + }; + + expect(ProjectConfig.cleanupMPDFromProjectDirectory(null, 'temp')).toStrictEqual(cleaned_sfdx_project); + }); + + it(`Gets all the external dependencies of a project`,()=>{ + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0H432322321',bi2:'0H43232232' }, + }; + + + + expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([{ + alias:'bi2', + Package2IdOrSubscriberPackageVersionId:"0H43232232" + }]) + + }); + + it(`Returns empty if there are no external dependencies`,()=>{ + let sfdx_project = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'core', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { bi: '0H432322321' }, + }; + + expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([]) + + }); + +}); diff --git a/packages/sfp-cli/tests/core/queryHelper/ChunkCollection.test.ts b/packages/sfp-cli/tests/core/queryHelper/ChunkCollection.test.ts new file mode 100644 index 000000000..85c598341 --- /dev/null +++ b/packages/sfp-cli/tests/core/queryHelper/ChunkCollection.test.ts @@ -0,0 +1,30 @@ +import { expect } from '@jest/globals'; +import chunkCollection from '../../../src/core/queryHelper/ChunkCollection'; + +describe('Given a collection', () => { + + it('should return a single chunk for a collection less than 3000 chars', () => { + const collection = ["ApexClassA", "ApexClassB", "ApexClassC"]; + const result = chunkCollection(collection); + expect(result.length).toBe(1); + expect(result).toEqual([ + ["ApexClassA", "ApexClassB", "ApexClassC"] + ]); + }); + + + it('should return N chunks for a collection exceeding the chunk size', () => { + const collection = ["ApexClassA", "ApexClassB", "ApexClassC", "ApexClassD"]; + const result = chunkCollection(collection, 1050, 1000); + expect(result.length).toBe(2); + expect(result).toEqual([ + ["ApexClassA", "ApexClassB", "ApexClassC"], + ["ApexClassD"] + ]); + }); + + it('should throw an error if single element in collection exceeds chunk size', () => { + const collection = ["ApexClassWithAnExceedinglyLongNameGreaterThanTheChunkSize"]; + expect(() => {chunkCollection(collection, 1050, 1000)}).toThrow(); + }); +}); diff --git a/packages/sfp-cli/tests/core/utils/ChunkArray.test.ts b/packages/sfp-cli/tests/core/utils/ChunkArray.test.ts new file mode 100644 index 000000000..15d92cd24 --- /dev/null +++ b/packages/sfp-cli/tests/core/utils/ChunkArray.test.ts @@ -0,0 +1,24 @@ +import { expect } from '@jest/globals'; +import { chunkArray } from '../../../src/core/utils/ChunkArray'; + +describe('Given an input array', () => { + const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + + it('should chunk for even chunk size', () => { + const result = chunkArray(2, input); + expect(result.length).toBe(5); + expect(result).toEqual([ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + [9, 10], + ]); + }); + + it('should chunk for odd chunk size', () => { + const result = chunkArray(3, input); + expect(result.length).toBe(4); + expect(result).toEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]); + }); +}); diff --git a/packages/sfp-cli/tests/core/utils/FileSystem.test.ts b/packages/sfp-cli/tests/core/utils/FileSystem.test.ts new file mode 100644 index 000000000..8686ef38c --- /dev/null +++ b/packages/sfp-cli/tests/core/utils/FileSystem.test.ts @@ -0,0 +1,35 @@ +import { expect } from '@jest/globals'; +import FileSystem from '../../../src/core/utils/FileSystem'; +const path = require('path'); + +describe('Given a search directory', () => { + it('should return nested files', () => { + const resourcesDir = path.join(__dirname, 'resources'); + let files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, false); + expect(files).toEqual(expectedFiles); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, false); + expect(files).toEqual(expectedFilesIncludingDirs); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, true); + expect(files).toEqual(expectedFiles.map((elem) => path.join(resourcesDir, 'a', elem))); + + files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, true); + expect(files).toEqual(expectedFilesIncludingDirs.map((elem) => path.join(resourcesDir, 'a', elem))); + }); +}); + +const expectedFiles = ['b/b1.file', 'b/c/c1.file', 'b/c/c2.file', 'b/d/d1.file', 'b/d/x/x1.file', 'b/e/e1.file']; +const expectedFilesIncludingDirs = [ + 'b', + 'b/b1.file', + 'b/c', + 'b/c/c1.file', + 'b/c/c2.file', + 'b/d', + 'b/d/d1.file', + 'b/d/x', + 'b/d/x/x1.file', + 'b/e', + 'b/e/e1.file', +]; diff --git a/packages/sfp-cli/tests/core/utils/extractDomainFromUrl.test.ts b/packages/sfp-cli/tests/core/utils/extractDomainFromUrl.test.ts new file mode 100644 index 000000000..a0fa39e73 --- /dev/null +++ b/packages/sfp-cli/tests/core/utils/extractDomainFromUrl.test.ts @@ -0,0 +1,34 @@ +import { expect } from '@jest/globals'; +import extractDomainFromUrl from '../../../src/core/utils/extractDomainFromUrl'; + +describe('Given a URL', () => { + it('should extract the domain name for https', () => { + expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( + 'force-power-8147.cs115.my.salesforce.com' + ); + }); + + it('should extract the domain name for http', () => { + expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( + 'force-power-8147.cs115.my.salesforce.com' + ); + }); + + it('should extract only the domain name', () => { + expect( + extractDomainFromUrl( + 'https://company.lightning.force.com/lightning/o/Account/list?filterName=00B4Y000000VyMDUA0' + ) + ).toBe('company.lightning.force.com'); + }); + + it('should return null for protocol other than http/s', () => { + expect(extractDomainFromUrl('ftp://ftp.example.com/files/fileA')).toBe(null); + }); + + it('should return input for falsy values', () => { + expect(extractDomainFromUrl('')).toBe(''); + expect(extractDomainFromUrl(undefined)).toBe(undefined); + expect(extractDomainFromUrl(null)).toBe(null); + }); +}); diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/b1.file b/packages/sfp-cli/tests/core/utils/resources/a/b/b1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/c/c1.file b/packages/sfp-cli/tests/core/utils/resources/a/b/c/c1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/c/c2.file b/packages/sfp-cli/tests/core/utils/resources/a/b/c/c2.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/d/d1.file b/packages/sfp-cli/tests/core/utils/resources/a/b/d/d1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/d/x/x1.file b/packages/sfp-cli/tests/core/utils/resources/a/b/d/x/x1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/core/utils/resources/a/b/e/e1.file b/packages/sfp-cli/tests/core/utils/resources/a/b/e/e1.file new file mode 100644 index 000000000..e69de29bb diff --git a/packages/sfp-cli/tests/impl/changelog/CommitUpdater.test.ts b/packages/sfp-cli/tests/impl/changelog/CommitUpdater.test.ts new file mode 100644 index 000000000..ce1ba2f70 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/CommitUpdater.test.ts @@ -0,0 +1,241 @@ +import { expect } from '@jest/globals'; +import CommitUpdater from '../../../src/impl/changelog/CommitUpdater'; +import ReadPackageChangelog from '../../../src/impl/changelog/ReadPackageChangelog'; +import { Changelog as PackageChangelog } from '../../../src/core/changelog/interfaces/GenericChangelogInterfaces'; +import { Release } from '../../../src/impl/changelog/ReleaseChangelog'; +const path = require('path'); +import * as fs from 'fs-extra'; + +describe('Given a CommitUpdater', () => { + let packagesToChangelogFilePaths: { [p: string]: string } = { + ESBaseCodeLWC: 'path/to/ESBaseCodeLWCChangelog', + ESBaseStylesLWC: 'path/to/ESBaseStylesLWCChangelog', + ESObjects: 'path/to/ESObjectsChangelog', + ESSpaceMgmtLWC: 'path/to/ESSpaceMgmtLWCChangelog', + }; + + let resourcesDir: string = path.join(__dirname, 'resources'); + + let readPackageChangelog: ReadPackageChangelog = (changelogFilePath: string) => { + let packageChangelog: PackageChangelog; + + switch (path.basename(changelogFilePath)) { + case 'ESBaseCodeLWCChangelog': + packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESBaseCodeLWCChangelog.json'), { + encoding: 'UTF-8', + }); + break; + case 'ESBaseStylesLWCChangelog': + packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESBaseStylesLWCChangelog.json'), { + encoding: 'UTF-8', + }); + break; + case 'ESObjectsChangelog': + packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESObjectsChangelog.json'), { + encoding: 'UTF-8', + }); + break; + case 'ESSpaceMgmtLWCChangelog': + packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESSpaceMgmtLWCChangelog.json'), { + encoding: 'UTF-8', + }); + break; + default: + throw new Error('No changelog for artifact'); + } + return packageChangelog; + }; + + it('should update latestRelease with all commits', () => { + let latestRelease: Release = { + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: undefined, + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESBaseStylesLWC', + from: undefined, + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESObjects', + from: undefined, + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESSpaceMgmtLWC', + from: undefined, + to: '2dbd257', + version: '50.0.4.6', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }; + + new CommitUpdater(latestRelease, undefined, packagesToChangelogFilePaths, readPackageChangelog).update(); + + expect(latestRelease).toEqual( + fs.readJSONSync( + path.join(resourcesDir, 'ExpectedResults', 'should_update_latestRelease_with_all_commits.json'), + { encoding: 'UTF-8' } + ) + ); + }); + + it('should update latestRelease with subset of commits', () => { + let latestRelease: Release = { + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESBaseStylesLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESObjects', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + { + name: 'ESSpaceMgmtLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.4.6', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }; + + let artifactsToLatestCommitId: { [p: string]: string } = { + ESBaseCodeLWC: 'e88a3919', + ESBaseStylesLWC: '5414295c', + ESObjects: '5c0d9381', + ESSpaceMgmtLWC: 'a155ee7a', + }; + + new CommitUpdater( + latestRelease, + artifactsToLatestCommitId, + packagesToChangelogFilePaths, + readPackageChangelog + ).update(); + + expect(latestRelease).toEqual( + fs.readJSONSync( + path.join(resourcesDir, 'ExpectedResults', 'should_update_latestRelease_with_subset_of_commits.json'), + { encoding: 'UTF-8' } + ) + ); + }); + + it('should update latestRelease with empty commits', () => { + let latestRelease: Release = { + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '2dbd257', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }; + + // same artifact version + let artifactsToLatestCommitId: { [p: string]: string } = { + ESBaseCodeLWC: '2dbd257', + }; + + new CommitUpdater( + latestRelease, + artifactsToLatestCommitId, + packagesToChangelogFilePaths, + readPackageChangelog + ).update(); + + expect(latestRelease).toEqual({ + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '2dbd257', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: 'c8dbab13', + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }); + + // latestCommitId does not exist in package changelog + artifactsToLatestCommitId = { + ESBaseCodeLWC: 'ad4d2228', + }; + + new CommitUpdater( + latestRelease, + artifactsToLatestCommitId, + packagesToChangelogFilePaths, + readPackageChangelog + ).update(); + + expect(latestRelease).toEqual({ + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '2dbd257', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: 'c8dbab13', + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }); + }); +}); diff --git a/packages/sfp-cli/tests/impl/changelog/OrgUpdater.test.ts b/packages/sfp-cli/tests/impl/changelog/OrgUpdater.test.ts new file mode 100644 index 000000000..712f4a477 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/OrgUpdater.test.ts @@ -0,0 +1,224 @@ +import { expect } from '@jest/globals'; +import OrgsUpdater from '../../../src/impl/changelog/OrgsUpdater'; +import { ReleaseChangelog, Release, ReleaseId } from '../../../src/impl/changelog/ReleaseChangelog'; +import lodash = require('lodash'); + +describe('Given an OrgsUpdater', () => { + // new release, org & no org + // old release, org-not current release (add/update org.releases), org-current release, & no org + + let releaseChangelog: ReleaseChangelog; + let expectedResult: ReleaseChangelog; + + beforeEach(() => { + releaseChangelog = lodash.cloneDeep(referenceReleaseChangelog); + expectedResult = lodash.cloneDeep(referenceReleaseChangelog); + }); + + it('should add new org, for a new release', () => { + new OrgsUpdater(releaseChangelog, newRelease, 'DEV', null).update(); + + let newReleaseId = convertReleaseToId(newRelease); + expectedResult.orgs.push({ name: 'DEV', releases: [newReleaseId], latestRelease: newReleaseId, retryCount: 0 }); + expect(releaseChangelog).toEqual(expectedResult); + }); + + it('should update an org, for a new release', () => { + let releaseIds: ReleaseId[] = []; + releaseChangelog.releases.forEach((release) => { + releaseIds.push(convertReleaseToId(release)); + }); + + let org = { + name: 'DEV', + releases: releaseIds, + latestRelease: releaseIds[releaseIds.length - 1], + retryCount: 0, + }; + + releaseChangelog.orgs.push(org); + expectedResult.orgs.push(lodash.cloneDeep(org)); + + new OrgsUpdater(releaseChangelog, newRelease, 'DEV', null).update(); + + let newReleaseId = convertReleaseToId(newRelease); + expectedResult.orgs[0].releases.push(newReleaseId); + expectedResult.orgs[0].latestRelease = newReleaseId; + expect(releaseChangelog).toEqual(expectedResult); + }); + + it('should update an org with the release, for an old release', () => { + let releaseIds: ReleaseId[] = []; + releaseChangelog.releases.forEach((release) => { + releaseIds.push(convertReleaseToId(release)); + }); + + let org_dev = { + name: 'DEV', + releases: releaseIds, + latestRelease: releaseIds[releaseIds.length - 1], + retryCount: 0, + }; + + let org_sit = { + name: 'SIT', + releases: [releaseIds[0]], + latestRelease: releaseIds[0], + retryCount: 0, + }; + + releaseChangelog.orgs.push(org_dev); + releaseChangelog.orgs.push(org_sit); + + expectedResult.orgs.push(lodash.cloneDeep(org_dev)); + + let expectedReleaseIds = lodash.cloneDeep(releaseIds); + + expectedResult.orgs.push({ + name: 'SIT', + releases: expectedReleaseIds, + latestRelease: expectedReleaseIds[1], + retryCount: 0, + }); + + new OrgsUpdater(releaseChangelog, oldRelease1, 'SIT', releaseChangelog.releases[1]).update(); + + expect(releaseChangelog).toEqual(expectedResult); + }); + + it("should update an org's retryCount, for an old release", () => { + let releaseId = convertReleaseToId(releaseChangelog.releases[0]); + + let org = { + name: 'DEV', + releases: [releaseId], + latestRelease: releaseId, + retryCount: 0, + }; + + releaseChangelog.orgs.push(org); + + expectedResult.orgs.push(lodash.cloneDeep(org)); + expectedResult.orgs[0].retryCount++; + + new OrgsUpdater(releaseChangelog, oldRelease2, 'DEV', releaseChangelog.releases[0]).update(); + + expect(releaseChangelog).toEqual(expectedResult); + }); +}); + +const oldRelease1: Release = { + names: ['release-1'], + buildNumber: 3, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: undefined, + to: '3d45227b', + version: '50.0.5.6', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', +}; + +const oldRelease2: Release = { + names: ['release-1'], + buildNumber: 2, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: undefined, + to: '2dbd257a', + version: '50.0.5.5', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: '975c78d55ef4dce9621dfb61b6349d463e7003d0', +}; + +const newRelease: Release = { + names: ['release-1'], + buildNumber: 3, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: undefined, + to: '27b545ef', + version: '50.0.5.7', + latestCommitId: undefined, + commits: [], + }, + ], + hashId: 'fd0edacd5a6ee547aac0068b22f839201fbc3c7f', +}; + +const referenceReleaseChangelog: ReleaseChangelog = { + orgs: [], + releases: [ + { + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '1cbf12aa', + to: '2dbd257a', + version: '50.0.5.5', + latestCommitId: 'd7124579', + commits: [ + { + commitId: 'd7124579', + date: '2020-10-19T02:30:31-04:00', + author: 'Mohith Shrivastava', + message: "feat: winter '21 release updates (#178)", + body: + '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', + }, + ], + }, + ], + hashId: '975c78d55ef4dce9621dfb61b6349d463e7003d0', + }, + { + names: ['release-1'], + buildNumber: 2, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '2dbd257a', + to: '3d45227b', + version: '50.0.5.6', + latestCommitId: 'c8dbab13', + commits: [ + { + commitId: 'c8dbab13', + date: '2021-01-25T11:01:55+11:00', + author: 'Azlam', + message: 'Add persist credential to PR (#6)', + body: + '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', + }, + ], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }, + ], +}; + +function convertReleaseToId(release: Release): ReleaseId { + let releaseNames = [...release.names]; // Shallow copy + return { + names: releaseNames, + buildNumber: release.buildNumber, + hashId: release.hashId, + }; +} diff --git a/packages/sfp-cli/tests/impl/changelog/WorkItemUpdater.test.ts b/packages/sfp-cli/tests/impl/changelog/WorkItemUpdater.test.ts new file mode 100644 index 000000000..c49c64934 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/WorkItemUpdater.test.ts @@ -0,0 +1,157 @@ +import { expect } from '@jest/globals'; +import WorkItemUpdater from '../../../src/impl/changelog/WorkItemUpdater'; +import { Release } from '../../../src/impl/changelog/ReleaseChangelog'; +const path = require('path'); +import * as fs from 'fs-extra'; + +describe('Given a WorkItemUpdater', () => { + const resourceDir: string = path.join(__dirname, 'resources'); + + it('should update latestRelease with work items', () => { + new WorkItemUpdater(latestRelease, ['NGV-[0-9]{3,4}', 'TEST-[0-9]{3,4}']).update(); + + expect(latestRelease).toEqual( + fs.readJSONSync( + path.join(resourceDir, 'ExpectedResults', 'should_update_latestRelease_with_work_items.json'), + { encoding: 'UTF-8' } + ) + ); + }); + + let latestRelease: Release = { + names: ['release-1'], + buildNumber: 1, + workItems: {}, + artifacts: [ + { + name: 'ESBaseCodeLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: 'c8dbab13', + commits: [ + { + commitId: 'c8dbab13', + date: '2021-01-25T11:01:55+11:00', + author: 'Azlam', + message: 'NGV-626 Add persist credential to PR (#6)', + body: + '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', + }, + { + commitId: 'd7124579', + date: '2020-10-19T02:30:31-04:00', + author: 'Mohith Shrivastava', + message: "feat: winter '21 release updates (#178)", + body: + '* NGV-626 Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', + }, + { + commitId: 'e4fd5b2c', + date: '2020-09-28T09:52:59+02:00', + author: 'Alba Rivas', + message: 'Setup sa11y and implement accessibility tests (#162)', + body: '', + }, + { + commitId: '9ca5cf96', + date: '2020-09-04T12:10:49-04:00', + author: 'Mohith Shrivastava', + message: 'feat:object agnostic design for apex code for Customer List component (#158)', + body: + '* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators', + }, + { + commitId: 'e192b8b1', + date: '2020-08-03T18:35:26+05:30', + author: 'Aditya Naag', + message: 'Dependabot Updates (#150)', + body: + '* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>', + }, + ], + }, + { + name: 'ESBaseStylesLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: 'd7124579', + commits: [ + { + commitId: 'd7124579', + date: '2020-10-19T02:30:31-04:00', + author: 'Mohith Shrivastava', + message: "NGV-4000 feat: winter '21 release updates (#178)", + body: + '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', + }, + { + commitId: 'e4fd5b2c', + date: '2020-09-28T09:52:59+02:00', + author: 'Alba Rivas', + message: 'Setup sa11y and implement accessibility tests (#162)', + body: '', + }, + ], + }, + { + name: 'ESObjects', + from: '15cb14b', + to: '2dbd257', + version: '50.0.5.6', + latestCommitId: '3b12d4c2', + commits: [ + { + commitId: '3b12d4c2', + date: '2020-02-17T11:31:08+05:30', + author: 'Aditya Naag', + message: 'Spring 20 Updates (#76)', + body: + '* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n', + }, + ], + }, + { + name: 'ESSpaceMgmtLWC', + from: '15cb14b', + to: '2dbd257', + version: '50.0.4.6', + latestCommitId: 'd60274b3', + commits: [ + { + commitId: 'd60274b3', + date: '2020-11-03T10:08:08-05:00', + author: 'Mohith Shrivastava', + message: 'feat: add in app guidance (#191)', + body: + '* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments', + }, + { + commitId: 'e61ffe19', + date: '2020-10-26T15:04:09-04:00', + author: 'Mohith Shrivastava', + message: 'fix: add order by clause (#189)', + body: 'NGV-6000', + }, + { + commitId: 'd7124579', + date: '2020-10-19T02:30:31-04:00', + author: 'Mohith Shrivastava', + message: "feat: winter '21 release updates (#178)", + body: + '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', + }, + { + commitId: 'e4fd5b2c', + date: '2020-09-28T09:52:59+02:00', + author: 'Alba Rivas', + message: 'Setup sa11y and implement accessibility tests (#162)', + body: '', + }, + ], + }, + ], + hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', + }; +}); diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json b/packages/sfp-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json new file mode 100644 index 000000000..2fa66c2ed --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json @@ -0,0 +1,216 @@ +{ + "name": "ESBaseCodeLWC", + "to": "2dbd257", + "commits": [ + { + "commitId": "c8dbab13", + "date": "2021-01-25T11:01:55+11:00", + "author": "Azlam", + "message": "Add persist credential to PR (#6)", + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "e192b8b1", + "date": "2020-08-03T18:35:26+05:30", + "author": "Aditya Naag", + "message": "Dependabot Updates (#150)", + "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "e88a3919", + "date": "2020-08-02T16:52:16-04:00", + "author": "Mohith Shrivastava", + "message": "implement entity particles custom metadata (#144)", + "body": "* implement entity particles custom metadata\r\n\r\n* format xml with prettier\r\n\r\n* remove help text for fields" + }, + { + "commitId": "b4b1f87b", + "date": "2020-07-15T23:06:44+05:30", + "author": "Aditya Naag", + "message": "Tests for error panel (#133)", + "body": "" + }, + { + "commitId": "f4503797", + "date": "2020-06-29T11:31:34-04:00", + "author": "Mohith Shrivastava", + "message": "Add sharing keyword (#118)", + "body": "" + }, + { + "commitId": "9e072cb0", + "date": "2020-06-22T22:54:04+05:30", + "author": "Aditya Naag", + "message": "Sync with Develop and Updated Aura Linting (#115)", + "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "20d23d4c", + "date": "2020-06-19T19:28:37+05:30", + "author": "Aditya Naag", + "message": "Replaced pubsub with LMS (#113)", + "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" + }, + { + "commitId": "3164a36a", + "date": "2020-05-19T22:30:10+02:00", + "author": "Philippe Ozil", + "message": "Doc fix (#106)", + "body": "" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "d9cbd607", + "date": "2020-05-19T21:20:01+05:30", + "author": "Aditya Naag", + "message": "ci: migrated CI jobs to GitHub Actions (#104)", + "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " + }, + { + "commitId": "93910646", + "date": "2020-05-04T19:27:50+02:00", + "author": "Alba Rivas", + "message": "inline message template and svg refactor (#100)", + "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" + }, + { + "commitId": "ab223c5b", + "date": "2020-04-22T12:01:40+05:30", + "author": "Aditya Naag", + "message": "Updated Style classes to respect org density settings (#94)", + "body": "" + }, + { + "commitId": "4c75cbe1", + "date": "2020-04-17T13:42:24+02:00", + "author": "Alba Rivas", + "message": "Error Panel Refactor (#93)", + "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "d5e935f3", + "date": "2019-02-04T14:07:54-08:00", + "author": "Zayne Turner", + "message": "adding Prettier formatting", + "body": "" + }, + { + "commitId": "cf005512", + "date": "2019-02-04T14:01:36-08:00", + "author": "Zayne Turner", + "message": "Adding regular whitespace", + "body": "" + }, + { + "commitId": "ce1eb00e", + "date": "2019-02-04T13:48:59-08:00", + "author": "Zayne Turner", + "message": "Updates to error extraction for inlineMessage", + "body": "" + }, + { + "commitId": "5d3f2739", + "date": "2019-01-29T10:57:32-08:00", + "author": "Zayne Turner", + "message": "Removing unneeded Aura service components", + "body": "" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json b/packages/sfp-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json new file mode 100644 index 000000000..20653f431 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json @@ -0,0 +1,125 @@ +{ + "name": "ESBaseStylesLWC", + "to": "2dbd257", + "commits": [ + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "5414295c", + "date": "2020-07-15T23:18:49+05:30", + "author": "Aditya Naag", + "message": "Tests for imageGallery (#129)", + "body": "* Added tests for imageGallery\r\n\r\n* Updated Comments\r\n\r\n* Added event fire test\r\n\r\n* Fixed issues based on Review Comments\r\n\r\n* Replaced toBe(true) with toBeTruthy()\r\n\r\n* Minor description update" + }, + { + "commitId": "3fca7dca", + "date": "2020-07-15T23:07:46+05:30", + "author": "Aditya Naag", + "message": "Tests for imageTile (#130)", + "body": "* Tests for imageTile\r\n\r\n* Added test for name element\r\n\r\n* Updated describe statement\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "d94a1779", + "date": "2020-07-15T23:07:17+05:30", + "author": "Aditya Naag", + "message": "Tests for pillList (#131)", + "body": "* Tests for pillList\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "82c988e7", + "date": "2020-06-30T15:04:12+02:00", + "author": "Philippe Ozil", + "message": "Set up LWC tests and codecov.io (#119)", + "body": "* Set up LWC tests and codecov.io\r\n\r\n* Fixed branch for codecov badge" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ESObjectsChangelog.json b/packages/sfp-cli/tests/impl/changelog/resources/ESObjectsChangelog.json new file mode 100644 index 000000000..7c218239e --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ESObjectsChangelog.json @@ -0,0 +1,27 @@ +{ + "name": "ESObjects", + "to": "2dbd257", + "commits": [ + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json b/packages/sfp-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json new file mode 100644 index 000000000..d181b22b3 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json @@ -0,0 +1,251 @@ +{ + "name": "ESSpaceMgmtLWC", + "to": "2dbd257", + "commits": [ + { + "commitId": "d60274b3", + "date": "2020-11-03T10:08:08-05:00", + "author": "Mohith Shrivastava", + "message": "feat: add in app guidance (#191)", + "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" + }, + { + "commitId": "e61ffe19", + "date": "2020-10-26T15:04:09-04:00", + "author": "Mohith Shrivastava", + "message": "fix: add order by clause (#189)", + "body": "" + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "a155ee7a", + "date": "2020-09-07T11:55:42+02:00", + "author": "pozil", + "message": "Simplified LMS pub/sub logic", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "55d0933a", + "date": "2020-07-17T14:33:26-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationHelper lwc (#138)", + "body": "* tests for reservationHelper lwc\r\n\r\n* add negative test cases" + }, + { + "commitId": "37cbaa2b", + "date": "2020-07-16T15:06:50-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationTile lwc component (#126)", + "body": "* tests for reservationTile lwc component\r\n\r\n* address review comments\r\n\r\n* address comments on PR" + }, + { + "commitId": "92e07c50", + "date": "2020-07-16T15:06:36-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationDetailForm lwc (#125)", + "body": "* test for reservationDetailForm lwc\r\n\r\n* fix comments\r\n\r\n* fix comments\r\n\r\n* resolve comments from pozil review" + }, + { + "commitId": "dec3e62f", + "date": "2020-07-16T14:02:22-04:00", + "author": "Mohith Shrivastava", + "message": "test for lwc reservationlist component (#127)", + "body": "* tests for reservationList component\r\n\r\n* add few more tests\r\n\r\n* ignore jest coverage reports\r\n\r\n* resolve comments raised\r\n\r\n* fix formating for jest.config.js\r\n\r\nCo-authored-by: Aditya Naag " + }, + { + "commitId": "68e81302", + "date": "2020-07-16T18:35:04+05:30", + "author": "Aditya Naag", + "message": "Tests for SpaceDesigner component (#137)", + "body": "* Tests for SpaceDesigner component\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "33b4fdd1", + "date": "2020-07-16T17:49:59+05:30", + "author": "Aditya Naag", + "message": "Tests for Space Designer Form Component (#136)", + "body": "* Tests for Space Designer Component\r\n\r\n* Cleanup\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "8e0c67e3", + "date": "2020-07-16T07:47:00-04:00", + "author": "Mohith Shrivastava", + "message": "tests for lwc reservationHelperForm (#128)", + "body": "* tests for lwc reservationHelperForm\r\n\r\n* add some more coverage\r\n\r\n* address comments\r\n\r\n* fix test names and code readability" + }, + { + "commitId": "4757d3f3", + "date": "2020-07-16T16:41:55+05:30", + "author": "Aditya Naag", + "message": "Tests for CustomerList Component (#134)", + "body": "* Tests for Customer List Component\r\n\r\n* Fixes for review comments\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "02a00c82", + "date": "2020-07-16T16:34:49+05:30", + "author": "Aditya Naag", + "message": "Tests for Customer Tile (#135)", + "body": "* Tests for Customer Tile\r\n\r\n* Updated Mock for GenerateURL\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "fc006867", + "date": "2020-07-16T15:37:50+05:30", + "author": "Aditya Naag", + "message": "Tests for Customer Detail Form (#132)", + "body": "* Tests for Customer Detail Form\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "4d0a1047", + "date": "2020-07-15T13:38:34-04:00", + "author": "Mohith Shrivastava", + "message": "test for relatedSpaces lwc (#124)", + "body": "* test for related spaces\r\n\r\n* fix comments" + }, + { + "commitId": "0f92230c", + "date": "2020-07-13T21:36:01+05:30", + "author": "Aditya Naag", + "message": "Removed un-needed Application Scope (#123)", + "body": "" + }, + { + "commitId": "9e072cb0", + "date": "2020-06-22T22:54:04+05:30", + "author": "Aditya Naag", + "message": "Sync with Develop and Updated Aura Linting (#115)", + "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "20d23d4c", + "date": "2020-06-19T19:28:37+05:30", + "author": "Aditya Naag", + "message": "Replaced pubsub with LMS (#113)", + "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "d9cbd607", + "date": "2020-05-19T21:20:01+05:30", + "author": "Aditya Naag", + "message": "ci: migrated CI jobs to GitHub Actions (#104)", + "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " + }, + { + "commitId": "93910646", + "date": "2020-05-04T19:27:50+02:00", + "author": "Alba Rivas", + "message": "inline message template and svg refactor (#100)", + "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" + }, + { + "commitId": "4c75cbe1", + "date": "2020-04-17T13:42:24+02:00", + "author": "Alba Rivas", + "message": "Error Panel Refactor (#93)", + "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "4c982202", + "date": "2019-01-04T19:44:31-08:00", + "author": "Zayne Turner", + "message": "Updating isExposed for components used in app builder", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json new file mode 100644 index 000000000..070bcd232 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json @@ -0,0 +1,635 @@ +{ + "names": ["release-1"], + "buildNumber": 1, + "workItems": {}, + "artifacts": [ + { + "name": "ESBaseCodeLWC", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "c8dbab13", + "commits": [ + { + "commitId": "c8dbab13", + "date": "2021-01-25T11:01:55+11:00", + "author": "Azlam", + "message": "Add persist credential to PR (#6)", + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "e192b8b1", + "date": "2020-08-03T18:35:26+05:30", + "author": "Aditya Naag", + "message": "Dependabot Updates (#150)", + "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "e88a3919", + "date": "2020-08-02T16:52:16-04:00", + "author": "Mohith Shrivastava", + "message": "implement entity particles custom metadata (#144)", + "body": "* implement entity particles custom metadata\r\n\r\n* format xml with prettier\r\n\r\n* remove help text for fields" + }, + { + "commitId": "b4b1f87b", + "date": "2020-07-15T23:06:44+05:30", + "author": "Aditya Naag", + "message": "Tests for error panel (#133)", + "body": "" + }, + { + "commitId": "f4503797", + "date": "2020-06-29T11:31:34-04:00", + "author": "Mohith Shrivastava", + "message": "Add sharing keyword (#118)", + "body": "" + }, + { + "commitId": "9e072cb0", + "date": "2020-06-22T22:54:04+05:30", + "author": "Aditya Naag", + "message": "Sync with Develop and Updated Aura Linting (#115)", + "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "20d23d4c", + "date": "2020-06-19T19:28:37+05:30", + "author": "Aditya Naag", + "message": "Replaced pubsub with LMS (#113)", + "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" + }, + { + "commitId": "3164a36a", + "date": "2020-05-19T22:30:10+02:00", + "author": "Philippe Ozil", + "message": "Doc fix (#106)", + "body": "" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "d9cbd607", + "date": "2020-05-19T21:20:01+05:30", + "author": "Aditya Naag", + "message": "ci: migrated CI jobs to GitHub Actions (#104)", + "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " + }, + { + "commitId": "93910646", + "date": "2020-05-04T19:27:50+02:00", + "author": "Alba Rivas", + "message": "inline message template and svg refactor (#100)", + "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" + }, + { + "commitId": "ab223c5b", + "date": "2020-04-22T12:01:40+05:30", + "author": "Aditya Naag", + "message": "Updated Style classes to respect org density settings (#94)", + "body": "" + }, + { + "commitId": "4c75cbe1", + "date": "2020-04-17T13:42:24+02:00", + "author": "Alba Rivas", + "message": "Error Panel Refactor (#93)", + "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "d5e935f3", + "date": "2019-02-04T14:07:54-08:00", + "author": "Zayne Turner", + "message": "adding Prettier formatting", + "body": "" + }, + { + "commitId": "cf005512", + "date": "2019-02-04T14:01:36-08:00", + "author": "Zayne Turner", + "message": "Adding regular whitespace", + "body": "" + }, + { + "commitId": "ce1eb00e", + "date": "2019-02-04T13:48:59-08:00", + "author": "Zayne Turner", + "message": "Updates to error extraction for inlineMessage", + "body": "" + }, + { + "commitId": "5d3f2739", + "date": "2019-01-29T10:57:32-08:00", + "author": "Zayne Turner", + "message": "Removing unneeded Aura service components", + "body": "" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] + }, + { + "name": "ESBaseStylesLWC", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "d7124579", + "commits": [ + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "5414295c", + "date": "2020-07-15T23:18:49+05:30", + "author": "Aditya Naag", + "message": "Tests for imageGallery (#129)", + "body": "* Added tests for imageGallery\r\n\r\n* Updated Comments\r\n\r\n* Added event fire test\r\n\r\n* Fixed issues based on Review Comments\r\n\r\n* Replaced toBe(true) with toBeTruthy()\r\n\r\n* Minor description update" + }, + { + "commitId": "3fca7dca", + "date": "2020-07-15T23:07:46+05:30", + "author": "Aditya Naag", + "message": "Tests for imageTile (#130)", + "body": "* Tests for imageTile\r\n\r\n* Added test for name element\r\n\r\n* Updated describe statement\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "d94a1779", + "date": "2020-07-15T23:07:17+05:30", + "author": "Aditya Naag", + "message": "Tests for pillList (#131)", + "body": "* Tests for pillList\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "82c988e7", + "date": "2020-06-30T15:04:12+02:00", + "author": "Philippe Ozil", + "message": "Set up LWC tests and codecov.io (#119)", + "body": "* Set up LWC tests and codecov.io\r\n\r\n* Fixed branch for codecov badge" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] + }, + { + "name": "ESObjects", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "3b12d4c2", + "commits": [ + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] + }, + { + "name": "ESSpaceMgmtLWC", + "to": "2dbd257", + "version": "50.0.4.6", + "latestCommitId": "d60274b3", + "commits": [ + { + "commitId": "d60274b3", + "date": "2020-11-03T10:08:08-05:00", + "author": "Mohith Shrivastava", + "message": "feat: add in app guidance (#191)", + "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" + }, + { + "commitId": "e61ffe19", + "date": "2020-10-26T15:04:09-04:00", + "author": "Mohith Shrivastava", + "message": "fix: add order by clause (#189)", + "body": "" + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "a155ee7a", + "date": "2020-09-07T11:55:42+02:00", + "author": "pozil", + "message": "Simplified LMS pub/sub logic", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "55d0933a", + "date": "2020-07-17T14:33:26-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationHelper lwc (#138)", + "body": "* tests for reservationHelper lwc\r\n\r\n* add negative test cases" + }, + { + "commitId": "37cbaa2b", + "date": "2020-07-16T15:06:50-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationTile lwc component (#126)", + "body": "* tests for reservationTile lwc component\r\n\r\n* address review comments\r\n\r\n* address comments on PR" + }, + { + "commitId": "92e07c50", + "date": "2020-07-16T15:06:36-04:00", + "author": "Mohith Shrivastava", + "message": "tests for reservationDetailForm lwc (#125)", + "body": "* test for reservationDetailForm lwc\r\n\r\n* fix comments\r\n\r\n* fix comments\r\n\r\n* resolve comments from pozil review" + }, + { + "commitId": "dec3e62f", + "date": "2020-07-16T14:02:22-04:00", + "author": "Mohith Shrivastava", + "message": "test for lwc reservationlist component (#127)", + "body": "* tests for reservationList component\r\n\r\n* add few more tests\r\n\r\n* ignore jest coverage reports\r\n\r\n* resolve comments raised\r\n\r\n* fix formating for jest.config.js\r\n\r\nCo-authored-by: Aditya Naag " + }, + { + "commitId": "68e81302", + "date": "2020-07-16T18:35:04+05:30", + "author": "Aditya Naag", + "message": "Tests for SpaceDesigner component (#137)", + "body": "* Tests for SpaceDesigner component\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "33b4fdd1", + "date": "2020-07-16T17:49:59+05:30", + "author": "Aditya Naag", + "message": "Tests for Space Designer Form Component (#136)", + "body": "* Tests for Space Designer Component\r\n\r\n* Cleanup\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "8e0c67e3", + "date": "2020-07-16T07:47:00-04:00", + "author": "Mohith Shrivastava", + "message": "tests for lwc reservationHelperForm (#128)", + "body": "* tests for lwc reservationHelperForm\r\n\r\n* add some more coverage\r\n\r\n* address comments\r\n\r\n* fix test names and code readability" + }, + { + "commitId": "4757d3f3", + "date": "2020-07-16T16:41:55+05:30", + "author": "Aditya Naag", + "message": "Tests for CustomerList Component (#134)", + "body": "* Tests for Customer List Component\r\n\r\n* Fixes for review comments\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "02a00c82", + "date": "2020-07-16T16:34:49+05:30", + "author": "Aditya Naag", + "message": "Tests for Customer Tile (#135)", + "body": "* Tests for Customer Tile\r\n\r\n* Updated Mock for GenerateURL\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "fc006867", + "date": "2020-07-16T15:37:50+05:30", + "author": "Aditya Naag", + "message": "Tests for Customer Detail Form (#132)", + "body": "* Tests for Customer Detail Form\r\n\r\n* Fixes based on review comments" + }, + { + "commitId": "4d0a1047", + "date": "2020-07-15T13:38:34-04:00", + "author": "Mohith Shrivastava", + "message": "test for relatedSpaces lwc (#124)", + "body": "* test for related spaces\r\n\r\n* fix comments" + }, + { + "commitId": "0f92230c", + "date": "2020-07-13T21:36:01+05:30", + "author": "Aditya Naag", + "message": "Removed un-needed Application Scope (#123)", + "body": "" + }, + { + "commitId": "9e072cb0", + "date": "2020-06-22T22:54:04+05:30", + "author": "Aditya Naag", + "message": "Sync with Develop and Updated Aura Linting (#115)", + "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + }, + { + "commitId": "20d23d4c", + "date": "2020-06-19T19:28:37+05:30", + "author": "Aditya Naag", + "message": "Replaced pubsub with LMS (#113)", + "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" + }, + { + "commitId": "c8ff6924", + "date": "2020-05-19T21:44:01+05:30", + "author": "Aditya Naag", + "message": "Updated to version 49.0 (#102)", + "body": "" + }, + { + "commitId": "d9cbd607", + "date": "2020-05-19T21:20:01+05:30", + "author": "Aditya Naag", + "message": "ci: migrated CI jobs to GitHub Actions (#104)", + "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " + }, + { + "commitId": "93910646", + "date": "2020-05-04T19:27:50+02:00", + "author": "Alba Rivas", + "message": "inline message template and svg refactor (#100)", + "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" + }, + { + "commitId": "4c75cbe1", + "date": "2020-04-17T13:42:24+02:00", + "author": "Alba Rivas", + "message": "Error Panel Refactor (#93)", + "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " + }, + { + "commitId": "989d0858", + "date": "2020-04-14T22:52:35+05:30", + "author": "Aditya Naag", + "message": "Updated Style Classes to use SLDS Design Tokens (#92)", + "body": "" + }, + { + "commitId": "0f08c795", + "date": "2020-04-06T10:05:20+02:00", + "author": "René Winkelmeyer", + "message": "feat: 🎉 Prettier 2.0 (#88)", + "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" + }, + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + }, + { + "commitId": "38d4cf2f", + "date": "2019-10-17T15:27:24+05:30", + "author": "Aditya Naag", + "message": "Winter 20 Updates (#55)", + "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" + }, + { + "commitId": "5c0d9381", + "date": "2019-06-16T18:12:28+02:00", + "author": "René Winkelmeyer", + "message": "Summer '19 release (#23)", + "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" + }, + { + "commitId": "6c884f49", + "date": "2019-02-11T11:04:08+01:00", + "author": "René Winkelmeyer", + "message": "Spring '19 GA (#11)", + "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" + }, + { + "commitId": "f00179b6", + "date": "2019-01-17T09:15:11+01:00", + "author": "René Winkelmeyer", + "message": "Prettier - remove trailing comma (#7)", + "body": "" + }, + { + "commitId": "60fd7784", + "date": "2019-01-15T16:17:44-08:00", + "author": "Zayne Turner", + "message": "Updates to .gitignore syntax and files for jsconfig.json references", + "body": "" + }, + { + "commitId": "4c982202", + "date": "2019-01-04T19:44:31-08:00", + "author": "Zayne Turner", + "message": "Updating isExposed for components used in app builder", + "body": "" + }, + { + "commitId": "81970b22", + "date": "2018-12-14T05:16:21+01:00", + "author": "René Winkelmeyer", + "message": "Streamline tooling files (#2)", + "body": "" + }, + { + "commitId": "cf695b12", + "date": "2018-12-12T08:30:01-05:00", + "author": "Zayne Turner", + "message": "Initial commit", + "body": "" + } + ] + } + ], + "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json new file mode 100644 index 000000000..62ea88528 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json @@ -0,0 +1,128 @@ +{ + "names": ["release-1"], + "buildNumber": 1, + "workItems": {}, + "artifacts": [ + { + "name": "ESBaseCodeLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "c8dbab13", + "commits": [ + { + "commitId": "c8dbab13", + "date": "2021-01-25T11:01:55+11:00", + "author": "Azlam", + "message": "Add persist credential to PR (#6)", + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "e192b8b1", + "date": "2020-08-03T18:35:26+05:30", + "author": "Aditya Naag", + "message": "Dependabot Updates (#150)", + "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + } + ] + }, + { + "name": "ESBaseStylesLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "d7124579", + "commits": [ + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + } + ] + }, + { + "name": "ESObjects", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "3b12d4c2", + "commits": [ + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + } + ] + }, + { + "name": "ESSpaceMgmtLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.4.6", + "latestCommitId": "d60274b3", + "commits": [ + { + "commitId": "d60274b3", + "date": "2020-11-03T10:08:08-05:00", + "author": "Mohith Shrivastava", + "message": "feat: add in app guidance (#191)", + "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" + }, + { + "commitId": "e61ffe19", + "date": "2020-10-26T15:04:09-04:00", + "author": "Mohith Shrivastava", + "message": "fix: add order by clause (#189)", + "body": "" + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + } + ] + } + ], + "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" +} diff --git a/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json new file mode 100644 index 000000000..0af6bd844 --- /dev/null +++ b/packages/sfp-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json @@ -0,0 +1,132 @@ +{ + "names": ["release-1"], + "buildNumber": 1, + "workItems": { + "NGV-626": ["c8dbab13", "d7124579"], + "NGV-4000": ["d7124579"], + "NGV-6000": ["e61ffe19"] + }, + "artifacts": [ + { + "name": "ESBaseCodeLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "c8dbab13", + "commits": [ + { + "commitId": "c8dbab13", + "date": "2021-01-25T11:01:55+11:00", + "author": "Azlam", + "message": "NGV-626 Add persist credential to PR (#6)", + "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* NGV-626 Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + }, + { + "commitId": "9ca5cf96", + "date": "2020-09-04T12:10:49-04:00", + "author": "Mohith Shrivastava", + "message": "feat:object agnostic design for apex code for Customer List component (#158)", + "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" + }, + { + "commitId": "e192b8b1", + "date": "2020-08-03T18:35:26+05:30", + "author": "Aditya Naag", + "message": "Dependabot Updates (#150)", + "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" + } + ] + }, + { + "name": "ESBaseStylesLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "d7124579", + "commits": [ + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "NGV-4000 feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + } + ] + }, + { + "name": "ESObjects", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.5.6", + "latestCommitId": "3b12d4c2", + "commits": [ + { + "commitId": "3b12d4c2", + "date": "2020-02-17T11:31:08+05:30", + "author": "Aditya Naag", + "message": "Spring 20 Updates (#76)", + "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" + } + ] + }, + { + "name": "ESSpaceMgmtLWC", + "from": "15cb14b", + "to": "2dbd257", + "version": "50.0.4.6", + "latestCommitId": "d60274b3", + "commits": [ + { + "commitId": "d60274b3", + "date": "2020-11-03T10:08:08-05:00", + "author": "Mohith Shrivastava", + "message": "feat: add in app guidance (#191)", + "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" + }, + { + "commitId": "e61ffe19", + "date": "2020-10-26T15:04:09-04:00", + "author": "Mohith Shrivastava", + "message": "fix: add order by clause (#189)", + "body": "NGV-6000" + }, + { + "commitId": "d7124579", + "date": "2020-10-19T02:30:31-04:00", + "author": "Mohith Shrivastava", + "message": "feat: winter '21 release updates (#178)", + "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" + }, + { + "commitId": "e4fd5b2c", + "date": "2020-09-28T09:52:59+02:00", + "author": "Alba Rivas", + "message": "Setup sa11y and implement accessibility tests (#162)", + "body": "" + } + ] + } + ], + "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" +} diff --git a/packages/sfp-cli/tests/impl/dependency/ShrinkImpl.test.ts b/packages/sfp-cli/tests/impl/dependency/ShrinkImpl.test.ts new file mode 100644 index 000000000..7a6d6879a --- /dev/null +++ b/packages/sfp-cli/tests/impl/dependency/ShrinkImpl.test.ts @@ -0,0 +1,220 @@ +import { jest, expect } from '@jest/globals'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { Connection, AuthInfo, OrgConfigProperties } from '@salesforce/core'; +import ShrinkImpl from '../../../src/impl/dependency/ShrinkImpl'; +const $$ =new TestContext(); + +const setupFakeConnection = async () => { + const testData = new MockTestOrgData(); + testData.makeDevHub(); + + await $$.stubAuths(testData); + await $$.stubAliases({ myAlias: testData.username }); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + + $$.fakeConnectionRequest = (request) => { + return Promise.resolve(response); + }; + + const conn = await Connection.create({ + authInfo: await AuthInfo.create({username: testData.username}) + }); + + return conn; +} + +jest.mock('../../../src/core/git/Git', () => { + class Git { + static async initiateRepo() + { + return new Git(); + } + } + + return Git; +}); + +jest.mock('../../../src/core/git/GitTags', () => { + class GitTags { + async listTagsOnBranch(): Promise { + return gitTags; + } + } + + return GitTags; +}); + +let conn: Connection; +let gitTags; +let response; + +describe("Given a ShrinkImpl", () => { + + beforeEach(async () => { + conn = await setupFakeConnection(); + + }) + + it("should remove duplicate package dependencies from its dependent package", async () => { + const shrinkImpl = new ShrinkImpl(conn); + let resolvedDependencies = await shrinkImpl.shrinkDependencies(projectConfig); + + let dependencies = resolvedDependencies.packageDirectories?.find(pkg => pkg.package === "candidate-management")?.dependencies; + let coreIndex = dependencies.findIndex(dependency => dependency.package === "core"); + expect(dependencies).toBeTruthy(); + expect(dependencies?.length)?.toBe(2); + expect(coreIndex).toBe(1); + }); + + it("should remove duplicate package dependencies from external dependency map", async () => { + const shrinkImpl = new ShrinkImpl(conn); + let resolvedDependencies = await shrinkImpl.shrinkDependencies(projectConfig); + + let dependencies = resolvedDependencies.packageDirectories?.find(pkg => pkg.package === "contact-management")?.dependencies; + let coreIndex = dependencies.findIndex(dependency => dependency.package === "core"); + expect(dependencies).toBeTruthy(); + expect(dependencies?.length)?.toBe(2); + expect(coreIndex).toBe(1); + }); + + + // TODO: test cache +}); + +const projectConfig = { + packageDirectories: [ + { + path: 'packages/base', + default: true, + package: 'base', + versionName: 'temp', + versionNumber: '1.0.2.NEXT', + }, + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'base', + versionNumber: '1.0.2.LATEST' + } + ] + }, + { + path: 'packages/core', + package: 'core', + default: false, + versionName: 'core-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'base', + versionNumber: '1.0.2.LATEST' + }, + { + package: 'temp', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/candidate-management', + package: 'candidate-management', + default: false, + versionName: 'candidate-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'base', + versionNumber: '1.0.2.LATEST' + }, + { + package: 'temp', + versionNumber: '1.0.0.LATEST' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/contact-management', + package: 'contact-management', + default: false, + versionName: 'contact-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: "sfdc-framework" + }, + { + package: 'base', + versionNumber: '1.0.2.LATEST' + }, + { + package: 'temp', + versionNumber: '1.0.0.LATEST' + }, + { + package: 'core', + versionNumber: '1.0.0.LATEST' + } + ] + }, + { + path: 'packages/quote-management', + package: 'quote-management', + default: false, + versionName: 'quote-management-1.0.0', + versionNumber: '1.0.0.NEXT', + dependencies: [ + { + package: 'tech-framework@2.0.0.38' + }, + { + package: 'core', + versionNumber: '1.2.0.LATEST' + }, + { + package: 'candidate-management', + versionNumber: '1.0.0.LATEST' + }, + ] + } + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', + "candidate-management": '0Ho4a00000000xxxx1', + "base": '0Ho4a00000000xxxx1', + "temp": '0Ho4a00000000xxxx1', + "core": '0Ho4a00000000xxxx1', + "contact-management": '0Ho4a00000000xxxx2', + "sfdc-framework":"04t1000x00x00x" + }, + "plugins": { + "sfp": { + "disableShrinkImpl": false, + "externalDependencyMap": { + "tech-framework@2.0.0.38": [ + { + "package": "sfdc-framework" + } + ] + } + } + } +}; + diff --git a/packages/sfp-cli/tests/impl/parallelBuilder/BuildCollections.test.ts b/packages/sfp-cli/tests/impl/parallelBuilder/BuildCollections.test.ts new file mode 100644 index 000000000..876858d10 --- /dev/null +++ b/packages/sfp-cli/tests/impl/parallelBuilder/BuildCollections.test.ts @@ -0,0 +1,183 @@ +import { jest, expect } from '@jest/globals'; +import BuildCollections from '../../../src/impl/parallelBuilder/BuildCollections'; + +let packageManifest = null; +jest.mock('../../../src/core/project/ProjectConfig', () => { + class ProjectConfig { + static getSFDXProjectConfig(projectDirectory: string) { + return packageManifest; + } + } + + return ProjectConfig; +}); + +describe('Given a BuildCollections class', () => { + it('should be able to create a graph of collections defined in a sfdx-project.json', () => { + packageManifest = packageManifestWithCollections; + let buildCollections = new BuildCollections(null); + expect(buildCollections.graph.adjacencyList).toEqual(adjacencyList); + }); + + it('should create an empty graph when there are no collections defined in sfdx-project.json', () => { + packageManifest = packageManifestWithNoCollections; + let buildCollections = new BuildCollections(null); + expect(buildCollections.graph.adjacencyList).toEqual({}); + }); + + it('should throw an error when package in collection does not exist', () => { + packageManifest = packageManifestWithError1; + expect(() => { + new BuildCollections(null); + }).toThrowError(`Package 'UNKNOWN' in collection UNKNOWN,core is not a valid package`); + }); + + it("should throw an error when received 'buildCollection' property is not an array", () => { + packageManifest = packageManifestWithError2; + expect(() => { + new BuildCollections(null); + }).toThrowError(`Property 'buildCollection' must be of type Array. Received core`); + }); +}); + +let adjacencyList = { + temp: ['core'], + core: ['temp', 'mass-dataload', 'sales'], + 'mass-dataload': ['core'], + 'access-mgmt': ['bi'], + bi: ['access-mgmt'], + sales: ['core', 'cases'], + cases: ['sales'], +}; + +const packageManifestWithCollections = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate', 'build'], + buildCollection: ['core'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'covax', + versionNumber: '1.0.0.0', + assignPermSetsPreDeployment: ['PermSetA', 'PermSetB', 'PermSetC'], + }, + { + path: 'packages/frameworks/mass-dataload', + package: 'mass-dataload', + default: false, + type: 'data', + versionName: 'mass-dataload', + versionNumber: '1.0.0.0', + buildCollection: ['core'], + }, + { + path: 'packages/access-mgmt', + package: 'access-mgmt', + default: false, + versionName: 'access-mgmt', + versionNumber: '1.0.0.0', + reconcileProfiles: 'true', + buildCollection: ['bi'], + }, + { + path: 'packages/bi', + package: 'bi', + default: false, + versionName: 'bi', + versionNumber: '1.0.0.0', + ignoreOnStage: ['prepare', 'validate'], + }, + { + path: 'packages/sales', + package: 'sales', + default: false, + versionName: 'sales', + versionNumber: '1.0.0.0', + buildCollection: ['core'], + }, + { + path: 'packages/cases', + package: 'cases', + default: false, + versionName: 'cases', + versionNumber: '1.0.0.0', + buildCollection: ['sales'], + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', + packageAliases: { + bi: '0x002232323232', + core: '0H04X00000000XXXXX', + }, +}; + +const packageManifestWithNoCollections = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', +}; + +const packageManifestWithError1 = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + buildCollection: ['UNKNOWN', 'core'], + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'covax', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', +}; + +const packageManifestWithError2 = { + packageDirectories: [ + { + path: 'packages/temp', + default: true, + package: 'temp', + versionName: 'temp', + versionNumber: '1.0.0.0', + buildCollection: 'core', + }, + { + path: 'packages/domains/core', + package: 'core', + default: false, + versionName: 'covax', + versionNumber: '1.0.0.0', + }, + ], + namespace: '', + sfdcLoginUrl: 'https://login.salesforce.com', + sourceApiVersion: '50.0', +}; diff --git a/packages/sfp-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts b/packages/sfp-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts new file mode 100644 index 000000000..d82dcba08 --- /dev/null +++ b/packages/sfp-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts @@ -0,0 +1,93 @@ +import { expect } from '@jest/globals'; +import UndirectedGraph from '../../../src/impl/parallelBuilder/UndirectedGraph'; + +describe('Given an Undirected Graph class', () => { + it('should initialise with an empty adjacency list', () => { + let graph = new UndirectedGraph(); + expect(graph.adjacencyList).toEqual({}); + }); + + it('should be able to add new vertices', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + expect(graph.adjacencyList.A).toEqual([]); + }); + + it('should throw an error if adding a vertex that already exists', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + expect(() => { + graph.addVertex('A'); + }).toThrow(); + }); + + it('should be able to add a bi-directional edge between two vertices', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + graph.addVertex('B'); + graph.addEdge('A', 'B'); + expect(graph.adjacencyList).toEqual({ A: ['B'], B: ['A'] }); + }); + + it('should throw an error if adding an edge between vertices that do not exist', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + graph.addVertex('B'); + + expect(() => { + graph.addEdge('A', 'C'); + }).toThrow(); + expect(() => { + graph.addEdge('C', 'A'); + }).toThrow(); + expect(() => { + graph.addEdge('C', 'D'); + }).toThrow(); + }); + + it('should throw an error if adding an edge to a single vertex', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + + expect(() => { + graph.addEdge('A', 'A'); + }).toThrow(); + }); + + it('should be able to list the vertices in a graph, using depth-first search from a given vertex', () => { + let graph = new UndirectedGraph(); + graph.addVertex('A'); + graph.addVertex('B'); + graph.addVertex('C'); + graph.addVertex('D'); + graph.addVertex('E'); + graph.addVertex('F'); + + graph.addEdge('A', 'B'); + graph.addEdge('A', 'C'); + graph.addEdge('B', 'D'); + graph.addEdge('C', 'E'); + graph.addEdge('D', 'E'); + graph.addEdge('D', 'F'); + graph.addEdge('E', 'F'); + + // A + // / \ + // B C + // | | + // D --- E + // \ / + // F + + expect(graph.dfs('F')).toEqual(['F', 'D', 'B', 'A', 'C', 'E']); + expect(graph.dfs('C')).toEqual(['C', 'A', 'B', 'D', 'E', 'F']); + expect(graph.dfs('A')).toEqual(['A', 'B', 'D', 'E', 'C', 'F']); + }); + + it('should throw an error when attempting to perform dfs from a non-existent vertex', () => { + let graph = new UndirectedGraph(); + expect(() => { + graph.dfs('A'); + }).toThrowError("Vertex 'A' does not exist"); + }); +}); diff --git a/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts b/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts new file mode 100644 index 000000000..a4820edba --- /dev/null +++ b/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts @@ -0,0 +1,125 @@ +import { jest, expect } from '@jest/globals'; +const fs = require('fs-extra'); +import ReleaseDefinition from '../../../src/impl/release/ReleaseDefinition'; + +describe('Given a release definition, validateReleaseDefinition', () => { + let releaseDefinitionYaml: string; + + beforeEach(() => { + const fsMock = jest.spyOn(fs, 'readFileSync'); + fsMock.mockImplementation(() => { + return releaseDefinitionYaml; + }); + }); + + it('should throw if artifacts field is missing', async () => { + releaseDefinitionYaml = ` + release: "test-release" + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).rejects.toThrowError(); + }); + + it('should throw if release field is missing', async () => { + releaseDefinitionYaml = ` + artifacts: + packageA: "1.0.0-0" + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).rejects.toThrowError(); + }); + + it('should not throw an error for valid package dependency', async () => { + releaseDefinitionYaml = ` + release: "test-release" + artifacts: + packageA: "3.0.5-13" + packageDependencies: + packageX: 04t0H000000xVrwQAE + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).toBeDefined(); + }); + + it('should throw an error for an invalid package dependency', async () => { + releaseDefinitionYaml = ` + release: "test-release" + artifacts: + packageA: "3.0.5-13" + packageDependencies: + packageX: 04t0H000000xVrwQAE123 + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).rejects.toThrowError(); + }); + + it('should not throw an error for valid release parameters', async () => { + releaseDefinitionYaml = ` + release: "test-release" + skipIfAlreadyInstalled: true + baselineOrg: "prod" + artifacts: + packageA: "3.0.5-13" + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).toBeDefined(); + }); + + it('should throw an error if baselineOrg specified but skipIfAlreadyInstalled is false', async () => { + releaseDefinitionYaml = ` + release: "test-release" + skipIfAlreadyInstalled: false + baselineOrg: "prod" + artifacts: + packageA: "3.0.5-13" + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).rejects.toThrowError(); + }); + + it('should not throw an error for valid changelog parameters', async () => { + releaseDefinitionYaml = ` + release: "test-release" + artifacts: + packageA: "3.0.5-13" + changelog: + workItemFilters: + - "GOR-[0-9]{4}" + workItemUrl: "https://www.atlassian.com/software/jira" + limit: 10 + showAllArtifacts: false + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).toBeDefined(); + }); + + it('should throw an error if required changelog parameters are missing', async () => { + releaseDefinitionYaml = ` + release: "test-release" + artifacts: + packageA: "3.0.5-13" + changelog: + workItemUrl: "https://www.atlassian.com/software/jira" + limit: 10 + showAllArtifacts: false + `; + + expect(async () => { + await ReleaseDefinition.loadReleaseDefinition('path'); + }).rejects.toThrow(); + }); +}); diff --git a/packages/sfp-cli/tsconfig.json b/packages/sfp-cli/tsconfig.json new file mode 100644 index 000000000..2c64cb84e --- /dev/null +++ b/packages/sfp-cli/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "skipLibCheck": true, + "lib": ["ES2020"] + }, + "exclude": ["node_modules", "dist", "tests"] +} From 0fab87a59559d4bf85573341c264536dd7c75171 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 16:36:19 +1100 Subject: [PATCH 03/95] chore: migrate to flxbl fork --- .github/workflows/buildPackages.yml | 2 +- .github/workflows/release.yml | 2 +- .gitignore | 6 +- .prettierignore | 4 +- CONTRIBUTING.md | 6 +- README.md | 46 +- Third Party Notices.md | 10 +- ...-sfpowerscripts-artifact-customsettings.md | 2 +- decision records/003-dependency-manager.md | 2 +- .../001-aliasified-data-sourcepackages.md | 4 +- decision records/release/001-release.md | 2 +- .../002-release-installing-packages.md | 2 +- .../release/003-release-autorollback.md | 2 +- dockerfiles/sfp-lite.Dockerfile | 16 +- dockerfiles/sfpowerscripts.Dockerfile | 8 +- package.json | 2 +- packages/apexlink/README.md | 2 +- packages/apexlink/package.json | 14 +- .../apexlink/src/ApexDepedencyCheckImpl.ts | 8 +- .../tests/ApexDependencyCheckImpl.test.ts | 2 +- packages/core/.editorconfig | 12 - packages/core/CHANGELOG.md | 11 - packages/core/babel.config.js | 7 - packages/core/jest.config.js | 20 - packages/core/package.json | 93 - packages/core/resources/metadatainfo.json | 1075 - .../core/resources/pooldefinition.schema.json | 147 - packages/core/src/apex/ApexClassFetcher.ts | 28 - packages/core/src/apex/ApexTriggerFetcher.ts | 28 - .../ApexCodeCoverageAggregateFetcher.ts | 42 - .../apex/coverage/IndividualClassCoverage.ts | 76 - .../core/src/apex/parser/ApexTypeFetcher.ts | 134 - .../apex/parser/listeners/ApexTypeListener.ts | 38 - packages/core/src/apextest/ApexTestSuite.ts | 30 - .../core/src/apextest/ClearCodeCoverage.ts | 53 - .../apextest/ImpactedApexTestClassFetcher.ts | 90 - packages/core/src/apextest/JSONReporter.ts | 174 - packages/core/src/apextest/TestOptions.ts | 73 - .../core/src/apextest/TestReportDisplayer.ts | 118 - .../core/src/apextest/TriggerApexTests.ts | 767 - .../core/src/artifacts/ArtifactFetcher.ts | 224 - .../artifacts/generators/ArtifactGenerator.ts | 105 - .../src/changelog/GeneratePackageChangelog.ts | 76 - .../interfaces/GenericChangelogInterfaces.ts | 30 - .../dependency/ChangedComponentsFetcher.ts | 93 - packages/core/src/dependency/Component.ts | 16 - .../src/dependency/DependencyViolation.ts | 7 - packages/core/src/dependency/Entrypoint.ts | 20 - .../src/deployers/DeploySourceToOrgImpl.ts | 230 - .../core/src/deployers/DeploymentExecutor.ts | 17 - .../deployers/DeploymentSettingsService.ts | 64 - .../display/DependencyViolationDisplayer.ts | 31 - .../core/src/display/DeployErrorDisplayer.ts | 103 - .../src/display/DeploymentOptionDisplayer.ts | 51 - .../display/ExternalDependencyDisplayer.ts | 30 - .../display/InstalledArtifactsDisplayer.ts | 22 - .../src/display/InstalledPackagesDisplayer.ts | 22 - .../src/display/PackageComponentPrinter.ts | 27 - .../src/display/PackageDependencyDisplayer.ts | 35 - .../src/display/PackageMetadataPrinter.ts | 38 - .../core/src/display/PushErrorDisplayer.ts | 75 - packages/core/src/display/TableConstants.ts | 38 - packages/core/src/git/Git.ts | 246 - packages/core/src/git/GitDiffUtil.ts | 175 - packages/core/src/git/GitIdentity.ts | 34 - packages/core/src/git/GitTags.ts | 151 - packages/core/src/ignore/IgnoreFiles.ts | 13 - packages/core/src/index.ts | 1 - packages/core/src/limits/LimitsFetcher.ts | 30 - .../core/src/metadata/CustomFieldFetcher.ts | 45 - packages/core/src/metadata/MetadataFetcher.ts | 71 - packages/core/src/metadata/MetadataFiles.ts | 343 - packages/core/src/metadata/MetadataInfo.ts | 214 - packages/core/src/metadata/SettingsFetcher.ts | 22 - packages/core/src/org/OrgDetailsFetcher.ts | 120 - packages/core/src/org/OrganizationFetcher.ts | 12 - packages/core/src/org/SFPOrg.ts | 271 - .../core/src/org/ScratchOrgInfoFetcher.ts | 30 - .../InstalledPackagesQueryExecutor.ts | 14 - packages/core/src/package/Package2Detail.ts | 10 - packages/core/src/package/SfpPackage.ts | 143 - .../core/src/package/SfpPackageBuilder.ts | 278 - .../core/src/package/SfpPackageInquirer.ts | 178 - .../core/src/package/SfpPackageInstaller.ts | 63 - .../src/package/analyser/AnalyzerRegistry.ts | 20 - .../core/src/package/analyser/FHTAnalyzer.ts | 76 - .../core/src/package/analyser/FTAnalyzer.ts | 74 - .../src/package/analyser/PackageAnalyzer.ts | 12 - .../src/package/analyser/PicklistAnalyzer.ts | 52 - .../DeployDestructiveManifestToOrgImpl.ts | 129 - .../src/package/components/MetadataCount.ts | 18 - .../src/package/components/PackageManifest.ts | 271 - .../package/components/PackageToComponent.ts | 28 - .../ReconcileProfileAgainstOrgImpl.ts | 53 - .../package/coverage/PackageTestCoverage.ts | 273 - .../coverage/PackageVersionCoverage.ts | 39 - .../ExternalPackage2DependencyResolver.ts | 103 - .../dependencies/PackageDependencyResolver.ts | 269 - .../TransitiveDependencyResolver.ts | 109 - .../DeploymentCustomizer.ts | 27 - .../deploymentCustomizers/FHTEnabler.ts | 121 - .../deploymentCustomizers/FTEnabler.ts | 107 - .../MetadataDeploymentCustomizer.ts | 83 - .../deploymentCustomizers/PicklistEnabler.ts | 218 - .../PostDeployersRegistry.ts | 18 - .../PreDeployersRegistry.ts | 14 - .../deploymentFilters/DeploymentFilter.ts | 13 - .../DeploymentFilterRegistry.ts | 18 - .../EntitlementVersionFilter.ts | 110 - .../src/package/diff/PackageComponentDiff.ts | 424 - .../core/src/package/diff/PackageDiffImpl.ts | 166 - .../generators/SfpPackageContentGenerator.ts | 301 - .../packageCreators/CreateDataPackageImpl.ts | 86 - .../packageCreators/CreateDiffPackageImpl.ts | 271 - .../package/packageCreators/CreatePackage.ts | 146 - .../CreateSourcePackageImpl.ts | 117 - .../CreateUnlockedPackageImpl.ts | 262 - .../SourceToMDAPIConvertor.ts | 52 - .../InstallDataPackageImpl.ts | 104 - .../packageInstallers/InstallPackage.ts | 497 - .../InstallSourcePackageImpl.ts | 397 - .../InstallUnlockedPackage.ts | 91 - .../InstallUnlockedPackageCollection.ts | 134 - .../InstallUnlockedPackageImpl.ts | 96 - .../PackageInstallationResult.ts | 15 - .../packageMerger/PackageMergeManager.ts | 160 - .../promote/PromoteUnlockedPackageImpl.ts | 34 - .../AssignPermissionSetFetcher.ts | 23 - .../DestructiveManifestPathFetcher.ts | 29 - .../propertyFetchers/PropertyFetcher.ts | 11 - .../ReconcileProfilePropertyFetcher.ts | 10 - .../package/validators/PackageEmptyChecker.ts | 85 - .../package/version/Package2VersionFetcher.ts | 109 - .../version/Package2VersionInstaller.ts | 26 - .../package/version/PackageVersionLister.ts | 62 - .../package/version/PackageVersionUpdater.ts | 18 - .../core/src/permsets/AssignPermissionSets.ts | 17 - .../src/permsets/AssignPermissionSetsImpl.ts | 93 - .../core/src/permsets/PermissionSetFetcher.ts | 15 - .../PermissionSetGroupUpdateAwaiter.ts | 46 - packages/core/src/project/ProjectConfig.ts | 281 - .../project/UserDefinedExternalDependency.ts | 61 - .../core/src/queryHelper/ChunkCollection.ts | 38 - packages/core/src/queryHelper/QueryHelper.ts | 18 - .../core/src/scratchorg/PasswordGenerator.ts | 41 - packages/core/src/scratchorg/ScratchOrg.ts | 18 - .../core/src/scratchorg/ScratchOrgOperator.ts | 149 - .../scratchorg/pool/ClientSourceTracking.ts | 205 - .../scratchorg/pool/OrphanedOrgsDeleteImpl.ts | 47 - .../core/src/scratchorg/pool/PoolBaseImpl.ts | 22 - .../core/src/scratchorg/pool/PoolConfig.ts | 40 - .../src/scratchorg/pool/PoolCreateImpl.ts | 433 - .../src/scratchorg/pool/PoolDeleteImpl.ts | 65 - .../core/src/scratchorg/pool/PoolError.ts | 13 - .../core/src/scratchorg/pool/PoolFetchImpl.ts | 244 - .../src/scratchorg/pool/PoolJobExecutor.ts | 41 - .../core/src/scratchorg/pool/PoolListImpl.ts | 48 - .../src/scratchorg/pool/PoolOrgDeleteImpl.ts | 26 - .../prequisitecheck/IsValidSfdxAuthUrl.ts | 19 - .../pool/prequisitecheck/PreRequisiteCheck.ts | 63 - .../pool/services/fetchers/GetUserEmail.ts | 28 - .../fetchers/ScratchOrgInfoFetcher.ts | 187 - .../fetchers/ScratchOrgLimitsFetcher.ts | 13 - .../updaters/ScratchOrgInfoAssigner.ts | 24 - .../scriptExecutor/ScriptExecutorHelpers.ts | 19 - .../core/src/sfdmuwrapper/SFDMURunImpl.ts | 28 - packages/core/src/stats/NativeMetricSender.ts | 22 - packages/core/src/stats/SFPStatsSender.ts | 114 - .../DataDogMetricSender.ts | 52 - .../NewRelicMetricSender.ts | 66 - .../SplunkMetricSender.ts | 49 - packages/core/src/utils/AliasList.ts | 16 - packages/core/src/utils/ChunkArray.ts | 11 - packages/core/src/utils/DefaultShell.ts | 7 - packages/core/src/utils/Delay.ts | 3 - packages/core/src/utils/FileSystem.ts | 52 - packages/core/src/utils/Fileutils.ts | 204 - packages/core/src/utils/GetFormattedTime.ts | 6 - packages/core/src/utils/ObjectCRUDHelper.ts | 38 - packages/core/src/utils/OnExit.ts | 17 - packages/core/src/utils/RandomId.ts | 9 - .../core/src/utils/VersionNumberConverter.ts | 33 - .../core/src/utils/extractDomainFromUrl.ts | 10 - packages/core/src/utils/xml2json.ts | 10 - .../vlocitywrapper/VlocityInitialInstall.ts | 21 - .../vlocitywrapper/VlocityPackDeployImpl.ts | 31 - .../VlocityPackUpdateSettings.ts | 21 - .../src/vlocitywrapper/VlocityRefreshBase.ts | 31 - .../core/tests/apextest/ApexTestSuite.test.ts | 77 - .../artifacts/ArtifactsFromFileSystem.test.ts | 52 - .../coverage/IndividualClassCoverage.test.ts | 167 - packages/core/tests/git/GitTags.test.ts | 83 - .../core/tests/org/ArtifactsToOrg.test.ts | 214 - .../core/tests/org/ListAllPackages.test.ts | 59 - .../package/Package2VersionFetcher.test.ts | 79 - .../tests/package/PackageDiffImpl.test.ts | 295 - .../tests/package/PackageManifest.test.ts | 300 - .../tests/package/SFPackageBuilder.test.ts | 374 - .../package/analysers/FHTAnalyzer.test.ts | 360 - .../package/analysers/FTAnalyzer.test.ts | 363 - .../coverage/PackageTestCoverage.test.ts | 330 - .../PackageDependencyResolver.test.ts | 346 - .../TransitiveDependencyResolver.test.ts | 235 - .../EntitlementVersionFilter.test.ts | 500 - .../packageMerger/PackageMergeManager.test.ts | 39 - .../core2_sfpowerscripts_artifact_1.0.4-1.zip | Bin 8405 -> 0 bytes ...-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip | Bin 35211 -> 0 bytes .../AssignPermissionSetFetcher.test.ts | 55 - .../DestructiveManifestPathFetcher.test.ts | 85 - .../ReconcileProfilePropertyFetcher.test.ts | 48 - .../permsets/AssignPermissionSets.test.ts | 198 - .../permsets/PermissionSetFetcher.test.ts | 115 - .../PermissionSetGroupUpdateAwaiter.test.ts | 35 - .../core/tests/project/ProjectConfig.test.ts | 278 - .../tests/queryHelper/ChunkCollection.test.ts | 30 - packages/core/tests/utils/ChunkArray.test.ts | 24 - packages/core/tests/utils/FileSystem.test.ts | 35 - .../tests/utils/extractDomainFromUrl.test.ts | 34 - .../core/tests/utils/resources/a/b/b1.file | 0 .../core/tests/utils/resources/a/b/c/c1.file | 0 .../core/tests/utils/resources/a/b/c/c2.file | 0 .../core/tests/utils/resources/a/b/d/d1.file | 0 .../tests/utils/resources/a/b/d/x/x1.file | 0 .../core/tests/utils/resources/a/b/e/e1.file | 0 packages/core/tsconfig.json | 13 - packages/forcemula/package.json | 4 +- packages/sfdx-process-wrapper/package.json | 12 +- .../sfdx-process-wrapper/src/SFDXCommand.ts | 2 +- .../src/commandExecutor/ExecuteCommand.ts | 2 +- packages/sfplogger/package.json | 10 +- packages/sfpowerscripts-cli/.babel.config.js | 7 - packages/sfpowerscripts-cli/.snyk | 76 - packages/sfpowerscripts-cli/CHANGELOG.md | 11 - packages/sfpowerscripts-cli/README.md | 98 - packages/sfpowerscripts-cli/bin/run | 5 - packages/sfpowerscripts-cli/bin/run.cmd | 3 - .../sfpowerscripts-cli/coverage/clover.xml | 2694 -- .../coverage/coverage-final.json | 72 - .../coverage/lcov-report/base.css | 224 - .../coverage/lcov-report/block-navigation.js | 87 - .../coverage/lcov-report/core/git/Git.ts.html | 823 - .../lcov-report/core/git/GitIdentity.ts.html | 187 - .../coverage/lcov-report/core/git/index.html | 131 - .../coverage/lcov-report/favicon.png | Bin 445 -> 0 bytes .../impl/changelog/OrgsUpdater.ts.html | 466 - .../impl/changelog/WorkItemUpdater.ts.html | 208 - .../lcov-report/impl/changelog/index.html | 131 - .../parallelBuilder/UndirectedGraph.ts.html | 232 - .../impl/parallelBuilder/index.html | 116 - .../impl/release/ReleaseDefinition.ts.html | 322 - .../lcov-report/impl/release/index.html | 116 - .../coverage/lcov-report/index.html | 581 - .../coverage/lcov-report/prettify.css | 1 - .../coverage/lcov-report/prettify.js | 2 - .../lcov-report/sort-arrow-sprite.png | Bin 138 -> 0 bytes .../coverage/lcov-report/sorter.js | 196 - .../lcov-report/src/ProjectValidation.ts.html | 346 - .../src/core/apex/ApexClassFetcher.ts.html | 166 - .../src/core/apex/ApexTriggerFetcher.ts.html | 169 - .../ApexCodeCoverageAggregateFetcher.ts.html | 211 - .../coverage/IndividualClassCoverage.ts.html | 313 - .../src/core/apex/coverage/index.html | 131 - .../lcov-report/src/core/apex/index.html | 131 - .../src/core/apextest/ApexTestSuite.ts.html | 175 - .../ImpactedApexTestClassFetcher.ts.html | 355 - .../lcov-report/src/core/apextest/index.html | 131 - .../core/artifacts/ArtifactFetcher.ts.html | 757 - .../lcov-report/src/core/artifacts/index.html | 116 - .../src/core/display/TableConstants.ts.html | 199 - .../lcov-report/src/core/display/index.html | 116 - .../lcov-report/src/core/git/Git.ts.html | 823 - .../src/core/git/GitDiffUtil.ts.html | 610 - .../src/core/git/GitIdentity.ts.html | 187 - .../lcov-report/src/core/git/GitTags.ts.html | 538 - .../lcov-report/src/core/git/index.html | 161 - .../src/core/metadata/MetadataFiles.ts.html | 1114 - .../src/core/metadata/MetadataInfo.ts.html | 727 - .../src/core/metadata/SettingsFetcher.ts.html | 151 - .../lcov-report/src/core/metadata/index.html | 146 - .../lcov-report/src/core/org/SFPOrg.ts.html | 898 - .../lcov-report/src/core/org/index.html | 116 - .../InstalledPackagesQueryExecutor.ts.html | 127 - .../src/core/org/packageQuery/index.html | 116 - .../src/core/package/SfpPackage.ts.html | 514 - .../core/package/SfpPackageBuilder.ts.html | 919 - .../package/analyser/AnalyzerRegistry.ts.html | 145 - .../core/package/analyser/FHTAnalyzer.ts.html | 313 - .../core/package/analyser/FTAnalyzer.ts.html | 307 - .../package/analyser/PicklistAnalyzer.ts.html | 241 - .../src/core/package/analyser/index.html | 161 - .../components/PackageManifest.ts.html | 898 - .../components/PackageToComponent.ts.html | 169 - .../src/core/package/components/index.html | 131 - .../coverage/PackageTestCoverage.ts.html | 904 - .../src/core/package/coverage/index.html | 116 - ...ExternalPackage2DependencyResolver.ts.html | 394 - .../PackageDependencyResolver.ts.html | 892 - .../TransitiveDependencyResolver.ts.html | 412 - .../src/core/package/dependencies/index.html | 146 - .../EntitlementVersionFilter.ts.html | 415 - .../core/package/deploymentFilters/index.html | 116 - .../package/diff/PackageComponentDiff.ts.html | 1357 - .../core/package/diff/PackageDiffImpl.ts.html | 583 - .../src/core/package/diff/index.html | 131 - .../lcov-report/src/core/package/index.html | 131 - .../CreateDataPackageImpl.ts.html | 343 - .../CreateDiffPackageImpl.ts.html | 898 - .../packageCreators/CreatePackage.ts.html | 523 - .../core/package/packageCreators/index.html | 146 - .../AssignPermissionSetFetcher.ts.html | 154 - .../DestructiveManifestPathFetcher.ts.html | 172 - .../ReconcileProfilePropertyFetcher.ts.html | 115 - .../core/package/propertyFetchers/index.html | 146 - .../validators/PackageEmptyChecker.ts.html | 340 - .../src/core/package/validators/index.html | 116 - .../version/Package2VersionFetcher.ts.html | 412 - .../version/PackageVersionUpdater.ts.html | 139 - .../src/core/package/version/index.html | 131 - .../permsets/AssignPermissionSetsImpl.ts.html | 364 - .../permsets/PermissionSetFetcher.ts.html | 130 - .../PermissionSetGroupUpdateAwaiter.ts.html | 223 - .../lcov-report/src/core/permsets/index.html | 146 - .../src/core/project/ProjectConfig.ts.html | 928 - .../UserDefinedExternalDependency.ts.html | 268 - .../lcov-report/src/core/project/index.html | 131 - .../core/queryHelper/ChunkCollection.ts.html | 196 - .../src/core/queryHelper/QueryHelper.ts.html | 139 - .../src/core/queryHelper/index.html | 131 - .../src/core/stats/NativeMetricSender.ts.html | 151 - .../src/core/stats/SFPStatsSender.ts.html | 427 - .../lcov-report/src/core/stats/index.html | 131 - .../DataDogMetricSender.ts.html | 241 - .../NewRelicMetricSender.ts.html | 283 - .../SplunkMetricSender.ts.html | 232 - .../stats/nativeMetricSenderImpl/index.html | 146 - .../src/core/utils/AliasList.ts.html | 133 - .../src/core/utils/ChunkArray.ts.html | 118 - .../lcov-report/src/core/utils/Delay.ts.html | 94 - .../src/core/utils/FileSystem.ts.html | 241 - .../src/core/utils/Fileutils.ts.html | 697 - .../src/core/utils/ObjectCRUDHelper.ts.html | 199 - .../core/utils/VersionNumberConverter.ts.html | 184 - .../core/utils/extractDomainFromUrl.ts.html | 115 - .../lcov-report/src/core/utils/index.html | 236 - .../src/core/utils/xml2json.ts.html | 115 - .../src/impl/changelog/CommitUpdater.ts.html | 256 - .../src/impl/changelog/OrgsUpdater.ts.html | 466 - .../impl/changelog/WorkItemUpdater.ts.html | 208 - .../lcov-report/src/impl/changelog/index.html | 146 - .../src/impl/dependency/ShrinkImpl.ts.html | 328 - .../src/impl/dependency/index.html | 116 - .../parallelBuilder/BuildCollections.ts.html | 280 - .../parallelBuilder/UndirectedGraph.ts.html | 232 - .../src/impl/parallelBuilder/index.html | 131 - .../impl/release/ReleaseDefinition.ts.html | 322 - .../lcov-report/src/impl/release/index.html | 116 - .../coverage/lcov-report/src/index.html | 116 - .../src/utils/Get18DigitSalesforceId.ts.html | 142 - .../coverage/lcov-report/src/utils/index.html | 116 - .../utils/Get18DigitSalesforceId.ts.html | 142 - .../coverage/lcov-report/utils/index.html | 116 - .../sfpowerscripts-cli/coverage/lcov.info | 4285 --- packages/sfpowerscripts-cli/jest.config.js | 17 - .../sfpowerscripts-cli/messages/analyze.json | 4 - .../messages/analyze_with_PMD.json | 13 - .../messages/artifacts_query.json | 4 - .../sfpowerscripts-cli/messages/build.json | 18 - .../messages/core-messages.md | 118 - .../messages/create-package.json | 13 - .../messages/create_data_package.json | 12 - .../messages/create_delta_package.json | 13 - .../messages/create_source_package.json | 13 - .../messages/create_unlocked_package.json | 21 - .../messages/dependency_expand.json | 4 - .../messages/dependency_install.json | 4 - .../messages/dependency_shrink.json | 4 - .../sfpowerscripts-cli/messages/deploy.json | 15 - .../sfpowerscripts-cli/messages/fetch.json | 10 - .../messages/generate_changelog.json | 14 - .../messages/impact_package.json | 4 - .../messages/impact_release_config.json | 7 - .../messages/increment_build_number.json | 10 - .../messages/install_data_package.json | 8 - .../messages/install_package.json | 14 - .../messages/install_package_command.json | 6 - .../messages/install_source_package.json | 12 - .../messages/install_unlocked_package.json | 16 - .../messages/metrics_report.json | 3 - .../messages/org_profile_diff.json | 6 - .../sfpowerscripts-cli/messages/patch.json | 11 - .../messages/pool_delete.json | 8 - .../sfpowerscripts-cli/messages/prepare.json | 8 - .../messages/profile_merge.json | 7 - .../messages/profile_reconcile.json | 8 - .../messages/profile_retrieve.json | 7 - .../sfpowerscripts-cli/messages/promote.json | 7 - .../sfpowerscripts-cli/messages/publish.json | 17 - .../messages/quickbuild.json | 17 - .../sfpowerscripts-cli/messages/release.json | 19 - .../messages/releasedefinition_generate.json | 10 - .../messages/scratchorg_poolFetch.json | 9 - .../scratchorg_pool_metrics_publish.json | 3 - .../messages/scratchorg_pool_org_delete.json | 4 - .../messages/scratchorg_poollist.json | 6 - .../messages/trigger_apex_test.json | 13 - .../sfpowerscripts-cli/messages/validate.json | 26 - .../messages/validateAgainstOrg.json | 16 - .../messages/validate_apex_coverage.json | 5 - packages/sfpowerscripts-cli/package.json | 177 - .../resources/metadatainfo.json | 1075 - .../schemas/pooldefinition.schema.json | 147 - .../schemas/releasedefinition.schema.json | 73 - .../releasedefinitiongenerator.schema.json | 101 - .../schemas/sfdx-project.schema.json | 654 - packages/sfpowerscripts-cli/src/BuildBase.ts | 273 - .../src/InstallPackageCommand.ts | 91 - .../src/PackageCreateCommand.ts | 198 - .../src/ProjectValidation.ts | 87 - packages/sfpowerscripts-cli/src/SfpCommand.ts | 177 - .../src/commands/apextests/trigger.ts | 162 - .../src/commands/artifacts/fetch.ts | 109 - .../src/commands/artifacts/query.ts | 57 - .../src/commands/changelog/generate.ts | 110 - .../src/commands/dependency/expand.ts | 74 - .../src/commands/dependency/install.ts | 67 - .../src/commands/dependency/shrink.ts | 69 - .../src/commands/impact/package.ts | 80 - .../src/commands/impact/releaseconfig.ts | 133 - .../src/commands/metrics/report.ts | 88 - .../src/commands/orchestrator/build.ts | 45 - .../src/commands/orchestrator/deploy.ts | 168 - .../src/commands/orchestrator/prepare.ts | 222 - .../src/commands/orchestrator/promote.ts | 115 - .../src/commands/orchestrator/publish.ts | 460 - .../src/commands/orchestrator/quickbuild.ts | 44 - .../src/commands/orchestrator/release.ts | 256 - .../src/commands/orchestrator/validate.ts | 221 - .../orchestrator/validateAgainstOrg.ts | 184 - .../src/commands/package/data/create.ts | 80 - .../src/commands/package/data/install.ts | 76 - .../src/commands/package/install.ts | 136 - .../src/commands/package/source/create.ts | 71 - .../src/commands/package/source/install.ts | 130 - .../src/commands/package/unlocked/create.ts | 132 - .../src/commands/package/unlocked/install.ts | 116 - .../src/commands/pool/delete.ts | 125 - .../src/commands/pool/fetch.ts | 163 - .../src/commands/pool/list.ts | 129 - .../src/commands/pool/metrics/publish.ts | 133 - .../src/commands/pool/org/delete.ts | 57 - .../src/commands/profile/merge.ts | 157 - .../src/commands/profile/reconcile.ts | 123 - .../src/commands/profile/retrieve.ts | 128 - .../commands/releasedefinition/generate.ts | 83 - .../src/commands/repo/patch.ts | 309 - .../src/core/apex/ApexClassFetcher.ts | 28 - .../src/core/apex/ApexTriggerFetcher.ts | 28 - .../ApexCodeCoverageAggregateFetcher.ts | 42 - .../apex/coverage/IndividualClassCoverage.ts | 76 - .../src/core/apex/parser/ApexTypeFetcher.ts | 134 - .../apex/parser/listeners/ApexTypeListener.ts | 38 - .../src/core/apextest/ApexTestSuite.ts | 30 - .../src/core/apextest/ClearCodeCoverage.ts | 53 - .../apextest/ImpactedApexTestClassFetcher.ts | 90 - .../src/core/apextest/JSONReporter.ts | 174 - .../src/core/apextest/TestOptions.ts | 73 - .../src/core/apextest/TestReportDisplayer.ts | 118 - .../src/core/apextest/TriggerApexTests.ts | 767 - .../src/core/artifacts/ArtifactFetcher.ts | 224 - .../artifacts/generators/ArtifactGenerator.ts | 105 - .../changelog/GeneratePackageChangelog.ts | 76 - .../interfaces/GenericChangelogInterfaces.ts | 30 - .../dependency/ChangedComponentsFetcher.ts | 93 - .../src/core/dependency/Component.ts | 16 - .../core/dependency/DependencyViolation.ts | 7 - .../src/core/dependency/Entrypoint.ts | 20 - .../core/deployers/DeploySourceToOrgImpl.ts | 230 - .../src/core/deployers/DeploymentExecutor.ts | 17 - .../deployers/DeploymentSettingsService.ts | 64 - .../display/DependencyViolationDisplayer.ts | 31 - .../src/core/display/DeployErrorDisplayer.ts | 103 - .../core/display/DeploymentOptionDisplayer.ts | 51 - .../display/ExternalDependencyDisplayer.ts | 30 - .../display/InstalledArtifactsDisplayer.ts | 22 - .../display/InstalledPackagesDisplayer.ts | 22 - .../core/display/PackageComponentPrinter.ts | 27 - .../display/PackageDependencyDisplayer.ts | 35 - .../core/display/PackageMetadataPrinter.ts | 38 - .../src/core/display/PushErrorDisplayer.ts | 75 - .../src/core/display/TableConstants.ts | 38 - .../sfpowerscripts-cli/src/core/git/Git.ts | 246 - .../src/core/git/GitDiffUtil.ts | 175 - .../src/core/git/GitIdentity.ts | 34 - .../src/core/git/GitTags.ts | 151 - .../src/core/ignore/IgnoreFiles.ts | 13 - .../src/core/limits/LimitsFetcher.ts | 30 - .../src/core/metadata/CustomFieldFetcher.ts | 45 - .../src/core/metadata/MetadataFetcher.ts | 71 - .../src/core/metadata/MetadataFiles.ts | 343 - .../src/core/metadata/MetadataInfo.ts | 214 - .../src/core/metadata/SettingsFetcher.ts | 22 - .../src/core/org/OrgDetailsFetcher.ts | 120 - .../src/core/org/OrganizationFetcher.ts | 12 - .../sfpowerscripts-cli/src/core/org/SFPOrg.ts | 271 - .../src/core/org/ScratchOrgInfoFetcher.ts | 30 - .../InstalledPackagesQueryExecutor.ts | 14 - .../src/core/package/Package2Detail.ts | 10 - .../src/core/package/SfpPackage.ts | 143 - .../src/core/package/SfpPackageBuilder.ts | 278 - .../src/core/package/SfpPackageInquirer.ts | 178 - .../src/core/package/SfpPackageInstaller.ts | 63 - .../core/package/analyser/AnalyzerRegistry.ts | 20 - .../src/core/package/analyser/FHTAnalyzer.ts | 76 - .../src/core/package/analyser/FTAnalyzer.ts | 74 - .../core/package/analyser/PackageAnalyzer.ts | 12 - .../core/package/analyser/PicklistAnalyzer.ts | 52 - .../DeployDestructiveManifestToOrgImpl.ts | 129 - .../core/package/components/MetadataCount.ts | 18 - .../package/components/PackageManifest.ts | 271 - .../package/components/PackageToComponent.ts | 28 - .../ReconcileProfileAgainstOrgImpl.ts | 53 - .../package/coverage/PackageTestCoverage.ts | 273 - .../coverage/PackageVersionCoverage.ts | 39 - .../ExternalPackage2DependencyResolver.ts | 103 - .../dependencies/PackageDependencyResolver.ts | 269 - .../TransitiveDependencyResolver.ts | 109 - .../DeploymentCustomizer.ts | 27 - .../deploymentCustomizers/FHTEnabler.ts | 121 - .../deploymentCustomizers/FTEnabler.ts | 107 - .../MetadataDeploymentCustomizer.ts | 83 - .../deploymentCustomizers/PicklistEnabler.ts | 218 - .../PostDeployersRegistry.ts | 18 - .../PreDeployersRegistry.ts | 14 - .../deploymentFilters/DeploymentFilter.ts | 13 - .../DeploymentFilterRegistry.ts | 18 - .../EntitlementVersionFilter.ts | 110 - .../core/package/diff/PackageComponentDiff.ts | 424 - .../src/core/package/diff/PackageDiffImpl.ts | 166 - .../generators/SfpPackageContentGenerator.ts | 301 - .../packageCreators/CreateDataPackageImpl.ts | 86 - .../packageCreators/CreateDiffPackageImpl.ts | 271 - .../package/packageCreators/CreatePackage.ts | 146 - .../CreateSourcePackageImpl.ts | 117 - .../CreateUnlockedPackageImpl.ts | 262 - .../SourceToMDAPIConvertor.ts | 52 - .../InstallDataPackageImpl.ts | 104 - .../packageInstallers/InstallPackage.ts | 497 - .../InstallSourcePackageImpl.ts | 397 - .../InstallUnlockedPackage.ts | 91 - .../InstallUnlockedPackageCollection.ts | 134 - .../InstallUnlockedPackageImpl.ts | 96 - .../PackageInstallationResult.ts | 15 - .../packageMerger/PackageMergeManager.ts | 160 - .../promote/PromoteUnlockedPackageImpl.ts | 34 - .../AssignPermissionSetFetcher.ts | 23 - .../DestructiveManifestPathFetcher.ts | 29 - .../propertyFetchers/PropertyFetcher.ts | 11 - .../ReconcileProfilePropertyFetcher.ts | 10 - .../package/validators/PackageEmptyChecker.ts | 85 - .../package/version/Package2VersionFetcher.ts | 109 - .../version/Package2VersionInstaller.ts | 26 - .../package/version/PackageVersionLister.ts | 62 - .../package/version/PackageVersionUpdater.ts | 18 - .../src/core/permsets/AssignPermissionSets.ts | 17 - .../core/permsets/AssignPermissionSetsImpl.ts | 93 - .../src/core/permsets/PermissionSetFetcher.ts | 15 - .../PermissionSetGroupUpdateAwaiter.ts | 46 - .../src/core/project/ProjectConfig.ts | 281 - .../project/UserDefinedExternalDependency.ts | 61 - .../src/core/queryHelper/ChunkCollection.ts | 38 - .../src/core/queryHelper/QueryHelper.ts | 18 - .../src/core/scratchorg/PasswordGenerator.ts | 41 - .../src/core/scratchorg/ScratchOrg.ts | 18 - .../src/core/scratchorg/ScratchOrgOperator.ts | 149 - .../scratchorg/pool/ClientSourceTracking.ts | 205 - .../scratchorg/pool/OrphanedOrgsDeleteImpl.ts | 47 - .../src/core/scratchorg/pool/PoolBaseImpl.ts | 22 - .../src/core/scratchorg/pool/PoolConfig.ts | 40 - .../core/scratchorg/pool/PoolCreateImpl.ts | 432 - .../core/scratchorg/pool/PoolDeleteImpl.ts | 65 - .../src/core/scratchorg/pool/PoolError.ts | 13 - .../src/core/scratchorg/pool/PoolFetchImpl.ts | 244 - .../core/scratchorg/pool/PoolJobExecutor.ts | 41 - .../src/core/scratchorg/pool/PoolListImpl.ts | 48 - .../core/scratchorg/pool/PoolOrgDeleteImpl.ts | 26 - .../prequisitecheck/IsValidSfdxAuthUrl.ts | 19 - .../pool/prequisitecheck/PreRequisiteCheck.ts | 63 - .../pool/services/fetchers/GetUserEmail.ts | 28 - .../fetchers/ScratchOrgInfoFetcher.ts | 187 - .../fetchers/ScratchOrgLimitsFetcher.ts | 13 - .../updaters/ScratchOrgInfoAssigner.ts | 24 - .../scriptExecutor/ScriptExecutorHelpers.ts | 19 - .../src/core/sfdmuwrapper/SFDMURunImpl.ts | 28 - .../src/core/stats/NativeMetricSender.ts | 22 - .../src/core/stats/SFPStatsSender.ts | 114 - .../DataDogMetricSender.ts | 52 - .../NewRelicMetricSender.ts | 66 - .../SplunkMetricSender.ts | 49 - .../src/core/utils/AliasList.ts | 16 - .../src/core/utils/ChunkArray.ts | 11 - .../src/core/utils/DefaultShell.ts | 7 - .../src/core/utils/Delay.ts | 3 - .../src/core/utils/FileSystem.ts | 52 - .../src/core/utils/Fileutils.ts | 204 - .../src/core/utils/GetFormattedTime.ts | 6 - .../src/core/utils/ObjectCRUDHelper.ts | 38 - .../src/core/utils/OnExit.ts | 17 - .../src/core/utils/RandomId.ts | 9 - .../src/core/utils/VersionNumberConverter.ts | 33 - .../src/core/utils/extractDomainFromUrl.ts | 10 - .../src/core/utils/xml2json.ts | 10 - .../vlocitywrapper/VlocityInitialInstall.ts | 21 - .../vlocitywrapper/VlocityPackDeployImpl.ts | 31 - .../VlocityPackUpdateSettings.ts | 21 - .../core/vlocitywrapper/VlocityRefreshBase.ts | 31 - .../src/errors/ReleaseError.ts | 22 - .../sfpowerscripts-cli/src/errors/SfpError.ts | 20 - .../src/errors/ValidateError.ts | 21 - .../sfpowerscripts-cli/src/flags/duration.ts | 75 - .../src/flags/orgApiVersion.ts | 74 - .../src/flags/salesforceId.ts | 70 - .../sfpowerscripts-cli/src/flags/sfdxflags.ts | 139 - packages/sfpowerscripts-cli/src/impl/Stage.ts | 10 - .../src/impl/artifacts/FetchAnArtifact.ts | 8 - .../impl/artifacts/FetchAnArtifactFromNPM.ts | 64 - .../artifacts/FetchAnArtifactUsingScript.ts | 58 - .../impl/artifacts/FetchArtifactSelector.ts | 17 - .../src/impl/artifacts/FetchArtifactsError.ts | 26 - .../src/impl/artifacts/FetchImpl.ts | 144 - .../src/impl/changelog/ChangelogImpl.ts | 194 - .../changelog/ChangelogMarkdownGenerator.ts | 184 - .../src/impl/changelog/CommitUpdater.ts | 57 - .../src/impl/changelog/OrgsUpdater.ts | 127 - .../impl/changelog/ReadPackageChangelog.ts | 5 - .../src/impl/changelog/ReleaseChangelog.ts | 72 - .../impl/changelog/ReleaseChangelogUpdater.ts | 187 - .../src/impl/changelog/WorkItemUpdater.ts | 41 - .../src/impl/demoreelplayer/DemoReelPlayer.ts | 61 - .../src/impl/dependency/ShrinkImpl.ts | 81 - .../src/impl/deploy/DeployImpl.ts | 851 - .../src/impl/deploy/PostDeployHook.ts | 14 - .../src/impl/deploy/PreDeployHook.ts | 12 - .../impl/impact/ImpactedPackagesResolver.ts | 140 - .../src/impl/impact/ImpactedReleaseConfig.ts | 83 - .../impl/parallelBuilder/BatchingTopoSort.ts | 63 - .../impl/parallelBuilder/BuildCollections.ts | 65 - .../src/impl/parallelBuilder/BuildImpl.ts | 879 - .../impl/parallelBuilder/DependencyHelper.ts | 80 - .../impl/parallelBuilder/UndirectedGraph.ts | 49 - .../src/impl/prepare/PrepareImpl.ts | 306 - .../src/impl/prepare/PrepareOrgJob.ts | 416 - .../src/impl/release/ReleaseConfig.ts | 115 - .../src/impl/release/ReleaseDefinition.ts | 79 - .../release/ReleaseDefinitionGenerator.ts | 285 - .../ReleaseDefinitionGeneratorConfigSchema.ts | 21 - .../impl/release/ReleaseDefinitionSchema.ts | 21 - .../src/impl/release/ReleaseImpl.ts | 358 - .../src/impl/repo/AlignImpl.ts | 20 - .../src/impl/validate/Analyzer.ts | 22 - .../src/impl/validate/ApexTestValidator.ts | 203 - .../src/impl/validate/ValidateImpl.ts | 744 - .../src/impl/validate/ValidateResult.ts | 8 - packages/sfpowerscripts-cli/src/index.ts | 1 - .../src/outputs/FileOutputHandler.ts | 35 - .../src/ui/GroupConsoleLogs.ts | 58 - .../src/ui/OrgInfoDisplayer.ts | 156 - .../src/ui/TableConstants.ts | 37 - .../src/utils/FetchArtifactsFromOrg.ts | 31 - .../src/utils/Get18DigitSalesforceId.ts | 19 - .../tests/ProjectValidation.test.ts | 414 - .../tests/core/apextest/ApexTestSuite.test.ts | 77 - .../artifacts/ArtifactsFromFileSystem.test.ts | 52 - .../coverage/IndividualClassCoverage.test.ts | 167 - .../tests/core/git/GitTags.test.ts | 83 - .../tests/core/org/ArtifactsToOrg.test.ts | 214 - .../tests/core/org/ListAllPackages.test.ts | 59 - .../package/Package2VersionFetcher.test.ts | 79 - .../core/package/PackageDiffImpl.test.ts | 295 - .../core/package/PackageManifest.test.ts | 300 - .../core/package/SFPackageBuilder.test.ts | 374 - .../package/analysers/FHTAnalyzer.test.ts | 360 - .../core/package/analysers/FTAnalyzer.test.ts | 363 - .../coverage/PackageTestCoverage.test.ts | 330 - .../PackageDependencyResolver.test.ts | 346 - .../TransitiveDependencyResolver.test.ts | 235 - .../EntitlementVersionFilter.test.ts | 500 - .../packageMerger/PackageMergeManager.test.ts | 39 - .../core2_sfpowerscripts_artifact_1.0.4-1.zip | Bin 8405 -> 0 bytes ...-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip | Bin 35211 -> 0 bytes .../AssignPermissionSetFetcher.test.ts | 55 - .../DestructiveManifestPathFetcher.test.ts | 85 - .../ReconcileProfilePropertyFetcher.test.ts | 48 - .../permsets/AssignPermissionSets.test.ts | 198 - .../permsets/PermissionSetFetcher.test.ts | 115 - .../PermissionSetGroupUpdateAwaiter.test.ts | 35 - .../tests/core/project/ProjectConfig.test.ts | 278 - .../core/queryHelper/ChunkCollection.test.ts | 30 - .../tests/core/utils/ChunkArray.test.ts | 24 - .../tests/core/utils/FileSystem.test.ts | 35 - .../core/utils/extractDomainFromUrl.test.ts | 34 - .../tests/core/utils/resources/a/b/b1.file | 0 .../tests/core/utils/resources/a/b/c/c1.file | 0 .../tests/core/utils/resources/a/b/c/c2.file | 0 .../tests/core/utils/resources/a/b/d/d1.file | 0 .../core/utils/resources/a/b/d/x/x1.file | 0 .../tests/core/utils/resources/a/b/e/e1.file | 0 .../impl/changelog/CommitUpdater.test.ts | 241 - .../tests/impl/changelog/OrgUpdater.test.ts | 224 - .../impl/changelog/WorkItemUpdater.test.ts | 157 - .../resources/ESBaseCodeLWCChangelog.json | 216 - .../resources/ESBaseStylesLWCChangelog.json | 125 - .../resources/ESObjectsChangelog.json | 27 - .../resources/ESSpaceMgmtLWCChangelog.json | 251 - ...update_latestRelease_with_all_commits.json | 635 - ..._latestRelease_with_subset_of_commits.json | 128 - ..._update_latestRelease_with_work_items.json | 132 - .../tests/impl/dependency/ShrinkImpl.test.ts | 220 - .../parallelBuilder/BuildCollections.test.ts | 183 - .../parallelBuilder/UndirectedGraph.test.ts | 93 - .../impl/release/ReleaseDefinition.test.ts | 125 - packages/sfpowerscripts-cli/tsconfig.json | 9 - packages/sfprofiles/package.json | 12 +- packages/sfprofiles/src/impl/diff/diffImpl.ts | 2 +- packages/sfprofiles/src/impl/diff/diffUtil.ts | 2 +- .../src/impl/metadata/metadataFiles.ts | 2 +- .../src/impl/metadata/packageBuilder.ts | 2 +- .../metadata/retriever/metadataRetriever.ts | 2 +- .../retriever/metadataSummaryInfoFetcher.ts | 2 +- .../src/impl/source/profileActions.ts | 2 +- .../impl/source/profileComponentReconciler.ts | 2 +- .../sfprofiles/src/impl/source/profileDiff.ts | 2 +- .../src/impl/source/profileMerge.ts | 2 +- .../src/impl/source/profileReconcile.ts | 2 +- .../sfprofiles/src/impl/source/profileSync.ts | 2 +- .../src/impl/source/reconcileWorker.ts | 2 +- .../src/impl/user/passwordgenerateimpl.ts | 2 +- .../src/utils/checkDeploymentStatus.ts | 2 +- .../src/utils/checkRetrievalStatus.ts | 2 +- packages/sfprofiles/src/utils/fileutils.ts | 2 +- .../sfprofiles/src/utils/metadataOperation.ts | 2 +- .../sfprofiles/src/utils/queryExecutor.ts | 2 +- .../src/utils/searchFilesInDirectory.ts | 2 +- packages/sfprofiles/src/utils/sfpowerkit.ts | 2 +- pnpm-lock.yaml | 27734 +++++++--------- 744 files changed, 11597 insertions(+), 117912 deletions(-) delete mode 100644 packages/core/.editorconfig delete mode 100644 packages/core/CHANGELOG.md delete mode 100644 packages/core/babel.config.js delete mode 100644 packages/core/jest.config.js delete mode 100644 packages/core/package.json delete mode 100644 packages/core/resources/metadatainfo.json delete mode 100644 packages/core/resources/pooldefinition.schema.json delete mode 100644 packages/core/src/apex/ApexClassFetcher.ts delete mode 100644 packages/core/src/apex/ApexTriggerFetcher.ts delete mode 100644 packages/core/src/apex/coverage/ApexCodeCoverageAggregateFetcher.ts delete mode 100644 packages/core/src/apex/coverage/IndividualClassCoverage.ts delete mode 100644 packages/core/src/apex/parser/ApexTypeFetcher.ts delete mode 100644 packages/core/src/apex/parser/listeners/ApexTypeListener.ts delete mode 100644 packages/core/src/apextest/ApexTestSuite.ts delete mode 100644 packages/core/src/apextest/ClearCodeCoverage.ts delete mode 100644 packages/core/src/apextest/ImpactedApexTestClassFetcher.ts delete mode 100644 packages/core/src/apextest/JSONReporter.ts delete mode 100644 packages/core/src/apextest/TestOptions.ts delete mode 100644 packages/core/src/apextest/TestReportDisplayer.ts delete mode 100644 packages/core/src/apextest/TriggerApexTests.ts delete mode 100644 packages/core/src/artifacts/ArtifactFetcher.ts delete mode 100644 packages/core/src/artifacts/generators/ArtifactGenerator.ts delete mode 100644 packages/core/src/changelog/GeneratePackageChangelog.ts delete mode 100644 packages/core/src/changelog/interfaces/GenericChangelogInterfaces.ts delete mode 100644 packages/core/src/dependency/ChangedComponentsFetcher.ts delete mode 100644 packages/core/src/dependency/Component.ts delete mode 100644 packages/core/src/dependency/DependencyViolation.ts delete mode 100644 packages/core/src/dependency/Entrypoint.ts delete mode 100644 packages/core/src/deployers/DeploySourceToOrgImpl.ts delete mode 100644 packages/core/src/deployers/DeploymentExecutor.ts delete mode 100644 packages/core/src/deployers/DeploymentSettingsService.ts delete mode 100644 packages/core/src/display/DependencyViolationDisplayer.ts delete mode 100644 packages/core/src/display/DeployErrorDisplayer.ts delete mode 100644 packages/core/src/display/DeploymentOptionDisplayer.ts delete mode 100644 packages/core/src/display/ExternalDependencyDisplayer.ts delete mode 100644 packages/core/src/display/InstalledArtifactsDisplayer.ts delete mode 100644 packages/core/src/display/InstalledPackagesDisplayer.ts delete mode 100644 packages/core/src/display/PackageComponentPrinter.ts delete mode 100644 packages/core/src/display/PackageDependencyDisplayer.ts delete mode 100644 packages/core/src/display/PackageMetadataPrinter.ts delete mode 100644 packages/core/src/display/PushErrorDisplayer.ts delete mode 100644 packages/core/src/display/TableConstants.ts delete mode 100644 packages/core/src/git/Git.ts delete mode 100644 packages/core/src/git/GitDiffUtil.ts delete mode 100644 packages/core/src/git/GitIdentity.ts delete mode 100644 packages/core/src/git/GitTags.ts delete mode 100644 packages/core/src/ignore/IgnoreFiles.ts delete mode 100644 packages/core/src/index.ts delete mode 100644 packages/core/src/limits/LimitsFetcher.ts delete mode 100644 packages/core/src/metadata/CustomFieldFetcher.ts delete mode 100644 packages/core/src/metadata/MetadataFetcher.ts delete mode 100644 packages/core/src/metadata/MetadataFiles.ts delete mode 100644 packages/core/src/metadata/MetadataInfo.ts delete mode 100644 packages/core/src/metadata/SettingsFetcher.ts delete mode 100644 packages/core/src/org/OrgDetailsFetcher.ts delete mode 100644 packages/core/src/org/OrganizationFetcher.ts delete mode 100644 packages/core/src/org/SFPOrg.ts delete mode 100644 packages/core/src/org/ScratchOrgInfoFetcher.ts delete mode 100644 packages/core/src/org/packageQuery/InstalledPackagesQueryExecutor.ts delete mode 100644 packages/core/src/package/Package2Detail.ts delete mode 100644 packages/core/src/package/SfpPackage.ts delete mode 100644 packages/core/src/package/SfpPackageBuilder.ts delete mode 100644 packages/core/src/package/SfpPackageInquirer.ts delete mode 100644 packages/core/src/package/SfpPackageInstaller.ts delete mode 100644 packages/core/src/package/analyser/AnalyzerRegistry.ts delete mode 100644 packages/core/src/package/analyser/FHTAnalyzer.ts delete mode 100644 packages/core/src/package/analyser/FTAnalyzer.ts delete mode 100644 packages/core/src/package/analyser/PackageAnalyzer.ts delete mode 100644 packages/core/src/package/analyser/PicklistAnalyzer.ts delete mode 100644 packages/core/src/package/components/DeployDestructiveManifestToOrgImpl.ts delete mode 100644 packages/core/src/package/components/MetadataCount.ts delete mode 100644 packages/core/src/package/components/PackageManifest.ts delete mode 100644 packages/core/src/package/components/PackageToComponent.ts delete mode 100644 packages/core/src/package/components/ReconcileProfileAgainstOrgImpl.ts delete mode 100644 packages/core/src/package/coverage/PackageTestCoverage.ts delete mode 100644 packages/core/src/package/coverage/PackageVersionCoverage.ts delete mode 100644 packages/core/src/package/dependencies/ExternalPackage2DependencyResolver.ts delete mode 100644 packages/core/src/package/dependencies/PackageDependencyResolver.ts delete mode 100644 packages/core/src/package/dependencies/TransitiveDependencyResolver.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/DeploymentCustomizer.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/FHTEnabler.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/FTEnabler.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/PicklistEnabler.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/PostDeployersRegistry.ts delete mode 100644 packages/core/src/package/deploymentCustomizers/PreDeployersRegistry.ts delete mode 100644 packages/core/src/package/deploymentFilters/DeploymentFilter.ts delete mode 100644 packages/core/src/package/deploymentFilters/DeploymentFilterRegistry.ts delete mode 100644 packages/core/src/package/deploymentFilters/EntitlementVersionFilter.ts delete mode 100644 packages/core/src/package/diff/PackageComponentDiff.ts delete mode 100644 packages/core/src/package/diff/PackageDiffImpl.ts delete mode 100644 packages/core/src/package/generators/SfpPackageContentGenerator.ts delete mode 100644 packages/core/src/package/packageCreators/CreateDataPackageImpl.ts delete mode 100644 packages/core/src/package/packageCreators/CreateDiffPackageImpl.ts delete mode 100644 packages/core/src/package/packageCreators/CreatePackage.ts delete mode 100644 packages/core/src/package/packageCreators/CreateSourcePackageImpl.ts delete mode 100644 packages/core/src/package/packageCreators/CreateUnlockedPackageImpl.ts delete mode 100644 packages/core/src/package/packageFormatConvertors/SourceToMDAPIConvertor.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallDataPackageImpl.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallPackage.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallSourcePackageImpl.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallUnlockedPackage.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallUnlockedPackageCollection.ts delete mode 100644 packages/core/src/package/packageInstallers/InstallUnlockedPackageImpl.ts delete mode 100644 packages/core/src/package/packageInstallers/PackageInstallationResult.ts delete mode 100644 packages/core/src/package/packageMerger/PackageMergeManager.ts delete mode 100644 packages/core/src/package/promote/PromoteUnlockedPackageImpl.ts delete mode 100644 packages/core/src/package/propertyFetchers/AssignPermissionSetFetcher.ts delete mode 100644 packages/core/src/package/propertyFetchers/DestructiveManifestPathFetcher.ts delete mode 100644 packages/core/src/package/propertyFetchers/PropertyFetcher.ts delete mode 100644 packages/core/src/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts delete mode 100644 packages/core/src/package/validators/PackageEmptyChecker.ts delete mode 100644 packages/core/src/package/version/Package2VersionFetcher.ts delete mode 100644 packages/core/src/package/version/Package2VersionInstaller.ts delete mode 100644 packages/core/src/package/version/PackageVersionLister.ts delete mode 100644 packages/core/src/package/version/PackageVersionUpdater.ts delete mode 100644 packages/core/src/permsets/AssignPermissionSets.ts delete mode 100644 packages/core/src/permsets/AssignPermissionSetsImpl.ts delete mode 100644 packages/core/src/permsets/PermissionSetFetcher.ts delete mode 100644 packages/core/src/permsets/PermissionSetGroupUpdateAwaiter.ts delete mode 100644 packages/core/src/project/ProjectConfig.ts delete mode 100644 packages/core/src/project/UserDefinedExternalDependency.ts delete mode 100644 packages/core/src/queryHelper/ChunkCollection.ts delete mode 100644 packages/core/src/queryHelper/QueryHelper.ts delete mode 100644 packages/core/src/scratchorg/PasswordGenerator.ts delete mode 100644 packages/core/src/scratchorg/ScratchOrg.ts delete mode 100644 packages/core/src/scratchorg/ScratchOrgOperator.ts delete mode 100644 packages/core/src/scratchorg/pool/ClientSourceTracking.ts delete mode 100644 packages/core/src/scratchorg/pool/OrphanedOrgsDeleteImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolBaseImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolConfig.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolCreateImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolDeleteImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolError.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolFetchImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolJobExecutor.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolListImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/PoolOrgDeleteImpl.ts delete mode 100644 packages/core/src/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts delete mode 100644 packages/core/src/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts delete mode 100644 packages/core/src/scratchorg/pool/services/fetchers/GetUserEmail.ts delete mode 100644 packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts delete mode 100644 packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts delete mode 100644 packages/core/src/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts delete mode 100644 packages/core/src/scriptExecutor/ScriptExecutorHelpers.ts delete mode 100644 packages/core/src/sfdmuwrapper/SFDMURunImpl.ts delete mode 100644 packages/core/src/stats/NativeMetricSender.ts delete mode 100644 packages/core/src/stats/SFPStatsSender.ts delete mode 100644 packages/core/src/stats/nativeMetricSenderImpl/DataDogMetricSender.ts delete mode 100644 packages/core/src/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts delete mode 100644 packages/core/src/stats/nativeMetricSenderImpl/SplunkMetricSender.ts delete mode 100644 packages/core/src/utils/AliasList.ts delete mode 100644 packages/core/src/utils/ChunkArray.ts delete mode 100644 packages/core/src/utils/DefaultShell.ts delete mode 100644 packages/core/src/utils/Delay.ts delete mode 100644 packages/core/src/utils/FileSystem.ts delete mode 100644 packages/core/src/utils/Fileutils.ts delete mode 100644 packages/core/src/utils/GetFormattedTime.ts delete mode 100644 packages/core/src/utils/ObjectCRUDHelper.ts delete mode 100644 packages/core/src/utils/OnExit.ts delete mode 100644 packages/core/src/utils/RandomId.ts delete mode 100644 packages/core/src/utils/VersionNumberConverter.ts delete mode 100644 packages/core/src/utils/extractDomainFromUrl.ts delete mode 100644 packages/core/src/utils/xml2json.ts delete mode 100644 packages/core/src/vlocitywrapper/VlocityInitialInstall.ts delete mode 100644 packages/core/src/vlocitywrapper/VlocityPackDeployImpl.ts delete mode 100644 packages/core/src/vlocitywrapper/VlocityPackUpdateSettings.ts delete mode 100644 packages/core/src/vlocitywrapper/VlocityRefreshBase.ts delete mode 100644 packages/core/tests/apextest/ApexTestSuite.test.ts delete mode 100644 packages/core/tests/artifacts/ArtifactsFromFileSystem.test.ts delete mode 100644 packages/core/tests/coverage/IndividualClassCoverage.test.ts delete mode 100644 packages/core/tests/git/GitTags.test.ts delete mode 100644 packages/core/tests/org/ArtifactsToOrg.test.ts delete mode 100644 packages/core/tests/org/ListAllPackages.test.ts delete mode 100644 packages/core/tests/package/Package2VersionFetcher.test.ts delete mode 100644 packages/core/tests/package/PackageDiffImpl.test.ts delete mode 100644 packages/core/tests/package/PackageManifest.test.ts delete mode 100644 packages/core/tests/package/SFPackageBuilder.test.ts delete mode 100644 packages/core/tests/package/analysers/FHTAnalyzer.test.ts delete mode 100644 packages/core/tests/package/analysers/FTAnalyzer.test.ts delete mode 100644 packages/core/tests/package/coverage/PackageTestCoverage.test.ts delete mode 100644 packages/core/tests/package/dependencies/PackageDependencyResolver.test.ts delete mode 100644 packages/core/tests/package/dependencies/TransitiveDependencyResolver.test.ts delete mode 100644 packages/core/tests/package/deploymentFilters/EntitlementVersionFilter.test.ts delete mode 100644 packages/core/tests/package/packageMerger/PackageMergeManager.test.ts delete mode 100644 packages/core/tests/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip delete mode 100644 packages/core/tests/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip delete mode 100644 packages/core/tests/package/propertyFetchers/AssignPermissionSetFetcher.test.ts delete mode 100644 packages/core/tests/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts delete mode 100644 packages/core/tests/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts delete mode 100644 packages/core/tests/permsets/AssignPermissionSets.test.ts delete mode 100644 packages/core/tests/permsets/PermissionSetFetcher.test.ts delete mode 100644 packages/core/tests/permsets/PermissionSetGroupUpdateAwaiter.test.ts delete mode 100644 packages/core/tests/project/ProjectConfig.test.ts delete mode 100644 packages/core/tests/queryHelper/ChunkCollection.test.ts delete mode 100644 packages/core/tests/utils/ChunkArray.test.ts delete mode 100644 packages/core/tests/utils/FileSystem.test.ts delete mode 100644 packages/core/tests/utils/extractDomainFromUrl.test.ts delete mode 100644 packages/core/tests/utils/resources/a/b/b1.file delete mode 100644 packages/core/tests/utils/resources/a/b/c/c1.file delete mode 100644 packages/core/tests/utils/resources/a/b/c/c2.file delete mode 100644 packages/core/tests/utils/resources/a/b/d/d1.file delete mode 100644 packages/core/tests/utils/resources/a/b/d/x/x1.file delete mode 100644 packages/core/tests/utils/resources/a/b/e/e1.file delete mode 100644 packages/core/tsconfig.json delete mode 100644 packages/sfpowerscripts-cli/.babel.config.js delete mode 100644 packages/sfpowerscripts-cli/.snyk delete mode 100644 packages/sfpowerscripts-cli/CHANGELOG.md delete mode 100644 packages/sfpowerscripts-cli/README.md delete mode 100755 packages/sfpowerscripts-cli/bin/run delete mode 100644 packages/sfpowerscripts-cli/bin/run.cmd delete mode 100644 packages/sfpowerscripts-cli/coverage/clover.xml delete mode 100644 packages/sfpowerscripts-cli/coverage/coverage-final.json delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/base.css delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/OrgsUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html delete mode 100644 packages/sfpowerscripts-cli/coverage/lcov.info delete mode 100644 packages/sfpowerscripts-cli/jest.config.js delete mode 100644 packages/sfpowerscripts-cli/messages/analyze.json delete mode 100644 packages/sfpowerscripts-cli/messages/analyze_with_PMD.json delete mode 100644 packages/sfpowerscripts-cli/messages/artifacts_query.json delete mode 100644 packages/sfpowerscripts-cli/messages/build.json delete mode 100644 packages/sfpowerscripts-cli/messages/core-messages.md delete mode 100644 packages/sfpowerscripts-cli/messages/create-package.json delete mode 100644 packages/sfpowerscripts-cli/messages/create_data_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/create_delta_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/create_source_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/create_unlocked_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/dependency_expand.json delete mode 100644 packages/sfpowerscripts-cli/messages/dependency_install.json delete mode 100644 packages/sfpowerscripts-cli/messages/dependency_shrink.json delete mode 100644 packages/sfpowerscripts-cli/messages/deploy.json delete mode 100644 packages/sfpowerscripts-cli/messages/fetch.json delete mode 100644 packages/sfpowerscripts-cli/messages/generate_changelog.json delete mode 100644 packages/sfpowerscripts-cli/messages/impact_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/impact_release_config.json delete mode 100644 packages/sfpowerscripts-cli/messages/increment_build_number.json delete mode 100644 packages/sfpowerscripts-cli/messages/install_data_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/install_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/install_package_command.json delete mode 100644 packages/sfpowerscripts-cli/messages/install_source_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/install_unlocked_package.json delete mode 100644 packages/sfpowerscripts-cli/messages/metrics_report.json delete mode 100644 packages/sfpowerscripts-cli/messages/org_profile_diff.json delete mode 100644 packages/sfpowerscripts-cli/messages/patch.json delete mode 100644 packages/sfpowerscripts-cli/messages/pool_delete.json delete mode 100644 packages/sfpowerscripts-cli/messages/prepare.json delete mode 100644 packages/sfpowerscripts-cli/messages/profile_merge.json delete mode 100644 packages/sfpowerscripts-cli/messages/profile_reconcile.json delete mode 100644 packages/sfpowerscripts-cli/messages/profile_retrieve.json delete mode 100644 packages/sfpowerscripts-cli/messages/promote.json delete mode 100644 packages/sfpowerscripts-cli/messages/publish.json delete mode 100644 packages/sfpowerscripts-cli/messages/quickbuild.json delete mode 100644 packages/sfpowerscripts-cli/messages/release.json delete mode 100644 packages/sfpowerscripts-cli/messages/releasedefinition_generate.json delete mode 100644 packages/sfpowerscripts-cli/messages/scratchorg_poolFetch.json delete mode 100644 packages/sfpowerscripts-cli/messages/scratchorg_pool_metrics_publish.json delete mode 100644 packages/sfpowerscripts-cli/messages/scratchorg_pool_org_delete.json delete mode 100644 packages/sfpowerscripts-cli/messages/scratchorg_poollist.json delete mode 100644 packages/sfpowerscripts-cli/messages/trigger_apex_test.json delete mode 100644 packages/sfpowerscripts-cli/messages/validate.json delete mode 100644 packages/sfpowerscripts-cli/messages/validateAgainstOrg.json delete mode 100644 packages/sfpowerscripts-cli/messages/validate_apex_coverage.json delete mode 100644 packages/sfpowerscripts-cli/package.json delete mode 100644 packages/sfpowerscripts-cli/resources/metadatainfo.json delete mode 100644 packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json delete mode 100644 packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json delete mode 100644 packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json delete mode 100644 packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json delete mode 100644 packages/sfpowerscripts-cli/src/BuildBase.ts delete mode 100644 packages/sfpowerscripts-cli/src/InstallPackageCommand.ts delete mode 100644 packages/sfpowerscripts-cli/src/PackageCreateCommand.ts delete mode 100644 packages/sfpowerscripts-cli/src/ProjectValidation.ts delete mode 100644 packages/sfpowerscripts-cli/src/SfpCommand.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/artifacts/query.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/changelog/generate.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/dependency/expand.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/dependency/install.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/impact/package.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/metrics/report.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/data/create.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/data/install.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/install.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/source/create.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/source/install.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/pool/delete.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/pool/fetch.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/pool/list.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/profile/merge.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts delete mode 100644 packages/sfpowerscripts-cli/src/commands/repo/patch.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/dependency/Component.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/display/TableConstants.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/git/Git.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/git/GitTags.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/AliasList.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/Delay.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/OnExit.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/RandomId.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/utils/xml2json.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts delete mode 100644 packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts delete mode 100644 packages/sfpowerscripts-cli/src/errors/ReleaseError.ts delete mode 100644 packages/sfpowerscripts-cli/src/errors/SfpError.ts delete mode 100644 packages/sfpowerscripts-cli/src/errors/ValidateError.ts delete mode 100644 packages/sfpowerscripts-cli/src/flags/duration.ts delete mode 100644 packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts delete mode 100644 packages/sfpowerscripts-cli/src/flags/salesforceId.ts delete mode 100644 packages/sfpowerscripts-cli/src/flags/sfdxflags.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/Stage.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifact.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactSelector.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/impact/ImpactedReleaseConfig.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/parallelBuilder/BatchingTopoSort.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionSchema.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts delete mode 100644 packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts delete mode 100644 packages/sfpowerscripts-cli/src/index.ts delete mode 100644 packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts delete mode 100644 packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts delete mode 100644 packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts delete mode 100644 packages/sfpowerscripts-cli/src/ui/TableConstants.ts delete mode 100644 packages/sfpowerscripts-cli/src/utils/FetchArtifactsFromOrg.ts delete mode 100644 packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts delete mode 100644 packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file delete mode 100644 packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESObjectsChangelog.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json delete mode 100644 packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts delete mode 100644 packages/sfpowerscripts-cli/tests/impl/release/ReleaseDefinition.test.ts delete mode 100644 packages/sfpowerscripts-cli/tsconfig.json diff --git a/.github/workflows/buildPackages.yml b/.github/workflows/buildPackages.yml index 435ff6675..0fe9f1625 100644 --- a/.github/workflows/buildPackages.yml +++ b/.github/workflows/buildPackages.yml @@ -1,4 +1,4 @@ -# This pipeline is used as template to build the sfpowerscripts plugin +# This pipeline is used as template to build the sfp plugin name: 'Build Packages' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 75e0d6512..bfeee6bf6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -# This pipeline builds the sfpowerscripts & sfp cli plugin +# This pipeline builds the sfp cli plugin # Needs following secrets # NPM_TOKEN : Token to npm.js for dx@scale scope # DOCKER_USERNAME : Token to username for ghcr.io for publishing docker diff --git a/.gitignore b/.gitignore index b0b70f3c5..65caa22eb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,12 +14,12 @@ oclif.manifest.json packages/azpipelines_release_management_extensions/BuildTasks/ManageReleaseTask/* packages/core/coverage -packages/sfpowerscripts-cli/coverage +packages/sfp-cli/coverage .DS_Store -packages/core/.sfpowerscripts/** + coverage/** packages/apexlink/coverage -packages/sfpowerscripts-cli/oclif.manifest.json +packages/sfp-cli/oclif.manifest.json packages/apexlink/tests/resources/core-crm/apexlink.json packages/apexlink/tests/resources/feature-mgmt/apexlink.json diff --git a/.prettierignore b/.prettierignore index fbb53a323..1488dbd3b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,11 +9,11 @@ tmp/ oclif.manifest.json packages/azpipelines_release_management_extensions/BuildTasks/ManageReleaseTask/* packages/core/coverage -packages/sfpowerscripts-cli/coverage +packages/sfp-cli/coverage .DS_Store packages/core/resources packages/sfp-cli/resources -packages/sfpowerscripts-cli/resources +packages/sfp-cli/resources .github decision records demoreel diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2bdd1c608..e8407a8b9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ -# Contributing to sfpowerscripts +# Contributing to sfp -First and foremost, **thank you**! We appreciate that you want to contribute to sfpowerscripts, your time is valuable, and your contributions mean a lot to us. +First and foremost, **thank you**! We appreciate that you want to contribute to sfp, your time is valuable, and your contributions mean a lot to us. ## Important! @@ -25,5 +25,5 @@ Creating an issue is the simplest form of contributing to the project. But there ## Issues -Please only create issues for bug reports or feature requests at [sfpowerscripts repo](https://github.com/dxatscale/sfpowerscripts). Issues discussing any other topics may be closed by the project’s maintainers without further explanation. +Please only create issues for bug reports or feature requests at [sfp repo](https://github.com/flxblio/sfp). Issues discussing any other topics may be closed by the project’s maintainers without further explanation. diff --git a/README.md b/README.md index b9864306c..a664255a7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@

- sfpowerscripts + sfp

-![Version](https://img.shields.io/npm/v/@dxatscale/sfpowerscripts.svg) -[![GitHub stars](https://img.shields.io/github/stars/dxatscale/sfpowerscripts)](https://gitHub.com/dxatscale/sfpowerscripts/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/dxatscale/sfpowerscripts.svg)](https://github.com/dxatscale/sfpowerscripts/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/dxatscale/sfpowerscripts/blob/master/LICENSE) +![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) +[![GitHub stars](https://img.shields.io/github/stars/flxlblio/sfp)](https://gitHub.com/flxlblio/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxlblio/sfp.svg)](https://github.com/flxlblio/sfp/graphs/contributors/) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxlblio/sfp/blob/master/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) -[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/dxatscale) +[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxlblio) -A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.dxatscale.io +A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxlblio.io #### Features @@ -26,10 +26,10 @@ A build system for package based development in Salesforce, delivered as a node - Integrate with any CI/CD system of choice - All commands are enabled with statsD, for collecting metrics about your pipeline. -There are lot more features to explore. Read more at https://docs.dxatscale.io +There are lot more features to explore. Read more at https://docs.flxlblio.io -The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@dxatscale/sfpowerscripts) or can be -used by using the [docker image](https://github.com/dxatscale/sfpowerscripts/pkgs/container/sfpowerscripts) +The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxlblio/sfp) or can be +used by using the [docker image](https://github.com/flxlblio/sfp/pkgs/container/sfp) @@ -45,28 +45,28 @@ used by using the [docker image](https://github.com/dxatscale/sfpowerscripts/pkg #### CI/CD Reference Implementation -Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.dxatscale.io/implementing-your-ci-cd/github) +Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxlblio.io/implementing-your-ci-cd/github) -#### Installing sfpowerscripts locally +#### Installing sfp locally -sfpowerscripts can be installed on your local device using npm +sfp can be installed on your local device using npm ``` -npm i -g @dxatscale/sfpowerscripts +npm i -g @flxlblio/sfp ``` #### Docker -Docker images for sfpowerscripts are available at [GitHub Container Registry](https://github.com/dxatscale/sfpowerscripts/pkgs/container/sfpowerscripts). +Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxlblio/sfp/pkgs/container/sfp). -We recommend using the sfpowerscripts docker image to avoid breakages in your CI/CD pipelines due to updates in sfpowerscripts or any of its dependencies such as the SFDX CLI. +We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. #### Build Instructions -To build sfpowerscripts execute the following on the terminal: +To build sfp execute the following on the terminal: ``` npm i -g lerna #Install Lerna Globally -cd # Navigate to the checked out directory +cd # Navigate to the checked out directory pnpm i lerna run build ``` @@ -80,19 +80,19 @@ lerna run test To debug and test plugin ``` - cd packages/sfpowerscripts-cli + cd packages/sfp-cli npm link ``` #### Maintainers -List of Maintainers are available in the [link](https://docs.dxatscale.io/about-us) +List of Maintainers are available in the [link](https://docs.flxlblio.io/about-us) #### Where do I reach for queries? -Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/dxatscale) as well. +Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxlblio) as well. ## License -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fdxatscale%2Fsfpowerscripts?ref=badge_large) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp?ref=badge_large) diff --git a/Third Party Notices.md b/Third Party Notices.md index 65632f624..0a5727229 100644 --- a/Third Party Notices.md +++ b/Third Party Notices.md @@ -927,7 +927,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --- -### [@dxatscale/forcemula (0.1.2)](https://www.npmjs.com/package/@dxatscale/forcemula) +### [@flxblio/forcemula (0.1.2)](https://www.npmjs.com/package/@flxblio/forcemula) #### Declared Licenses @@ -935,7 +935,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -Copyright (c) 2023, @dxatscale/forcemula Contributors +Copyright (c) 2023, @flxblio/forcemula Contributors Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` @@ -1048,7 +1048,7 @@ SOFTWARE. --- -### [@dxatscale/sfp-logger (1.2.0)](https://www.npmjs.com/package/@dxatscale/sfp-logger) +### [@flxblio/sfp-logger (1.2.0)](https://www.npmjs.com/package/@flxblio/sfp-logger) #### Declared Licenses @@ -1101,7 +1101,7 @@ SOFTWARE. --- -### [@dxatscale/sfpowerscripts (^20.25.4)](https://www.npmjs.com/package/@dxatscale/sfpowerscripts) +### [@flxblio/sfp (^20.25.4)](https://www.npmjs.com/package/@flxblio/sfp) #### Declared Licenses @@ -1188,7 +1188,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --- -### [@dxatscale/sfpowerscripts.core (33.21.2)](https://www.npmjs.com/package/@dxatscale/sfpowerscripts.core) +### [@flxblio/sfp.core (33.21.2)](https://www.npmjs.com/package/@flxblio/sfp.core) #### Declared Licenses diff --git a/decision records/001-sfpowerscripts-artifact-customsettings.md b/decision records/001-sfpowerscripts-artifact-customsettings.md index b88d46297..061796f4c 100644 --- a/decision records/001-sfpowerscripts-artifact-customsettings.md +++ b/decision records/001-sfpowerscripts-artifact-customsettings.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: -Issue [Issue #476](https://github.com/dxatscale/sfpowerscripts/issues/476) +Issue [Issue #476](https://github.com/flxblio/sfp/issues/476) ## Context and Problem Statement diff --git a/decision records/003-dependency-manager.md b/decision records/003-dependency-manager.md index c61796faa..e57bae917 100644 --- a/decision records/003-dependency-manager.md +++ b/decision records/003-dependency-manager.md @@ -5,7 +5,7 @@ ## Context and Problem Statement As the number of packages increases in large scale projects, with multiple dependencies, updating package versions and dependencies manually is time consuming and takes great care to update dependencies one by one. -Other solutions encountered were local bash scripts as documented in both the issue https://github.com/dxatscale/sfpowerscripts/issues/638 raised and in the discussions has here: https://github.com/dxatscale/sfpowerscripts/discussions/468 +Other solutions encountered were local bash scripts as documented in both the issue https://github.com/flxblio/sfp/issues/638 raised and in the discussions has here: https://github.com/dxatscale/sfpowerscripts/discussions/468 ## Solution The dependency manager should utilise the SemVer incrementation style https://semver.org/ and be of a similar method to the ‘lerna version’ command. It should prompt the user for the version either for individual packages or for all packages in the sfdx-project.json: (major, minor, patch, custom). diff --git a/decision records/deployments/001-aliasified-data-sourcepackages.md b/decision records/deployments/001-aliasified-data-sourcepackages.md index 418de9ef4..41b804a0d 100644 --- a/decision records/deployments/001-aliasified-data-sourcepackages.md +++ b/decision records/deployments/001-aliasified-data-sourcepackages.md @@ -4,8 +4,8 @@ * Deciders: Azlam, Alan * Date: -Issue [Issue #632](https://github.com/dxatscale/sfpowerscripts/issues/632) -Issue [Issue #715](https://github.com/dxatscale/sfpowerscripts/issues/715) +Issue [Issue #632](https://github.com/flxblio/sfp/issues/632) +Issue [Issue #715](https://github.com/flxblio/sfp/issues/715) ## Context and Problem Statement diff --git a/decision records/release/001-release.md b/decision records/release/001-release.md index 6c9efdde6..0e94b2917 100644 --- a/decision records/release/001-release.md +++ b/decision records/release/001-release.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: 23/03/21 -Issue: [Issue #452](https://github.com/dxatscale/sfpowerscripts/issues/452) +Issue: [Issue #452](https://github.com/flxblio/sfp/issues/452) ## Context and Problem Statement diff --git a/decision records/release/002-release-installing-packages.md b/decision records/release/002-release-installing-packages.md index c8616aa7d..7d28f08f8 100644 --- a/decision records/release/002-release-installing-packages.md +++ b/decision records/release/002-release-installing-packages.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: 23/03/21 -Issue: [Issue #452](https://github.com/dxatscale/sfpowerscripts/issues/452) +Issue: [Issue #452](https://github.com/flxblio/sfp/issues/452) ## Context and Problem Statement diff --git a/decision records/release/003-release-autorollback.md b/decision records/release/003-release-autorollback.md index 454b0606c..11d33019e 100644 --- a/decision records/release/003-release-autorollback.md +++ b/decision records/release/003-release-autorollback.md @@ -3,7 +3,7 @@ * Status: Proposed -Issue: [Issue #478](https://github.com/dxatscale/sfpowerscripts/issues/478) +Issue: [Issue #478](https://github.com/flxblio/sfp/issues/478) ## Context and Problem Statement diff --git a/dockerfiles/sfp-lite.Dockerfile b/dockerfiles/sfp-lite.Dockerfile index 1d80ac161..390b25762 100644 --- a/dockerfiles/sfp-lite.Dockerfile +++ b/dockerfiles/sfp-lite.Dockerfile @@ -5,14 +5,14 @@ ARG SFPOWERSCRIPTS_VERSION=alpha ARG GIT_COMMIT ARG NODE_MAJOR=18 -LABEL org.opencontainers.image.description "sfpowerscripts is a build system for modular development in Salesforce." +LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" -LABEL org.opencontainers.image.url "https://github.com/dxatscale/sfpowerscripts" -LABEL org.opencontainers.image.documentation "https://docs.dxatscale.io/sfpowerscripts/sfpowerscripts" +LABEL org.opencontainers.image.url "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" LABEL org.opencontainers.image.revision $GIT_COMMIT -LABEL org.opencontainers.image.vendor "DX@Scale" -LABEL org.opencontainers.image.source "https://github.com/dxatscale/sfpowerscripts" -LABEL org.opencontainers.image.title "DX@Scale sfp lite docker image - January 24" +LABEL org.opencontainers.image.vendor "Flxbl" +LABEL org.opencontainers.image.source "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.title "Flxbl sfp lite docker image - January 24" ENV DEBIAN_FRONTEND=noninteractive @@ -54,9 +54,9 @@ RUN mkdir -p /etc/apt/keyrings \ && rm -rf /var/lib/apt/list/* -# Install sfpowerscripts +# Install sfp RUN npm install --global --omit=dev \ - @dxatscale/sfpowerscripts@${SFPOWERSCRIPTS_VERSION} + @flxblio/sfp@${SFPOWERSCRIPTS_VERSION} WORKDIR /root diff --git a/dockerfiles/sfpowerscripts.Dockerfile b/dockerfiles/sfpowerscripts.Dockerfile index 4ba5541e4..4f3e8b390 100644 --- a/dockerfiles/sfpowerscripts.Dockerfile +++ b/dockerfiles/sfpowerscripts.Dockerfile @@ -8,13 +8,13 @@ ARG SFDMU_VERSION=4.18.2 ARG GIT_COMMIT ARG NODE_MAJOR=18 -LABEL org.opencontainers.image.description "sfpowerscripts is a build system for modular development in Salesforce." +LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" -LABEL org.opencontainers.image.url "https://github.com/dxatscale/sfpowerscripts" -LABEL org.opencontainers.image.documentation "https://docs.dxatscale.io/sfpowerscripts/sfpowerscripts" +LABEL org.opencontainers.image.url "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "DX@Scale" -LABEL org.opencontainers.image.source "https://github.com/dxatscale/sfpowerscripts" +LABEL org.opencontainers.image.source "https://github.com/flxblio/sfp" LABEL org.opencontainers.image.title "DX@Scale sfpowercripts docker image - January 24" diff --git a/package.json b/package.json index ca3752633..765768d1a 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "sfpowerscripts", + "name": "sfp", "private": true, "license": "MIT", "scripts": { diff --git a/packages/apexlink/README.md b/packages/apexlink/README.md index 54c1da6ff..cc61c79ae 100644 --- a/packages/apexlink/README.md +++ b/packages/apexlink/README.md @@ -1,4 +1,4 @@ -# @dxatscale/apexlink` +# @flxblio/apexlink` ApexLink is the a thin node invoker for @nawforce/apex-link, which is delivered as a JAR file. This invoker executes a sub process where the apex link jar is executed diff --git a/packages/apexlink/package.json b/packages/apexlink/package.json index 59e992828..bd4e27ad1 100644 --- a/packages/apexlink/package.json +++ b/packages/apexlink/package.json @@ -1,9 +1,9 @@ { - "name": "@dxatscale/apexlink", + "name": "@flxblio/apexlink", "version": "1.0.2", "description": "Wrappers around @nawforce's apexlink java pom ", - "author": "dxatscale", - "homepage": "https://github.com/dxatscale/sfpowerscripts", + "author": "flxblio", + "homepage": "https://github.com/flxblio/sfp", "license": "MIT", "main": "lib/index", "types": "lib/index", @@ -12,8 +12,8 @@ "/jars" ], "dependencies": { - "@dxatscale/sfdx-process-wrapper": "^1.0.2", - "@dxatscale/sfp-logger": "^2.1.2", + "@flxblio/sfdx-process-wrapper": "^1.0.2", + "@flxblio/sfp-logger": "^2.1.2", "find-java-home": "2.0.0", "fs-extra": "11.1.1" }, @@ -31,7 +31,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/dxatscale/sfpowerscripts.git" + "url": "git+https://github.com/flxblio/sfp.git" }, "publishConfig": { "access": "public" @@ -45,6 +45,6 @@ "spec-test": "FORCE_COLOR=true jest -i packages/apexlink/tests/ApexDependencyCheckImpl.test.ts --verbose true --coverage --detectOpenHandles" }, "bugs": { - "url": "https://github.com/dxatscale/sfpowerscripts/issues" + "url": "https://github.com/flxblio/sfp/issues" } } diff --git a/packages/apexlink/src/ApexDepedencyCheckImpl.ts b/packages/apexlink/src/ApexDepedencyCheckImpl.ts index 589212413..c5b26df00 100644 --- a/packages/apexlink/src/ApexDepedencyCheckImpl.ts +++ b/packages/apexlink/src/ApexDepedencyCheckImpl.ts @@ -1,8 +1,8 @@ import findJavaHome from 'find-java-home'; -import ExecuteCommand from '@dxatscale/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPLogger from '@dxatscale/sfp-logger'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; +import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPLogger from '@flxblio/sfp-logger'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; import path from 'path'; diff --git a/packages/apexlink/tests/ApexDependencyCheckImpl.test.ts b/packages/apexlink/tests/ApexDependencyCheckImpl.test.ts index dbc1fee09..44f3429ec 100644 --- a/packages/apexlink/tests/ApexDependencyCheckImpl.test.ts +++ b/packages/apexlink/tests/ApexDependencyCheckImpl.test.ts @@ -1,5 +1,5 @@ import { jest, expect } from '@jest/globals'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; import ApexDepedencyCheckImpl from '../src/ApexDepedencyCheckImpl'; import path from 'path'; diff --git a/packages/core/.editorconfig b/packages/core/.editorconfig deleted file mode 100644 index a9b0d2824..000000000 --- a/packages/core/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ - -root = false - -[*] -indent_style = space -indent_size = 4 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md deleted file mode 100644 index a4a2da8af..000000000 --- a/packages/core/CHANGELOG.md +++ /dev/null @@ -1,11 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [33.23.0](https://github.com/dxatscale/sfpowerscripts/compare/@dxatscale/sfpowerscripts.core@33.22.1...@dxatscale/sfpowerscripts.core@33.23.0) (2023-03-22) - - -### Features - -* **publish:** Add new flag to delete Git tags by age and limit ([#1275](https://github.com/dxatscale/sfpowerscripts/issues/1275)) ([aae62d6](https://github.com/dxatscale/sfpowerscripts/commit/aae62d6d3e7eb390dddcf2ca46b99b44ca4cc933)) diff --git a/packages/core/babel.config.js b/packages/core/babel.config.js deleted file mode 100644 index 6e7404754..000000000 --- a/packages/core/babel.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - - plugins: [ - '@babel/plugin-proposal-optional-chaining', - '@babel/plugin-proposal-nullish-coalescing-operator' - ], -}; \ No newline at end of file diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js deleted file mode 100644 index 4d647c055..000000000 --- a/packages/core/jest.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - preset: 'ts-jest/presets/js-with-babel', - testEnvironment: 'node', - restoreMocks: true, - clearMocks: true, - resetMocks: true, - transform: { - '^.+\\.[t]sx?$': [ - 'ts-jest', - { - tsconfig: 'tsconfig.json', - babelConfig: true, - }, - ] - }, - transformIgnorePatterns: ['/node_modules/(?!@salesforce/source-deploy-retrieve)(.*)'], - moduleNameMapper: { - '^axios$': require.resolve('axios'), - } -}; diff --git a/packages/core/package.json b/packages/core/package.json deleted file mode 100644 index 03083aa44..000000000 --- a/packages/core/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "@dxatscale/sfpowerscripts.core", - "version": "36.5.3", - "description": "Core Module used by sfpowerscripts", - "main": "lib/index", - "types": "lib/index", - "files": [ - "lib", - "resources" - ], - "scripts": { - "build": "pnpm run clean && pnpm run compile", - "clean": "rimraf ./lib && rimraf tsconfig.tsbuildinfo", - "compile": "tsc -b tsconfig.json", - "clearCache": "jest --clearCache", - "test": "FORCE_COLOR=true jest --silent --verbose true --coverage --detectOpenHandles" - }, - "engines": { - "node": ">=14.0.0" - }, - "dependencies": { - "@dxatscale/apexlink": "^1.0.2", - "@dxatscale/sfdx-process-wrapper": "^1.0.2", - "@dxatscale/sfp-logger": "^2.1.2", - "@dxatscale/sfprofiles": "^2.0.8", - "@newrelic/telemetry-sdk": "^0.6.0", - "@salesforce/apex-node": "2.1.0", - "@salesforce/core": "5.3.9", - "@salesforce/kit": "3.0.13", - "@salesforce/packaging": "2.3.3", - "@salesforce/source-deploy-retrieve": "9.7.24", - "@salesforce/source-tracking": "4.2.16", - "adm-zip": "^0.5.6", - "apex-parser": "2.13.0", - "async-retry": "^1.3.3", - "axios": "^1.4.0", - "bottleneck": "^2.19.5", - "chalk": "^4.1.2", - "cli-table": "0.3.11", - "datadog-metrics": "^0.9.3", - "fast-xml-parser": "4.2.7", - "fs-extra": "11.1.1", - "glob": "^10.3.3", - "hot-shots": "^8.5.0", - "ignore": "^5.1.6", - "js-yaml": "4.1.0", - "jsforce": "^2.0.0-beta.27", - "lodash": "^4.17.21", - "neverthrow": "4.4.2", - "rimraf": "^3.0.2", - "semver": "7.5.2", - "simple-git": "3.16.0", - "tar": "^6.1.9", - "tmp": "^0.2.1", - "xml2js": "^0.6.0" - }, - "devDependencies": { - "@babel/core": "7.18.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-optional-chaining": "7.17.12", - "@jest/globals": "^29.6.1", - "@salesforce/ts-sinon": "^1.3.21", - "@salesforce/ts-types": "2.0.7", - "@types/adm-zip": "^0.5.0", - "@types/async-retry": "^1.4.2", - "@types/datadog-metrics": "^0.6.1", - "@types/jest": "^29.5.3", - "@types/mocha": "9.1.0", - "@types/node": "20.4.4", - "@types/splunk-logging": "^0.11.1", - "@types/tmp": "^0.2.3", - "jest": "^29.5.3", - "ts-jest": "^29.1.1", - "ts-node": "10.7.0", - "typescript": "^5" - }, - "repository": { - "type": "git", - "url": "https://github.com/dxatscale/sfpowerscripts.git", - "directory": "packages/core" - }, - "keywords": [ - "sfdx", - "cli", - "ci/cd" - ], - "author": "dxatscale", - "license": "MIT", - "bugs": { - "url": "https://github.com/dxatscale/sfpowerscripts/issues" - }, - "homepage": "https://github.com/dxatscale/sfpowerscripts#readme" -} diff --git a/packages/core/resources/metadatainfo.json b/packages/core/resources/metadatainfo.json deleted file mode 100644 index abcbaba65..000000000 --- a/packages/core/resources/metadatainfo.json +++ /dev/null @@ -1,1075 +0,0 @@ -{ - "metadataObjects": [ - { - "directoryName": "installedPackages", - "inFolder": false, - "metaFile": false, - "suffix": "installedPackage", - "xmlName": "InstalledPackage" - }, - { - "childXmlNames": ["CustomLabel"], - "directoryName": "labels", - "inFolder": false, - "metaFile": false, - "suffix": "labels", - "xmlName": "CustomLabels" - }, - { - "directoryName": "staticresources", - "inFolder": false, - "metaFile": true, - "suffix": "resource", - "xmlName": "StaticResource" - }, - { - "directoryName": "scontrols", - "inFolder": false, - "metaFile": true, - "suffix": "scf", - "xmlName": "Scontrol" - }, - { - "directoryName": "certs", - "inFolder": false, - "metaFile": true, - "suffix": "crt", - "xmlName": "Certificate" - }, - { - "directoryName": "messageChannels", - "inFolder": false, - "metaFile": false, - "suffix": "messageChannel", - "xmlName": "LightningMessageChannel" - }, - { - "directoryName": "aura", - "inFolder": false, - "metaFile": false, - "xmlName": "AuraDefinitionBundle" - }, - { - "directoryName": "lwc", - "inFolder": false, - "metaFile": false, - "xmlName": "LightningComponentBundle" - }, - { - "directoryName": "components", - "inFolder": false, - "metaFile": true, - "suffix": "component", - "xmlName": "ApexComponent" - }, - { - "directoryName": "pages", - "inFolder": false, - "metaFile": true, - "suffix": "page", - "xmlName": "ApexPage" - }, - { - "directoryName": "queues", - "inFolder": false, - "metaFile": false, - "suffix": "queue", - "xmlName": "Queue" - }, - { - "directoryName": "CaseSubjectParticles", - "inFolder": false, - "metaFile": false, - "suffix": "CaseSubjectParticle", - "xmlName": "CaseSubjectParticle" - }, - { - "directoryName": "dataSources", - "inFolder": false, - "metaFile": false, - "suffix": "dataSource", - "xmlName": "ExternalDataSource" - }, - { - "directoryName": "namedCredentials", - "inFolder": false, - "metaFile": false, - "suffix": "namedCredential", - "xmlName": "NamedCredential" - }, - { - "directoryName": "externalServiceRegistrations", - "inFolder": false, - "metaFile": false, - "suffix": "externalServiceRegistration", - "xmlName": "ExternalServiceRegistration" - }, - { - "directoryName": "roles", - "inFolder": false, - "metaFile": false, - "suffix": "role", - "xmlName": "Role" - }, - { - "directoryName": "groups", - "inFolder": false, - "metaFile": false, - "suffix": "group", - "xmlName": "Group" - }, - { - "directoryName": "globalValueSets", - "inFolder": false, - "metaFile": false, - "suffix": "globalValueSet", - "xmlName": "GlobalValueSet" - }, - { - "directoryName": "standardValueSets", - "inFolder": false, - "metaFile": false, - "suffix": "standardValueSet", - "xmlName": "StandardValueSet" - }, - { - "directoryName": "customPermissions", - "inFolder": false, - "metaFile": false, - "suffix": "customPermission", - "xmlName": "CustomPermission" - }, - { - "childXmlNames": [ - "CustomField", - "Index", - "BusinessProcess", - "RecordType", - "CompactLayout", - "WebLink", - "ValidationRule", - "SharingReason", - "ListView", - "FieldSet" - ], - "directoryName": "objects", - "inFolder": false, - "metaFile": false, - "suffix": "object", - "xmlName": "CustomObject" - }, - { - "directoryName": "reportTypes", - "inFolder": false, - "metaFile": false, - "suffix": "reportType", - "xmlName": "ReportType" - }, - { - "directoryName": "reports", - "inFolder": true, - "metaFile": false, - "suffix": "report", - "xmlName": "Report" - }, - { - "directoryName": "dashboards", - "inFolder": true, - "metaFile": false, - "suffix": "dashboard", - "xmlName": "Dashboard" - }, - { - "directoryName": "analyticSnapshots", - "inFolder": false, - "metaFile": false, - "suffix": "snapshot", - "xmlName": "AnalyticSnapshot" - }, - { - "directoryName": "feedFilters", - "inFolder": false, - "metaFile": false, - "suffix": "feedFilter", - "xmlName": "CustomFeedFilter" - }, - { - "directoryName": "layouts", - "inFolder": false, - "metaFile": false, - "suffix": "layout", - "xmlName": "Layout" - }, - { - "directoryName": "documents", - "inFolder": true, - "metaFile": true, - "suffix": "document", - "xmlName": "Document" - }, - { - "directoryName": "weblinks", - "inFolder": false, - "metaFile": false, - "suffix": "weblink", - "xmlName": "CustomPageWebLink" - }, - { - "directoryName": "letterhead", - "inFolder": false, - "metaFile": false, - "suffix": "letter", - "xmlName": "Letterhead" - }, - { - "directoryName": "email", - "inFolder": true, - "metaFile": true, - "suffix": "email", - "xmlName": "EmailTemplate" - }, - { - "directoryName": "quickActions", - "inFolder": false, - "metaFile": false, - "suffix": "quickAction", - "xmlName": "QuickAction" - }, - { - "directoryName": "flexipages", - "inFolder": false, - "metaFile": false, - "suffix": "flexipage", - "xmlName": "FlexiPage" - }, - { - "directoryName": "tabs", - "inFolder": false, - "metaFile": false, - "suffix": "tab", - "xmlName": "CustomTab" - }, - { - "directoryName": "customApplicationComponents", - "inFolder": false, - "metaFile": false, - "suffix": "customApplicationComponent", - "xmlName": "CustomApplicationComponent" - }, - { - "directoryName": "applications", - "inFolder": false, - "metaFile": false, - "suffix": "app", - "xmlName": "CustomApplication" - }, - { - "directoryName": "customMetadata", - "inFolder": false, - "metaFile": false, - "suffix": "md", - "xmlName": "CustomMetadata" - }, - { - "directoryName": "flows", - "inFolder": false, - "metaFile": false, - "suffix": "flow", - "xmlName": "Flow" - }, - { - "directoryName": "flowDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "flowDefinition", - "xmlName": "FlowDefinition" - }, - { - "childXmlNames": [ - "WorkflowFieldUpdate", - "WorkflowKnowledgePublish", - "WorkflowTask", - "WorkflowAlert", - "WorkflowSend", - "WorkflowOutboundMessage", - "WorkflowRule" - ], - "directoryName": "workflows", - "inFolder": false, - "metaFile": false, - "suffix": "workflow", - "xmlName": "Workflow" - }, - { - "childXmlNames": ["AssignmentRule"], - "directoryName": "assignmentRules", - "inFolder": false, - "metaFile": false, - "suffix": "assignmentRules", - "xmlName": "AssignmentRules" - }, - { - "childXmlNames": ["AutoResponseRule"], - "directoryName": "autoResponseRules", - "inFolder": false, - "metaFile": false, - "suffix": "autoResponseRules", - "xmlName": "AutoResponseRules" - }, - { - "childXmlNames": ["EscalationRule"], - "directoryName": "escalationRules", - "inFolder": false, - "metaFile": false, - "suffix": "escalationRules", - "xmlName": "EscalationRules" - }, - { - "directoryName": "postTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "postTemplate", - "xmlName": "PostTemplate" - }, - { - "directoryName": "approvalProcesses", - "inFolder": false, - "metaFile": false, - "suffix": "approvalProcess", - "xmlName": "ApprovalProcess" - }, - { - "directoryName": "homePageComponents", - "inFolder": false, - "metaFile": false, - "suffix": "homePageComponent", - "xmlName": "HomePageComponent" - }, - { - "directoryName": "homePageLayouts", - "inFolder": false, - "metaFile": false, - "suffix": "homePageLayout", - "xmlName": "HomePageLayout" - }, - { - "directoryName": "objectTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "objectTranslation", - "xmlName": "CustomObjectTranslation" - }, - { - "directoryName": "objectTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "fieldTranslation", - "xmlName": "CustomFieldTranslation" - }, - { - "directoryName": "translations", - "inFolder": false, - "metaFile": false, - "suffix": "translation", - "xmlName": "Translations" - }, - { - "directoryName": "globalValueSetTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "globalValueSetTranslation", - "xmlName": "GlobalValueSetTranslation" - }, - { - "directoryName": "standardValueSetTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "standardValueSetTranslation", - "xmlName": "StandardValueSetTranslation" - }, - { - "directoryName": "classes", - "inFolder": false, - "metaFile": true, - "suffix": "cls", - "xmlName": "ApexClass" - }, - { - "directoryName": "triggers", - "inFolder": false, - "metaFile": true, - "suffix": "trigger", - "xmlName": "ApexTrigger" - }, - { - "directoryName": "testSuites", - "inFolder": false, - "metaFile": false, - "suffix": "testSuite", - "xmlName": "ApexTestSuite" - }, - { - "directoryName": "profiles", - "inFolder": false, - "metaFile": false, - "suffix": "profile", - "xmlName": "Profile" - }, - { - "directoryName": "permissionsets", - "inFolder": false, - "metaFile": false, - "suffix": "permissionset", - "xmlName": "PermissionSet" - }, - { - "directoryName": "mutingpermissionsets", - "inFolder": false, - "metaFile": false, - "suffix": "mutingpermissionset", - "xmlName": "MutingPermissionSet" - }, - { - "directoryName": "permissionsetgroups", - "inFolder": false, - "metaFile": false, - "suffix": "permissionsetgroup", - "xmlName": "PermissionSetGroup" - }, - { - "directoryName": "profilePasswordPolicies", - "inFolder": false, - "metaFile": false, - "suffix": "profilePasswordPolicy", - "xmlName": "ProfilePasswordPolicy" - }, - { - "directoryName": "profileSessionSettings", - "inFolder": false, - "metaFile": false, - "suffix": "profileSessionSetting", - "xmlName": "ProfileSessionSetting" - }, - { - "directoryName": "myDomainDiscoverableLogins", - "inFolder": false, - "metaFile": false, - "suffix": "myDomainDiscoverableLogin", - "xmlName": "MyDomainDiscoverableLogin" - }, - { - "directoryName": "oauthcustomscopes", - "inFolder": false, - "metaFile": false, - "suffix": "oauthcustomscope", - "xmlName": "OauthCustomScope" - }, - { - "directoryName": "datacategorygroups", - "inFolder": false, - "metaFile": false, - "suffix": "datacategorygroup", - "xmlName": "DataCategoryGroup" - }, - { - "directoryName": "remoteSiteSettings", - "inFolder": false, - "metaFile": false, - "suffix": "remoteSite", - "xmlName": "RemoteSiteSetting" - }, - { - "directoryName": "cspTrustedSites", - "inFolder": false, - "metaFile": false, - "suffix": "cspTrustedSite", - "xmlName": "CspTrustedSite" - }, - { - "directoryName": "redirectWhitelistUrls", - "inFolder": false, - "metaFile": false, - "suffix": "redirectWhitelistUrl", - "xmlName": "RedirectWhitelistUrl" - }, - { - "childXmlNames": ["MatchingRule"], - "directoryName": "matchingRules", - "inFolder": false, - "metaFile": false, - "suffix": "matchingRule", - "xmlName": "MatchingRules" - }, - { - "directoryName": "duplicateRules", - "inFolder": false, - "metaFile": false, - "suffix": "duplicateRule", - "xmlName": "DuplicateRule" - }, - { - "directoryName": "cleanDataServices", - "inFolder": false, - "metaFile": false, - "suffix": "cleanDataService", - "xmlName": "CleanDataService" - }, - { - "directoryName": "skills", - "inFolder": false, - "metaFile": false, - "suffix": "skill", - "xmlName": "Skill" - }, - { - "directoryName": "serviceChannels", - "inFolder": false, - "metaFile": false, - "suffix": "serviceChannel", - "xmlName": "ServiceChannel" - }, - { - "directoryName": "queueRoutingConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "queueRoutingConfig", - "xmlName": "QueueRoutingConfig" - }, - { - "directoryName": "servicePresenceStatuses", - "inFolder": false, - "metaFile": false, - "suffix": "servicePresenceStatus", - "xmlName": "ServicePresenceStatus" - }, - { - "directoryName": "presenceDeclineReasons", - "inFolder": false, - "metaFile": false, - "suffix": "presenceDeclineReason", - "xmlName": "PresenceDeclineReason" - }, - { - "directoryName": "presenceUserConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "presenceUserConfig", - "xmlName": "PresenceUserConfig" - }, - { - "directoryName": "authproviders", - "inFolder": false, - "metaFile": false, - "suffix": "authprovider", - "xmlName": "AuthProvider" - }, - { - "directoryName": "eclair", - "inFolder": false, - "metaFile": true, - "suffix": "geodata", - "xmlName": "EclairGeoData" - }, - { - "directoryName": "sites", - "inFolder": false, - "metaFile": false, - "suffix": "site", - "xmlName": "CustomSite" - }, - { - "directoryName": "channelLayouts", - "inFolder": false, - "metaFile": false, - "suffix": "channelLayout", - "xmlName": "ChannelLayout" - }, - { - "directoryName": "contentassets", - "inFolder": false, - "metaFile": true, - "suffix": "asset", - "xmlName": "ContentAsset" - }, - { - "directoryName": "sites", - "inFolder": false, - "metaFile": false, - "suffix": "site", - "xmlName": "CustomSite" - }, - { - "childXmlNames": ["SharingOwnerRule", "SharingCriteriaRule"], - "directoryName": "sharingRules", - "inFolder": false, - "metaFile": false, - "suffix": "sharingRules", - "xmlName": "SharingRules" - }, - { - "directoryName": "sharingSets", - "inFolder": false, - "metaFile": false, - "suffix": "sharingSet", - "xmlName": "SharingSet" - }, - { - "directoryName": "communities", - "inFolder": false, - "metaFile": false, - "suffix": "community", - "xmlName": "Community" - }, - { - "directoryName": "ChatterExtensions", - "inFolder": false, - "metaFile": false, - "suffix": "ChatterExtension", - "xmlName": "ChatterExtension" - }, - { - "directoryName": "platformEventChannels", - "inFolder": false, - "metaFile": false, - "suffix": "platformEventChannel", - "xmlName": "PlatformEventChannel" - }, - { - "directoryName": "platformEventChannelMembers", - "inFolder": false, - "metaFile": false, - "suffix": "platformEventChannelMember", - "xmlName": "PlatformEventChannelMember" - }, - { - "directoryName": "callCenters", - "inFolder": false, - "metaFile": false, - "suffix": "callCenter", - "xmlName": "CallCenter" - }, - { - "directoryName": "milestoneTypes", - "inFolder": false, - "metaFile": false, - "suffix": "milestoneType", - "xmlName": "MilestoneType" - }, - { - "directoryName": "entitlementProcesses", - "inFolder": false, - "metaFile": false, - "suffix": "entitlementProcess", - "xmlName": "EntitlementProcess" - }, - { - "directoryName": "entitlementTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "entitlementTemplate", - "xmlName": "EntitlementTemplate" - }, - { - "directoryName": "timeSheetTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "timeSheetTemplate", - "xmlName": "TimeSheetTemplate" - }, - { - "directoryName": "Canvases", - "inFolder": false, - "metaFile": false, - "suffix": "Canvas", - "xmlName": "CanvasMetadata" - }, - { - "directoryName": "MobileApplicationDetails", - "inFolder": false, - "metaFile": false, - "suffix": "MobileApplicationDetail", - "xmlName": "MobileApplicationDetail" - }, - { - "directoryName": "notificationtypes", - "inFolder": false, - "metaFile": false, - "suffix": "notiftype", - "xmlName": "CustomNotificationType" - }, - { - "directoryName": "connectedApps", - "inFolder": false, - "metaFile": false, - "suffix": "connectedApp", - "xmlName": "ConnectedApp" - }, - { - "directoryName": "appMenus", - "inFolder": false, - "metaFile": false, - "suffix": "appMenu", - "xmlName": "AppMenu" - }, - { - "directoryName": "notificationTypeConfig", - "inFolder": false, - "metaFile": false, - "suffix": "config", - "xmlName": "NotificationTypeConfig" - }, - { - "directoryName": "delegateGroups", - "inFolder": false, - "metaFile": false, - "suffix": "delegateGroup", - "xmlName": "DelegateGroup" - }, - { - "directoryName": "siteDotComSites", - "inFolder": false, - "metaFile": true, - "suffix": "site", - "xmlName": "SiteDotCom" - }, - { - "directoryName": "experiences", - "inFolder": false, - "metaFile": false, - "xmlName": "ExperienceBundle" - }, - { - "directoryName": "networks", - "inFolder": false, - "metaFile": false, - "suffix": "network", - "xmlName": "Network" - }, - { - "directoryName": "networkBranding", - "inFolder": false, - "metaFile": true, - "suffix": "networkBranding", - "xmlName": "NetworkBranding" - }, - { - "directoryName": "audience", - "inFolder": false, - "metaFile": false, - "suffix": "audience", - "xmlName": "Audience" - }, - { - "directoryName": "brandingSets", - "inFolder": false, - "metaFile": false, - "suffix": "brandingSet", - "xmlName": "BrandingSet" - }, - { - "directoryName": "communityThemeDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "communityThemeDefinition", - "xmlName": "CommunityThemeDefinition" - }, - { - "directoryName": "communityTemplateDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "communityTemplateDefinition", - "xmlName": "CommunityTemplateDefinition" - }, - { - "directoryName": "navigationMenus", - "inFolder": false, - "metaFile": false, - "suffix": "navigationMenu", - "xmlName": "NavigationMenu" - }, - { - "directoryName": "flowCategories", - "inFolder": false, - "metaFile": false, - "suffix": "flowCategory", - "xmlName": "FlowCategory" - }, - { - "directoryName": "lightningBolts", - "inFolder": false, - "metaFile": false, - "suffix": "lightningBolt", - "xmlName": "LightningBolt" - }, - { - "directoryName": "lightningExperienceThemes", - "inFolder": false, - "metaFile": false, - "suffix": "lightningExperienceTheme", - "xmlName": "LightningExperienceTheme" - }, - { - "directoryName": "lightningOnboardingConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "lightningOnboardingConfig", - "xmlName": "LightningOnboardingConfig" - }, - { - "directoryName": "customHelpMenuSections", - "inFolder": false, - "metaFile": false, - "suffix": "customHelpMenuSection", - "xmlName": "CustomHelpMenuSection" - }, - { - "directoryName": "prompts", - "inFolder": false, - "metaFile": false, - "suffix": "prompt", - "xmlName": "Prompt" - }, - { - "childXmlNames": ["ManagedTopic"], - "directoryName": "managedTopics", - "inFolder": false, - "metaFile": false, - "suffix": "managedTopics", - "xmlName": "ManagedTopics" - }, - { - "directoryName": "moderation", - "inFolder": false, - "metaFile": false, - "suffix": "keywords", - "xmlName": "KeywordList" - }, - { - "directoryName": "userCriteria", - "inFolder": false, - "metaFile": false, - "suffix": "userCriteria", - "xmlName": "UserCriteria" - }, - { - "directoryName": "moderation", - "inFolder": false, - "metaFile": false, - "suffix": "rule", - "xmlName": "ModerationRule" - }, - { - "directoryName": "cmsConnectSource", - "inFolder": false, - "metaFile": false, - "suffix": "cmsConnectSource", - "xmlName": "CMSConnectSource" - }, - { - "directoryName": "managedContentTypes", - "inFolder": false, - "metaFile": false, - "suffix": "managedContentType", - "xmlName": "ManagedContentType" - }, - { - "directoryName": "samlssoconfigs", - "inFolder": false, - "metaFile": false, - "suffix": "samlssoconfig", - "xmlName": "SamlSsoConfig" - }, - { - "directoryName": "corsWhitelistOrigins", - "inFolder": false, - "metaFile": false, - "suffix": "corsWhitelistOrigin", - "xmlName": "CorsWhitelistOrigin" - }, - { - "directoryName": "actionLinkGroupTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "actionLinkGroupTemplate", - "xmlName": "ActionLinkGroupTemplate" - }, - { - "directoryName": "liveChatDeployments", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatDeployment", - "xmlName": "LiveChatDeployment" - }, - { - "directoryName": "liveChatButtons", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatButton", - "xmlName": "LiveChatButton" - }, - { - "directoryName": "liveChatAgentConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatAgentConfig", - "xmlName": "LiveChatAgentConfig" - }, - { - "directoryName": "liveChatSensitiveDataRule", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatSensitiveDataRule", - "xmlName": "LiveChatSensitiveDataRule" - }, - { - "directoryName": "transactionSecurityPolicies", - "inFolder": false, - "metaFile": false, - "suffix": "transactionSecurityPolicy", - "xmlName": "TransactionSecurityPolicy" - }, - { - "directoryName": "synonymDictionaries", - "inFolder": false, - "metaFile": false, - "suffix": "synonymDictionary", - "xmlName": "SynonymDictionary" - }, - { - "directoryName": "pathAssistants", - "inFolder": false, - "metaFile": false, - "suffix": "pathAssistant", - "xmlName": "PathAssistant" - }, - { - "directoryName": "animationRules", - "inFolder": false, - "metaFile": false, - "suffix": "animationRule", - "xmlName": "AnimationRule" - }, - { - "directoryName": "LeadConvertSettings", - "inFolder": false, - "metaFile": false, - "suffix": "LeadConvertSetting", - "xmlName": "LeadConvertSettings" - }, - { - "directoryName": "cachePartitions", - "inFolder": false, - "metaFile": false, - "suffix": "cachePartition", - "xmlName": "PlatformCachePartition" - }, - { - "directoryName": "topicsForObjects", - "inFolder": false, - "metaFile": false, - "suffix": "topicsForObjects", - "xmlName": "TopicsForObjects" - }, - { - "directoryName": "recommendationStrategies", - "inFolder": false, - "metaFile": false, - "suffix": "recommendationStrategy", - "xmlName": "RecommendationStrategy" - }, - { - "directoryName": "emailservices", - "inFolder": false, - "metaFile": false, - "suffix": "xml", - "xmlName": "EmailServicesFunction" - }, - { - "directoryName": "recordActionDeployments", - "inFolder": false, - "metaFile": false, - "suffix": "deployment", - "xmlName": "RecordActionDeployment" - }, - { - "directoryName": "salesAgreementSettings", - "inFolder": false, - "metaFile": false, - "suffix": "salesAgreementSetting", - "xmlName": "SalesAgreementSettings" - }, - { - "directoryName": "AccountForecastSettings", - "inFolder": false, - "metaFile": false, - "suffix": "accountForecastSetting", - "xmlName": "AccountForecastSettings" - }, - { - "directoryName": "icons", - "inFolder": false, - "metaFile": false, - "suffix": "icon", - "xmlName": "Icon" - }, - { - "directoryName": "EmbeddedServiceLiveAgent", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceLiveAgent", - "xmlName": "EmbeddedServiceLiveAgent" - }, - { - "directoryName": "EmbeddedServiceConfig", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceConfig", - "xmlName": "EmbeddedServiceConfig" - }, - { - "directoryName": "EmbeddedServiceBranding", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceBranding", - "xmlName": "EmbeddedServiceBranding" - }, - { - "directoryName": "EmbeddedServiceFlowConfig", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceFlowConfig", - "xmlName": "EmbeddedServiceFlowConfig" - }, - { - "directoryName": "EmbeddedServiceMenuSettings", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceMenuSettings", - "xmlName": "EmbeddedServiceMenuSettings" - }, - { - "directoryName": "uiObjectRelationConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "uiObjectRelationConfig", - "xmlName": "UIObjectRelationConfig" - }, - { - "directoryName": "careProviderSearchConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "careProviderSearchConfig", - "xmlName": "CareProviderSearchConfig" - }, - { - "directoryName": "settings", - "inFolder": false, - "metaFile": false, - "suffix": "settings", - "xmlName": "Settings" - } - ], - "organizationNamespace": "", - "partialSaveAllowed": false, - "testRequired": true -} diff --git a/packages/core/resources/pooldefinition.schema.json b/packages/core/resources/pooldefinition.schema.json deleted file mode 100644 index 1ecb997d9..000000000 --- a/packages/core/resources/pooldefinition.schema.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/dxatscale/sfpowerscripts/develop/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json", - "title": "pool definition", - "description": "The definition for creating a pool of scratch orgs in sfpowerscripts", - "type": "object", - "required": ["tag", "maxAllocation"], - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Support editors like vscode to help with IntelliSense", - "type": "string", - "default": "https://raw.githubusercontent.com/dxatscale/sfpowerscripts/develop/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json" - }, - "tag": { - "title": "Tag of the pool", - "description": "Tag or name to identify the scratch org pool", - "type": "string" - }, - "waitTime": { - "title": "wait time", - "description": "Time to wait for scratch org creation in minutes (default:6 mins)", - "type": "integer", - "default": 6 - }, - "expiry": { - "title": "expiry", - "description": "Duration of the scratch org (in days) (default:2)", - "type": "integer", - "default": 2 - }, - "maxAllocation": { - "title": "Max number of scratch orgs to be allocated", - "description": "Maximum number of scratch orgs to be allocated in the pool", - "type": "integer" - }, - "batchSize": { - "title": "Batch Size", - "description": "Control the parallelism of the pool creation (default:5)", - "type": "integer", - "default": 5 - }, - "configFilePath": { - "title": "Path to config file", - "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition.", - "type": "string", - "default": "config/project-scratch-def.json" - }, - "releaseConfigFile": { - "title": "Path to release config file", - "description": "Path to the config file which determines how a release defintion should be generated, enable this for pools to use this release config to only utilize artifacts described the releae config", - "type": "string" - }, - "succeedOnDeploymentErrors": { - "title": "Succeed on Deployment Errors", - "description": "In case of a deployment error, whether to keep that scratch org in the pool", - "type": "boolean", - "default": true - }, - "installAll": { - "title": "Install all packages", - "description": "Install all package artifacts, in addition to the managed package dependencies", - "type": "boolean", - "default": false - }, - "enableVlocity": { - "title": "Enable vlocity config deployment", - "description": "[alpha] Enable vlocity settings and config deployment. Please note it doesnt install vlocity managed package", - "type": "boolean", - "default": "false" - }, - "enableSourceTracking": { - "title": "Enable source tracking", - "description": "Enable source tracking by deploying packages using source:push , and persisting local source tracking files", - "type": "boolean", - "default": true - }, - "relaxAllIPRanges": { - "title": "Relax all IP Ranges", - "description": "Relax all IP addresses to enable developers to login to scratch orgs", - "type": "boolean", - "default": "false" - }, - "ipRangesToBeRelaxed": { - "title": "IP ranges to be relaxed", - "description": "Relax IP address of developers to allow access to scratch orgs", - "type": "array" - }, - "retryOnFailure": { - "title": "Retry on failure", - "description": "Retry installation of packages on failed deployment", - "type": "boolean", - "default": "false" - }, - "maxRetryCount": { - "title": "Max Retry Count", - "description": "Maximum number of attempts sfpowerscripts should retry installation of packages on failed deployment", - "type": "number", - "default": "2" - }, - "snapshotPool": { - "title": "Snapshot Pool", - "description": "Use a pre-prepared pool to further add packages on top of it", - "type": "string" - }, - "postDeploymentScriptPath": { - "title": "Post Script", - "description": "Execute a custom script after all the artifacts are deployed into a particular org", - "type": "string" - }, - "preDependencyInstallationScriptPath": { - "title": "Pre Script", - "description": "Execute a custom script before denpendencies install into a particular org", - "type": "string" - }, - "disableSourcePackageOverride": { - "title": "Disable installation of unlocked packages as source package", - "description": "Prepare by default utilizes source package for installing unlocked packages to the scratchorg, disabling this flag will allow to install it ", - "type": "boolean", - "default":false - }, - "fetchArtifacts": { - "title": "Fetch Artifacts using below mechanism", - "description": "Fetch artifacts from artifact registry using below mechanism", - "type": "object", - "oneOf": [{ "required": ["artifactFetchScript"] }, { "required": ["npm"] }], - "properties": { - "artifactFetchScript": { - "title": "Path to the script for fetching artifacts", - "description": "Path to Shell script that handles fetching artifacts from a registry", - "type": "string" - }, - "npm": { - "type": "object", - "required": ["scope"], - "properties": { - "scope": { - "title": "Scope of NPM packages", - "description": "Scope of NPM packages", - "type": "string" - } - } - } - } - } - } -} diff --git a/packages/core/src/apex/ApexClassFetcher.ts b/packages/core/src/apex/ApexClassFetcher.ts deleted file mode 100644 index b7e20ea49..000000000 --- a/packages/core/src/apex/ApexClassFetcher.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from "../queryHelper/ChunkCollection"; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ApexClassFetcher { - constructor(private conn: Connection) {} - - /** - * Query Apex Classes by Name - * - * @param classNames - * @returns - */ - public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> { - let result: {Id: string; Name: string}[] = []; - - const chunks = chunkCollection(classNames); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query - const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); - result = result.concat(records); - } - - return result; - } -} \ No newline at end of file diff --git a/packages/core/src/apex/ApexTriggerFetcher.ts b/packages/core/src/apex/ApexTriggerFetcher.ts deleted file mode 100644 index 9b17c3d4d..000000000 --- a/packages/core/src/apex/ApexTriggerFetcher.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from '../queryHelper/ChunkCollection'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ApexTriggerFetcher { - constructor(private conn: Connection) {} - - /** - * Query Triggers by Name - * - * @param triggerNames - * @returns - */ - public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> { - let result: {Id: string, Name: string}[] = []; - - const chunks = chunkCollection(triggerNames); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query - const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); - result = result.concat(records); - } - - return result; - } -} diff --git a/packages/core/src/apex/coverage/ApexCodeCoverageAggregateFetcher.ts b/packages/core/src/apex/coverage/ApexCodeCoverageAggregateFetcher.ts deleted file mode 100644 index f1f543365..000000000 --- a/packages/core/src/apex/coverage/ApexCodeCoverageAggregateFetcher.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from '../../queryHelper/ChunkCollection'; -import QueryHelper from '../../queryHelper/QueryHelper'; - -export default class ApexCodeCoverageAggregateFetcher { - constructor(private conn: Connection) {} - - /** - * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId - * @param listOfApexClassOrTriggerId - * @returns - */ - public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{ - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }[]> { - let result: { - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }[] = []; - - const chunks = chunkCollection(listOfApexClassOrTriggerId); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); - let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }>(query, this.conn, true); - result = result.concat(records); - } - - return result; - } -} diff --git a/packages/core/src/apex/coverage/IndividualClassCoverage.ts b/packages/core/src/apex/coverage/IndividualClassCoverage.ts deleted file mode 100644 index 004299a6c..000000000 --- a/packages/core/src/apex/coverage/IndividualClassCoverage.ts +++ /dev/null @@ -1,76 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from "@dxatscale/sfp-logger" - -export default class IndividualClassCoverage { - public constructor(private codeCoverage: any, private logger: Logger) {} - - public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] { - let individualClassCoverage: { - name: string; - coveredPercent: number; - }[] = []; - - // Return every class in coverage json if test level is not RunAllTestsInPackage - individualClassCoverage = this.codeCoverage.map((cls) => { - return { name: cls.name, coveredPercent: cls.coveredPercent }; - }); - - // Filter individualClassCoverage based on classesToBeValidated - if(classesToBeValidated && classesToBeValidated.length > 0) - individualClassCoverage = individualClassCoverage.filter((cls) => { - return classesToBeValidated.includes(cls.name); - }); - - - return individualClassCoverage; - } - - public validateIndividualClassCoverage( - individualClassCoverage: ClassCoverage[], - coverageThreshold?: number - ): { - result: boolean; - message: string; - classesCovered?: ClassCoverage[]; - classesWithInvalidCoverage?: ClassCoverage[]; - } { - if (coverageThreshold < 75) { - SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger); - coverageThreshold = 75; - } - - SFPLogger.log( - `Validating individual classes for code coverage greater than ${coverageThreshold} percent`, - LoggerLevel.INFO, - this.logger - ); - let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => { - return cls.coveredPercent < coverageThreshold; - }); - - if (classesWithInvalidCoverage.length > 0) { - return { - result: false, - message: 'There are classes which do not satisfy the individual coverage requirements', - classesCovered: individualClassCoverage, - classesWithInvalidCoverage: classesWithInvalidCoverage, - }; - } else - return { - result: true, - message: 'All classes in this test run meet the required coverage threshold', - classesCovered: individualClassCoverage, - }; - } -} - -export type CoverageOptions = { - isPackageCoverageToBeValidated: boolean; - isIndividualClassCoverageToBeValidated: boolean; - coverageThreshold: number; - classesToBeValidated?: string[]; -}; - -export type ClassCoverage = { - name: string; - coveredPercent: number; -}; diff --git a/packages/core/src/apex/parser/ApexTypeFetcher.ts b/packages/core/src/apex/parser/ApexTypeFetcher.ts deleted file mode 100644 index 3dff890f1..000000000 --- a/packages/core/src/apex/parser/ApexTypeFetcher.ts +++ /dev/null @@ -1,134 +0,0 @@ -import * as fs from 'fs-extra'; -const path = require('path'); -const { globSync } = require('glob'); - -import ApexTypeListener from './listeners/ApexTypeListener'; - -import { - ApexLexer, - ApexParser, - ApexParserListener, - CaseInsensitiveInputStream, - ThrowingErrorListener, - CommonTokenStream, - ParseTreeWalker, -} from 'apex-parser'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import { ApexClasses } from '../../package/SfpPackage'; - -/** - * Get Apex type of cls files in a search directory. - * Sorts files into classes, test classes and interfaces. - */ -export default class ApexTypeFetcher { - private apexSortedByType: ApexSortedByType = { - class: [], - testClass: [], - interface: [], - parseError: [], - }; - - constructor(private searchDir: string) {} - - public getClassesClassifiedByType(): ApexSortedByType { - let clsFiles: string[]; - if (fs.existsSync(this.searchDir)) { - clsFiles = globSync(`**/*.cls`, { - cwd: this.searchDir, - absolute: true, - }); - } else { - throw new Error(`Search directory does not exist`); - } - - for (let clsFile of clsFiles) { - let clsPayload: string = fs.readFileSync(clsFile, 'utf8'); - let fileDescriptor: FileDescriptor = { - name: path.basename(clsFile, '.cls'), - filepath: clsFile, - }; - - // Parse cls file - let compilationUnitContext; - try { - let lexer = new ApexLexer(new CaseInsensitiveInputStream(clsFile, clsPayload)); - let tokens: CommonTokenStream = new CommonTokenStream(lexer); - - let parser = new ApexParser(tokens); - parser.removeErrorListeners(); - parser.addErrorListener(new ThrowingErrorListener()); - - compilationUnitContext = parser.compilationUnit(); - } catch (err) { - SFPLogger.log(`Failed to parse ${clsFile} in ${this.searchDir}`, LoggerLevel.WARN); - SFPLogger.log(err.message, LoggerLevel.WARN); - - fileDescriptor.error = err; - this.apexSortedByType.parseError.push(fileDescriptor); - - continue; - } - - let apexTypeListener: ApexTypeListener = new ApexTypeListener(); - - // Walk parse tree to determine Apex type - ParseTreeWalker.DEFAULT.walk(apexTypeListener as ApexParserListener, compilationUnitContext); - - let apexType = apexTypeListener.getApexType(); - - if (apexType.class) { - this.apexSortedByType.class.push(fileDescriptor); - if (apexType.testClass) { - this.apexSortedByType.testClass.push(fileDescriptor); - } - } else if (apexType.interface) { - this.apexSortedByType.interface.push(fileDescriptor); - } else { - fileDescriptor.error = { message: 'Unknown Apex Type' }; - this.apexSortedByType.parseError.push(fileDescriptor); - } - } - return this.apexSortedByType; - } - - public getTestClasses(): ApexClasses { - let testClassNames: ApexClasses = this.apexSortedByType.testClass.map((fileDescriptor) => fileDescriptor.name); - return testClassNames; - } - - public getClassesOnlyExcludingTestsAndInterfaces(): ApexClasses { - let packageClasses: ApexClasses = this.apexSortedByType.class.map((fileDescriptor) => fileDescriptor.name); - - if (packageClasses != null) { - let testClassesInPackage: ApexClasses = this.apexSortedByType.testClass.map( - (fileDescriptor) => fileDescriptor.name - ); - if (testClassesInPackage != null && testClassesInPackage.length > 0) - packageClasses = packageClasses.filter((item) => !testClassesInPackage.includes(item)); - - let interfacesInPackage: ApexClasses = this.apexSortedByType.testClass.map( - (fileDescriptor) => fileDescriptor.name - ); - if (interfacesInPackage != null && interfacesInPackage.length > 0) - packageClasses = packageClasses.filter((item) => !interfacesInPackage.includes(item)); - - let parseError: ApexClasses = this.apexSortedByType.parseError.map((fileDescriptor) => fileDescriptor.name); - if (parseError != null && parseError.length > 0) - packageClasses = packageClasses.filter((item) => !parseError.includes(item)); - } - return packageClasses; - } -} - -export type ApexSortedByType = { - class: FileDescriptor[]; - testClass: FileDescriptor[]; - interface: FileDescriptor[]; - parseError: FileDescriptor[]; -}; - -export type FileDescriptor = { - name: string; - filepath: string; - error?: any; -}; diff --git a/packages/core/src/apex/parser/listeners/ApexTypeListener.ts b/packages/core/src/apex/parser/listeners/ApexTypeListener.ts deleted file mode 100644 index 12e6e2181..000000000 --- a/packages/core/src/apex/parser/listeners/ApexTypeListener.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - ApexParserListener, - AnnotationContext, - InterfaceDeclarationContext, - ClassDeclarationContext, -} from 'apex-parser'; - -export default class ApexTypeListener implements ApexParserListener { - private apexType: ApexType = { - class: false, - testClass: false, - interface: false, - }; - - enterAnnotation(ctx: AnnotationContext): void { - if (ctx.text.toUpperCase().startsWith('@ISTEST')) { - this.apexType.testClass= true; - } - } - - enterInterfaceDeclaration(ctx: InterfaceDeclarationContext): void { - this.apexType.interface = true; - } - - enterClassDeclaration(ctx: ClassDeclarationContext): void { - this.apexType.class = true; - } - - public getApexType(): ApexType { - return this.apexType; - } -} - -interface ApexType { - class: boolean; - testClass: boolean; - interface: boolean; -} diff --git a/packages/core/src/apextest/ApexTestSuite.ts b/packages/core/src/apextest/ApexTestSuite.ts deleted file mode 100644 index ca2dbd0e0..000000000 --- a/packages/core/src/apextest/ApexTestSuite.ts +++ /dev/null @@ -1,30 +0,0 @@ - -const fs = require('fs-extra'); -import path from 'path'; -import xml2json from '../utils/xml2json'; -import { globSync } from 'glob'; - -export default class ApexTestSuite { - public constructor(private sourceDir: string, private suiteName: string) {} - - public async getConstituentClasses(): Promise { - let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, { - cwd: this.sourceDir, - absolute: true, - }); - - console.log('testSuitePaths',testSuitePaths); - - if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`); - - let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0]))); - - if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) { - return apex_test_suite.ApexTestSuite.testClassName; - } else { - let testClassess = new Array(); - testClassess.push(apex_test_suite.ApexTestSuite.testClassName); - return testClassess; - } - } -} diff --git a/packages/core/src/apextest/ClearCodeCoverage.ts b/packages/core/src/apextest/ClearCodeCoverage.ts deleted file mode 100644 index 611f31670..000000000 --- a/packages/core/src/apextest/ClearCodeCoverage.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Connection, Org } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { chunkArray } from '../utils/ChunkArray'; -const CODECOV_AGGREGATE_QUERY = `SELECT Id FROM ApexCodeCoverageAggregate`; -const APEX_TEST_RESULT_QUERY = `SELECT Id FROM ApexTestResult`; -import { delay } from '../utils/Delay'; - -export default class ClearTestResults { - private conn: Connection; - - public constructor(private org: Org, private logger: Logger) {} - /** - * Clear coverage and test results - */ - public async clear() { - this.conn = this.org.getConnection(); - - SFPLogger.log(`Clearing Coverage Results`, LoggerLevel.DEBUG, this.logger); - let codeCoverageAggregate = await QueryHelper.query(CODECOV_AGGREGATE_QUERY, this.conn, true); - await this.deleteRecords('ApexCodeCoverageAggregate', codeCoverageAggregate); - SFPLogger.log(`Cleared Coverage Results`, LoggerLevel.DEBUG, this.logger); - - SFPLogger.log(`Clearing Test Results`, LoggerLevel.DEBUG, this.logger); - let testResults = await QueryHelper.query(APEX_TEST_RESULT_QUERY, this.conn, true); - await this.deleteRecords('ApexTestResult', testResults); - SFPLogger.log(`Cleared Test Results`, LoggerLevel.DEBUG, this.logger); - - SFPLogger.log(`Cleared Existing Coverage and Test Results`, LoggerLevel.INFO, this.logger); - - //allow org to catchup - await delay(10000); - } - - private async deleteRecords(objectType: string, records: any[]) { - if (records && records.length > 0) { - let idsList: string[] = records.map((elem) => elem.Id); - let errors = []; - for (let idsToDelete of chunkArray(2000, idsList)) { - const deleteResults: any = await this.conn.tooling.destroy(objectType, idsToDelete); - deleteResults.forEach((elem) => { - if (!elem.success) { - errors = errors.concat(elem.errors); - } - }); - } - - if (errors.length > 0) { - throw new Error(JSON.stringify(errors)); - } - } - } -} diff --git a/packages/core/src/apextest/ImpactedApexTestClassFetcher.ts b/packages/core/src/apextest/ImpactedApexTestClassFetcher.ts deleted file mode 100644 index 1181a82b7..000000000 --- a/packages/core/src/apextest/ImpactedApexTestClassFetcher.ts +++ /dev/null @@ -1,90 +0,0 @@ -import * as _ from 'lodash'; -import ApexDepedencyCheckImpl from "@dxatscale/apexlink/lib/ApexDepedencyCheckImpl" -import Component from '../dependency/Component'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SfpPackage, { PackageType } from '../package/SfpPackage'; -import path from 'path'; - -export default class ImpactedApexTestClassFetcher { - public constructor( - private sfpPackage: SfpPackage, - private changedComponents: Component[], - private logger: Logger, - private loglevel?: LoggerLevel - ) {} - - public async getImpactedTestClasses(): Promise { - - let invalidatedClasses = []; - let invalidatedTestClasses = []; - - try - { - let validatedChangedComponents = this.changedComponents.filter( - (component) => component.package == this.sfpPackage.packageName - ); - - SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger); - - - - let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory)); - let dependencies = (await apexLinkImpl.execute()).dependencies; - - if(dependencies.length==0) - { - //go for another attempt - SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger); - apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory); - dependencies = (await apexLinkImpl.execute()).dependencies; - } - - SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger); - - //compute invalidated apex classes - for (const changedComponent of validatedChangedComponents) { - //If the component is a permset or profile, add every test class - //There is a change in security model, add all test classes as invalidated - // Temoorarily disabled this check as it is not working as expected - if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) { - SFPLogger.log( - COLOR_WARNING(`Change in Security Model, pushing all test classes through`), - LoggerLevel.INFO, - this.logger - ); - invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses); - break; - } - - for (const apexClass of dependencies) { - // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class - if (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name); - - // push any apex class or test class who is dependent on the changed entity - for (const dependsOn of apexClass.dependencies) { - if (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name); - } - } - } - - SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger); - //Filter all apex classes by means of whats is detected in test classes list - invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses); - SFPLogger.log( - `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`, - LoggerLevel.INFO, - this.logger - ); - }catch(error) - { - SFPLogger.log( - `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`, - LoggerLevel.ERROR, - this.logger - ); - invalidatedClasses = this.sfpPackage.apexTestClassses; - } - return invalidatedTestClasses; - } -} diff --git a/packages/core/src/apextest/JSONReporter.ts b/packages/core/src/apextest/JSONReporter.ts deleted file mode 100644 index 315f3d47a..000000000 --- a/packages/core/src/apextest/JSONReporter.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* - * 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 - */ -import { ApexTestResultData, ApexTestResultOutcome, TestResult } from '@salesforce/apex-node'; - -export type CliJsonFormat = { - summary: object; - tests: CliTestResult[]; - coverage?: CliCoverageResult; -}; - -type CliTestResult = { - Id: string; - QueueItemId: string; - StackTrace: string; - Message: string; - AsyncApexJobId: string; - MethodName: string; - Outcome: ApexTestResultOutcome; - ApexClass: { Id: string; Name: string; NamespacePrefix: string }; - RunTime: number; - FullName: string; -}; - -type ClassCoverage = { - id: string; - name: string; - totalLines: number; - lines: {}; - totalCovered: number; - coveredPercent: number; -}; - -type PerClassCoverage = { - ApexTestClass: { - Id: string; - Name: string; - }; - Coverage?: { coveredLines: number[]; uncoveredLines: number[] }; - TestMethodName: string; - NumLinesCovered: number; - ApexClassOrTrigger: { - Id: string; - Name: string; - }; - NumLinesUncovered: number; -}; - -type CliCoverageResult = { - coverage: ClassCoverage[]; - records: PerClassCoverage[]; - summary: { - totalLines: number; - coveredLines: number; - testRunCoverage: string; - orgWideCoverage: string; - }; -}; - -const skippedProperties = ['skipRate', 'coveredLines', 'totalLines']; -const timeProperties = ['testExecutionTimeInMs', 'testTotalTimeInMs', 'commandTimeInMs']; - -export class JsonReporter { - public format( - result: TestResult - ): { - summary: object; - tests: CliTestResult[]; - coverage?: CliCoverageResult; - } { - return { - summary: this.formatSummary(result), - tests: this.formatTestResults(result.tests), - ...(result.codecoverage - ? { - coverage: this.formatCoverage(result), - } - : {}), - }; - } - - private formatSummary(testResult: TestResult): object { - const summary = {}; - - Object.entries(testResult.summary).forEach(([key, value]) => { - if (skippedProperties.includes(key)) { - return; - } - - if (timeProperties.includes(key)) { - key = key.replace('InMs', ''); - value = `${value} ms`; - } - - Object.assign(summary, { [key]: value }); - }); - - return summary; - } - - private formatTestResults(testResults: ApexTestResultData[]): CliTestResult[] { - return testResults.map((test) => { - return { - Id: test.id, - QueueItemId: test.queueItemId, - StackTrace: test.stackTrace, - Message: test.message, - AsyncApexJobId: test.asyncApexJobId, - MethodName: test.methodName, - Outcome: test.outcome, - ApexClass: { - Id: test.apexClass.id, - Name: test.apexClass.name, - NamespacePrefix: test.apexClass.namespacePrefix, - }, - RunTime: test.runTime, - FullName: test.fullName, - }; - }) as CliTestResult[]; - } - - private formatCoverage(testResult: TestResult): CliCoverageResult { - const formattedCov = { - coverage: [], - records: [], - summary: { - totalLines: testResult.summary.totalLines, - coveredLines: testResult.summary.coveredLines, - orgWideCoverage: testResult.summary.orgWideCoverage, - testRunCoverage: testResult.summary.testRunCoverage, - }, - } as CliCoverageResult; - - if (testResult.codecoverage) { - formattedCov.coverage = testResult.codecoverage.map((cov) => { - const lines: { [key: number]: number } = {}; - cov.coveredLines.forEach((covLine) => (lines[covLine] = 1)); - cov.uncoveredLines.forEach((uncovLine) => (lines[uncovLine] = 0)); - - return { - id: cov.apexId, - name: cov.name, - totalLines: cov.numLinesCovered + cov.numLinesUncovered, - lines, - totalCovered: cov.numLinesCovered, - coveredPercent: parseInt(cov.percentage), - } as ClassCoverage; - }); - - testResult.tests.forEach((test) => { - if (test.perClassCoverage) { - test.perClassCoverage.forEach((perClassCov) => { - formattedCov.records.push({ - ApexTestClass: { Id: test.id, Name: test.apexClass.name }, - ...(perClassCov.coverage ? { Coverage: perClassCov.coverage } : {}), - TestMethodName: test.methodName, - NumLinesCovered: perClassCov.numLinesCovered, - ApexClassOrTrigger: { - Id: perClassCov.apexClassOrTriggerId, - Name: perClassCov.apexClassOrTriggerName, - }, - NumLinesUncovered: perClassCov.numLinesUncovered, - } as PerClassCoverage); - }); - } - }); - } - - return formattedCov; - } -} diff --git a/packages/core/src/apextest/TestOptions.ts b/packages/core/src/apextest/TestOptions.ts deleted file mode 100644 index 15faf1fcd..000000000 --- a/packages/core/src/apextest/TestOptions.ts +++ /dev/null @@ -1,73 +0,0 @@ -import * as _ from 'lodash'; -import SfpPackage from '../package/SfpPackage'; - -export class TestOptions { - synchronous?: boolean; - wait_time: number; - outputdir: string; - testLevel: TestLevel; -} - -export class RunSpecifiedTestsOption extends TestOptions { - specifiedTests: string; - constructor(wait_time: number, outputdir: string, specifiedTests: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.specifiedTests = specifiedTests; - this.testLevel = TestLevel.RunSpecifiedTests; - } -} - -export class RunApexTestSuitesOption extends TestOptions { - suiteNames: string; - constructor(wait_time: number, outputdir: string, suiteNames: string, pkg?: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.suiteNames = suiteNames; - this.testLevel = TestLevel.RunApexTestSuite; - } -} - -export class RunLocalTests extends TestOptions { - constructor(wait_time: number, outputdir: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.testLevel = TestLevel.RunLocalTests; - } -} - -export class RunAllTestsInOrg extends TestOptions { - constructor(wait_time: number, outputdir: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.testLevel = TestLevel.RunAllTestsInOrg; - } -} - -export class RunAllTestsInPackageOptions extends RunSpecifiedTestsOption { - public constructor(private _sfppackage: SfpPackage, wait_time: number, outputdir: string) { - super(wait_time, outputdir, _sfppackage.apexTestClassses.toString(), false); - this.synchronous = _sfppackage.packageDescriptor.testSynchronous == true ? true : false; - } - - public get sfppackage() { - return this._sfppackage; - } -} - -export enum TestLevel { - RunNoTests = 'NoTestRun', - RunSpecifiedTests = 'RunSpecifiedTests', - RunApexTestSuite = 'RunApexTestSuite', - RunLocalTests = 'RunLocalTests', - RunAllTestsInOrg = 'RunAllTestsInOrg', - RunAllTestsInPackage = 'RunAllTestsInPackage', -} diff --git a/packages/core/src/apextest/TestReportDisplayer.ts b/packages/core/src/apextest/TestReportDisplayer.ts deleted file mode 100644 index 598fd15f0..000000000 --- a/packages/core/src/apextest/TestReportDisplayer.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { RunAllTestsInPackageOptions, RunApexTestSuitesOption, TestOptions } from './TestOptions'; -import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from '../display/TableConstants'; - -const Table = require('cli-table'); - -export class TestReportDisplayer { - constructor(private apexTestReport: any, private testOptions: TestOptions, private fileLogger?: any) {} - - public printTestSummary(packageCoverage?: number): string { - let apexTestReport = { ...this.apexTestReport }; - SFPLogger.log('\n\n\n=== Test Summary', LoggerLevel.INFO, this.fileLogger); - let table = new Table({ - head: ['Name', 'Value'], - chars: ZERO_BORDER_TABLE - }); - - if ( - this.testOptions instanceof RunAllTestsInPackageOptions || - this.testOptions instanceof RunApexTestSuitesOption || - this.testOptions instanceof RunAllTestsInPackageOptions - ) { - delete apexTestReport.summary.testRunCoverage; - delete apexTestReport.summary.orgWideCoverage; - - if (this.testOptions instanceof RunAllTestsInPackageOptions) - apexTestReport.summary.packageCoverage = packageCoverage; - } - - Object.entries(apexTestReport.summary).forEach((keyValuePair) => { - keyValuePair[1] = keyValuePair[1] || ''; - table.push(keyValuePair); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } - - public printTestResults(): string { - SFPLogger.log('=== Test Results', LoggerLevel.INFO, this.fileLogger); - - let table = new Table({ - head: ['Test Name', 'Outcome', 'Message', 'Runtime (ms)'], - chars: ZERO_BORDER_TABLE - }); - - this.apexTestReport.tests.forEach((test) => { - if (test.Outcome === 'Pass') { - table.push([ - COLOR_SUCCESS(test.FullName || ''), - COLOR_SUCCESS(test.Outcome), - COLOR_SUCCESS(test.Message || ''), - COLOR_SUCCESS(test.RunTime || ''), - ]); - } else { - table.push([ - COLOR_ERROR(test.FullName || ''), - COLOR_ERROR(test.Outcome || ''), - COLOR_ERROR(test.Message || ''), - COLOR_ERROR(test.RunTime || ''), - ]); - } - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } - - public printCoverageReport( - coverageThreshold: number, - classesCovered?: { name: string; coveredPercent: number }[], - classesWithInvalidCoverage?: { name: string; coveredPercent: number }[] - ): { classesCoveredTable: string; classInvalidCoverageTable?: string } { - SFPLogger.log('\n\n=== Test Coverage', LoggerLevel.INFO, this.fileLogger); - let classesCoveredTable; - if (classesCovered) { - classesCoveredTable = this.printIndividualClassCoverage(classesCovered); - } - if (classesWithInvalidCoverage) { - let classInvalidCoverageTable = this.printClassesWithInvalidCoverage( - classesWithInvalidCoverage, - coverageThreshold - ); - return { classesCoveredTable, classInvalidCoverageTable }; - } else return { classesCoveredTable }; - } - - private printClassesWithInvalidCoverage( - classesWithInvalidCoverage: { name: string; coveredPercent: number }[], - coverageThreshold: number - ): string { - SFPLogger.log( - `The following classes do not satisfy the ${coverageThreshold}% code coverage requirement:`, - LoggerLevel.INFO, - this.fileLogger - ); - - return this.printIndividualClassCoverage(classesWithInvalidCoverage); - } - - private printIndividualClassCoverage(individualClassCoverage: { name: string; coveredPercent: number }[]): string { - let table = new Table({ - head: ['Class', 'Coverage Percent'], - chars: ZERO_BORDER_TABLE - }); - - individualClassCoverage.forEach((cls) => { - if (cls.coveredPercent !== null && cls.coveredPercent < 75) { - table.push([COLOR_ERROR(cls.name || ''), COLOR_ERROR(cls.coveredPercent)]); - } else if (cls.coveredPercent !== null && cls.coveredPercent >= 75) { - table.push([COLOR_SUCCESS(cls.name || ''), COLOR_SUCCESS(cls.coveredPercent)]); - } else table.push([cls.name || '', 'N/A']); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } -} diff --git a/packages/core/src/apextest/TriggerApexTests.ts b/packages/core/src/apextest/TriggerApexTests.ts deleted file mode 100644 index d521c7733..000000000 --- a/packages/core/src/apextest/TriggerApexTests.ts +++ /dev/null @@ -1,767 +0,0 @@ -const fs = require('fs-extra'); -import path = require('path'); -import { - RunSpecifiedTestsOption, - TestOptions, - RunApexTestSuitesOption, - RunLocalTests, - RunAllTestsInOrg, - RunAllTestsInPackageOptions, -} from './TestOptions'; -import IndividualClassCoverage, { CoverageOptions } from '../apex/coverage/IndividualClassCoverage'; -import { TestReportDisplayer } from './TestReportDisplayer'; -import PackageTestCoverage from '../package/coverage/PackageTestCoverage'; -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel, COLOR_ERROR } from '@dxatscale/sfp-logger'; -import SFPStatsSender from '../stats/SFPStatsSender'; -import { Connection, Org } from '@salesforce/core'; -import { - TestLevel, - TestResult, - TestService, - JUnitReporter, - Progress, - ApexTestProgressValue, - CancellationTokenSource, - ApexTestResultOutcome, - ApexTestResultData, - CodeCoverageResult, -} from '@salesforce/apex-node'; -import { CliJsonFormat, JsonReporter } from './JSONReporter'; -import { Duration } from '@salesforce/kit'; -import ClearCodeCoverage from './ClearCodeCoverage'; -import _ from 'lodash'; -const retry = require('async-retry'); - -export default class TriggerApexTests { - private conn: Connection; - protected cancellationTokenSource = new CancellationTokenSource(); - - public constructor( - private target_org: string, - private testOptions: TestOptions, - private coverageOptions: CoverageOptions, - private project_directory: string, - private fileLogger?: any - ) {} - - public async exec(): Promise<{ - id: string; - result: boolean; - message: string; - }> { - let org = await Org.create({ aliasOrUsername: this.target_org }); - this.conn = org.getConnection(); - - // graceful shutdown - const exitHandler = async (): Promise => { - await this.cancellationTokenSource.asyncCancel(); - process.exit(); - }; - process.on('SIGINT', exitHandler); - process.on('SIGTERM', exitHandler); - - let startTime = Date.now(); - let testExecutionResult: boolean = false; - let testsRan: number; - let commandTime: number; - - try { - const testService = new TestService(this.conn); - - //Clear Code Coverage before triggering tests - try { - let clearCodeCoverage = new ClearCodeCoverage(org, this.fileLogger); - await clearCodeCoverage.clear(); - } catch (error) { - SFPLogger.log( - `Ignoring error in clearing code coverage attributed to ${error}.`, - LoggerLevel.DEBUG, - this.fileLogger - ); - } - - //Translate Tests to test levels used by apex-node - let translatedTestLevel: TestLevel; - //Fetch tests passed in the testOptions - let tests: string = null; - let suites: string = null; - let isCoverageToBeFetched: boolean = - this.coverageOptions.isIndividualClassCoverageToBeValidated || - this.coverageOptions.isPackageCoverageToBeValidated; - - //Translate Test Option - ({ translatedTestLevel, tests, suites } = await this.translateTestOptionToAPIVars(this.testOptions)); - //Trigger tests asynchronously - let testRunResult: TestResult; - try { - testRunResult = (await this.triggerTestAsynchronously( - testService, - translatedTestLevel, - isCoverageToBeFetched, - tests, - suites - )) as TestResult; - } catch (error) { - return { - result: false, - id: null, - message: error.message, - }; - } - - //Fetch Test Results - let testResult = await retry( - async (bail) => { - return await testService.reportAsyncResults( - testRunResult.summary.testRunId, - isCoverageToBeFetched, - this.cancellationTokenSource.token - ); - }, - { retries: 2, minTimeout: 3000 } - ); - - testResult = this.fixBadNamespaceClassFullNames(testResult); - - //Collect Failed Tests only if Parallel - testResult = await this.triggerSecondRunInSerialForParallelFailedTests( - testResult, - testService, - translatedTestLevel, - isCoverageToBeFetched - ); - - //Filter testResult for duplicate test listing - testResult = this.removeDuplicateTestListing(testResult); - - //Write Test Results to file - let jsonOutput = undefined; - try - { - jsonOutput = this.writeTestOutput(testResult); - }catch(error) - { - SFPLogger.log( - `Unable to write test results to file due to ${error}`, - LoggerLevel.DEBUG, - this.fileLogger - ); - return { - result: false, - id: testResult.summary.testRunId, - message: 'Unable to fetch test execution results, Please retry', - }; - } - - //Print tests result to screen - let testReportDisplayer = new TestReportDisplayer(jsonOutput, this.testOptions, this.fileLogger); - testReportDisplayer.printTestResults(); - - commandTime = testResult.summary.commandTimeInMs; - - if (testResult.summary.outcome == 'Failed') { - testExecutionResult = false; - - return { - result: false, - id: testResult.summary.testRunId, - message: 'Test Execution failed', - }; - } else { - if (isCoverageToBeFetched) { - let coverageResults = await this.validateForApexCoverage(jsonOutput.coverage.coverage); - testReportDisplayer.printCoverageReport( - this.coverageOptions.coverageThreshold, - coverageResults.classesCovered, - coverageResults.classesWithInvalidCoverage - ); - - testsRan = testResult.summary.testsRan; - testReportDisplayer.printTestSummary(coverageResults.packageTestCoverage); - - testExecutionResult = coverageResults.result; - SFPStatsSender.logGauge('apextest.testcoverage', coverageResults.packageTestCoverage, { - package: - this.testOptions instanceof RunAllTestsInPackageOptions - ? this.testOptions.sfppackage.packageName - : null, - }); - return { - result: coverageResults.result, - id: testResult.summary.testRunId, - message: coverageResults.message, - }; - } else { - testExecutionResult = true; - SFPStatsSender.logGauge( - 'apextest.testcoverage', - Number.parseInt(testResult.summary.testRunCoverage), - { - package: - this.testOptions instanceof RunAllTestsInPackageOptions - ? this.testOptions.sfppackage.packageName - : null, - } - ); - return { - result: true, - id: testResult.summary.testRunId, - message: `Test execution succesfully completed`, - }; - } - } - } finally { - this.reportMetrics(this.testOptions, { - targetOrg: this.target_org, - startTime, - testExecutionResult, - testsRan, - commandTime, - }); - } - } - - private async translateTestOptionToAPIVars( - testOptions: TestOptions - ): Promise<{ translatedTestLevel: TestLevel; tests: string; suites: string }> { - let translatedTestLevel: TestLevel; - let tests: string; - let suites: string; - if (testOptions instanceof RunAllTestsInPackageOptions) { - ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForAllTestInPackageOptions(testOptions)); - } else if (testOptions instanceof RunSpecifiedTestsOption) { - ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForSpecifiedTests(testOptions)); - } else if (testOptions instanceof RunApexTestSuitesOption) { - translatedTestLevel = TestLevel.RunSpecifiedTests; - suites = (testOptions as RunApexTestSuitesOption).suiteNames; - SFPLogger.log( - `Test Suites to be executed: ${COLOR_KEY_MESSAGE(suites)}`, - LoggerLevel.INFO, - this.fileLogger - ); - } else if (testOptions instanceof RunLocalTests) { - translatedTestLevel = TestLevel.RunLocalTests; - SFPLogger.log( - `Triggering all ${COLOR_KEY_MESSAGE(`local tests`)}in the org`, - LoggerLevel.INFO, - this.fileLogger - ); - } else if (testOptions instanceof RunAllTestsInOrg) { - SFPLogger.log( - `Triggering all ${COLOR_KEY_MESSAGE(`all tests`)}in the org`, - LoggerLevel.INFO, - this.fileLogger - ); - translatedTestLevel = TestLevel.RunAllTestsInOrg; - } - return { translatedTestLevel, tests, suites }; - } - - private removeDuplicateTestListing(testResult: any): any { - let modifiedTestResult = _.cloneDeep(testResult); - - let toEliminateIndices = []; - for (let index = 0; index < modifiedTestResult.tests.length; index++) { - let idx = index; - let duplicateIndices = [index]; - while (idx != -1) { - idx = _.findIndex( - modifiedTestResult.tests, - (elem: any) => { - return elem.methodName == modifiedTestResult.tests[index].methodName - && elem.apexClass.name == modifiedTestResult.tests[index].apexClass.name; - }, - idx + 1 - ); - if (idx != -1) duplicateIndices.push(idx); - } - if (duplicateIndices.length > 1) { - for (const idx of duplicateIndices) { - if (modifiedTestResult.tests[idx].outcome != 'Pass') toEliminateIndices.push(idx); - } - } - } - - modifiedTestResult.tests = modifiedTestResult.tests.filter(function (value, index, arr) { - return !toEliminateIndices.includes(index); - }); - - if (toEliminateIndices.length > 0) modifiedTestResult = this.combineTestResult(modifiedTestResult); - - return modifiedTestResult; - } - - private async getTranslatedOptionsForSpecifiedTests(testOptions: RunSpecifiedTestsOption) { - let translatedTestLevel = TestLevel.RunSpecifiedTests; - let tests = testOptions.specifiedTests; - SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); - SFPLogger.log( - `Test Mode: ${COLOR_KEY_MESSAGE(this.testOptions.synchronous == true ? 'serial' : 'parallel')}`, - LoggerLevel.INFO, - this.fileLogger - ); - //Toggle to serial - await this.toggleParallelApexTesting( - this.conn, - this.fileLogger, - this.testOptions.synchronous == true ? true : false - ); - return { translatedTestLevel, tests }; - } - - private async getTranslatedOptionsForAllTestInPackageOptions(testOptions: RunAllTestsInPackageOptions) { - SFPLogger.log( - `Test Mode Descriptor in Package 'testSynchronous': ${ - testOptions.sfppackage.packageDescriptor.testSynchronous - ? testOptions.sfppackage.packageDescriptor.testSynchronous - : false - }`, - LoggerLevel.TRACE, - this.fileLogger - ); - SFPLogger.log( - `Test Mode: ${COLOR_KEY_MESSAGE(testOptions.synchronous == true ? 'serial' : 'parallel')}`, - LoggerLevel.INFO, - this.fileLogger - ); - await this.toggleParallelApexTesting( - this.conn, - this.fileLogger, - testOptions.synchronous == true ? true : false - ); - let translatedTestLevel = TestLevel.RunSpecifiedTests; - let tests = testOptions.specifiedTests; - SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); - return { translatedTestLevel, tests }; - } - - private async triggerSecondRunInSerialForParallelFailedTests( - testResult: TestResult, - testService: TestService, - translatedTestLevel: TestLevel, - isCoverageToBeFetched: boolean - ) { - let modifiedTestResult = _.cloneDeep(testResult); - if (!this.testOptions.synchronous) { - let parallelFailedTestClasses: string[] = []; - let testClassesThatDonotContributedCoverage: string[] = []; - - let testToBeTriggered: string[] = []; - for (const test of modifiedTestResult.tests) { - if (test.outcome == ApexTestResultOutcome.Fail) { - //Check for messages - if ( - test.message.includes(`Your request exceeded the time limit for processing`) || - test.message.includes(`UNABLE_TO_LOCK_ROW`) || - test.message.includes(`Internal Salesforce Error`) || - test.message.includes(`LIMIT_EXCEEDED`) || - test.message.includes(`Too many concurrent Apex compilations during resource mitigation`) - ) { - if (!testToBeTriggered.includes(test.apexClass.fullName)) { - parallelFailedTestClasses.push(test.apexClass.fullName); - testToBeTriggered.push(test.apexClass.fullName); - } - } - } - - if (test.outcome == ApexTestResultOutcome.Pass) { - if ( - !test.perClassCoverage && - (this.coverageOptions.isPackageCoverageToBeValidated || - this.coverageOptions.isIndividualClassCoverageToBeValidated) - ) { - if (!testToBeTriggered.includes(test.apexClass.fullName)) { - testClassesThatDonotContributedCoverage.push(test.apexClass.fullName); - if (!testToBeTriggered.includes(test.apexClass.fullName)) - testToBeTriggered.push(test.apexClass.fullName); - } - } - } - } - - if (parallelFailedTestClasses.length > 0) { - SFPLogger.log( - `Failed Tests while triggered in parallel: ${COLOR_KEY_MESSAGE( - parallelFailedTestClasses.toString() - )}`, - LoggerLevel.INFO, - this.fileLogger - ); - } - - if (testClassesThatDonotContributedCoverage.length > 0) { - SFPLogger.log( - `Test Classes that were not able to contribute coverage: ${COLOR_KEY_MESSAGE( - testClassesThatDonotContributedCoverage.toString() - )}`, - LoggerLevel.INFO, - this.fileLogger - ); - } - - if (testToBeTriggered.length > 0) { - SFPLogger.log( - `Triggering tests synchronously: ${COLOR_KEY_MESSAGE(testToBeTriggered.toString())}`, - LoggerLevel.INFO, - this.fileLogger - ); - //Trigger Second Test Run - //Convert to sequential - await this.toggleParallelApexTesting(this.conn, this.fileLogger, true); - - //Trigger tests asynchronously - let secondRuntestRunResult: TestResult; - secondRuntestRunResult = await retry( - async (bail) => { - return (await this.triggerTestAsynchronously( - testService, - translatedTestLevel, - isCoverageToBeFetched, - testToBeTriggered.toString(), - null - )) as TestResult; - }, - { retries: 2, minTimeout: 3000 } - ); - - secondRuntestRunResult = this.fixBadNamespaceClassFullNames(secondRuntestRunResult); - - //Fetch Test Results - const secondTestResult = this.fixBadNamespaceClassFullNames( - await testService.reportAsyncResults( - secondRuntestRunResult.summary.testRunId, - true, - this.cancellationTokenSource.token - ) - ); - - this.writeTestOutput(secondTestResult); - - //Merge original test results with second run - const mergedTestResults: ApexTestResultData[] = modifiedTestResult.tests; - for (const testObject of secondTestResult.tests){ - const index = mergedTestResults.findIndex((test) => test.fullName === testObject.fullName); - if (index !== -1) { - mergedTestResults[index] = testObject; - }else{ - mergedTestResults.push(testObject); - } - } - modifiedTestResult.tests = mergedTestResults; - - //Merge original code coverage with second run - if (isCoverageToBeFetched) { - const mergedCodecoverage: CodeCoverageResult[] = modifiedTestResult.codecoverage; - for (const codeCoverageObject of secondTestResult.codecoverage){ - - const index = mergedCodecoverage.findIndex((codeCoverage) => codeCoverage.name === codeCoverageObject.name); - if (index !== -1) { - mergedCodecoverage[index] = codeCoverageObject; - }else{ - mergedCodecoverage.push(codeCoverageObject); - } - } - modifiedTestResult.codecoverage = mergedCodecoverage; - } - - //Now redo the math - modifiedTestResult = this.combineTestResult(modifiedTestResult, secondRuntestRunResult); - } - } - - return modifiedTestResult; - } - - private fixBadNamespaceClassFullNames(testResult: any): any { - let modifiedTestResult = _.cloneDeep(testResult); - - try - { - modifiedTestResult.tests = modifiedTestResult.tests.map((test) => { - return { - ...test, - ...{ - fullName: test.fullName?.replace('__', '.'), - apexClass: { - ...test.apexClass, - ...{ - fullName: test.apexClass?.fullName?.replace('__', '.'), - }, - }, - }, - }; - }); - }catch(error) - { - SFPLogger.log( - `Unable to fix bad namespace class full names due to ${error}`, - LoggerLevel.DEBUG, - this.fileLogger - ); - modifiedTestResult = _.cloneDeep(testResult); - } - - return modifiedTestResult; - } - - private combineTestResult(testResult: TestResult, testResultSecondRun?: TestResult) { - testResult.summary.failing = 0; - testResult.summary.passing = 0; - testResult.summary.skipped = 0; - - for (const test of testResult.tests) { - if (test.outcome === ApexTestResultOutcome.Pass) testResult.summary.passing++; - else if (test.outcome === ApexTestResultOutcome.Fail) testResult.summary.failing++; - else if (test.outcome === ApexTestResultOutcome.Skip) testResult.summary.skipped++; - } - - if (testResult.summary.failing > 0) testResult.summary.outcome = 'Failed'; - else testResult.summary.outcome = 'Passed'; - - testResult.summary.passRate = (testResult.summary.passing / testResult.summary.testsRan) * 100 + '%'; - testResult.summary.failRate = (testResult.summary.failing / testResult.summary.testsRan) * 100 + '%'; - testResult.summary.commandTimeInMs = - testResult.summary.commandTimeInMs + testResultSecondRun?.summary.commandTimeInMs; - testResult.summary.testExecutionTimeInMs = - testResult.summary.testExecutionTimeInMs + testResultSecondRun?.summary.testExecutionTimeInMs; - testResult.summary.testTotalTimeInMs = - testResult.summary.testTotalTimeInMs + testResultSecondRun?.summary.testTotalTimeInMs; - - delete testResult.summary.testRunCoverage; - delete testResult.summary.orgWideCoverage; - delete testResult.summary.totalLines; - delete testResult.summary.coveredLines; - - if (testResultSecondRun) - testResult.summary.testRunId = testResult.summary.testRunId.concat( - '_', - testResultSecondRun.summary.testRunId - ); - return testResult; - } - - /** - * Trigger tests asynchronously - * @param {TestService} testService - * @param {TestLevel} testLevel - * @param {string} tests? - * @param {string} suites? - */ - private async triggerTestAsynchronously( - testService: TestService, - testLevel: TestLevel, - isCoverageToBeFetched: boolean, - tests?: string, - suites?: string - ) { - const payload = await testService.buildAsyncPayload(testLevel, null, tests, suites); - - let result = await testService.runTestAsynchronous( - payload, - isCoverageToBeFetched, - false, - new ProgressReporter(this.fileLogger), - this.cancellationTokenSource.token - ); - - if (this.cancellationTokenSource.token.isCancellationRequested) { - throw new Error(`A previous run is being cancelled.. Please try after some time`); - } - - return result; - } - - private async validateForApexCoverage( - coverageReport: any - ): Promise<{ - result: boolean; - message?: string; - packageTestCoverage?: number; - classesCovered?: { - name: string; - coveredPercent: number; - }[]; - classesWithInvalidCoverage?: { - name: string; - coveredPercent: number; - }[]; - }> { - if (this.testOptions instanceof RunAllTestsInPackageOptions) { - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - this.testOptions.sfppackage, - coverageReport, - this.fileLogger, - this.conn - ); - - return packageTestCoverage.validateTestCoverage(this.coverageOptions.coverageThreshold); - } else { - if (this.coverageOptions.isIndividualClassCoverageToBeValidated) { - let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( - coverageReport, - this.fileLogger - ); - return coverageValidator.validateIndividualClassCoverage( - coverageValidator.getIndividualClassCoverage(this.coverageOptions.classesToBeValidated), - this.coverageOptions.coverageThreshold - ); - } else { - let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( - coverageReport, - this.fileLogger - ); - return coverageValidator.validateIndividualClassCoverage( - coverageValidator.getIndividualClassCoverage() - ); - } - } - } - - private writeJUnit(testResult: TestResult) { - SFPLogger.log( - `Junit Report file available at ${path.join( - this.testOptions.outputdir, - `test-result-${testResult.summary.testRunId}-junit.xml` - )}` - ); - let reportAsJUnitReport = new JUnitReporter().format(testResult); - fs.writeFileSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-junit.xml`), - reportAsJUnitReport - ); - } - - private writeTestOutput(testResult: TestResult): CliJsonFormat { - const jsonOutput = this.formatResultInJson(testResult); - - //write output files - fs.ensureDirSync(this.testOptions.outputdir); - - //Write files - fs.writeJSONSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}.json`), - testResult, - { spaces: 4 } - ); - - if (jsonOutput.coverage) - fs.writeJSONSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-coverage.json`), - jsonOutput.coverage?.coverage, - { spaces: 4 } - ); - - //Write Junit Result no matter what - this.writeJUnit(testResult); - - return jsonOutput; - } - - private formatResultInJson(result: TestResult): CliJsonFormat { - try { - const reporter = new JsonReporter(); - return reporter.format(result); - } catch (error) { - return null; - } - } - - //Enable Synchronus Compile on Deploy - private async toggleParallelApexTesting(conn: Connection, logger: Logger, toEnable: boolean) { - try { - SFPLogger.log(`Set enableDisableParallelApexTesting:${toEnable}`, LoggerLevel.TRACE, logger); - let apexSettingMetadata = { fullName: 'ApexSettings', enableDisableParallelApexTesting: toEnable }; - let result = await conn.metadata.upsert('ApexSettings', apexSettingMetadata); - if (result.success) { - SFPLogger.log(`Successfully updated apex testing setting`, LoggerLevel.INFO, logger); - } - } catch (error) { - SFPLogger.log( - `Skipping toggling of enableDisableParallelApexTesting due to ${error}..`, - LoggerLevel.INFO, - logger - ); - } - } - - private reportMetrics( - testOptions: TestOptions, - testMetrics: { - targetOrg: string; - startTime: number; - testExecutionResult: boolean; - testsRan: number; - commandTime?: number; - } - ) { - let elapsedTime = Date.now() - testMetrics.startTime; - - if (testMetrics.testExecutionResult) - SFPStatsSender.logGauge('apextest.tests.ran', testMetrics.testsRan, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - - SFPStatsSender.logGauge('apextest.testtotal.time', elapsedTime, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions['testlevel'], - target_org: testMetrics.targetOrg, - }); - - if (testMetrics.commandTime) - SFPStatsSender.logGauge('apextest.command.time', testMetrics.commandTime, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - - SFPStatsSender.logCount('apextests.triggered', { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - } -} -export class ProgressReporter implements Progress { - private lastExecutedTime; - constructor(private logger: Logger) { - this.lastExecutedTime = Date.now(); - } - - report(value: ApexTestProgressValue): void { - try { - let count = {}; - //Limit printing an update to 30 seconds - if (Date.now() - this.lastExecutedTime > Duration.seconds(30).milliseconds) { - if (value.type == 'TestQueueProgress') { - for (const elem of value.value.records) { - if (elem?.Status) { - if (!count[elem.Status]) { - count[elem.Status] = 1; - } else count[elem.Status]++; - } - } - let statusString = ''; - - //Compute total - let total: number = 0; - for (const [key, value] of Object.entries(count)) { - total += value as number; - } - statusString = `Completed:${count['Completed'] ? count['Completed'] : 0}/${total} Queued(${ - count['Queued'] ? count['Queued'] : 0 - }) Failed(${COLOR_ERROR(count['Failed'] ? count['Failed'] : 0)}) `; - SFPLogger.log(`Test Status: ` + COLOR_KEY_MESSAGE(statusString), LoggerLevel.INFO, this.logger); - this.lastExecutedTime = Date.now(); - } - } - } catch (error) { - //Ignore any results during reporting - } - } -} diff --git a/packages/core/src/artifacts/ArtifactFetcher.ts b/packages/core/src/artifacts/ArtifactFetcher.ts deleted file mode 100644 index e56641278..000000000 --- a/packages/core/src/artifacts/ArtifactFetcher.ts +++ /dev/null @@ -1,224 +0,0 @@ -import path = require('path'); -import * as fs from 'fs-extra'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { globSync } from 'glob'; -import AdmZip = require('adm-zip'); -import semver = require('semver'); -import tar = require('tar'); - -export default class ArtifactFetcher { - /** - * Decider for which artifact retrieval method to use - * Returns empty array if no artifacts are found - * @param artifactDirectory - * @param sfdx_package - */ - public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] { - let result: Artifact[] = []; - - if (!fs.existsSync(artifactDirectory)) { - throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`); - } - - let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package); - - SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger); - - for (let artifact of artifacts) { - let artifactFilePaths: Artifact; - if (path.extname(artifact) === '.zip') { - artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact); - } else if (path.extname(artifact) === '.tgz') { - artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact); - } else { - throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`); - } - result.push(artifactFilePaths); - } - - return result; - } - - /** - * Helper method for retrieving the ArtifactFilePaths of an artifact folder - * @param packageMetadataFilePath - */ - private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact { - let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`); - - let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Helper method for retrieving ArtifactFilePaths of an artifact zip - * @param artifact - */ - private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfpowerscripts/unzippedArtifacts/${this.makefolderid(8)}`; - - fs.mkdirpSync(unzippedArtifactsDirectory); - let zip = new AdmZip(artifact); - - // Overwrite existing files - zip.extractAllTo(unzippedArtifactsDirectory, true); - - let artifactName: string = path.basename(artifact).match(/.*sfpowerscripts_artifact/)?.[0]; - if (artifactName == null) { - throw new Error(`Failed to fetch artifact file paths for ${artifact}`); - } - - let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json'); - - let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`); - - let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Helper method for retrieving ArtifactFilePaths of a tarball - * @param artifact - */ - private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfpowerscripts/unzippedArtifacts/${this.makefolderid(8)}`; - fs.mkdirpSync(unzippedArtifactsDirectory); - - tar.x({ - file: artifact, - cwd: unzippedArtifactsDirectory, - sync: true, - }); - - let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json'); - - let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`); - - let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Find zip and tarball artifacts - * Artifact format/s: - * sfpowerscripts_artifact_.zip, - * [sfdx_package]_sfpowerscripts_artifact_[version].zip, - * [sfdx_package]_sfpowerscripts_artifact_[version].tgz - */ - public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] { - let pattern: string; - if (sfdx_package) { - pattern = `**/*${sfdx_package}_sfpowerscripts_artifact*.@(zip|tgz)`; - } else { - pattern = `**/*sfpowerscripts_artifact*.@(zip|tgz)`; - } - - let artifacts: string[] = globSync(pattern, { - cwd: artifactDirectory, - absolute: true, - }); - - if (sfdx_package && artifacts.length > 1) { - SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO); - let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts); - SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO); - return [latestArtifact]; - } else return artifacts; - } - - /** - * Get the artifact with the latest semantic version - * @param artifacts - */ - private static getLatestArtifact(artifacts: string[]) { - // Consider zip & tarball artifacts only - artifacts = artifacts.filter((artifact) => { - let ext: string = path.extname(artifact); - return ext === '.zip' || ext === '.tgz'; - }); - - let pattern = new RegExp('(?:^.*)(?:_sfpowerscripts_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); - let versions: string[] = artifacts.map((artifact) => { - let match: RegExpMatchArray = path.basename(artifact).match(pattern); - let version = match?.groups.version; - - if (version) return version; - else throw new Error('Corrupted artifact detected with no version number'); - }); - - // Pick artifact with latest semantic version - let sortedVersions: string[] = semver.sort(versions); - let latestVersion: string = sortedVersions.pop(); - - return artifacts.find((artifact) => artifact.includes(latestVersion)); - } - - /** - * Verify that artifact filepaths exist on the file system - * @param artifactFilePaths - */ - private static existsArtifactFilepaths(artifactFilePaths: Artifact): void { - Object.values(artifactFilePaths).forEach((filepath) => { - if (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`); - }); - } - - /** - * Decider for task outcome if the artifact cannot be found - * @param artifacts_filepaths - * @param isToSkipOnMissingArtifact - */ - public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean { - if (artifacts.length === 0 && !isToSkipOnMissingArtifact) { - throw new Error(`Artifact not found, Please check the inputs`); - } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) { - SFPLogger.log( - `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}` - ); - return true; - } - } - - private static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} - -export interface Artifact { - packageMetadataFilePath: string; - sourceDirectoryPath?: string; - changelogFilePath?: string; -} diff --git a/packages/core/src/artifacts/generators/ArtifactGenerator.ts b/packages/core/src/artifacts/generators/ArtifactGenerator.ts deleted file mode 100644 index 4e9be0f15..000000000 --- a/packages/core/src/artifacts/generators/ArtifactGenerator.ts +++ /dev/null @@ -1,105 +0,0 @@ -import path = require('path'); -import * as fs from 'fs-extra'; -import GeneratePackageChangelog from '../../changelog/GeneratePackageChangelog'; -import { Changelog } from '../../changelog/interfaces/GenericChangelogInterfaces'; -import * as rimraf from 'rimraf'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import AdmZip = require('adm-zip'); -import SfpPackage from '../../package/SfpPackage'; - -export default class ArtifactGenerator { - //Generates the universal artifact used by the CLI and AZP - public static async generateArtifact( - sfpPackage: SfpPackage, - project_directory: string, - artifact_directory: string - ): Promise { - try { - // Artifact folder consisting of artifact metadata, changelog & source - let artifactFolder: string = `${sfpPackage.packageName}_sfpowerscripts_artifact`; - - // Absolute filepath of artifact - let artifactFilepath: string; - - if (artifact_directory != null) { - artifactFilepath = path.resolve(artifact_directory, artifactFolder); - } else { - artifactFilepath = path.resolve(artifactFolder); - } - - fs.mkdirpSync(artifactFilepath); - - let sourcePackage: string = path.join(artifactFilepath, `source`); - fs.mkdirpSync(sourcePackage); - - //Clean up temp directory - if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfpowerscripts'))) - rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfpowerscripts')); - if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfdx'))) - rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfdx')); - - fs.copySync(sfpPackage.workingDirectory, sourcePackage); - rimraf.sync(sfpPackage.workingDirectory); - - //Modify Source Directory to the new source directory inside the artifact - sfpPackage.sourceDir = `source`; - - let artifactMetadataFilePath: string = path.join(artifactFilepath, `artifact_metadata.json`); - - fs.writeFileSync(artifactMetadataFilePath, JSON.stringify(sfpPackage, null, 4)); - - // Generate package changelog - // Doesnt need a from version number, as it always generate from start - let generatePackageChangelog: GeneratePackageChangelog = new GeneratePackageChangelog( - sfpPackage.packageName, - undefined, - sfpPackage.sourceVersion, - project_directory - ); - - let packageChangelog: Changelog = await generatePackageChangelog.exec(); - - let changelogFilepath: string = path.join(artifactFilepath, `changelog.json`); - - fs.writeFileSync(changelogFilepath, JSON.stringify(packageChangelog, null, 4)); - - SFPLogger.log('Artifact Copy Completed', LoggerLevel.DEBUG); - - let zip = new AdmZip(); - zip.addLocalFolder(artifactFilepath, artifactFolder); - SFPLogger.log(`Zipping ${artifactFolder}`, LoggerLevel.DEBUG); - - let packageVersionNumber: string = ArtifactGenerator.substituteBuildNumberWithPreRelease( - sfpPackage.versionNumber - ); - - let zipArtifactFilepath: string = artifactFilepath + `_` + packageVersionNumber + `.zip`; - zip.writeZip(zipArtifactFilepath); - - SFPLogger.log( - `Artifact Generation Completed for ${sfpPackage.packageType} to ${zipArtifactFilepath}`, - LoggerLevel.INFO - ); - - // Cleanup unzipped artifact - rimraf.sync(artifactFilepath); - - return zipArtifactFilepath; - } catch (error) { - throw new Error('Unable to create artifact' + error); - } - } - - private static substituteBuildNumberWithPreRelease(packageVersionNumber: string) { - let segments = packageVersionNumber.split('.'); - - if (segments.length === 4) { - packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { - if (segmentsIdx === 3) return version + '-' + segment; - else return version + '.' + segment; - }); - } - - return packageVersionNumber; - } -} diff --git a/packages/core/src/changelog/GeneratePackageChangelog.ts b/packages/core/src/changelog/GeneratePackageChangelog.ts deleted file mode 100644 index d8d77081c..000000000 --- a/packages/core/src/changelog/GeneratePackageChangelog.ts +++ /dev/null @@ -1,76 +0,0 @@ -import ProjectConfig from '../project/ProjectConfig'; -import simplegit, { SimpleGit, LogOptions } from 'simple-git'; -import { Changelog } from './interfaces/GenericChangelogInterfaces'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; - -/** - * A class for generating a changelog between two commits - * for a single package - */ -export default class GeneratePackageChangelog { - constructor( - private readonly sfdx_package: string, - private readonly revFrom: string, - private readonly revTo: string, - private readonly project_directory: string - ) {} - - public async exec(): Promise { - let git: SimpleGit; - if (this.project_directory != null) { - git = simplegit(this.project_directory); - } else { - git = simplegit(); - } - - let packageDescriptor; - try { - packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(this.project_directory, this.sfdx_package); - } catch (err) { - SFPLogger.log(`Unable to find descriptor for package ${this.sfdx_package}`, LoggerLevel.WARN); - SFPLogger.log(err.message, LoggerLevel.WARN); - } - - let revFrom: string; - if (this.revFrom) { - revFrom = await git.revparse(['--short', `${this.revFrom}^{}`]); - } - - - let revTo: string = await git.revparse(['--short', `${this.revTo}^{}`]); - - let options: LogOptions = { - file: packageDescriptor ? `${packageDescriptor['path']}*` : packageDescriptor, - }; - if(revFrom) - { - options.from = revFrom; - options.to = revTo; - } - - const gitLogResult = await git.log(options); - - let changelog: Changelog = { - name: undefined, - from: undefined, - to: undefined, - commits: [], - }; - - changelog['name'] = this.sfdx_package; - changelog['from'] = revFrom; - changelog['to'] = revTo; - - for (let commit of gitLogResult.all) { - changelog['commits'].push({ - commitId: commit.hash.slice(0, 8), - date: commit.date, - author: commit.author_name, - message: commit.message, - body: commit.body, - }); - } - - return changelog; - } -} diff --git a/packages/core/src/changelog/interfaces/GenericChangelogInterfaces.ts b/packages/core/src/changelog/interfaces/GenericChangelogInterfaces.ts deleted file mode 100644 index d9929d0ad..000000000 --- a/packages/core/src/changelog/interfaces/GenericChangelogInterfaces.ts +++ /dev/null @@ -1,30 +0,0 @@ -export interface Changelog { - /** - * Name of the package - */ - name: string; - - /** - * Backwards-compatibility for delta package - */ - from: string; - - /** - * Commit Id from which package was created - * May not necessarily be the first element in commits - */ - to: string; - - /** - * Commits that modified the package - */ - commits: Commit[]; -} - -export interface Commit { - commitId: string; - date: string; - author: string; - message: string; - body: string; -} diff --git a/packages/core/src/dependency/ChangedComponentsFetcher.ts b/packages/core/src/dependency/ChangedComponentsFetcher.ts deleted file mode 100644 index ee227524a..000000000 --- a/packages/core/src/dependency/ChangedComponentsFetcher.ts +++ /dev/null @@ -1,93 +0,0 @@ -import Git from '../git/Git'; -import IgnoreFiles from '../ignore/IgnoreFiles'; -import ProjectConfig from '../project/ProjectConfig'; -import MetadataFiles from '../metadata/MetadataFiles'; -import Component from './Component'; -import * as fs from 'fs-extra'; -import path = require('path'); -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class ChangedComponentsFetcher { - constructor(private baseBranch: string) {} - - async fetch(): Promise { - const components: Component[] = []; - - let git: Git = await Git.initiateRepo(); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(null); - - if (!this.baseBranch.includes('origin')) { - // for user convenience, use full ref name to avoid errors involving missing local refs - this.baseBranch = `remotes/origin/${this.baseBranch}`; - } - - let diff: string[] = await git.diff([this.baseBranch, `HEAD`, `--no-renames`, `--name-only`]); - - // Filter diff to package directories - diff = diff.filter((filepath) => - projectConfig.packageDirectories.find((pkg) => - // TODO: make comparison more robust - filepath.includes(pkg.path) - ) - ); - - // Apply root forceignore to the diff - let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync('.forceignore', 'utf8')); - diff = ignoreFiles.filter(diff); - - let componentSuccesses = this.getComponentSuccessesFromReports(); - - if (diff.length > 0) { - for (const filepath of diff) { - const fullApiName = MetadataFiles.getFullApiName(filepath); - - // find package that file belongs to - const indexOfPackage = projectConfig.packageDirectories.findIndex((pkg) => filepath.includes(pkg.path)); - - const packageName = projectConfig.packageDirectories[indexOfPackage].package; - - const componentSuccess = componentSuccesses.find( - (component) => component.fullName === fullApiName && component.id - ); - - if (componentSuccess) { - const component: Component = { - id: componentSuccess.id, - fullName: componentSuccess.fullName, - type: componentSuccess.componentType, - files: [filepath], - package: packageName, - packageType: ProjectConfig.getPackageType(projectConfig, packageName), - indexOfPackage: indexOfPackage, - }; - - components.push(component); - } else { - SFPLogger.log(`Unable to find ID for ${fullApiName} in deployment reports`, LoggerLevel.DEBUG); - // Ignore file if it's not an identifiable component - continue; - } - } - } - - return components; - } - - /** - * Aggregates component successes from MDAPI deploy reports - */ - private getComponentSuccessesFromReports(): any[] { - let componentSuccesses: any[] = []; - - const reportsDir: string = '.sfpowerscripts/mdapiDeployReports'; - if (fs.existsSync(reportsDir)) { - let reports = fs.readdirSync(reportsDir); - reports.forEach((report) => { - let data = JSON.parse(fs.readFileSync(path.join(reportsDir, report), 'utf8')); - componentSuccesses = componentSuccesses.concat(data.result.details.componentSuccesses); - }); - } - return componentSuccesses; - } -} diff --git a/packages/core/src/dependency/Component.ts b/packages/core/src/dependency/Component.ts deleted file mode 100644 index 7fe64298b..000000000 --- a/packages/core/src/dependency/Component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PackageType } from "../package/SfpPackage"; - -/** - * Component details and package it belongs to - */ -export default interface Component { - id: string; - fullName: string; - type: string; - files?: string[]; - package?: string; - packageType?: PackageType; - indexOfPackage?: number; - namespace?: string; - dependencies?: Component[]; -} diff --git a/packages/core/src/dependency/DependencyViolation.ts b/packages/core/src/dependency/DependencyViolation.ts deleted file mode 100644 index 80493b56e..000000000 --- a/packages/core/src/dependency/DependencyViolation.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Component from './Component'; - -export default interface DependencyViolation { - component: Component; - dependency: any; - description: string; -} diff --git a/packages/core/src/dependency/Entrypoint.ts b/packages/core/src/dependency/Entrypoint.ts deleted file mode 100644 index 008ec7b59..000000000 --- a/packages/core/src/dependency/Entrypoint.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Component from './Component'; - -/** - * Used by sfdc-soup API calls - */ -export default interface Entrypoint { - name: string; - type: string; - id: string; -} - -export function component2entrypoint(components: Component[]): Entrypoint[] { - return components.map((component) => { - return { - name: component.fullName, - type: component.type, - id: component.id, - } as Entrypoint; - }); -} diff --git a/packages/core/src/deployers/DeploySourceToOrgImpl.ts b/packages/core/src/deployers/DeploySourceToOrgImpl.ts deleted file mode 100644 index 69810d1f3..000000000 --- a/packages/core/src/deployers/DeploySourceToOrgImpl.ts +++ /dev/null @@ -1,230 +0,0 @@ -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_KEY_MESSAGE, - COLOR_SUCCESS, - Logger, - LoggerLevel, -} from '@dxatscale/sfp-logger'; - -import { Duration } from '@salesforce/kit'; -import DeploymentExecutor, { DeploySourceResult } from './DeploymentExecutor'; -import { - ComponentSet, - DeployMessage, - DeployResult, - MetadataApiDeployOptions, - RequestStatus, -} from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import path from 'path'; -import SFPOrg from '../org/SFPOrg'; -import getFormattedTime from '../utils/GetFormattedTime'; -import { TestLevel } from '../apextest/TestOptions'; -import { SfProject } from '@salesforce/core'; -import { SourceTracking } from '@salesforce/source-tracking'; - -export default class DeploySourceToOrgImpl implements DeploymentExecutor { - public constructor( - private org: SFPOrg, - private projectDir: string, - private componentSet: ComponentSet, - private deploymentOptions: DeploymentOptions, - private logger?: Logger - ) {} - - public async exec(): Promise { - let deploySourceResult = {} as DeploySourceResult; - - if (this.deploymentOptions.apiVersion) this.componentSet.sourceApiVersion = this.deploymentOptions.apiVersion; - - //Get Deploy ID - let result = await this.deploy(this.componentSet); - - this.writeResultToReport(result); - - if (this.deploymentOptions.sourceTracking) { - await this.handleSourceTracking(this.org, this.logger, this.projectDir, result); - } - - //Handle Responses - if (result.response.status == RequestStatus.Succeeded) { - deploySourceResult.message = `Successfully deployed`; - deploySourceResult.result = result.response.success; - deploySourceResult.deploy_id = result.response.id; - } else { - if (result.response.status == RequestStatus.Canceled) { - deploySourceResult.message = `The deployment request ${result.response.id} was cancelled by ${result.response.canceledByName}`; - } else { - deploySourceResult.message = this.handlErrorMesasge(result); - } - deploySourceResult.response = result.response; - deploySourceResult.result = false; - deploySourceResult.deploy_id = result.response.id; - } - return deploySourceResult; - } - - private handlErrorMesasge(result: DeployResult): string { - if (result.response.numberComponentErrors == 0) { - return 'Unable to fetch report, Check your org for details'; - } else if (result.response.numberComponentErrors > 0) { - return this.constructComponentErrorMessage(result.response.details.componentFailures, this.logger); - } else if (result.response.details.runTestResult) { - return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; - } else { - return 'Unable to fetch report, Check your org for details'; - } - } - - private constructComponentErrorMessage(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { - let errorMessage = `Unable to deploy due to failure in some components, check log for details`; - - if (componentFailures === null || componentFailures === undefined) return; - - if (componentFailures instanceof Array) { - //Search for other scenarios and if background Job is being executed, override the error message - for (let failure of componentFailures) { - let scenario = classifyErrorScenarios(failure); - if (scenario == `BackgroundJob`) { - errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; - break; - } - } - } else { - let failure = componentFailures; - let scenario = classifyErrorScenarios(failure); - if (scenario == `BackgroundJob`) { - errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; - } - } - - function classifyErrorScenarios(failure: DeployMessage) { - let scenario = `Component Error`; - //Override if background job is being executed - if (failure.problem.includes(`background job is being executed`)) { - scenario = `BackgroundJob`; - } - return scenario; - } - return errorMessage; - } - - private writeResultToReport(result: DeployResult) { - let deploymentReports = `.sfpowerscripts/mdapiDeployReports`; - fs.mkdirpSync(deploymentReports); - fs.writeFileSync( - path.join(deploymentReports, `${result.response.id}.json`), - JSON.stringify(this.formatResultAsJSON(result)) - ); - } - - private async buildDeploymentOptions(org: SFPOrg): Promise { - let metdataDeployOptions: MetadataApiDeployOptions = { - usernameOrConnection: org.getConnection(), - apiOptions: {}, - }; - - if (this.deploymentOptions.apiVersion) metdataDeployOptions.apiVersion = this.deploymentOptions.apiVersion; - - if (this.deploymentOptions.testLevel == TestLevel.RunLocalTests) { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunLocalTests; - } else if (this.deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunSpecifiedTests; - metdataDeployOptions.apiOptions.runTests = this.deploymentOptions.specifiedTests.split(`,`); - } else { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunNoTests; - } - - if (this.deploymentOptions.ignoreWarnings) { - metdataDeployOptions.apiOptions.ignoreWarnings = true; - } - - metdataDeployOptions.apiOptions.rollbackOnError = this.deploymentOptions.rollBackOnError; - - return metdataDeployOptions; - } - - private async deploy(componentSet: ComponentSet) { - let deploymentOptions = await this.buildDeploymentOptions(this.org); - const deploy = await componentSet.deploy(deploymentOptions); - - let startTime = Date.now(); - SFPLogger.log(`Deploying to ${this.org.getUsername()} with id:${deploy.id}`, LoggerLevel.INFO, this.logger); - // Attach a listener to check the deploy status on each poll - deploy.onUpdate((response) => { - const { status, numberComponentsDeployed, numberComponentsTotal } = response; - const progress = `${numberComponentsDeployed}/${numberComponentsTotal}`; - const message = `Status: ${COLOR_KEY_MESSAGE(status)} Progress: ${COLOR_KEY_MESSAGE(progress)}`; - SFPLogger.log(message, LoggerLevel.INFO, this.logger); - }); - - deploy.onFinish((response) => { - let deploymentDuration = Date.now() - startTime; - if (response.response.success) { - SFPLogger.log( - COLOR_SUCCESS( - `Succesfully Deployed ${COLOR_HEADER( - response.response.numberComponentsDeployed - )} components in ${getFormattedTime(deploymentDuration)}` - ), - LoggerLevel.INFO, - this.logger - ); - } else - SFPLogger.log( - COLOR_ERROR(`Failed to deploy after ${getFormattedTime(deploymentDuration)}`), - LoggerLevel.INFO, - this.logger - ); - }); - - // Wait for polling to finish and get the DeployResult object - const hoursInWaitTime = Number(this.deploymentOptions.waitTime) / 60; - const result = await deploy.pollStatus({ frequency: Duration.seconds(30), timeout: Duration.hours(hoursInWaitTime) }); - return result; - } - - //For compatibility with cli output - private formatResultAsJSON(result) { - const response = result?.response ? result.response : {}; - return { - result: { - ...response, - details: { - componentSuccesses: response?.details?.componentSuccesses, - componentFailures: response?.details?.componentFailures, - runTestResult: response?.details?.runTestResult, - }, - }, - }; - } - - private async handleSourceTracking(org: SFPOrg, logger: Logger, projectDir: string, result: DeployResult) { - if (result.response.success) { - try { - const project = await SfProject.resolve(this.projectDir); - const tracking = await SourceTracking.create({ - org: org, - project: project, - }); - await tracking.ensureRemoteTracking(); - tracking.updateTrackingFromDeploy(result); - } catch (error) { - SFPLogger.log(`Unable to update source tracking due to \n ${error}`, LoggerLevel.WARN, logger); - } - } - } -} - -export class DeploymentOptions { - ignoreWarnings: boolean; - waitTime: string; - checkOnly?: boolean; - apiVersion?: string; - testLevel?: TestLevel; - apexTestSuite?: string; - specifiedTests?: string; - sourceTracking?: boolean; - rollBackOnError?: boolean; -} diff --git a/packages/core/src/deployers/DeploymentExecutor.ts b/packages/core/src/deployers/DeploymentExecutor.ts deleted file mode 100644 index 1e1165abf..000000000 --- a/packages/core/src/deployers/DeploymentExecutor.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MetadataApiDeployStatus } from "@salesforce/source-deploy-retrieve"; - -export default interface DeploymentExecutor { - exec(): Promise; -} - -export interface DeploySourceResult { - deploy_id: string; - result: boolean; - message: string; - response?:MetadataApiDeployStatus -} - -export enum DeploymentType { - SOURCE_PUSH, - MDAPI_DEPLOY, -} diff --git a/packages/core/src/deployers/DeploymentSettingsService.ts b/packages/core/src/deployers/DeploymentSettingsService.ts deleted file mode 100644 index ac468f7ee..000000000 --- a/packages/core/src/deployers/DeploymentSettingsService.ts +++ /dev/null @@ -1,64 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { Connection } from '@salesforce/core'; -import { IpRange, SecuritySettings } from 'jsforce/lib/api/metadata'; - -export default class DeploymentSettingsService { - constructor(private conn: Connection) {} - - //Enable Synchronus Compile on Deploy - public async enableSynchronousCompileOnDeploy(logger: Logger) { - try { - let apexSettingMetadata = { fullName: 'ApexSettings', enableCompileOnDeploy: true }; - let result = await this.conn.metadata.upsert('ApexSettings', apexSettingMetadata); - if (result.success) { - SFPLogger.log( - `${COLOR_KEY_MESSAGE( - 'Enabled Synchronous Compile on Org succesfully as this is the last package in queue' - )}`, - LoggerLevel.INFO, - logger - ); - } - } catch (error) { - SFPLogger.log( - `Skipping Synchronous Compile on Org succesfully due to ${error}..`, - LoggerLevel.INFO, - logger - ); - } - } - - public async relaxAllIPRanges(logger: Logger, ipRangesAsStringArray?: string[]) { - let ipRanges: IpRange[] = []; - if (!ipRangesAsStringArray) { - ipRanges = this.getFullRange(); - } else { - ipRanges = []; - //transform to ipRange Array - for (const ipRange of ipRangesAsStringArray) { - ipRanges.push({ start: ipRange, end: ipRange }); - } - } - let securitySettingsMetadata: SecuritySettings = { - fullName: 'SecuritySettings', - networkAccess: { ipRanges: ipRanges }, - }; - try { - let result = await this.conn.metadata.upsert('SecuritySettings', securitySettingsMetadata); - if (result.success) { - SFPLogger.log(`${COLOR_KEY_MESSAGE('Relaxed all ipRanges in the org')}`, LoggerLevel.INFO, logger); - } - } catch (error) { - SFPLogger.log(`Unable to relax IP range in org due to ${error.message}`, LoggerLevel.ERROR, logger); - throw error; - } - } - - private getFullRange(): IpRange[] { - let ipRanges = []; - for (let i = 0; i < 255; i += 2) { - ipRanges.push({ start: `${i}.0.0.0`, end: `${i + 1}.255.255.255` }); - } - return ipRanges; - } -} diff --git a/packages/core/src/display/DependencyViolationDisplayer.ts b/packages/core/src/display/DependencyViolationDisplayer.ts deleted file mode 100644 index c0e12ed1b..000000000 --- a/packages/core/src/display/DependencyViolationDisplayer.ts +++ /dev/null @@ -1,31 +0,0 @@ -const Table = require('cli-table'); -import DependencyViolation from '../dependency/DependencyViolation'; -import SFPLogger from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class DependencyViolationDisplayer { - public static printDependencyViolations(dependencyViolations: DependencyViolation[]) { - if (!dependencyViolations || dependencyViolations.length === 0) return; - - const table = new Table({ - head: ['API Name', 'Type', 'Package', 'Dependency', 'Dependency Type', 'Dependency Package', 'Problem'], - chars: ZERO_BORDER_TABLE - }); - - SFPLogger.log('The following components resulted in failures:'); - - dependencyViolations.forEach((violation) => { - table.push([ - violation.component.fullName, - violation.component.type, - violation.component.package, - violation.dependency.fullName, - violation.dependency.type, - violation.dependency.package, - violation.description, - ]); - }); - - SFPLogger.log(table.toString()); - } -} diff --git a/packages/core/src/display/DeployErrorDisplayer.ts b/packages/core/src/display/DeployErrorDisplayer.ts deleted file mode 100644 index e6c0b6480..000000000 --- a/packages/core/src/display/DeployErrorDisplayer.ts +++ /dev/null @@ -1,103 +0,0 @@ -const Table = require('cli-table'); -import { CodeCoverageWarnings, DeployMessage, Failures, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class DeployErrorDisplayer { - private static printMetadataFailedToDeploy(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { - if (componentFailures === null || componentFailures === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name', 'Problem Type', 'Problem'], - chars: ZERO_BORDER_TABLE - }); - - let pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.componentType, - componentFailure.fullName, - componentFailure.problemType, - componentFailure.problem, - ]; - table.push(item); - }; - - if (componentFailures instanceof Array) { - for (let failure of componentFailures) { - pushComponentFailureIntoTable(failure); - } - } else { - let failure = componentFailures; - pushComponentFailureIntoTable(failure); - } - SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, logger); - SFPLogger.log(table.toString(), LoggerLevel.ERROR, logger); - } - - public static displayErrors(response: MetadataApiDeployStatus, logger: Logger) { - SFPLogger.log(`Gathering Final Deployment Status`, null, logger); - - if (response.numberComponentErrors == 0) { - return 'Unable to fetch report, Check your org for details'; - } else if (response.numberComponentErrors > 0) { - this.printMetadataFailedToDeploy(response.details.componentFailures, logger); - return response.errorMessage; - } else if (response.details.runTestResult) { - if (response.details.runTestResult.codeCoverageWarnings) { - this.displayCodeCoverageWarnings(response.details.runTestResult.codeCoverageWarnings, logger); - } - - if (response.details.runTestResult.failures) { - this.displayTestFailures(response.details.runTestResult.failures, logger); - } - return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; - } else { - return 'Unable to fetch report, Check your org for details'; - } - } - - private static displayCodeCoverageWarnings( - codeCoverageWarnings: CodeCoverageWarnings | CodeCoverageWarnings[], - logger: Logger - ) { - let table = new Table({ - head: ['Name', 'Message'], - }); - - if (Array.isArray(codeCoverageWarnings)) { - codeCoverageWarnings.forEach((coverageWarningElement) => { - table.push([coverageWarningElement['name'], coverageWarningElement.message]); - }); - } else { - table.push([codeCoverageWarnings['name'], codeCoverageWarnings.message]); - } - - if (table.length > 1) { - SFPLogger.log( - 'Unable to deploy due to unsatisfactory code coverage, Check the following classes:', - LoggerLevel.WARN, - logger - ); - SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); - } - } - - private static displayTestFailures(testFailures: Failures | Failures[], logger: Logger) { - let table = new Table({ - head: ['Test Name', 'Method Name', 'Message'], - chars: ZERO_BORDER_TABLE - }); - - if (Array.isArray(testFailures)) { - testFailures.forEach((elem) => { - table.push([elem.name, elem.methodName, elem.message]); - }); - } else { - table.push([testFailures.name, testFailures.methodName, testFailures.message]); - } - if (table.length > 1) { - SFPLogger.log('Unable to deploy due to test failures:', LoggerLevel.WARN, logger); - SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); - } - } -} diff --git a/packages/core/src/display/DeploymentOptionDisplayer.ts b/packages/core/src/display/DeploymentOptionDisplayer.ts deleted file mode 100644 index 0aabca641..000000000 --- a/packages/core/src/display/DeploymentOptionDisplayer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { TestLevel } from '../apextest/TestOptions'; -import { DeploymentOptions } from '../deployers/DeploySourceToOrgImpl'; - -export default class DeploymentOptionDisplayer { - public static printDeploymentOptions(deploymentOptions: DeploymentOptions, logger?: Logger) { - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - SFPLogger.log(`${COLOR_HEADER(`Deployment Options`)}`, LoggerLevel.INFO, logger); - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - SFPLogger.log(`TestLevel: ${COLOR_KEY_MESSAGE(deploymentOptions.testLevel)}`, LoggerLevel.INFO, logger); - if (deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) - SFPLogger.log( - `Tests to be triggered: ${COLOR_KEY_MESSAGE(deploymentOptions.specifiedTests)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log( - `Ignore Warnings: ${COLOR_KEY_MESSAGE(deploymentOptions.ignoreWarnings)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log( - `Roll Back on Error: ${COLOR_KEY_MESSAGE(deploymentOptions.rollBackOnError)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log(`API Version: ${COLOR_KEY_MESSAGE(deploymentOptions.apiVersion)}`, LoggerLevel.INFO, logger); - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - } -} diff --git a/packages/core/src/display/ExternalDependencyDisplayer.ts b/packages/core/src/display/ExternalDependencyDisplayer.ts deleted file mode 100644 index 8dd63b12b..000000000 --- a/packages/core/src/display/ExternalDependencyDisplayer.ts +++ /dev/null @@ -1,30 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { EOL } from 'os'; -import Package2Detail from '../package/Package2Detail'; -import { ZERO_BORDER_TABLE } from './TableConstants'; -const Table = require('cli-table'); - -export default class ExternalDependencyDisplayer { - public constructor(private externalPackage2s: Package2Detail[], private logger: Logger) {} - - public display() { - if (this.externalPackage2s.length > 0) { - let table = new Table({ - head: ['Order', 'Package', 'Version', 'Subscriber Version Id'], - chars: ZERO_BORDER_TABLE - }); - let i = 0; - for (const externalPackage of this.externalPackage2s) { - table.push([ - i++, - externalPackage.name, - externalPackage.versionNumber ? externalPackage.versionNumber : 'N/A', - externalPackage.subscriberPackageVersionId ? externalPackage.subscriberPackageVersionId:'N/A, Could be part of current operation', - ]); - } - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log(COLOR_KEY_MESSAGE(`Resolved external package dependencies:`), LoggerLevel.INFO, this.logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); - } - } -} \ No newline at end of file diff --git a/packages/core/src/display/InstalledArtifactsDisplayer.ts b/packages/core/src/display/InstalledArtifactsDisplayer.ts deleted file mode 100644 index 9d1c905fa..000000000 --- a/packages/core/src/display/InstalledArtifactsDisplayer.ts +++ /dev/null @@ -1,22 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class InstalledArtifactsDisplayer { - public static printInstalledArtifacts(artifacts: any, logger: Logger) { - if (!artifacts) return; - else if(artifacts.length==0) return; - - let table = new Table({ - head: ['Artifact', 'Version', 'Commit Id'], - chars: ZERO_BORDER_TABLE - }); - - artifacts.forEach((artifact) => { - table.push([artifact.Name, artifact.Version__c, artifact.CommitId__c?artifact.CommitId__c:""]); - }); - - SFPLogger.log(COLOR_KEY_MESSAGE('Artifacts installed in org:'), LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/core/src/display/InstalledPackagesDisplayer.ts b/packages/core/src/display/InstalledPackagesDisplayer.ts deleted file mode 100644 index 456bb9d47..000000000 --- a/packages/core/src/display/InstalledPackagesDisplayer.ts +++ /dev/null @@ -1,22 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import Package2Detail from '../package/Package2Detail'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class InstalledPackagesDisplayer { - public static printInstalledPackages(packages: Package2Detail[], logger: Logger) { - if (packages == null) return; - - let table = new Table({ - head: ['Package', 'Version', 'Type', 'isOrgDependent'], - chars: ZERO_BORDER_TABLE - }); - - packages.forEach((pkg) => { - table.push([pkg.name, pkg.versionNumber, pkg.type, pkg.isOrgDependent]); - }); - - SFPLogger.log(COLOR_KEY_MESSAGE('Packages installed in org:'), LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/core/src/display/PackageComponentPrinter.ts b/packages/core/src/display/PackageComponentPrinter.ts deleted file mode 100644 index 7956658df..000000000 --- a/packages/core/src/display/PackageComponentPrinter.ts +++ /dev/null @@ -1,27 +0,0 @@ -const Table = require('cli-table'); -import { LazyCollection, SourceComponent } from '@salesforce/source-deploy-retrieve'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PackageComponentPrinter { - public static printComponentTable(components: LazyCollection, logger: Logger) { - //If Manifest is null, just return - if (components === null || components === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name'], - chars: ZERO_BORDER_TABLE - }); - - let componentArray = components.toArray(); - componentArray.sort((a, b) => a.type.name.localeCompare(b.type.name)); - - for (const component of componentArray) { - let item = [component.type.name, component.fullName]; - table.push(item); - } - - SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/core/src/display/PackageDependencyDisplayer.ts b/packages/core/src/display/PackageDependencyDisplayer.ts deleted file mode 100644 index ecd64d6b4..000000000 --- a/packages/core/src/display/PackageDependencyDisplayer.ts +++ /dev/null @@ -1,35 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; -const Table = require('cli-table'); - -export default class PackageDependencyDisplayer { - public static printPackageDependencies( - dependencies: { package: string; versionNumber?: string }[], - projectConfig: any, - logger: Logger - ) { - if (Array.isArray(dependencies)) { - SFPLogger.log('Package Dependencies:', LoggerLevel.INFO, logger); - const table = new Table({ - head: ['Order','Package', 'Version'], - chars: ZERO_BORDER_TABLE, - style: { 'padding-left': 3 }, - }); - let order=1; - for (const dependency of dependencies) { - let versionNumber = 'N/A'; - - if (!dependency.versionNumber) - versionNumber = projectConfig.packageAliases[dependency.package] - ? projectConfig.packageAliases[dependency.package] - : 'N/A'; - else versionNumber = dependency.versionNumber; - - const row = [order,dependency.package, versionNumber]; - table.push(row); - order++; - } - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } - } -} diff --git a/packages/core/src/display/PackageMetadataPrinter.ts b/packages/core/src/display/PackageMetadataPrinter.ts deleted file mode 100644 index 9d7f2b574..000000000 --- a/packages/core/src/display/PackageMetadataPrinter.ts +++ /dev/null @@ -1,38 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PackageMetadataPrinter { - public static printMetadataToDeploy(payload: any, logger: Logger) { - //If Manifest is null, just return - if (payload === null || payload === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name'], - chars: ZERO_BORDER_TABLE - }); - - let pushTypeMembersIntoTable = (type) => { - if (type['members'] instanceof Array) { - for (let member of type['members']) { - let item = [type.name, member]; - table.push(item); - } - } else { - let item = [type.name, type.members]; - table.push(item); - } - }; - - if (payload['Package']['types'] instanceof Array) { - for (let type of payload['Package']['types']) { - pushTypeMembersIntoTable(type); - } - } else { - let type = payload['Package']['types']; - pushTypeMembersIntoTable(type); - } - SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/core/src/display/PushErrorDisplayer.ts b/packages/core/src/display/PushErrorDisplayer.ts deleted file mode 100644 index a99bc5f8a..000000000 --- a/packages/core/src/display/PushErrorDisplayer.ts +++ /dev/null @@ -1,75 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PushErrorDisplayer { - public static printMetadataFailedToPush(error: any, packageLogger: Logger) { - if (error == null) return; - - let table; - let pushComponentFailureIntoTable; - if (error.name === 'sourceConflictDetected') { - table = new Table({ - head: ['State', 'API Name', 'Metadata Type', 'File Path'], - chars: ZERO_BORDER_TABLE - }); - - pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.state, - componentFailure.fullName, - componentFailure.type, - componentFailure.filePath, - ]; - - // Replace "undefined" values with "NA". cli-table breaks for undefined cells - item.forEach((elem, idx, item) => { - if (elem === undefined) { - item[idx] = 'NA'; - } - }); - - table.push(item); - }; - } else if (error.name === 'DeployFailed') { - table = new Table({ - head: ['Metadata Type', 'API Name', 'Problem Type', 'FilePath','Problem'], - }); - - pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.type, - componentFailure.fullName, - componentFailure.problemType, - componentFailure.error, - componentFailure.filePath, - ]; - - // Replace "undefined" values with "NA". cli-table breaks for undefined cells - item.forEach((elem, idx, item) => { - if (elem === undefined) { - item[idx] = 'NA'; - } - }); - - table.push(item); - }; - } else { - SFPLogger.log('Unknown error type. Failed to print table.', LoggerLevel.ERROR, packageLogger); - return; - } - - if (error.data instanceof Array) { - for (let componentFailure of error.data) { - pushComponentFailureIntoTable(componentFailure); - } - } else { - let failure = error.data; - pushComponentFailureIntoTable(failure); - } - - SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, packageLogger); - - SFPLogger.log(table.toString(), LoggerLevel.ERROR, packageLogger); - } -} diff --git a/packages/core/src/display/TableConstants.ts b/packages/core/src/display/TableConstants.ts deleted file mode 100644 index 4caeefcdc..000000000 --- a/packages/core/src/display/TableConstants.ts +++ /dev/null @@ -1,38 +0,0 @@ - -export const ZERO_BORDER_TABLE = { - top: ' ', - 'top-mid': ' ', - 'top-left': ' ', - 'top-right': ' ', - bottom: ' ', - 'bottom-mid': ' ', - 'bottom-left': ' ', - 'bottom-right': ' ', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ' ', -}; - - - -export const COLON_MIDDLE_BORDER_TABLE = { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ':', -}; diff --git a/packages/core/src/git/Git.ts b/packages/core/src/git/Git.ts deleted file mode 100644 index 9d2e60e71..000000000 --- a/packages/core/src/git/Git.ts +++ /dev/null @@ -1,246 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import simplegit, { SimpleGit } from 'simple-git'; -import fs = require('fs-extra'); -import GitIdentity from './GitIdentity'; -const tmp = require('tmp'); - -//Git Abstraction -export default class Git { - private _git: SimpleGit; - private repositoryLocation: string; - private tempRepoLocation: any; - private _isATemporaryRepo: boolean = false; - - private constructor(private projectDir?: string, private logger?: Logger) { - if (this.projectDir) { - this._git = simplegit(this.projectDir); - this.repositoryLocation = this.projectDir; - } else { - this._git = simplegit(); - this.repositoryLocation = process.cwd(); - } - } - - async fetch() { - return this._git.fetch('origin'); - } - - async getHeadCommit(): Promise { - return this._git.revparse(['HEAD']); - } - - async show(options: string[]): Promise { - return this._git.show(options); - } - - async tag(options: string[]): Promise { - let tagResult = await this._git.tag(options); - - let temp: string[] = tagResult.split('\n'); - temp.pop(); - - return temp; - } - - async diff(options: string[]): Promise { - let diffResult = await this._git.diff(options); - - let temp: string[] = diffResult.split('\n'); - temp.pop(); - - return temp; - } - - async log(options: string[]): Promise { - let gitLogResult = await this._git.log(options); - - return gitLogResult['all'][0]['hash'].split('\n'); - } - - public async getRemoteOriginUrl(overrideOriginURL?: string): Promise { - let remoteOriginURL; - if (!overrideOriginURL) { - remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; - if (!remoteOriginURL) { - remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; - } - SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG); - } else remoteOriginURL = overrideOriginURL; - - if (!remoteOriginURL) throw new Error('Remote origin must be set in repository'); - - return remoteOriginURL; - } - - public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfpowerscripts`) { - try { - await new GitIdentity(this._git).setUsernameAndEmail(); - await this._git.add(pathToFiles); - await this._git.commit(message); - SFPLogger.log(`Committed File ${pathToFiles}`); - } catch (error) { - SFPLogger.log( - `Unable to commit file, probably due to no change or something else,Please try manually`, - LoggerLevel.ERROR - ); - throw error; - } - } - - async pushTags(tags?: string[]) { - if (!tags) await this._git.pushTags(); - else { - for (let tag of tags) { - await this._git.push('origin', tag); - } - } - } - - async deleteTags(tags?: string[]) { - if (tags) await this._git.push('origin', '--delete', tags); - } - - async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) { - try { - await new GitIdentity(this._git).setUsernameAndEmail(); - if (!commitId) { - await this._git.addAnnotatedTag(tagName, annotation); - } else { - const commands = ['tag', tagName, commitId, '-m', annotation]; - await this._git.raw(commands); - } - } catch (error) { - SFPLogger.log( - `Unable to commit file, probably due to no change or something else,Please try manually`, - LoggerLevel.ERROR - ); - throw error; - } - } - - public async isBranchExists(branch: string): Promise { - const listOfBranches = await this._git.branch(['-la']); - - return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false; - } - - static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise { - let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true }); - - SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger); - let repoDir = locationOfCopiedDirectory.name; - - // Copy source directory to temp dir - fs.copySync(process.cwd(), repoDir); - - //Initiate git on new repo on using the abstracted object - let git = new Git(repoDir, logger); - git._isATemporaryRepo = true; - git.tempRepoLocation = locationOfCopiedDirectory; - - await git.addSafeConfig(repoDir); - await git.getRemoteOriginUrl(); - await git.fetch(); - if (branch) { - await git.createBranch(branch); - } - if (commitRef) { - await git.checkout(commitRef, true); - } - - SFPLogger.log( - `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`, - LoggerLevel.INFO, - logger - ); - return git; - } - - static async initiateRepo(logger?: Logger, projectDir?: string) { - let git = new Git(projectDir, logger); - if (projectDir) await git.addSafeConfig(projectDir); - else { - await git.addSafeConfig(process.cwd()); - } - await git.getRemoteOriginUrl(); - return git; - } - - public getRepositoryPath() { - return this.repositoryLocation; - } - - async deleteTempoRepoIfAny() { - if (this.tempRepoLocation) this.tempRepoLocation.removeCallback(); - } - - async addSafeConfig(repoDir: string) { - try - { - //add workaround for safe directory (https://github.com/actions/runner/issues/2033) - await this._git.addConfig('safe.directory', repoDir, false, 'global'); - }catch(error) - { - //ignore error - SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE) - } - } - - async pushToRemote(branch: string, isForce: boolean) { - if (!branch) branch = (await this._git.branch()).current; - SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger); - if (process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL) { - await this._git.removeRemote('origin'); - await this._git.addRemote('origin', process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL); - } - - if (isForce) { - await this._git.push('origin', branch, [`--force`]); - } else { - await this._git.push('origin', branch); - } - } - - isATemporaryRepo(): boolean { - return this._isATemporaryRepo; - } - - async getCurrentCommitId() { - return this._git.revparse(['HEAD']); - } - - async checkout(commitRef: string, isForce?: boolean) { - if (isForce) { - return this._git.checkout(commitRef, [`--force`]); - } else return this._git.checkout(commitRef, {}); - } - - async checkoutPath(commitRef: string, path: string, isForce?: boolean) { - if (isForce) { - return this._git.checkout(commitRef, [path, `--force`]); - } else return this._git.checkout(commitRef, [path]); - } - - async stageChangedFiles(path: string): Promise { - try { - await this._git.add(path); - return true; - } catch (error) { - SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger); - return false; - } - } - async createBranch(branch: string) { - if (await this.isBranchExists(branch)) { - await this._git.checkout(branch, ['-f']); - try { - // For ease-of-use when running locally and local branch exists - await this._git.merge([`refs/remotes/origin/${branch}`]); - } catch (error) { - SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger); - } - } else { - await this._git.checkout(['-b', branch]); - } - } -} diff --git a/packages/core/src/git/GitDiffUtil.ts b/packages/core/src/git/GitDiffUtil.ts deleted file mode 100644 index a153d2035..000000000 --- a/packages/core/src/git/GitDiffUtil.ts +++ /dev/null @@ -1,175 +0,0 @@ -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as _ from 'lodash'; - -import { LoggerLevel } from '@salesforce/core'; -import simplegit, { SimpleGit } from 'simple-git'; -import SFPLogger, { Logger } from '@dxatscale/sfp-logger'; -const SEP = /\/|\\/; - -export interface DiffFileStatus { - revisionFrom: string; - revisionTo: string; - path: string; - renamedPath?: string; -} - -export interface DiffFile { - deleted: DiffFileStatus[]; - addedEdited: DiffFileStatus[]; -} - -const git: SimpleGit = simplegit(); - -export default class GitDiffUtils { - private gitTreeRevisionTo: { - revision: string; - path: string; - }[]; - - public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise { - let fileAsString = await git.show(['--raw', diffFile.revisionFrom]); - let result = fileAsString.includes(content); - return result; - } - - public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) { - SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger); - this.gitTreeRevisionTo = []; - let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]); - const sepRegex = /\n|\r/; - let lines = revisionTree.split(sepRegex); - for (let i = 0; i < lines.length; i++) { - if (lines[i] === '') continue; - let fields = lines[i].split(/\t/); - let pathStr = fields[1]; - let revisionSha = fields[0].split(/\s/)[2]; - let fileMetadata = { - revision: revisionSha, - path: path.join('.', pathStr), - }; - this.gitTreeRevisionTo.push(fileMetadata); - } - return this.gitTreeRevisionTo; - } - - public async copyFile(filePath: string, outputFolder: string, logger: Logger) { - SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); - if (fs.existsSync(path.join(outputFolder, filePath))) { - SFPLogger.log(`File ${filePath} already in output folder. `, LoggerLevel.TRACE, logger); - return; - } - - let gitFiles: { - revision: string; - path: string; - }[] = []; - this.gitTreeRevisionTo.forEach((file) => { - if (file.path === filePath) { - gitFiles.push(file); - } - }); - - if(gitFiles.length==0) - throw new Error(`Unable to find the required file ${filePath} in Git.., Did you really commit the file?`) - - let copyOutputFolder = outputFolder; - for (let i = 0; i < gitFiles.length; i++) { - outputFolder = copyOutputFolder; - let gitFile = gitFiles[i]; - - SFPLogger.log( - `Associated file ${i}: ${gitFile.path} Revision: ${gitFile.revision}`, - LoggerLevel.TRACE, - logger - ); - - let outputPath = path.join(outputFolder, gitFile.path); - - let filePathParts = gitFile.path.split(SEP); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - // Create folder structure - for (let i = 0; i < filePathParts.length - 1; i++) { - let folder = filePathParts[i].replace('"', ''); - outputFolder = path.join(outputFolder, folder); - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - let fileContent = await git.binaryCatFile(['-p', gitFile.revision]); - fs.writeFileSync(outputPath, fileContent); - } - } - - public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) { - SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); - if (fs.existsSync(path.join(outputFolder, folderPath))) { - SFPLogger.log(`Folder ${folderPath} already in output folder. `, LoggerLevel.TRACE, logger); - return; - } - - this.gitTreeRevisionTo.forEach((file) => { - let fileToCompare = file.path; - if (fileToCompare.startsWith(folderPath)) { - this.copyFile(fileToCompare, outputFolder, logger); - } - }); - } - - public getChangedOrAdded(list1: any[], list2: any[], key: string) { - let result: any = { - addedEdited: [], - deleted: [], - }; - - //Ensure array - if (!_.isNil(list1) && !Array.isArray(list1)) { - list1 = [list1]; - } - if (!_.isNil(list2) && !Array.isArray(list2)) { - list2 = [list2]; - } - - if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) { - result.addedEdited.push(...list2); - } - - if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) { - result.deleted.push(...list1); - } - - if (!_.isNil(list1) && !_.isNil(list2)) { - list1.forEach((elem1) => { - let found = false; - for (let i = 0; i < list2.length; i++) { - let elem2 = list2[i]; - if (elem1[key] === elem2[key]) { - //check if edited - if (!_.isEqual(elem1, elem2)) { - result.addedEdited.push(elem2); - } - found = true; - break; - } - } - if (!found) { - result.deleted.push(elem1); - } - }); - - //Check for added elements - - let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) { - return element1[key] === element2[key]; - }); - - if (!_.isNil(addedElement)) { - result.addedEdited.push(...addedElement); - } - } - return result; - } -} diff --git a/packages/core/src/git/GitIdentity.ts b/packages/core/src/git/GitIdentity.ts deleted file mode 100644 index 101fff86f..000000000 --- a/packages/core/src/git/GitIdentity.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { SimpleGit } from 'simple-git/promise'; - -export default class GitIdentity { - constructor(private git: SimpleGit) {} - - async setUsernameAndEmail(): Promise { - await this.setUsername(); - await this.setEmail(); - } - - private async setUsername(): Promise { - let username: string; - - if (process.env.SFPOWERSCRIPTS_GIT_USERNAME) { - username = process.env.SFPOWERSCRIPTS_GIT_USERNAME; - } else { - username = 'sfpowerscripts'; - } - - await this.git.addConfig('user.name', username); - } - - private async setEmail(): Promise { - let email: string; - - if (process.env.SFPOWERSCRIPTS_GIT_EMAIL) { - email = process.env.SFPOWERSCRIPTS_GIT_EMAIL; - } else { - email = 'sfpowerscripts@dxatscale.io'; - } - - await this.git.addConfig('user.email', email); - } -} diff --git a/packages/core/src/git/GitTags.ts b/packages/core/src/git/GitTags.ts deleted file mode 100644 index 846585451..000000000 --- a/packages/core/src/git/GitTags.ts +++ /dev/null @@ -1,151 +0,0 @@ -import Git from './Git'; -import child_process = require('child_process'); - -export default class GitTags { - constructor(private git: Git, private sfdx_package: string) {} - - /*** - * Returns list of sorted tags, belonging to package, that are reachable from HEAD and - * follow the first parent on merge commits. - * If there are no tags, returns empty array - * @param sfdx_package - */ - async listTagsOnBranch(): Promise { - let tags: string[] = await this.git.tag([ - `-l`, - `${this.sfdx_package}_v*`, - `--sort=creatordate`, - `--merged`, - ]); - - if (tags.length > 0) return this.filterTagsAgainstBranch(tags); - else return tags; - } - - private async filterTagsAgainstBranch(tags: string[]): Promise { - // Get full-length commit ID's on the current branch, following the first parent on merge commits - let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]); - - // Get the tags' associated commit ID - // Dereference (-d) tags into object IDs - //TODO: Remove this direct usage - let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, { - maxBuffer: 5 * 1024 * 1024, - stdio: 'pipe', - cwd: this.git.getRepositoryPath() - }); - - let gitShowRefTags = gitShowRefTagsBuffer.toString(); - - let refTags: string[] = gitShowRefTags.split('\n'); - refTags.pop(); // Remove last empty element - - // Filter ref tags, only including tags that point to the branch - // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log - let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40))); - - // Only match the name of the tags pointing to the branch - refTagsPointingToBranch = refTagsPointingToBranch.map( - (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1] - ); - - // Filter the sorted tags - only including tags that point to the branch - let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag)); - - return tagsPointingToBranch; - } - - public async getVersionFromLatestTag(): Promise { - let version: string; - - let tags = await this.listTagsOnBranch(); - let latestTag = tags.pop(); - if (latestTag) { - let match: RegExpMatchArray = latestTag.match( - /^.*_v(?[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/ - ); - if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version); - else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`); - } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`); - - return version; - } - - private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { - let segments = packageVersionNumber.split('.'); - //Strip ALIGN - if (segments.length == 4 && segments[3].includes('ALIGN')) { - segments[3] = segments[3].substring(0, segments[3].indexOf('-')); - } - - if (segments.length === 4) { - packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { - if (segmentsIdx === 3) return version + '-' + segment; - else return version + '.' + segment; - }); - } - - return packageVersionNumber; - } - - - public async limitTags(limit: number): Promise{ - let rawTags = await this.listTagsOnBranch(); - - if (rawTags.length <= limit) { - return []; - } - - const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1); - return tags; - } - - - public async filteredOldTags(daysToKeep: number, limit?: number): Promise { - const currentTimestamp = Math.floor(Date.now() / 1000); - - let rawTags: string[]; - if (limit) { - rawTags = await this.limitTags(limit); - } else { - rawTags = await this.listTagsOnBranch(); - } - - if (rawTags.length < 0) { - return []; - } - - let tags: string[] = await this.getTagsWithTimestamps(rawTags); - - const filteredTags = tags - .map(tagStr => { - const [name, timestampStr] = tagStr.split(' '); - const timestamp = parseInt(timestampStr, 10); - return { name, timestamp }; - }) - .filter(tag => { - const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400; - return tag.name && daysSinceTag > daysToKeep; - }); - - return filteredTags.map(tag => tag.name); - } - - private async getTagsWithTimestamps(tags: string[]): Promise { - const timestampPromises: Promise[] = []; - - // Create an array of promises that will get the tagger date for each tag - tags.forEach((tag: string) => { - timestampPromises.push( - this.git.log(['--format=%at', `refs/tags/${tag}`]) - .then((output: string[]) => parseInt(output[0].trim(), 10)) - ); - }); - - // Wait for all promises to resolve and format the output - const timestamps: number[] = await Promise.all(timestampPromises); - const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`); - return tagsWithTimestamp - } - -} diff --git a/packages/core/src/ignore/IgnoreFiles.ts b/packages/core/src/ignore/IgnoreFiles.ts deleted file mode 100644 index 9a48420f9..000000000 --- a/packages/core/src/ignore/IgnoreFiles.ts +++ /dev/null @@ -1,13 +0,0 @@ -import ignore, { Ignore } from 'ignore'; - -export default class IgnoreFiles { - private _ignore: Ignore; - - constructor(pattern: string) { - this._ignore = ignore().add(pattern); - } - - filter(pathnames: string[]): string[] { - return this._ignore.filter(pathnames); - } -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts deleted file mode 100644 index ff8b4c563..000000000 --- a/packages/core/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/packages/core/src/limits/LimitsFetcher.ts b/packages/core/src/limits/LimitsFetcher.ts deleted file mode 100644 index da4e69186..000000000 --- a/packages/core/src/limits/LimitsFetcher.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Connection } from '@salesforce/core'; -const retry = require('async-retry'); - -export default class LimitsFetcher { - constructor(private conn: Connection) {} - - public async getApiLimits() { - const limits: { name: string; max: number; remaining: number }[] = []; - const endpoint = `${this.conn.instanceUrl}/services/data/v${this.conn.version}/limits`; - - const result = await retry( - async (bail) => { - return this.conn.request<{ - [p: string]: { Max: number; Remaining: number }; - }>(endpoint); - }, - { retries: 3, minTimeout: 2000 } - ); - - Object.keys(result).forEach((limitName) => { - limits.push({ - name: limitName, - max: result[limitName].Max, - remaining: result[limitName].Remaining, - }); - }); - - return limits; - } -} diff --git a/packages/core/src/metadata/CustomFieldFetcher.ts b/packages/core/src/metadata/CustomFieldFetcher.ts deleted file mode 100644 index b6905fced..000000000 --- a/packages/core/src/metadata/CustomFieldFetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -const fs = require('fs-extra'); -import { XMLParser } from 'fast-xml-parser'; -import MetadataFetcher from './MetadataFetcher'; -import { - ComponentSet, - MetadataConverter, - MetadataResolver, - ZipTreeContainer, -} from '@salesforce/source-deploy-retrieve'; -import path from 'path'; -import { makeRandomId } from '../utils/RandomId'; - -export default class CustomFieldFetcher extends MetadataFetcher { - constructor(logger: Logger) { - super(logger); - } - - public async getCustomFields(org: SFPOrg, fields: string[]) { - SFPLogger.log(`Fetching Custom Fields from Org`, LoggerLevel.INFO, this.logger); - let retriveLocation = await this.fetchPackageFromOrg(org, { - types: { name: 'CustomField', members: fields.length > 1 ? fields : fields[0] }, - }); - - const zipTree = await ZipTreeContainer.create(fs.readFileSync(retriveLocation.zipLocation)); - const zipResolver = new MetadataResolver(undefined, zipTree); - const zipComponents = zipResolver.getComponentsFromPath('.'); - let packageName = makeRandomId(6); - await new MetadataConverter().convert(zipComponents, 'source', { - type: 'directory', - outputDirectory: path.join(retriveLocation.unzippedLocation, 'source'), - packageName: packageName - }); - - //Write a force ignore file as its required for component set resolution - fs.writeFileSync(path.resolve(retriveLocation.unzippedLocation, 'source', '.forceignore'), '# .forceignore v2'); - - let sourceBackedComponents = ComponentSet.fromSource(path.resolve(retriveLocation.unzippedLocation, 'source')); - - return {components:sourceBackedComponents,location:path.join(retriveLocation.unzippedLocation, 'source',packageName)} - } - - -} diff --git a/packages/core/src/metadata/MetadataFetcher.ts b/packages/core/src/metadata/MetadataFetcher.ts deleted file mode 100644 index db652353f..000000000 --- a/packages/core/src/metadata/MetadataFetcher.ts +++ /dev/null @@ -1,71 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -import { delay } from '../utils/Delay'; -const fs = require('fs-extra'); -import AdmZip = require('adm-zip'); -import { Connection } from '@salesforce/core'; -import { RetrieveResult } from 'jsforce/lib/api/metadata'; -import { makeRandomId } from '../utils/RandomId'; - -export default class MetadataFetcher { - constructor(protected logger: Logger) {} - - - protected async fetchPackageFromOrg(org: SFPOrg, members: any) { - let connection = org.getConnection(); - const apiversion = await org.getConnection().retrieveMaxApiVersion(); - - let retrieveRequest = { - apiVersion: Number(apiversion), - }; - - retrieveRequest['singlePackage'] = true; - retrieveRequest['unpackaged'] = members; - connection.metadata.pollTimeout = 60; - let retrievedId = await connection.metadata.retrieve(retrieveRequest); - SFPLogger.log(`Fetching metadata from ${connection.getUsername()}`, LoggerLevel.DEBUG, this.logger); - - let metadata_retrieve_result = await this.checkRetrievalStatus(connection, retrievedId.id); - if (!metadata_retrieve_result.zipFile) - SFPLogger.log('Unable to find the requested metadata', LoggerLevel.ERROR, this.logger); - - let retriveLocation = `.sfpowerscripts/retrieved/${retrievedId.id}`; - //Extract Security - let zipFileName = `${retriveLocation}/unpackaged_${makeRandomId(8)}.zip`; - fs.mkdirpSync(retriveLocation); - fs.writeFileSync(zipFileName, metadata_retrieve_result.zipFile, { - encoding: 'base64', - }); - this.extract(retriveLocation, zipFileName); - // fs.unlinkSync(zipFileName); - return {zipLocation:zipFileName,unzippedLocation:retriveLocation}; - } - - private async checkRetrievalStatus( - conn: Connection, - retrievedId: string, - isToBeLoggedToConsole: boolean = true - ): Promise { - let metadata_result:RetrieveResult; - - while (true) { - metadata_result = await conn.metadata.checkRetrieveStatus(retrievedId); - - if (metadata_result.done === false) { - if (isToBeLoggedToConsole) SFPLogger.log(`Polling for Retrieval Status`, LoggerLevel.INFO, this.logger); - await delay(5000); - } else { - //this.ux.logJson(metadata_result); - break; - } - } - return metadata_result; - } - - - private extract(unzippedDirectory: string, zipFile: string) { - let zip = new AdmZip(zipFile); - // Overwrite existing files - zip.extractAllTo(unzippedDirectory, true); - } -} diff --git a/packages/core/src/metadata/MetadataFiles.ts b/packages/core/src/metadata/MetadataFiles.ts deleted file mode 100644 index cffbea0d6..000000000 --- a/packages/core/src/metadata/MetadataFiles.ts +++ /dev/null @@ -1,343 +0,0 @@ -//TODO: Replace with SDR -import * as path from 'path'; -import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo'; -import FileUtils from '../utils/Fileutils'; -import * as _ from 'lodash'; -import ignore from 'ignore'; -import * as fs from 'fs-extra'; -import ProjectConfig from '../project/ProjectConfig'; -import { globSync } from 'glob'; - -const SEP = /\/|\\/; - -export default class MetadataFiles { - public static sourceOnly: boolean = false; - forceignore: any; - public constructor() { - if (fs.existsSync('.forceignore')) { - this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString()); - } else { - this.forceignore = ignore(); - } - } - static getFullApiName(fileName: string): string { - let fullName = ''; - let metadateType = MetadataInfo.getMetadataName(fileName); - let splitFilepath = fileName.split(SEP); - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); - if (isObjectChild) { - let objectName = splitFilepath[splitFilepath.length - 3]; - let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0]; - fullName = objectName.concat('.' + fieldName); - } else { - fullName = splitFilepath[splitFilepath.length - 1].split('.')[0]; - } - return fullName; - } - static getFullApiNameWithExtension(fileName: string): string { - let fullName = ''; - let metadateType = MetadataInfo.getMetadataName(fileName); - let splitFilepath = fileName.split(SEP); - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); - if (isObjectChild) { - let objectName = splitFilepath[splitFilepath.length - 3]; - let fieldName = splitFilepath[splitFilepath.length - 1]; - fullName = objectName.concat('.' + fieldName); - } else { - fullName = splitFilepath[splitFilepath.length - 1]; - } - return fullName; - } - - public static isCustomMetadata(filepath: string, name: string): boolean { - let result = true; - let splitFilepath = filepath.split(SEP); - let componentName = splitFilepath[splitFilepath.length - 1]; - componentName = componentName.substring(0, componentName.indexOf('.')); - if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) { - //Custom Field or Custom Object - result = componentName.endsWith('__c') || componentName.endsWith('__mdt'); - } - return result; - } - public static getMemberNameFromFilepath(filepath: string, name: string): string { - let member: string; - let splitFilepath = filepath.split(SEP); - let lastIndex = splitFilepath.length - 1; - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name); - let metadataDescribe: MetadataDescribe = METADATA_INFO[name]; - if (isObjectChild) { - let objectName = splitFilepath[lastIndex - 2]; - let fieldName = splitFilepath[lastIndex].split('.')[0]; - member = objectName.concat('.' + fieldName); - } else if (metadataDescribe.inFolder) { - let baseName = metadataDescribe.directoryName; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - cmpPath = cmpPath.substring(0, cmpPath.indexOf('.')); - member = cmpPath.replace(SEP, '/'); - } else { - if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) { - member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, ''); - } else { - const auraRegExp = new RegExp('aura'); - const lwcRegExp = new RegExp('lwc'); - const staticResourceRegExp = new RegExp('staticresources'); - const experienceBundleRegExp = new RegExp('experiences'); - if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) { - member = splitFilepath[lastIndex - 1]; - } else if (staticResourceRegExp.test(filepath)) { - //Return the fileName - let baseName = 'staticresources'; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - member = cmpPath.split(SEP)[0]; - let extension = path.parse(member).ext; - - member = member.replace(new RegExp(extension + '$'), ''); - } else if (experienceBundleRegExp.test(filepath)) { - //Return the fileName - let baseName = 'experiences'; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - member = cmpPath.split(SEP)[0]; - let extension = path.parse(member).ext; - - member = member.replace(new RegExp(extension + '$'), ''); - } else { - let extension = path.parse(splitFilepath[lastIndex]).ext; - member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), ''); - } - } - } - return member; - } - - public loadComponents(srcFolder: string, checkIgnore = true): void { - var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder); - let keys = Object.keys(METADATA_INFO); - if (Array.isArray(metadataFiles) && metadataFiles.length > 0) { - metadataFiles.forEach((metadataFile) => { - let found = false; - - for (let i = 0; i < keys.length; i++) { - let match = false; - if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) { - match = true; - } else if ( - METADATA_INFO[keys[i]].inFolder && - metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension) - ) { - match = true; - } - if (match) { - if (_.isNil(METADATA_INFO[keys[i]].files)) { - METADATA_INFO[keys[i]].files = []; - METADATA_INFO[keys[i]].components = []; - } - if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { - METADATA_INFO[keys[i]].files.push(metadataFile); - - let name = FileUtils.getFileNameWithoutExtension( - metadataFile, - METADATA_INFO[keys[i]].sourceExtension - ); - - if (METADATA_INFO[keys[i]].isChildComponent) { - let fileParts = metadataFile.split(SEP); - let parentName = fileParts[fileParts.length - 3]; - name = parentName + '.' + name; - } - - METADATA_INFO[keys[i]].components.push(name); - } - found = true; - break; - } - } - - if (!found) { - const auraRegExp = new RegExp('aura'); - if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) { - if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) { - METADATA_INFO.AuraDefinitionBundle.files = []; - METADATA_INFO.AuraDefinitionBundle.components = []; - } - if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { - METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile); - - let name = FileUtils.getFileNameWithoutExtension(metadataFile); - METADATA_INFO.AuraDefinitionBundle.components.push(name); - } - } - } - }); - } else { - keys.forEach((key) => { - if (_.isNil(METADATA_INFO[key].files)) { - METADATA_INFO[key].files = []; - METADATA_INFO[key].components = []; - } - }); - } - } - //Check if a component is accepted by forceignore. - public accepts(filePath: string) { - return !this.forceignore.ignores(path.relative(process.cwd(), filePath)); - } - - public async isInModuleFolder(filePath: string) { - const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path); - if (!packageDirectories || packageDirectories.length == 0) { - return false; - } - const moduleFolder = packageDirectories.find((packageFolder) => { - let packageFolderNormalized = path.relative('', packageFolder); - return filePath.startsWith(packageFolderNormalized); - }); - return moduleFolder !== undefined; - } - - /** - * Copy a file to an outpu directory. If the filePath is a Metadata file Path, - * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls. - * Enforcing the .forceignore to ignire file ignored in the project. - * @param filePath - * @param outputFolder - */ - public static copyFile(filePath: string, outputFolder: string) { - console.log(`Copying file ${filePath} from file system to ${outputFolder}`); - const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json']; - const pairStatResources = METADATA_INFO.StaticResource.directoryName; - const pairStatResourcesRegExp = new RegExp(pairStatResources); - const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName); - - let copyOutputFolder = outputFolder; - - if (!fs.existsSync(filePath)) { - return; - } - - let exists = fs.existsSync(path.join(outputFolder, filePath)); - if (exists) { - return; - } - - if (filePath.startsWith('.')) { - let parts = path.parse(filePath); - if (parts.dir === '') { - fs.copyFileSync(filePath, path.join(outputFolder, filePath)); - return; - } - } - - let fileName = path.parse(filePath).base; - //exclude lwc ignored files - if (LWC_IGNORE_FILES.includes(fileName)) { - return; - } - - let filePathParts = filePath.split(SEP); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - // Create folder structure - for (let i = 0; i < filePathParts.length - 1; i++) { - let folder = filePathParts[i].replace('"', ''); - outputFolder = path.join(outputFolder, folder); - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - - // Copy all file with same base name - let associatedFilePattern = ''; - if (SOURCE_EXTENSION_REGEX.test(filePath)) { - associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*'); - } else { - let extension = path.parse(filePath).ext; - associatedFilePattern = filePath.replace(extension, '.*'); - } - let files = globSync(associatedFilePattern); - for (let i = 0; i < files.length; i++) { - if (fs.lstatSync(files[i]).isDirectory() == false) { - let oneFilePath = path.join('.', files[i]); - let oneFilePathParts = oneFilePath.split(SEP); - fileName = oneFilePathParts[oneFilePathParts.length - 1]; - let outputPath = path.join(outputFolder, fileName); - fs.copyFileSync(files[i], outputPath); - } - } - - // Hadle ObjectTranslations - // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied - if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) { - let parentFolder = filePathParts[filePathParts.length - 2]; - let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension; - let outputPath = path.join(outputFolder, objectTranslation); - let sourceFile = filePath.replace(fileName, objectTranslation); - if (fs.existsSync(sourceFile) == true) { - fs.copyFileSync(sourceFile, outputPath); - } - } - - //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED - if (pairStatResourcesRegExp.test(filePath)) { - outputFolder = path.join('.', copyOutputFolder); - let srcFolder = '.'; - let staticRecourceRoot = ''; - let resourceFile = ''; - for (let i = 0; i < filePathParts.length; i++) { - outputFolder = path.join(outputFolder, filePathParts[i]); - srcFolder = path.join(srcFolder, filePathParts[i]); - if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) { - let fileOrDirname = filePathParts[i + 1]; - let fileOrDirnameParts = fileOrDirname.split('.'); - srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); - outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); - resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension; - METADATA_INFO.StaticResource.sourceExtension; - staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension; - if (fs.existsSync(srcFolder)) { - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - break; - } - } - if (fs.existsSync(srcFolder)) { - FileUtils.copyRecursiveSync(srcFolder, outputFolder); - } - if (fs.existsSync(resourceFile)) { - fs.copyFileSync(resourceFile, staticRecourceRoot); - } - } - //FOR AURA components and LWC components - if (pairAuaraRegExp.test(filePath)) { - outputFolder = path.join('.', copyOutputFolder); - let srcFolder = '.'; - for (let i = 0; i < filePathParts.length; i++) { - outputFolder = path.join(outputFolder, filePathParts[i]); - srcFolder = path.join(srcFolder, filePathParts[i]); - if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') { - let fileOrDirname = filePathParts[i + 1]; - let fileOrDirnameParts = fileOrDirname.split('.'); - srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); - outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); - - if (fs.existsSync(srcFolder)) { - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - break; - } - } - if (fs.existsSync(srcFolder)) { - FileUtils.copyRecursiveSync(srcFolder, outputFolder); - } - } - } -} diff --git a/packages/core/src/metadata/MetadataInfo.ts b/packages/core/src/metadata/MetadataInfo.ts deleted file mode 100644 index 2b045612f..000000000 --- a/packages/core/src/metadata/MetadataInfo.ts +++ /dev/null @@ -1,214 +0,0 @@ -//TODO: Replace with SDR -import * as _ from 'lodash'; -import * as path from 'path'; -import * as fs from 'fs-extra'; - -export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/; -const SPLITED_TYPES = { - CustomField: { - suffix: 'field', - folder: 'fields', - }, - BusinessProcess: { - suffix: 'businessProcess', - folder: 'businessProcesses', - }, - CompactLayout: { - suffix: 'compactLayout', - folder: 'compactLayouts', - }, - FieldSet: { - suffix: 'fieldSet', - folder: 'fieldSets', - }, - RecordType: { - suffix: 'recordType', - folder: 'recordTypes', - }, - ListView: { - suffix: 'listView', - folder: 'listViews', - }, - SharingReason: { - suffix: 'sharingReason', - folder: 'sharingReasons', - }, - ValidationRule: { - suffix: 'validationRule', - folder: 'validationRules', - }, - WebLink: { - suffix: 'webLink', - folder: 'webLinks', - }, -}; - -export interface MetadataDescribe { - directoryName?: string; - inFolder?: boolean; - metaFile?: boolean; - suffix?: string; - xmlName?: string; - sourceExtension?: string; - childXmlNames?: string[]; - folderExtension?: string; - files?: string[]; - components?: string[]; - isChildComponent?: boolean; -} - -export interface MetadataInfo { - CustomApplication?: MetadataDescribe; - ApexClass?: MetadataDescribe; - ApexPage?: MetadataDescribe; - CustomField?: MetadataDescribe; - CustomObject?: MetadataDescribe; - CustomPermission?: MetadataDescribe; - ExternalDataSource?: MetadataDescribe; - ExperienceBundle?: MetadataDescribe; - Flow?: MetadataDescribe; - RecordType?: MetadataDescribe; - ListView?: MetadataDescribe; - WebLink?: MetadataDescribe; - ValidationRule?: MetadataDescribe; - CompactLayout?: MetadataDescribe; - BujsinessProcess?: MetadataDescribe; - CustomTab?: MetadataDescribe; - Layout?: MetadataDescribe; - Profile?: MetadataDescribe; - Translations?: MetadataDescribe; - CustomLabel?: MetadataDescribe; - CustomLabels?: MetadataDescribe; - GlobalValueSet?: MetadataDescribe; - CustomMetadata?: MetadataDescribe; - Document?: MetadataDescribe; - Queue?: MetadataDescribe; - Group?: MetadataDescribe; - Role?: MetadataDescribe; - Report?: MetadataDescribe; - Dashboard?: MetadataDescribe; - EmailTemplate?: MetadataDescribe; - CustomSite?: MetadataDescribe; - PermissionSet?: MetadataDescribe; - StaticResource?: MetadataDescribe; - CustomObjectTranslation?: MetadataDescribe; - AuraDefinitionBundle?: MetadataDescribe; - Workflow?: MetadataDescribe; - SharingRules?: MetadataDescribe; - LightningComponentBundle?: MetadataDescribe; -} - -export class MetadataInfo { - static loadMetadataInfo(): MetadataInfo { - let metadataInfo: MetadataInfo = {}; - let resourcePath = path.join(__dirname, '..', '..', 'resources', 'metadatainfo.json'); - const fileData = fs.readFileSync(resourcePath, 'utf8'); - let metadataInfoJSON = JSON.parse(fileData); - metadataInfoJSON.metadataObjects.forEach((metadata) => { - let metadataDescribe = metadata as MetadataDescribe; - if (_.isNil(metadata.suffix)) { - if (metadata.xmlName === 'AuraDefinitionBundle') { - metadata.suffix = 'cmp'; - metadataDescribe.suffix = 'cmp'; - } else if (metadata.xmlName == 'LightningComponentBundle') { - metadata.suffix = 'js'; - metadataDescribe.suffix = 'js'; - } - } - metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`; - if (metadata.inFolder) { - let folderExtensionPrefix = metadata.suffix; - if (_.isNil(metadata.suffix)) { - folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1); - } - metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`; - } - - //Generate Describe of cheildItems if exists - if (!_.isNil(metadata.childXmlNames)) { - metadata.childXmlNames.forEach((element) => { - let splitedElement = SPLITED_TYPES[element]; - if (!_.isNil(splitedElement)) { - let childDescribe: MetadataDescribe = {}; - childDescribe.directoryName = SPLITED_TYPES[element].folder; - childDescribe.suffix = SPLITED_TYPES[element].suffix; - childDescribe.xmlName = element; - childDescribe.inFolder = false; - childDescribe.metaFile = false; - childDescribe.isChildComponent = true; - childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`; - metadataInfo[childDescribe.xmlName] = childDescribe; - } - }); - } - metadataInfo[metadataDescribe.xmlName] = metadataDescribe; - }); - return metadataInfo; - } - - static getMetadataName(metadataFile: string, validateSourceExtension = true): string { - let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX); - let extension = ''; - if (matcher) { - extension = matcher[0]; - } else { - extension = path.parse(metadataFile).ext; - } - //SfPowerKit.ux.log(extension); - let metadataName = ''; - - const auraRegExp = new RegExp('aura'); - const lwcRegExp = new RegExp('lwc'); - const staticResourceRegExp = new RegExp('staticresources'); - const experienceBundleRegExp = new RegExp('experiences'); - const documentRegExp = new RegExp('documents'); - if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) { - metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName; - } else if ( - lwcRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.LightningComponentBundle.xmlName; - } else if ( - staticResourceRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.StaticResource.xmlName; - } else if ( - experienceBundleRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.ExperienceBundle.xmlName; - } else if ( - documentRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.Document.xmlName; - } else { - let keys = Object.keys(METADATA_INFO); - for (let i = 0; i < keys.length; i++) { - let metaDescribe = METADATA_INFO[keys[i]]; - if ( - metaDescribe.sourceExtension === extension || - ('.' + metaDescribe.suffix === extension && !validateSourceExtension) || - metaDescribe.folderExtension === extension - ) { - metadataName = metaDescribe.xmlName; - break; - } - } - } - return metadataName; - } -} - -export const METADATA_INFO = MetadataInfo.loadMetadataInfo(); -export const UNSPLITED_METADATA = [ - METADATA_INFO.Workflow, - METADATA_INFO.SharingRules, - METADATA_INFO.CustomLabels, - METADATA_INFO.Profile, - METADATA_INFO.PermissionSet, -]; - -export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet]; diff --git a/packages/core/src/metadata/SettingsFetcher.ts b/packages/core/src/metadata/SettingsFetcher.ts deleted file mode 100644 index 0c47e9116..000000000 --- a/packages/core/src/metadata/SettingsFetcher.ts +++ /dev/null @@ -1,22 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -const fs = require('fs-extra'); -import { XMLParser } from 'fast-xml-parser'; -import MetadataFetcher from './MetadataFetcher'; - -export default class SettingsFetcher extends MetadataFetcher { - constructor(logger: Logger) { - super(logger); - } - - public async getSetttingMetadata(org: SFPOrg, setting: string) { - SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger); - let retriveLocation = (await this.fetchPackageFromOrg(org, { - types: { name: 'Settings', members: setting }, - })).unzippedLocation; - let resultFile = `${retriveLocation}/settings/${setting}.settings`; - const parser = new XMLParser(); - let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`]; - return parsedSettings; - } -} diff --git a/packages/core/src/org/OrgDetailsFetcher.ts b/packages/core/src/org/OrgDetailsFetcher.ts deleted file mode 100644 index 10ce08e8b..000000000 --- a/packages/core/src/org/OrgDetailsFetcher.ts +++ /dev/null @@ -1,120 +0,0 @@ -import extractDomainFromUrl from '../utils/extractDomainFromUrl'; -import { convertAliasToUsername } from '../utils/AliasList'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import ScratchOrgInfoFetcher from './ScratchOrgInfoFetcher'; -import OrganizationFetcher from './OrganizationFetcher'; -import { AuthInfo, Connection, Org, trimTo15 } from '@salesforce/core'; - -export default class OrgDetailsFetcher { - private static usernamesToOrgDetails: { [P: string]: OrgDetails } = {}; - - constructor(private username: string) {} - - public async getOrgDetails(): Promise { - //Convert alias to username - this.username = await convertAliasToUsername(this.username); - - if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) - return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; - - const authInfo = await AuthInfo.create({ username: this.username }); - - let authInfoFields = authInfo.getFields(); - - - let sfdxAuthUrl: string; - try { - sfdxAuthUrl = authInfo.getSfdxAuthUrl(); - } catch (error) { - SFPLogger.log(`Unable to get SFDX Auth URL: ${error.message}`, LoggerLevel.TRACE, null); - } - - const isScratchOrg = authInfoFields.devHubUsername; - let scratchOrgInfo = isScratchOrg - ? await this.getScratchOrgDetails(authInfoFields.orgId, authInfo) - : ({} as ScratchOrgDetails); - - const organization = await this.getOrganization(authInfo); - - OrgDetailsFetcher.usernamesToOrgDetails[this.username] = { - sfdxAuthUrl: sfdxAuthUrl, - instanceUrl: authInfoFields.instanceUrl, - ...authInfoFields, - ...scratchOrgInfo, - ...organization, - }; - - return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; - } - - public async getOrgDomainUrl(): Promise { - await this.getOrgDetails(); - - if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) { - let domain = extractDomainFromUrl(OrgDetailsFetcher.usernamesToOrgDetails[this.username].instanceUrl); - if (domain) return domain; - else return ''; - } else { - return ''; - } - } - - private async getScratchOrgDetails(orgId: string, authInfo: AuthInfo): Promise { - const hubOrg: Org = await ( - await Org.create({ - connection: await Connection.create({ - authInfo: authInfo, - }), - }) - ).getDevHubOrg(); - - let scratchOrgInfo = ( - await new ScratchOrgInfoFetcher(hubOrg).getScratchOrgInfoByOrgId([trimTo15(orgId)]) - )[0]; - - if (scratchOrgInfo) { - return { - isScratchOrg:true, - status: scratchOrgInfo.Status, - }; - } else { - throw new Error( - `No information for scratch org with ID ${trimTo15( - orgId - )} found in Dev Hub ${hubOrg.getUsername()}` - ); - } - } - - private async getOrganization(authInfo: AuthInfo) { - const connection = await Connection.create({ - authInfo: authInfo, - }); - - const results = await new OrganizationFetcher(connection).fetch(); - - if (results[0]) { - return { - isSandbox: results[0].IsSandbox, - organizationType: results[0].OrganizationType, - }; - } else { - throw new Error(`No Organization records found for ${connection.getUsername()}`); - } - } -} - -export interface OrgDetails extends ScratchOrgDetails, Organization { - sfdxAuthUrl: string; - instanceUrl:string; -} - -export interface ScratchOrgDetails { - isScratchOrg:boolean; - status: string; -} - -export interface Organization { - isSandbox: boolean; - organizationType: string; -} diff --git a/packages/core/src/org/OrganizationFetcher.ts b/packages/core/src/org/OrganizationFetcher.ts deleted file mode 100644 index b453b9851..000000000 --- a/packages/core/src/org/OrganizationFetcher.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class OrganizationFetcher { - constructor(private conn: Connection) {} - - public fetch() { - const query = 'SELECT OrganizationType, IsSandbox FROM Organization LIMIT 1'; - - return QueryHelper.query<{ OrganizationType: string; IsSandbox: boolean }>(query, this.conn, false); - } -} diff --git a/packages/core/src/org/SFPOrg.ts b/packages/core/src/org/SFPOrg.ts deleted file mode 100644 index 9e499203f..000000000 --- a/packages/core/src/org/SFPOrg.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { Org } from '@salesforce/core'; -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import Package2Detail from '../package/Package2Detail'; -import SfpPackage from '../package/SfpPackage'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { convertUsernameToAlias } from '../utils/AliasList'; -import ObjectCRUDHelper from '../utils/ObjectCRUDHelper'; -import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor'; - -export default class SFPOrg extends Org { - /** - * Get list of all artifacts in an org - */ - public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) { - let records=[] - try { - records = await QueryHelper.query( - `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM SfpowerscriptsArtifact2__c ORDER BY ${orderBy} ASC`, - this.getConnection(), - false - ); - return records; - } catch (error) { - SFPLogger.log( - 'Unable to fetch any sfpowerscripts artifacts in the org\n' + - '1. sfpowerscripts package is not installed in the org\n' + - '2. The required prerequisite object is not deployed to this org\n', - LoggerLevel.WARN, - logger - ); - } - return records; - } - /** - * Check whether an artifact is installed in a Org - * @param {Logger} logger - * @param {SfpPackage} sfpPackage - */ - public async isArtifactInstalledInOrg( - logger: Logger, - sfpPackage: SfpPackage - ): Promise<{ isInstalled: boolean; versionNumber?: string }> { - let result: { isInstalled: boolean; versionNumber?: string } = { - isInstalled: false, - }; - try { - SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger); - result.isInstalled = false; - let installedArtifacts = await this.getInstalledArtifacts(); - let packageName = sfpPackage.packageName; - for (const artifact of installedArtifacts) { - if (artifact.Name === packageName) { - result.versionNumber = artifact.Version__c; - if (artifact.Version__c === sfpPackage.package_version_number) { - result.isInstalled = true; - return result; - } - } - } - } catch (error) { - SFPLogger.log( - 'Unable to fetch any sfpowerscripts artifacts in the org\n' + - '1. sfpowerscripts package is not installed in the org\n' + - '2. The required prerequisite object is not deployed to this org\n', - LoggerLevel.WARN, - logger - ); - } - return result; - } - /** - * Updates or Create information about an artifact in the org - * @param {Logger} logger - * @param {SfpPackage} sfpPackage - */ - public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise { - let artifactId = await this.getArtifactRecordId(sfpPackage); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Existing artifact record id for ${sfpPackage.packageName} in Org for ${ - sfpPackage.package_version_number - }: ${artifactId ? artifactId : 'N/A'}` - ), - LoggerLevel.INFO, - logger - ); - - let packageName = sfpPackage.package_name; - - if (artifactId == null) { - artifactId = await ObjectCRUDHelper.createRecord( - this.getConnection(), - 'SfpowerscriptsArtifact2__c', - { - Name: packageName, - Tag__c: sfpPackage.tag, - Version__c: sfpPackage.package_version_number, - CommitId__c: sfpPackage.sourceVersion, - } - ); - } else { - artifactId = await ObjectCRUDHelper.updateRecord( - this.getConnection(), - 'SfpowerscriptsArtifact2__c', - { - Id: artifactId, - Name: packageName, - Tag__c: sfpPackage.tag, - Version__c: sfpPackage.package_version_number, - CommitId__c: sfpPackage.sourceVersion, - } - ); - } - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${ - artifactId ? artifactId : '' - }` - ), - LoggerLevel.INFO, - logger - ); - return artifactId; - } - - private async getArtifactRecordId(sfpPackage: SfpPackage): Promise { - let installedArtifacts = await this.getInstalledArtifacts(); - - let packageName = sfpPackage.packageName; - for (const artifact of installedArtifacts) { - if (artifact.Name === packageName) { - return artifact.Id; - } - } - return null; - } - /** - * Retrieves all packages(recognized by Salesforce) installed in the org - */ - public async getAllInstalled2GPPackages(): Promise { - const installedPackages: Package2Detail[] = []; - - let records = await InstalledPackagesQueryExecutor.exec(this.getConnection()); - - records.forEach((record) => { - let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`; - - let packageDetails: Package2Detail = { - name: record.SubscriberPackage.Name, - package2Id: record.SubscriberPackageId, - namespacePrefix: record.SubscriberPackage.NamespacePrefix, - subscriberPackageVersionId: record.SubscriberPackageVersion.Id, - versionNumber: packageVersionNumber, - type: record.SubscriberPackageVersion.Package2ContainerOptions, - isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent, - }; - - installedPackages.push(packageDetails); - }); - - return installedPackages; - } - - /** - * Retrives all managed packages in the org - */ - public async getAllInstalledManagedPackages(): Promise { - const installedPackages = await this.getAllInstalled2GPPackages(); - return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed'); - } - /** - * List all the packages created in DevHub, will throw an error, if its not a DevHub - */ - public async listAllPackages() { - if (await this.determineIfDevHubOrg(true)) { - let records = await QueryHelper.query(packageQuery, this.getConnection(), true); - records.forEach((record) => { - record.IsOrgDependent = - record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No'; - }); - - return records; - } else throw new Error('Package Type Information can only be fetched from a DevHub'); - } - - public async getAlias(): Promise { - return await convertUsernameToAlias(this.getUsername()); - } - - /** - * Return all artifacts including sfpowerscripts as well as external unlocked/managed - */ - public async getAllInstalledArtifacts():Promise { - let artifacts = await this.getInstalledArtifacts(`Name`); - let installedArtifacts: InstalledArtifact[]=[]; - let installed2GPPackages = await this.getAllInstalled2GPPackages(); - - artifacts.forEach((artifact) => { - let installedArtifact: InstalledArtifact = { - name: artifact.Name, - version: artifact.Version__c, - commitId:artifact.CommitId__c, - isInstalledBySfpowerscripts: true, - }; - let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name); - if (packageFound) { - installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId; - if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`; - else installedArtifact.type = `Unlocked`; - } else { - installedArtifact.subscriberVersion = `N/A`; - installedArtifact.type = `Source/Data`; - } - installedArtifacts.push(installedArtifact); - }); - - installed2GPPackages.forEach((installed2GPPackage) => { - let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name); - if (!packageFound) { - let installedArtifact: InstalledArtifact = { - name: installed2GPPackage.name, - version: installed2GPPackage.versionNumber, - commitId: `N/A`, - }; - if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`; - else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`; - else installedArtifact.type = `Unlocked`; - - installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId; - installedArtifact.isInstalledBySfpowerscripts = false; - installedArtifacts.push(installedArtifact); - } - }); - return installedArtifacts; - } -} - -const packageQuery = - 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' + - 'FROM Package2 ' + - 'WHERE IsDeprecated != true ' + - 'ORDER BY NamespacePrefix, Name'; - - -export interface InstalledArtifact { - name: string; - version: string; - commitId?: string; - subscriberVersion?: string; - type?: string; - isInstalledBySfpowerscripts?: boolean; -} - -export interface SfpowerscriptsArtifact2__c { - Id?: string; - Name: string; - Tag__c: string; - Version__c: string; - CommitId__c: string; -} - -export interface PackageTypeInfo { - Id: string; - Name: string; - Description: string; - NamespacePrefix: string; - ContainerOptions: string; - IsOrgDependent: boolean | string; -} diff --git a/packages/core/src/org/ScratchOrgInfoFetcher.ts b/packages/core/src/org/ScratchOrgInfoFetcher.ts deleted file mode 100644 index c238af473..000000000 --- a/packages/core/src/org/ScratchOrgInfoFetcher.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Org, trimTo15 } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ScratchOrgInfoFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgInfoByOrgId(orgId: string[]) { - const conn = this.hubOrg.getConnection(); - - let collection = orgId - .map((id) => { - return `'${trimTo15(id)}'`; - }) - .toString(); - - let query = ` - SELECT Id, ScratchOrg, Status - FROM ScratchOrgInfo - WHERE ScratchOrg IN (${collection}) - `; - - return QueryHelper.query(query, conn, false); - } -} - -export interface ScratchOrgInfo { - Id: string; - ScratchOrg: string; - Status: 'New' | 'Deleted' | 'Active' | 'Error'; -} diff --git a/packages/core/src/org/packageQuery/InstalledPackagesQueryExecutor.ts b/packages/core/src/org/packageQuery/InstalledPackagesQueryExecutor.ts deleted file mode 100644 index 2d124718c..000000000 --- a/packages/core/src/org/packageQuery/InstalledPackagesQueryExecutor.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; - -export default class InstalledPackagesQueryExecutor { - static async exec(conn: Connection) { - const installedPackagesQuery = - 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' + - 'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' + - 'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' + - 'ORDER BY SubscriberPackageId'; - - return QueryHelper.query(installedPackagesQuery, conn, true); - } -} diff --git a/packages/core/src/package/Package2Detail.ts b/packages/core/src/package/Package2Detail.ts deleted file mode 100644 index 55c55deed..000000000 --- a/packages/core/src/package/Package2Detail.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default interface Package2Detail { - name: string; - package2Id?: string; - namespacePrefix?: string; - subscriberPackageVersionId?: string; - versionNumber?: string; - type?: string; - isOrgDependent?: boolean; - key?: string; -} diff --git a/packages/core/src/package/SfpPackage.ts b/packages/core/src/package/SfpPackage.ts deleted file mode 100644 index 9c4833062..000000000 --- a/packages/core/src/package/SfpPackage.ts +++ /dev/null @@ -1,143 +0,0 @@ -import _ from 'lodash'; -import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; - -export type ApexClasses = Array; - -class PackageInfo { - id?: string; - package_name: string; - package_version_number?: string; - package_version_id?: string; - package_type?: string; - test_coverage?: number; - has_passed_coverage_check?: boolean; - repository_url?: string; - sourceVersion?: string; - branch?: string; - apextestsuite?: string; - isApexFound?: boolean; - assignPermSetsPreDeployment?: string[]; - assignPermSetsPostDeployment?: string[]; - apexTestClassses?: string[]; - isPickListsFound?: boolean; - isTriggerAllTests?: boolean; - isProfilesFound?: boolean; - isPermissionSetGroupFound?: boolean; - isPromoted?: boolean; - tag?: string; - isDependencyValidated?: boolean; - destructiveChanges?: any; - destructiveChangesPath?: string; - payload?: any; - metadataCount?: number; - sourceDir?: string; - dependencies?: any; - reconcileProfiles?: boolean; - isPayLoadContainTypesSupportedByProfiles?: boolean; - creation_details?: { creation_time?: number; timestamp?: number }; - deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[]; - apiVersion?: string; - postDeploymentScript?: string; - preDeploymentScript?: string; - apexClassWithOutTestClasses?: ApexClasses; - triggers?: ApexClasses; - configFilePath?: string; - packageDescriptor?: any; - commitSHAFrom?:string; - commitSHATo?:string; - packageDirectory?: string; - apexClassesSortedByTypes?: ApexSortedByType; - projectConfig?: any; - changelogFilePath?: string; -} - -export default class SfpPackage extends PackageInfo { - public projectDirectory: string; - public workingDirectory: string; - public mdapiDir: string; - public destructiveChangesPath: string; - public resolvedPackageDirectory: string; - - public version: string = '5'; - - //Just a few helpers to resolve api differene - public get packageName(): string { - return this.package_name; - } - - public get versionNumber(): string { - return this.package_version_number; - } - - public set versionNumber(versionNumber:string) - { - this.package_version_number = versionNumber; - } - - public get packageType(): string { - return this.package_type.toLocaleLowerCase(); - } - - public set packageType(packageType: string) { - this.package_type = packageType; - } - /** - * Do not use this constructor directly, use SfPPackageBuilder - * to build a package - * - */ - public constructor() { - super(); - } - - toJSON(): PackageInfo { - let castToPackageMetadata = _.cloneDeep(this); - delete castToPackageMetadata.workingDirectory; - delete castToPackageMetadata.mdapiDir; - delete castToPackageMetadata.projectConfig; - delete castToPackageMetadata.packageDescriptor; - delete castToPackageMetadata.projectDirectory; - delete castToPackageMetadata.resolvedPackageDirectory; - delete castToPackageMetadata.isTriggerAllTests; - return castToPackageMetadata; - } -} - - -export enum PackageType { - Unlocked = "unlocked", - Source = "source", - Data = "data", - Diff = "diff" -} - -export interface DiffPackageMetadata { - - - sourceVersionFrom?: string; - sourceVersionTo?: string; - isProfilesFound?: boolean; - apexTestClassses?: string[]; - isApexFound?: boolean; - isPicklistFound?: boolean; - isPermissionSetGroupFound?: boolean; - isPermissionSetFound?: boolean; - payload?: any; - metadataCount?: number; - profilesToReconcile?: number; - destructiveChanges?: any; - sourceDir?: string; - invalidatedTestClasses?: ApexClasses; - isPayLoadContainTypesSupportedByProfiles?:boolean; -} -export interface SfpPackageParams { - overridePackageTypeWith?: string; - branch?: string; - packageVersionNumber?: string; - repositoryUrl?: string; - sourceVersion?: string; - configFilePath?: string; - pathToReplacementForceIgnore?: string; - revisionFrom?: string; - revisionTo?: string; -} diff --git a/packages/core/src/package/SfpPackageBuilder.ts b/packages/core/src/package/SfpPackageBuilder.ts deleted file mode 100644 index fb35dd914..000000000 --- a/packages/core/src/package/SfpPackageBuilder.ts +++ /dev/null @@ -1,278 +0,0 @@ -import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; -import ProjectConfig from '../project/ProjectConfig'; -import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator'; -import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor'; -import PackageManifest from './components/PackageManifest'; -import MetadataCount from './components/MetadataCount'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import * as fs from 'fs-extra'; -import path from 'path'; -import { Artifact } from '../artifacts/ArtifactFetcher'; -import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage'; -import PropertyFetcher from './propertyFetchers/PropertyFetcher'; -import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher'; -import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher'; -import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher'; -import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl'; -import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl'; -import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl'; -import lodash = require('lodash'); -import { EOL } from 'os'; -import PackageVersionUpdater from './version/PackageVersionUpdater'; -import { AnalyzerRegistry } from './analyser/AnalyzerRegistry'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl'; -import { COLOR_WARNING } from '@dxatscale/sfp-logger'; - -export default class SfpPackageBuilder { - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string, - params?: SfpPackageParams, - packageCreationParams?: PackageCreationParams, - projectConfig?: any - ) { - if (!projectConfig) { - projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - } else { - // Clone the projectConfig to prevent mutation - projectConfig = lodash.cloneDeep(projectConfig); - } - - let propertyFetchers: PropertyFetcher[] = [ - new AssignPermissionSetFetcher(), - new DestructiveManifestPathFetcher(), - new ReconcilePropertyFetcher(), - ]; - - let startTime = Date.now; - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.package_name = sfdx_package; - sfpPackage.projectConfig = projectConfig; - sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion; - sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig( - sfdx_package, - sfpPackage.projectConfig - ); - sfpPackage.projectDirectory = projectDirectory?projectDirectory:''; - sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; - //Set Default Version Number - sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; - - //set additional options - sfpPackage.sourceVersion = params?.sourceVersion; - sfpPackage.branch = params?.branch; - sfpPackage.repository_url = params?.repositoryUrl; - if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json'; - else sfpPackage.configFilePath = params?.configFilePath; - - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getSfpowerscriptsProperties(sfpPackage, logger); - } - - //Get Package Type - sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package); - - sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams); - - // Requires destructiveChangesPath which is set by the property fetcher - sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory( - logger, - sfpPackage.projectDirectory, - sfpPackage.projectConfig, - sfpPackage.packageName, - sfpPackage.packageDescriptor.path, - sfpPackage.versionNumber, - sfpPackage.destructiveChangesPath, - sfpPackage.configFilePath, - params?.pathToReplacementForceIgnore - ); - - sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path); - - //Don't proceed further if packageType is Data - if (sfpPackage.package_type != PackageType.Data) { - let sourceToMdapiConvertor = new SourceToMDAPIConvertor( - sfpPackage.workingDirectory, - sfpPackage.packageDescriptor.path, - ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion, - logger - ); - sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath; - const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir); - - sfpPackage.payload = packageManifest.manifestJson; - sfpPackage.triggers = packageManifest.fetchTriggers(); - sfpPackage.isApexFound = packageManifest.isApexInPackage(); - sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); - sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); - sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); - - let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir); - sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType(); - sfpPackage.apexTestClassses = apexFetcher.getTestClasses(); - sfpPackage.metadataCount = await MetadataCount.getMetadataCount( - sfpPackage.workingDirectory, - sfpPackage.packageDescriptor.path - ); - sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces(); - - sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); - - //Load component Set - let componentSet = ComponentSet.fromSource( - path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory) - ); - - //Run through all analyzers - let analyzers = AnalyzerRegistry.getAnalyzers(); - for (const analyzer of analyzers) { - if (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger); - } - } - - //Create the actual package - let createPackage; - - if (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true }; - - let packageType = sfpPackage.package_type; - if (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase(); - - //Get Implementors - switch (packageType) { - case PackageType.Unlocked: - createPackage = new CreateUnlockedPackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Source: - createPackage = new CreateSourcePackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Data: - createPackage = new CreateDataPackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Diff: - packageCreationParams.revisionFrom = params.revisionFrom; - packageCreationParams.revisionTo = params.revisionTo; - createPackage = new CreateDiffPackageImp( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - } - - return createPackage.exec(); - } - - /* - * Handle version Numbers of package - * If VersionNumber is explcitly passed, use that - * else allow autosubstitute using buildNumber for Source and Data if available - */ - private static handleVersionNumber( - params: SfpPackageParams, - sfpPackage: SfpPackage, - packageCreationParams: PackageCreationParams - ) { - if (params?.packageVersionNumber) { - sfpPackage.versionNumber = params.packageVersionNumber; - } else if (packageCreationParams?.buildNumber) { - if (sfpPackage.packageType != PackageType.Unlocked) { - let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater(); - sfpPackage.versionNumber = versionUpdater.substituteBuildNumber( - sfpPackage, - packageCreationParams.buildNumber - ); - } - } else { - sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; - } - return sfpPackage; - } - - public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise { - //Read artifact metadata - let sfpPackage = new SfpPackage(); - Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' })); - sfpPackage.sourceDir = artifact.sourceDirectoryPath; - sfpPackage.changelogFilePath = artifact.changelogFilePath; - - sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath); - sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - artifact.sourceDirectoryPath, - sfpPackage.package_name - ); - sfpPackage.projectDirectory = artifact.sourceDirectoryPath; - sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; - sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); - - return sfpPackage; - } - - - - private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) { - if ( - this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false || - (sfpPackage.packageType == PackageType.Source && - sfpPackage.isApexFound == true && - sfpPackage.apexTestClassses == null) - ) { - SFPLogger.printHeaderLine('WARNING! NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger); - SFPLogger.log( - `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` + - `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` + - `via triggering all local tests,This definitely is not optimal approach on large orgs` + - `Please consider adding test classes for the classes in the package`, - LoggerLevel.INFO, - logger - ); - SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger); - return true; - } else return false; - } - - // Allow individual packages to use non optimized path - private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { - if (pkgDescriptor['isOptimizedDeployment'] == null) return true; - else return pkgDescriptor['isOptimizedDeployment']; - } -} - -// Options while creating package -export class PackageCreationParams { - breakBuildIfEmpty: boolean = true; - devHub?: string; - installationkeybypass?: boolean; - installationkey?: string; - waitTime?: string; - isCoverageEnabled?: boolean; - isSkipValidation?: boolean; - isComputeDiffPackage?: boolean; - baseBranch?: string; - buildNumber?: string; - useSelectiveBuildOnly?: boolean; - revisionFrom?:string; - revisionTo?:string; -} diff --git a/packages/core/src/package/SfpPackageInquirer.ts b/packages/core/src/package/SfpPackageInquirer.ts deleted file mode 100644 index 7395560fd..000000000 --- a/packages/core/src/package/SfpPackageInquirer.ts +++ /dev/null @@ -1,178 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import * as fs from 'fs-extra'; -import path = require('path'); -import lodash = require('lodash'); -import { URL } from 'url'; -import SfpPackage from './SfpPackage'; - -/** - * Methods for getting information about artifacts - */ -export default class SfpPackageInquirer { - private _latestPackageManifestFromArtifacts: any; - private _pathToLatestPackageManifestFromArtifacts: string; - private _prunedLatestPackageManifestFromArtifacts: any; - - get pathToLatestPackageManifestFromArtifacts() { - return this._pathToLatestPackageManifestFromArtifacts; - } - get prunedLatestPackageManifestFromArtifacts() { - return this._prunedLatestPackageManifestFromArtifacts; - } - - constructor(private readonly sfpPackages: SfpPackage[], private packageLogger?: Logger) {} - - public getLatestProjectConfig() { - let latestPackageManifest = this.getLatestPackageManifestFromArtifacts(this.sfpPackages); - - if (latestPackageManifest) { - this._latestPackageManifestFromArtifacts = latestPackageManifest.latestPackageManifest; - this._pathToLatestPackageManifestFromArtifacts = latestPackageManifest.pathToLatestPackageManifest; - - this._prunedLatestPackageManifestFromArtifacts = this.pruneLatestPackageManifest( - latestPackageManifest.latestPackageManifest, - this.sfpPackages - ); - } - return this._latestPackageManifestFromArtifacts; - } - - /** - * Gets latest package manifest from artifacts - * Returns null if unable to find latest package manifest - */ - private getLatestPackageManifestFromArtifacts( - sfpPackages: SfpPackage[] - ): { - latestPackageManifest: any; - pathToLatestPackageManifest: string; - } { - let latestPackageManifest: any; - let pathToLatestPackageManifest: string; - - this.validateArtifactsSourceRepository(); - - let latestSfpPackage: SfpPackage; - for (let sfpPackage of sfpPackages) { - if ( - latestSfpPackage == null || - latestSfpPackage.creation_details.timestamp < sfpPackage.creation_details.timestamp - ) { - latestSfpPackage = sfpPackage; - - let pathToPackageManifest = path.join(sfpPackage.sourceDir, 'manifests', 'sfdx-project.json.ori'); - if (fs.existsSync(pathToPackageManifest)) { - latestPackageManifest = JSON.parse(fs.readFileSync(pathToPackageManifest, 'utf8')); - - pathToLatestPackageManifest = pathToPackageManifest; - } - } - } - - if (latestPackageManifest) { - SFPLogger.log( - `Found latest package manifest in ${latestSfpPackage.packageName} artifact`, - LoggerLevel.INFO, - this.packageLogger - ); - - return { latestPackageManifest, pathToLatestPackageManifest }; - } else return null; - } - - /** - * Verify that artifacts are from the same source repository - */ - public validateArtifactsSourceRepository(): void { - let remoteURL: RemoteURL; - - for (let sfpPackage of this.sfpPackages) { - let currentRemoteURL: RemoteURL; - - let isHttp: boolean = sfpPackage.repository_url.match(/^https?:\/\//) ? true : false; - if (isHttp) { - const url = new URL(sfpPackage.repository_url); - currentRemoteURL = { - ref: url.toString(), - hostName: url.hostname, - pathName: url.pathname, - }; - } else { - // Handle SSH URL separately, as it is not supported by URL module - currentRemoteURL = { - ref: sfpPackage.repository_url, - hostName: null, - pathName: null, - }; - } - - if (remoteURL == null) { - remoteURL = currentRemoteURL; - continue; - } - - let isValid: boolean; - if (isHttp) { - if ( - currentRemoteURL.hostName === remoteURL.hostName && - currentRemoteURL.pathName === remoteURL.pathName - ) - isValid = true; - else isValid = false; - } else { - if (currentRemoteURL.ref === remoteURL.ref) isValid = true; - else isValid = false; - } - - if (!isValid) { - SFPLogger.log(`remoteURL: ${JSON.stringify(remoteURL)}`, LoggerLevel.DEBUG, this.packageLogger); - SFPLogger.log( - `currentRemoteURL: ${JSON.stringify(currentRemoteURL)}`, - LoggerLevel.DEBUG, - this.packageLogger - ); - throw new Error( - `Artifacts must originate from the same source repository, for deployment to work. The artifact ${sfpPackage.packageName} has repository URL that doesn't meet the current repository URL ${JSON.stringify(currentRemoteURL)} not equal ${JSON.stringify(remoteURL)}` - ); - } - } - } - - /** - * Remove packages that do not have an artifact from the package manifest - * @param latestPackageManifest - * @param artifacts - */ - private pruneLatestPackageManifest(latestPackageManifest: any, sfpPackages: SfpPackage[]) { - let prunedLatestPackageManifest = lodash.cloneDeep(latestPackageManifest); - - let packagesWithArtifacts: string[] = []; - sfpPackages.forEach((sfpPackage) => { - packagesWithArtifacts.push(sfpPackage.packageName); - }); - - let i = prunedLatestPackageManifest.packageDirectories.length; - while (i--) { - if (!packagesWithArtifacts.includes(prunedLatestPackageManifest.packageDirectories[i].package)) { - let removedPackageDirectory = prunedLatestPackageManifest.packageDirectories.splice(i, 1); - - // Also remove references to the package as a dependency - prunedLatestPackageManifest.packageDirectories.forEach((pkg) => { - let indexOfDependency = pkg.dependencies?.findIndex( - (dependency) => dependency.package === removedPackageDirectory[0].package - ); - - if (indexOfDependency >= 0) pkg.dependencies.splice(indexOfDependency, 1); - }); - } - } - - return prunedLatestPackageManifest; - } -} - -interface RemoteURL { - ref: string; - hostName: string; - pathName: string; -} diff --git a/packages/core/src/package/SfpPackageInstaller.ts b/packages/core/src/package/SfpPackageInstaller.ts deleted file mode 100644 index d475e17dd..000000000 --- a/packages/core/src/package/SfpPackageInstaller.ts +++ /dev/null @@ -1,63 +0,0 @@ -import path from 'path'; -import { Logger } from '@dxatscale/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -import InstallDataPackageImpl from './packageInstallers/InstallDataPackageImpl'; -import { SfpPackageInstallationOptions } from './packageInstallers/InstallPackage'; -import InstallSourcePackageImpl from './packageInstallers/InstallSourcePackageImpl'; -import InstallUnlockedPackage from './packageInstallers/InstallUnlockedPackage'; -import { PackageInstallationResult } from './packageInstallers/PackageInstallationResult'; -import SfpPackage, { PackageType } from './SfpPackage'; - -export default class SfpPackageInstaller { - public static async installPackage( - logger: Logger, - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - installationOptions: SfpPackageInstallationOptions, - installationContext?: SfPPackageInstallationContext, - overridePackageTypeWith?: string - ): Promise { - let packageType = sfpPackage.packageType; - if (overridePackageTypeWith) packageType = overridePackageTypeWith; - - switch (packageType) { - case PackageType.Unlocked: - let installUnlockedPackageImpl: InstallUnlockedPackage = new InstallUnlockedPackage( - sfpPackage, - targetOrg, - installationOptions, - logger - ); - installUnlockedPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installUnlockedPackageImpl.exec(); - case PackageType.Diff: - case PackageType.Source: - installationOptions.pathToReplacementForceIgnore = installationContext?.currentStage == 'prepare' - ? path.join(sfpPackage.sourceDir, 'forceignores', '.prepareignore') - : null; - let installSourcePackageImpl: InstallSourcePackageImpl = new InstallSourcePackageImpl( - sfpPackage, - targetOrg, - installationOptions, - logger - ); - installSourcePackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installSourcePackageImpl.exec(); - case PackageType.Data: - let installDataPackageImpl: InstallDataPackageImpl = new InstallDataPackageImpl( - sfpPackage, - targetOrg, - logger, - installationOptions - ); - installDataPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installDataPackageImpl.exec(); - default: - throw new Error('Unknown Package Type'); - } - } -} - -export class SfPPackageInstallationContext { - currentStage: string; -} diff --git a/packages/core/src/package/analyser/AnalyzerRegistry.ts b/packages/core/src/package/analyser/AnalyzerRegistry.ts deleted file mode 100644 index 0e4abe323..000000000 --- a/packages/core/src/package/analyser/AnalyzerRegistry.ts +++ /dev/null @@ -1,20 +0,0 @@ -import FHTAnalyser from './FHTAnalyzer'; -import FTAnalyser from './FTAnalyzer'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import PicklistAnalyzer from './PicklistAnalyzer'; - -export class AnalyzerRegistry { - static getAnalyzers(): PackageAnalyzer[] { - let packageAnalyzers: PackageAnalyzer[] = []; - - //TODO: Make dynamic - let fhtAnalyzer = new FHTAnalyser(); - let ftAnalyser = new FTAnalyser(); - let picklistAnalyzer = new PicklistAnalyzer(); - packageAnalyzers.push(fhtAnalyzer); - packageAnalyzers.push(ftAnalyser); - packageAnalyzers.push(picklistAnalyzer); - - return packageAnalyzers; - } -} diff --git a/packages/core/src/package/analyser/FHTAnalyzer.ts b/packages/core/src/package/analyser/FHTAnalyzer.ts deleted file mode 100644 index 04dc2b1e5..000000000 --- a/packages/core/src/package/analyser/FHTAnalyzer.ts +++ /dev/null @@ -1,76 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import * as yaml from 'js-yaml'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class FHTAnalyser implements PackageAnalyzer { - - public getName() { - return "Field History Tracking Analyzer" - } - - - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - - let fhtFields: { [key: string]: Array } = {}; - - //read the yaml - let fhtYamlPath = path.join( - sfpPackage.workingDirectory, - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - '/postDeploy/history-tracking.yml' - ); - - //read components mentioned in yaml - if (fs.existsSync(fhtYamlPath)) { - //convert yaml to json - fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; - } - - - //filter the components in the package - fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet); - - if (Object.keys(fhtFields).length>0) { - sfpPackage['isFHTFieldFound'] = true; - sfpPackage['fhtFields'] = fhtFields; - } - } catch (error) { - //Ignore error for now - SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - private async addFieldsFromComponentSet( - fhtFields: { [key: string]: Array }, - componentSet: ComponentSet - ): Promise>> { - let sourceComponents = componentSet.getSourceComponents().toArray(); - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { - continue; - } - - let customField = sourceComponent.parseXmlSync().CustomField; - if (customField['trackHistory'] == 'true') { - let objName = sourceComponent.parent.fullName; - if (!fhtFields[objName]) fhtFields[objName] = []; - fhtFields[objName].push(sourceComponent.name); - } - } - return fhtFields; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/core/src/package/analyser/FTAnalyzer.ts b/packages/core/src/package/analyser/FTAnalyzer.ts deleted file mode 100644 index 9734043cf..000000000 --- a/packages/core/src/package/analyser/FTAnalyzer.ts +++ /dev/null @@ -1,74 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import * as yaml from 'js-yaml'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class FTAnalyser implements PackageAnalyzer { - - public getName(): string { - return "Feed Tracking Analyzer"; - }; - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - - let ftFields: { [key: string]: Array } = {}; - - //read the yaml - let ftYamlPath = path.join( - sfpPackage.workingDirectory, - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - '/postDeploy/feed-tracking.yml' - ); - - //read components mentioned in yaml - if (fs.existsSync(ftYamlPath)) { - //convert yaml to json - ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; - } - - - //filter the components in the package - ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet); - - if (Object.keys(ftFields).length>0) { - sfpPackage['isFTFieldFound'] = true; - sfpPackage['ftFields'] = ftFields; - } - } catch (error) { - //Ignore error for now - SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - private async addFieldsFromComponentSet( - ftFields: { [key: string]: Array }, - componentSet: ComponentSet - ): Promise>> { - let sourceComponents = componentSet.getSourceComponents().toArray(); - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { - continue; - } - - let customField = sourceComponent.parseXmlSync().CustomField; - if (customField['trackFeedHistory'] == 'true') { - let objName = sourceComponent.parent.fullName; - if (!ftFields[objName]) ftFields[objName] = []; - ftFields[objName].push(sourceComponent.name); - } - } - return ftFields; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/core/src/package/analyser/PackageAnalyzer.ts b/packages/core/src/package/analyser/PackageAnalyzer.ts deleted file mode 100644 index cc51b44ec..000000000 --- a/packages/core/src/package/analyser/PackageAnalyzer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Logger } from "@dxatscale/sfp-logger"; -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import SfpPackage from "../SfpPackage"; - -export interface PackageAnalyzer -{ - getName(); - analyze(sfpPackage: SfpPackage,componentSet:ComponentSet,logger:Logger): Promise - isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise - - -} \ No newline at end of file diff --git a/packages/core/src/package/analyser/PicklistAnalyzer.ts b/packages/core/src/package/analyser/PicklistAnalyzer.ts deleted file mode 100644 index 80db81f54..000000000 --- a/packages/core/src/package/analyser/PicklistAnalyzer.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class PicklistAnalyzer implements PackageAnalyzer { - - public getName() { - return "Picklist Analyzer" - } - - - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - let sourceComponents = componentSet.getSourceComponents().toArray(); - let components = []; - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name == registry.types.customobject.name) { - //issues/1367 - //this can add child elements that are not custom fields.. - components.push(...sourceComponent.getChildren()); - } - - if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { - components.push(sourceComponent); - } - } - - if (components) { - for (const fieldComponent of components) { - let customField = fieldComponent.parseXmlSync().CustomField; - //issues/1367 - //if the component isn't a field customField will be undefined..so check - if (customField && customField['type'] == 'Picklist') { - sfpPackage.isPickListsFound= true; - break; - } - } - } - } catch (error) { - SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/core/src/package/components/DeployDestructiveManifestToOrgImpl.ts b/packages/core/src/package/components/DeployDestructiveManifestToOrgImpl.ts deleted file mode 100644 index 15a8607ff..000000000 --- a/packages/core/src/package/components/DeployDestructiveManifestToOrgImpl.ts +++ /dev/null @@ -1,129 +0,0 @@ -import SFPLogger from '@dxatscale/sfp-logger'; -import { Connection } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import { delay } from '../../utils/Delay'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPOrg from '../../org/SFPOrg'; -import AdmZip from "adm-zip" -import path from 'path'; -import tmp from "tmp"; -import { XMLParser } from 'fast-xml-parser'; -import { isEmpty } from 'lodash'; - -export default class DeployDestructiveManifestToOrgImpl { - public constructor(private sfpOrg: SFPOrg, private destructiveManifestPath: string) { } - - - - - public async exec(): Promise { - //Connect to the org - const conn = this.sfpOrg.getConnection(); - const apiversion = await conn.retrieveMaxApiVersion(); - let workingDirectory = this.generateCacheDirectory(); - await this.copyAndValidateDestructiveManifest(this.destructiveManifestPath, workingDirectory); - this.generateEmptyPackageXml(workingDirectory, apiversion); - let zipFile = await this.generateDeploymentZipFile(workingDirectory); - await this.deployDestructiveManifest(zipFile, conn); - } - - private generateCacheDirectory() { - - let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); - let tempDir = tmpDirObj.name; - let destructCacheDirectory = path.join(tempDir, 'destruct'); - fs.mkdirSync(destructCacheDirectory); - return destructCacheDirectory; - } - - private async copyAndValidateDestructiveManifest(existingManifestPath: string, workingDirectory: string) { - let destructiveManifestFile = path.join(workingDirectory, 'destructiveChanges.xml'); - - //Copy Destructive Manifest File to Temporary Directory - fs.copyFileSync(existingManifestPath, destructiveManifestFile); - const parser = new XMLParser(); - let destructiveChanges = await parser.parse(fs.readFileSync(path.resolve(destructiveManifestFile))); - - if (isEmpty(destructiveChanges['Package']['types'])) { - throw new Error('Invalid Destructive Change Definition encountered, please check'); - } - - SFPLogger.log(destructiveChanges['Package']['types'], LoggerLevel.TRACE); - } - - - private generateEmptyPackageXml(workingDirectory: string, apiversion: string) { - let packageXml = ` - - - * - CustomLabel - - ${apiversion} - `; - - let packageXmlPath = path.join(workingDirectory, 'package.xml'); - fs.outputFileSync(packageXmlPath, packageXml); - - SFPLogger.log(`Empty Package.xml with ${apiversion} created at ${workingDirectory}`, LoggerLevel.DEBUG); - } - - private async generateDeploymentZipFile(workingDirectory: string) { - let zip = new AdmZip(); - zip.addLocalFolder(workingDirectory); - zip.writeZip(path.join(workingDirectory, 'package.zip')); - return path.join(workingDirectory, 'package.zip'); - } - - - - private async deployDestructiveManifest(zipFile: string, conn: Connection) { - //Deploy Package - conn.metadata.pollTimeout = 300; - - const zipStream = fs.createReadStream(zipFile); - let deployResult = await conn.metadata.deploy(zipStream, { rollbackOnError: true, singlePackage: true }); - - - SFPLogger.log( - `Deploying Destructive Changes with ID ${deployResult.id} to ${conn.getUsername()}`, - LoggerLevel.INFO - ); - let deploymentStatus = await this.checkDeploymentStatus(conn, deployResult.id); - - if (deploymentStatus.success) { - if (deploymentStatus.success) - SFPLogger.log( - `Deployed Destructive Changes in target org ${conn.getUsername()} succesfully`, - LoggerLevel.INFO - ); - } else { - let componentFailures = deploymentStatus.details.componentFailures; - let errorResult = []; - componentFailures.forEach((failure) => { - errorResult.push({ - componentType: failure.componentType, - fullName: failure.fullName, - problem: failure.problem, - }); - }); - - console - throw new Error('Unable to deploy the Destructive Changes: ' + JSON.stringify(errorResult)); - } - } - - private async checkDeploymentStatus(conn: Connection, retrievedId: string) { - - while (true) { - let result = await conn.metadata.checkDeployStatus(retrievedId, true); - - if (!result.done) { - SFPLogger.log('Polling for Deployment Status', LoggerLevel.INFO); - await delay(5000); - } else { - return result; - } - } - } -} diff --git a/packages/core/src/package/components/MetadataCount.ts b/packages/core/src/package/components/MetadataCount.ts deleted file mode 100644 index 23454e15d..000000000 --- a/packages/core/src/package/components/MetadataCount.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { globSync } from 'glob'; -import path from 'path'; - -export default class MetadataCount { - public static async getMetadataCount(projectDirectory: string, sourceDirectory: string): Promise { - let metadataCount; - try { - let metadataFiles: string[] = globSync(`**/*-meta.xml`, { - cwd: projectDirectory ? path.join(projectDirectory, sourceDirectory) : sourceDirectory, - absolute: true, - }); - metadataCount = metadataFiles.length; - } catch (error) { - metadataCount = -1; - } - return metadataCount; - } -} diff --git a/packages/core/src/package/components/PackageManifest.ts b/packages/core/src/package/components/PackageManifest.ts deleted file mode 100644 index 9d0be4521..000000000 --- a/packages/core/src/package/components/PackageManifest.ts +++ /dev/null @@ -1,271 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import { ApexClasses } from '../SfpPackage'; -import xml2json from '../../utils/xml2json'; -const xml2js = require('xml2js'); - -export default class PackageManifest { - private _manifestJson; - private _manifestXml: string; - - /** - * Getter for package manifest JSON - */ - get manifestJson() { - return this._manifestJson; - } - - /** - * Getter for package manifest XML - */ - get manifestXml(): string { - return this._manifestXml; - } - - private constructor() {} - - /** - * Factory method - * @param mdapiDir directory containing package.xml - * @returns instance of PackageManifest - */ - static async create(mdapiDir: string): Promise { - const packageManifest = new PackageManifest(); - - const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8'); - - packageManifest._manifestXml = packageXml; - packageManifest._manifestJson = await xml2json(packageXml); - - return packageManifest; - } - - /** - * Factory method - * @param components - * @param apiVersion - * @returns intance of PackageManifest - */ - static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest { - const packageManifest = new PackageManifest(); - - const packageJson = { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [], - version: apiVersion, - }; - - components.forEach((component) => { - const type = packageJson.types.find((type) => type.name === component.type); - if (type) { - // Add member to existing type - type.members.push(component.fullName); - } else { - // create new type - const newType = { - name: component.type, - members: [component.fullName], - }; - packageJson.types.push(newType); - } - }); - - const builder = new xml2js.Builder({ - xmldec: { version: '1.0', encoding: 'UTF-8' }, - }); - - let packageObj = { - Package: packageJson, - }; - - packageManifest._manifestXml = builder.buildObject(packageObj); - packageManifest._manifestJson = packageObj; - - return packageManifest; - } - - /** - * Factory method - * @param manifest package JSON - * @returns instance of PackageManifest - */ - static async createWithJSONManifest(manifest: any): Promise { - const packageManifest = new PackageManifest(); - packageManifest._manifestJson = manifest; - - const builder = new xml2js.Builder({ - xmldec: { version: '1.0', encoding: 'UTF-8' }, - }); - - packageManifest._manifestXml = builder.buildObject(manifest); - - return packageManifest; - } - - /** - * - * @returns true or false, for whether there are profiles - */ - public isProfilesInPackage(): boolean { - let isProfilesFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'Profile') { - isProfilesFound = true; - break; - } - } - } else if (this.manifestJson.Package.types.name === 'Profile') { - isProfilesFound = true; - } - } - - return isProfilesFound; - } - - /** - * - * @returns true or false, for whether there are profiles - */ - public isPermissionSetsInPackage(): boolean { - let isPermissionSetFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'PermissionSet') { - isPermissionSetFound = true; - break; - } - } - } else if (this.manifestJson.Package.types.name === 'PermissionSet') { - isPermissionSetFound = true; - } - } - - return isPermissionSetFound; - } - - public isPermissionSetGroupsFoundInPackage(): boolean { - let isPermissionSetGroupFound = false; - if (Array.isArray(this._manifestJson?.Package?.types)) { - for (let type of this._manifestJson.Package.types) { - if (type.name === 'PermissionSetGroup') { - isPermissionSetGroupFound = true; - break; - } - } - } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') { - isPermissionSetGroupFound = true; - } - return isPermissionSetGroupFound; - } - - /** - * - * @returns true or false, for whether there are Apex classes and/or triggers - */ - public isApexInPackage(): boolean { - let isApexFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'ApexClass' || type.name === 'ApexTrigger') { - isApexFound = true; - break; - } - } - } else if ( - this._manifestJson.Package.types.name === 'ApexClass' || - this._manifestJson.Package.types.name === 'ApexTrigger' - ) { - isApexFound = true; - } - } - - return isApexFound; - } - - /** - * - * @returns Apex triggers if there are any, otherwise returns undefined - */ - public fetchTriggers(): ApexClasses { - let triggers: string[]; - - let types; - if (this._manifestJson.Package.types) { - if (this._manifestJson.Package.types instanceof Array) { - types = this._manifestJson.Package.types; - } else { - // Create array with single type - types = [this._manifestJson.Package.types]; - } - } - - if (types) { - for (const type of types) { - if (type.name === 'ApexTrigger') { - if (type.members instanceof Array) { - triggers = type.members; - } else { - // Create array with single member - triggers = [type.members]; - } - break; - } - } - } - - return triggers; - } - - public isPayloadContainTypesOtherThan(providedType: string): boolean { - let anyOtherType = false; - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name !== providedType) { - anyOtherType = true; - break; - } - } - } else if (this._manifestJson.Package.types.name !== providedType) { - anyOtherType = true; - } - } - return anyOtherType; - } - - public isPayLoadContainTypesSupportedByProfiles(): boolean { - const profileSupportedMetadataTypes = [ - 'ApexClass', - 'CustomApplication', - 'CustomObject', - 'CustomField', - 'Layout', - 'ApexPage', - 'CustomTab', - 'RecordType', - 'SystemPermissions', - ]; - - let containsProfileSupportedType = false; - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (profileSupportedMetadataTypes.includes(type.name)) { - containsProfileSupportedType = true; - break; - } - } - } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) { - containsProfileSupportedType = true; - } - } - return containsProfileSupportedType; - } -} diff --git a/packages/core/src/package/components/PackageToComponent.ts b/packages/core/src/package/components/PackageToComponent.ts deleted file mode 100644 index 7f6a6eef1..000000000 --- a/packages/core/src/package/components/PackageToComponent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import Component from '../../dependency/Component'; - - -export default class PackageToComponent { - public constructor(private packageName:string,private packageDirectory:string) {} - - public generateComponents() { - const components: Component[] = []; - - let componentSet = ComponentSet.fromSource(this.packageDirectory); - - let componentSetArray = componentSet.getSourceComponents().toArray(); - - for (const individualComponentFromComponentSet of componentSetArray) { - const component: Component = { - id: undefined, - fullName: individualComponentFromComponentSet.fullName, - type: individualComponentFromComponentSet.type.name, - files: [individualComponentFromComponentSet.xml], - package: this.packageName, - }; - components.push(component); - } - - return components; - } -} diff --git a/packages/core/src/package/components/ReconcileProfileAgainstOrgImpl.ts b/packages/core/src/package/components/ReconcileProfileAgainstOrgImpl.ts deleted file mode 100644 index 1d9736118..000000000 --- a/packages/core/src/package/components/ReconcileProfileAgainstOrgImpl.ts +++ /dev/null @@ -1,53 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; -const Table = require('cli-table'); -import ProfileReconcile from '@dxatscale/sfprofiles/lib/impl/source/profileReconcile'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import { METADATA_INFO } from '../../metadata/MetadataInfo'; - -export default class ReconcileProfileAgainstOrgImpl { - public constructor(private sfpOrg:SFPOrg, private project_directory: string, private logger: Logger) {} - - public async exec() { - - let result=[]; - try { - let profileReconciler = new ProfileReconcile(this.sfpOrg); - let reconcileProfiles = await profileReconciler.reconcile( - [ this.project_directory], - [], - undefined - ); - - // Return an object to be displayed with --json - - reconcileProfiles.forEach((file) => { - result.push({ - state: 'Cleaned', - fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), - type: 'Profile', - path: path.relative(this.project_directory, file), - }); - }); - } catch (err) { - SFPLogger.log(err, LoggerLevel.ERROR); - - SFPLogger.log( - 'An error occured during profile reconcile. You can rerun the command after a moment.', - LoggerLevel.ERROR - ); - } - const table = new Table({ - head: ['State', 'Full Name', 'Type', 'Path'], - chars: ZERO_BORDER_TABLE, - }); - for (let res of result) { - table.push([res.state, res.fullName, res.type, res.path]); - } - SFPLogger.log(table.toString(), LoggerLevel.INFO); - return result; - } - - -} diff --git a/packages/core/src/package/coverage/PackageTestCoverage.ts b/packages/core/src/package/coverage/PackageTestCoverage.ts deleted file mode 100644 index b88d79cd6..000000000 --- a/packages/core/src/package/coverage/PackageTestCoverage.ts +++ /dev/null @@ -1,273 +0,0 @@ -import SFPLogger, { COLOR_WARNING, Logger } from '@dxatscale/sfp-logger'; -import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import ApexClassFetcher from '../../apex/ApexClassFetcher'; -import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher'; -import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher'; - -export default class PackageTestCoverage { - private individualClassCoverage: IndividualClassCoverage; - private packageTestCoverage: number = -1; // Set inital value - - public constructor( - private pkg: SfpPackage, - private codeCoverage: any, - private logger: Logger, - private readonly conn: Connection - ) { - this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger); - } - - public async getCurrentPackageTestCoverage(): Promise { - let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; - let triggers: string[] = this.pkg.triggers; - - let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers( - this.codeCoverage, - packageClasses, - triggers - ); - - let totalLines: number = 0; - let totalCovered: number = 0; - for (let classCoverage of filteredCodeCoverage) { - if (classCoverage.coveredPercent !== null) { - totalLines += classCoverage.totalLines; - totalCovered += classCoverage.totalCovered; - } - } - - let listOfApexClassOrTriggerId: string[] = []; - - let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage); - if (classesNotTouchedByTestClass.length > 0) { - let apexClassIds = ( - await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass) - ).map((apexClass) => apexClass.Id); - listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds); - } - - let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage); - if (triggersNotTouchedByTestClass.length > 0) { - let triggerIds = ( - await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass) - ).map((trigger) => trigger.Id); - listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds); - } - - if (listOfApexClassOrTriggerId.length > 0) { - let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher( - this.conn - ).fetchACCAById(listOfApexClassOrTriggerId); - - if (recordsOfApexCodeCoverageAggregate.length > 0) { - let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes - recordsOfApexCodeCoverageAggregate.forEach((record) => { - numLinesUncovered += record.NumLinesUncovered; - }); - totalLines += numLinesUncovered; - } - } - - let testCoverage = Math.floor((totalCovered / totalLines) * 100); - this.packageTestCoverage = testCoverage; - return testCoverage; - } - - public async validateTestCoverage( - coverageThreshold?: number - ): Promise<{ - result: boolean; - message?: string; - packageTestCoverage: number; - classesCovered?: { name: string; coveredPercent: number }[]; - classesWithInvalidCoverage?: { name: string; coveredPercent: number }[]; - }> { - if (this.packageTestCoverage == -1) - //No Value available - await this.getCurrentPackageTestCoverage(); - - let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage); - - if (coverageThreshold == undefined || coverageThreshold < 75) { - SFPLogger.log('Setting minimum coverage percentage to 75%.'); - coverageThreshold = 75; - } - - - - if (this.pkg.packageType === PackageType.Unlocked) { - if (this.packageTestCoverage < coverageThreshold) { - // Coverage inadequate, set result to false - return { - result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - message: `${COLOR_WARNING( - `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%` - )}`, - }; - } else { - return { - result: true, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - message: `Package overall coverage is greater than ${coverageThreshold}%`, - }; - } - } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) { - SFPLogger.log("Package type is Source. Validating individual class coverage"); - - let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage( - this.getIndividualClassCoverageByPackage(this.codeCoverage), - coverageThreshold - ); - - if (individualClassValidationResults.result) { - return { - result: true, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, - message: `Individidual coverage of classes is greater than ${coverageThreshold}%`, - }; - } else { - return { - result: false, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, - message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`, - }; - } - } else { - throw new Error('Unhandled package type'); - } - } - - private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] { - let individualClassCoverage: { - name: string; - coveredPercent: number; - }[] = []; - - let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; - let triggers: string[] = this.pkg.triggers; - - codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers( - codeCoverageReport, - packageClasses, - triggers - ); - - for (let classCoverage of codeCoverageReport) { - if (classCoverage['coveredPercent'] !== null) { - individualClassCoverage.push({ - name: classCoverage['name'], - coveredPercent: classCoverage['coveredPercent'], - }); - } - } - - let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass( - packageClasses, - codeCoverageReport - ); - - if (namesOfClassesWithoutTest.length > 0) { - let classesWithoutTest: { - name: string; - coveredPercent: number; - }[] = namesOfClassesWithoutTest.map((className) => { - return { name: className, coveredPercent: 0 }; - }); - individualClassCoverage = individualClassCoverage.concat(classesWithoutTest); - } - - // Check for triggers with no test class - let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport); - - if (namesOfTriggersWithoutTest.length > 0) { - let triggersWithoutTest: { - name: string; - coveredPercent: number; - }[] = namesOfTriggersWithoutTest.map((triggerName) => { - return { name: triggerName, coveredPercent: 0 }; - }); - individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest); - } - - return individualClassCoverage; - } - - /** - * Returns names of triggers in the package that are not triggered by the execution of any test classes - * Returns empty array if triggers is null or undefined - * @param triggers - * @param codeCoverageReport - * @returns - */ - private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] { - if (triggers != null) { - return triggers.filter((trigger) => { - for (let classCoverage of codeCoverageReport) { - if (classCoverage['name'] === trigger) { - // Filter out triggers if accounted for in coverage json - return false; - } - } - return true; - }); - } else return []; - } - - /** - * Returns name of classes in the package that are not touched by the execution of any test classes - * Returns empty array if packageClasses is null or undefined - * @param packageClasses - * @param codeCoverageReport - * @returns - */ - private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] { - if (packageClasses != null) { - return packageClasses.filter((packageClass) => { - for (let classCoverage of codeCoverageReport) { - if (classCoverage['name'] === packageClass) { - // Filter out package class if accounted for in coverage json - return false; - } - } - return true; - }); - } else return []; - } - - /** - * Filter code coverage to classes and triggers in the package - * @param codeCoverage - * @param packageClasses - * @param triggers - */ - private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) { - let filteredCodeCoverage = codeCoverage.filter((classCoverage) => { - if (packageClasses != null) { - for (let packageClass of packageClasses) { - if (packageClass === classCoverage['name']) return true; - } - } - - if (triggers != null) { - for (let trigger of triggers) { - if (trigger === classCoverage['name']) { - return true; - } - } - } - - return false; - }); - - return filteredCodeCoverage; - } -} diff --git a/packages/core/src/package/coverage/PackageVersionCoverage.ts b/packages/core/src/package/coverage/PackageVersionCoverage.ts deleted file mode 100644 index 590863d2c..000000000 --- a/packages/core/src/package/coverage/PackageVersionCoverage.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Connection } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import Package2VersionFetcher from '../version/Package2VersionFetcher'; - -export default class PackageVersionCoverage { - public constructor(private connection: Connection, private logger: Logger) {} - - public async getCoverage(versionId: string): Promise { - const package2VersionFetcher = new Package2VersionFetcher(this.connection); - const package2Version = await package2VersionFetcher.fetchBySubscriberPackageVersionId(versionId); - SFPLogger.log(`Fetched Record ${JSON.stringify(package2Version)}`, LoggerLevel.TRACE, this.logger); - if (package2Version) { - var packageCoverage = {}; - packageCoverage.HasPassedCodeCoverageCheck = package2Version.HasPassedCodeCoverageCheck; - packageCoverage.coverage = package2Version.CodeCoverage ? package2Version.CodeCoverage.apexCodeCoveragePercentage : 0; - packageCoverage.packageId = package2Version.Package2Id; - packageCoverage.packageName = package2Version.Package2.Name; - packageCoverage.packageVersionId = package2Version.SubscriberPackageVersionId; - packageCoverage.packageVersionNumber = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; - - SFPLogger.log( - `Successfully Retrieved the Apex Test Coverage of the package version`, - LoggerLevel.INFO, - this.logger - ); - } else { - throw new Error(`Package version doesnot exist, Please check the version details`); - } - return packageCoverage; - } -} -interface PackageCoverage { - coverage: number; - packageName: string; - packageId: string; - packageVersionNumber: string; - packageVersionId: string; - HasPassedCodeCoverageCheck: boolean; -} diff --git a/packages/core/src/package/dependencies/ExternalPackage2DependencyResolver.ts b/packages/core/src/package/dependencies/ExternalPackage2DependencyResolver.ts deleted file mode 100644 index a91dc95e0..000000000 --- a/packages/core/src/package/dependencies/ExternalPackage2DependencyResolver.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Connection } from '@salesforce/core'; -import PackageDependencyResolver from './PackageDependencyResolver'; -import _ from 'lodash'; -import Package2VersionFetcher from '../version/Package2VersionFetcher'; -import Package2Detail from '../Package2Detail'; - -/** - * Resolves external package dependency versions to their subscriber version - */ -export default class ExternalPackage2DependencyResolver { - //TOOD: Finalize Keys - constructor(private conn: Connection, private projectConfig, private keys) {} - - public async resolveExternalPackage2DependenciesToVersions( - packagesToBeResolved?: string[], - packagesToBeSkipped?: string[], - isDependencyValidated?: boolean - ): Promise { - if (isDependencyValidated == undefined) isDependencyValidated = true; - //Do a dependency resolution first only for external dependencies - //Resolve .LATEST to exact version numbers - let revisedProjectConfig = await new PackageDependencyResolver( - this.conn, - this.projectConfig, - packagesToBeSkipped, - null, - isDependencyValidated - ).resolvePackageDependencyVersions(); - - let packageVersions: Package2Detail[] = []; - let packageVersionFetcher = new Package2VersionFetcher(this.conn); - - let packagesToKeys: { [p: string]: string }; - if (this.keys) { - packagesToKeys = this.parseKeys(this.keys); - } - - //Resolve provided version Number to SubscriberVersionId - for (const sfdxPackage of revisedProjectConfig.packageDirectories) { - - if(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package)) - continue; - - if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) { - for (let i = 0; i < sfdxPackage.dependencies.length; i++) { - let dependency = sfdxPackage.dependencies[i]; - - if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) - { - let dependendentPackage: Package2Detail = { name: dependency.package }; - packageVersions.push(dependendentPackage); - continue; - } - - if (!packageVersions.find((elem) => elem.name == dependency.package)) { - let dependendentPackage: Package2Detail = { name: dependency.package }; - if (dependency.versionNumber) { - dependendentPackage.versionNumber = dependency.versionNumber; - let packageVersion = await packageVersionFetcher.fetchByPackage2Id( - revisedProjectConfig.packageAliases[dependendentPackage.name], - dependendentPackage.versionNumber, - true - ); - dependendentPackage.subscriberPackageVersionId = - packageVersion[0].SubscriberPackageVersionId; - } else { - dependendentPackage.subscriberPackageVersionId = - revisedProjectConfig.packageAliases[dependendentPackage.name]; - } - if (packagesToKeys?.[dependendentPackage.name]) { - dependendentPackage.key = packagesToKeys[dependency.package]; - } - packageVersions.push(dependendentPackage); - } - } - } - } - return packageVersions; - } - - /** - * Parse keys in string format "packageA:key packageB:key packageC:key" - * Returns map of packages to keys - * @param keys - */ - private parseKeys(keys: string) { - let output: { [p: string]: string } = {}; - - keys = keys.trim(); - let listOfKeys = keys.split(' '); - - for (let key of listOfKeys) { - let packageKeyPair = key.split(':'); - if (packageKeyPair.length === 2) { - output[packageKeyPair[0]] = packageKeyPair[1]; - } else { - // Format is incorrect, throw an error - throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); - } - } - return output; - } -} diff --git a/packages/core/src/package/dependencies/PackageDependencyResolver.ts b/packages/core/src/package/dependencies/PackageDependencyResolver.ts deleted file mode 100644 index b72db34a9..000000000 --- a/packages/core/src/package/dependencies/PackageDependencyResolver.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { Connection } from '@salesforce/core'; -import lodash = require('lodash'); -import Git from '../../git/Git'; -import GitTags from '../../git/GitTags'; -import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; - - -/** - * Resolves package dependency versions to their exact versions - */ -export default class PackageDependencyResolver { - private package2VersionCache: Package2VersionCache = new Package2VersionCache(); - - constructor( - private conn: Connection, - private projectConfig, - private packagesToBeSkipped?: string[], - private packagesToBeResolved?: string[], - private resolveExternalDepenciesOnly?: boolean - ) { - // prevent mutation of original config - this.projectConfig = lodash.cloneDeep(this.projectConfig); - } - - /** - * Resolves package dependency versions in project config - * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped) - * @returns new project config JSON, does not change original JSON - */ - public async resolvePackageDependencyVersions() { - for (const packageDirectory of this.projectConfig.packageDirectories) { - if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) { - throw Error(`Unsupported path.. Use only one of the options at any given time`); - } - - if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) { - continue; - } - - if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) { - continue; - } - if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) { - for (let i = 0; i < packageDirectory.dependencies.length; i++) { - let dependency = packageDirectory.dependencies[i]; - if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) { - - throw new Error(`Can't find package id for dependency: ` + dependency.package); - } - - let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package] - - if (this.isSubscriberPackageVersionId(packageVersionId)) { - // Already resolved - continue; - } - - if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) { - // Dependency is part of the same build, will be resolved when new version is created - continue; - } - let package2VersionForDependency: any = ''; - if ( dependency.branch && dependency.branch !== '' ) { - SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO); - package2VersionForDependency = await this.getPackage2VersionForDependency( - this.conn, - dependency, - packageVersionId, - dependency.branch - ); - SFPLogger.log(`Fetched latest branched package of ${dependency.package},` - +`version: ${package2VersionForDependency.MajorVersion}.` - +`${package2VersionForDependency.MinorVersion}.` - +`${package2VersionForDependency.PatchVersion}.` - +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO); - - let branchedPackageAlias = `${dependency.package}@` - +`${package2VersionForDependency.MajorVersion}.` - +`${package2VersionForDependency.MinorVersion}.` - +`${package2VersionForDependency.PatchVersion}.` - +`${package2VersionForDependency.BuildNumber}-` - +`${dependency.branch}`; - dependency.package = branchedPackageAlias; - this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId; - delete dependency.versionNumber; - delete dependency.branch; - continue; - - }else { - package2VersionForDependency = await this.getPackage2VersionForDependency( - this.conn, - dependency, - packageVersionId - ); - } - - - if (package2VersionForDependency == null) { - packageDirectory.dependencies.splice(i, 1); - i--; - } else - dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`; - } - } - } - return this.projectConfig; - } - - /** - * Get last validated Package2 version for package dependency - * @param conn - * @param dependency - * @returns Package2Version - */ - private async getPackage2VersionForDependency( - conn: Connection, - dependency: { package: string; versionNumber: string }, - packageVersionId: string, - branch?: string, - ): Promise { - - //Dont hit api's if its only for external dependencies - if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) { - if (this.resolveExternalDepenciesOnly) return null; - } - - let package2Version: Package2Version; - - let versionNumber: string = dependency.versionNumber; - let vers: string[] = versionNumber.split('.'); - if (vers.length === 4 && vers[3] === 'LATEST') { - versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`; - } - - let package2Versions: Package2Version[]; - if (this.package2VersionCache.has(packageVersionId, versionNumber)) { - package2Versions = this.package2VersionCache.get( - packageVersionId, - versionNumber - ); - } else { - const package2VersionFetcher = new Package2VersionFetcher(conn); - let records; - if( branch ){ - records = await package2VersionFetcher.fetchByPackageBranchAndName( - branch, - dependency.package, - versionNumber - ); - }else{ - records = await package2VersionFetcher.fetchByPackage2Id( - packageVersionId, - versionNumber, - true - ); - } - - this.package2VersionCache.set( - packageVersionId, - versionNumber, - records - ); - package2Versions = this.package2VersionCache.get( - packageVersionId, - versionNumber - ); - } - - if (package2Versions.length === 0) { - throw new Error( - `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}` - ); - } - - if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) { - package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency); - } else { - // Take last validated package for external packages - package2Version = package2Versions[0]; - } - return package2Version; - } - - /** - * Get Package2 version created from the current branch - * @param package2Versions - * @param dependency - * @returns Package2Version - */ - private async getPackage2VersionFromCurrentBranch( - package2Versions: Package2Version[], - dependency: { package: string; versionNumber: string } - ) { - let package2VersionOnCurrentBranch: Package2Version; - - const git = await Git.initiateRepo(); - const gitTags = new GitTags(git, dependency.package); - const tags = await gitTags.listTagsOnBranch(); - - for (const package2Version of package2Versions) { - const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; - for (const tag of tags) { - if (tag.endsWith(version)) { - package2VersionOnCurrentBranch = package2Version; - break; - } - } - if (package2VersionOnCurrentBranch) break; - } - - if (!package2VersionOnCurrentBranch) { - throw new Error( - `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch` - ); - } - - return package2VersionOnCurrentBranch; - } - - private isSubscriberPackageVersionId(packageAlias: string): boolean { - const subscriberPackageVersionIdPrefix = '04t'; - return packageAlias.startsWith(subscriberPackageVersionIdPrefix); - } -} - -class Package2VersionCache { - private cache: { [p: string]: Package2Version[] } = {}; - - /** - * Checks whether cache contains key for package ID and version number - * @param packageId - * @param versionNumberstartw - * @returns true or false - */ - has(packageId: string, versionNumber: string): boolean { - const key = `${packageId}-${versionNumber}`; - if (this.cache[key]) return true; - else return false; - } - - /** - * Set the cache value, Package2 versions, for package ID and version number - * @param packageId - * @param versionNumber - * @param package2Versions - * @returns cache - */ - set( - packageId: string, - versionNumber: string, - package2Versions: Package2Version[] - ): { [p: string]: Package2Version[] } { - const key = `${packageId}-${versionNumber}`; - this.cache[key] = package2Versions; - return this.cache; - } - - /** - * - * @param packageId - * @param versionNumber - * @returns Package2 versions for package ID and version number - */ - get(packageId: string, versionNumber: string): Package2Version[] { - const key = `${packageId}-${versionNumber}`; - return this.cache[key]; - } -} diff --git a/packages/core/src/package/dependencies/TransitiveDependencyResolver.ts b/packages/core/src/package/dependencies/TransitiveDependencyResolver.ts deleted file mode 100644 index 23c5bd01c..000000000 --- a/packages/core/src/package/dependencies/TransitiveDependencyResolver.ts +++ /dev/null @@ -1,109 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@dxatscale/sfp-logger'; -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; -import _, { uniq } from 'lodash'; -import semver = require('semver'); -import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter'; -import { Connection } from '@salesforce/core'; -import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency'; - -export default class TransitiveDependencyResolver { - constructor(private sfdxProjectConfig: any, private logger?: Logger) {} - - public async resolveTransitiveDependencies(): Promise> { - SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger); - - let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig); - clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig); - let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig); - pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap( - pkgWithDependencies, - new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig) - ); - pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies); - - return pkgWithDependencies; - } - - private fillDepsWithUserDefinedExternalDependencyMap( - pkgWithDependencies: Map, - externalDependencyMap: any - ): Map { - if (externalDependencyMap) { - for (let pkg of Object.keys(externalDependencyMap)) { - pkgWithDependencies.set(pkg, externalDependencyMap[pkg]); - } - } - return pkgWithDependencies; - } - - private fillDepsTransitively( - dependencyMap: Map - ): Map { - let pkgs = Array.from(dependencyMap.keys()); - for (let pkg of pkgs) { - SFPLogger.log( - COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), - LoggerLevel.TRACE, - this.logger - ); - let dependenencies: { package: string; versionNumber?: string }[] = []; - for (let dependency of dependencyMap.get(pkg)) { - if (dependencyMap.get(dependency.package)) { - //push parents first - dependenencies = dependenencies.concat(dependencyMap.get(dependency.package)); - SFPLogger.log( - `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${ - dependency.package - }`, - LoggerLevel.TRACE, - this.logger - ); - } - //push itself - dependenencies.push(dependency); - } - //deduplicate dependency list - let uniqueDependencies = [ - ...new Set(dependenencies.map((objects) => JSON.stringify(objects))), - ].map((tmpString) => JSON.parse(tmpString)); - for (let j = 0; j < uniqueDependencies.length; j++) { - if (uniqueDependencies[j].versionNumber) { - let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber); - - for (let i = j + 1; i < uniqueDependencies.length; i++) { - if (uniqueDependencies[j].package == uniqueDependencies[i].package) { - let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber); - // replace existing packageInfo if package version number is newer - if (semver.lt(version, versionToCompare)) { - uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i); - - } else { - uniqueDependencies.splice(i, 1); - i--; - } - } - } - } - //do a dedup again - uniqueDependencies = [ - ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))), - ].map((tmpString) => JSON.parse(tmpString)); - } - dependencyMap.set(pkg, uniqueDependencies); - } - return dependencyMap; - } - - private swapAndDropArrayElement(arr: T[], i: number, j: number): T[] { - if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) { - return arr; - } - - let newArr = [...arr]; - [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; - return [...newArr.slice(0, j), ...newArr.slice(j + 1)]; - } - - -} diff --git a/packages/core/src/package/deploymentCustomizers/DeploymentCustomizer.ts b/packages/core/src/package/deploymentCustomizers/DeploymentCustomizer.ts deleted file mode 100644 index 5425d01e8..000000000 --- a/packages/core/src/package/deploymentCustomizers/DeploymentCustomizer.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Logger } from "@dxatscale/sfp-logger"; -import { Connection } from "@salesforce/core"; -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; -import SfpPackage from "../SfpPackage"; -import SFPOrg from "../../org/SFPOrg"; -import { DeploySourceResult } from "../../deployers/DeploymentExecutor"; - -export interface DeploymentContext -{ - apiVersion: string; - waitTime: string; -} - -export interface DeploymentCustomizer -{ - gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet:ComponentSet, conn: Connection, logger: Logger):Promise<{location:string, componentSet:ComponentSet}>; - isEnabled(sfpPackage:SfpPackage, conn:Connection,logger:Logger):Promise; - getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - getName():string - execute(sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg:SFPOrg, - logger: Logger, - deploymentContext:DeploymentContext - ):Promise -} \ No newline at end of file diff --git a/packages/core/src/package/deploymentCustomizers/FHTEnabler.ts b/packages/core/src/package/deploymentCustomizers/FHTEnabler.ts deleted file mode 100644 index f365decb9..000000000 --- a/packages/core/src/package/deploymentCustomizers/FHTEnabler.ts +++ /dev/null @@ -1,121 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SfpPackage from '../SfpPackage'; -import { Connection } from '@salesforce/core'; - -import { Schema } from 'jsforce'; -import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import { TestLevel } from '../../apextest/TestOptions'; -import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; - -const QUERY_BODY = - 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFieldHistoryTracked = true AND EntityDefinitionId IN '; - -export default class FHTEnabler extends MetdataDeploymentCustomizer { - - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg) return false; - - if ( - sfpPackage['isFHTFieldFound'] && - (sfpPackage.packageDescriptor.enableFHT == undefined || sfpPackage.packageDescriptor.enableFHT == true) - ) { - return true; - } - } - - - - public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - { - return { - ignoreWarnings:true, - waitTime:waitTime, - apiVersion:apiVersion, - testLevel : TestLevel.RunSpecifiedTests, - specifiedTests :'skip', - rollBackOnError:true - } - } - - public async gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - //First retrieve all objects/fields of interest from the package - let objList = []; - let fieldList = []; - Object.keys(sfpPackage['fhtFields']).forEach((key) => { - objList.push(`'${key}'`); - sfpPackage['fhtFields'][key].forEach((field) => fieldList.push(key + '.' + field)); - }); - //Now query all the fields for this object where FHT is already enabled - SFPLogger.log( - `Gathering fields which are already enabled with trackHistory on target org....`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log('FHT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) - let fhtFieldsInOrg = await QueryHelper.query<{ - QualifiedApiName: string; - EntityDefinition: any; - IsFieldHistoryTracked: boolean; - }>(QUERY_BODY + '(' + objList + ')', conn, true); - - //Clear of the fields that alread has FHT applied and keep a reduced filter - fhtFieldsInOrg.map((record) => { - let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; - const index = fieldList.indexOf(field); - if (index > -1) { - fieldList.splice(index, 1); - } - }); - - if (fieldList.length > 0) { - //Now retrieve the fields from the org - let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); - let sfpOrg = await SFPOrg.create({ connection: conn }); - let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); - - - - //Modify the component set - //Parsing is risky due to various encoding, so do an inplace replacement - for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { - let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); - - metadataOfComponent = metadataOfComponent.replace( - 'false', - 'true' - ); - - - - fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); - } - - return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; - } else SFPLogger.log(`No fields are required to be updated, skipping update of Field History Tracking`, LoggerLevel.INFO, logger); - } - - public getName(): string { - return 'Field History Tracking Enabler'; - } -} - -interface CustomField { - QualifiedApiName: string; - IsFieldHistoryTracked: boolean; - EntityDefinitionId: string; -} diff --git a/packages/core/src/package/deploymentCustomizers/FTEnabler.ts b/packages/core/src/package/deploymentCustomizers/FTEnabler.ts deleted file mode 100644 index f97f6169a..000000000 --- a/packages/core/src/package/deploymentCustomizers/FTEnabler.ts +++ /dev/null @@ -1,107 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SfpPackage from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import { Schema } from 'jsforce'; -import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import { TestLevel } from '../../apextest/TestOptions'; -import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; - -const QUERY_BODY = - 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFeedEnabled = true AND EntityDefinitionId IN '; - -export default class FTEnabler extends MetdataDeploymentCustomizer { - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg) return false; - - if ( - sfpPackage['isFTFieldFound'] && - (sfpPackage.packageDescriptor.enableFT == undefined || sfpPackage.packageDescriptor.enableFT == true) - ) { - return true; - } - } - - public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - { - return { - ignoreWarnings:true, - waitTime:waitTime, - apiVersion:apiVersion, - testLevel : TestLevel.RunSpecifiedTests, - specifiedTests :'skip', - rollBackOnError:true - } - } - - public async gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - //First retrieve all objects/fields of interest from the package - let objList = []; - let fieldList = []; - Object.keys(sfpPackage['ftFields']).forEach((key) => { - objList.push(`'${key}'`); - sfpPackage['ftFields'][key].forEach((field) => fieldList.push(key + '.' + field)); - }); - //Now query all the fields for this object where FT is already enabled - SFPLogger.log( - `Gathering fields which are already enabled with feed traking in the target org....`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log('FT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) - let ftFieldsInOrg = await QueryHelper.query<{ - QualifiedApiName: string; - EntityDefinition: any; - IsFeedEnabled: boolean; - }>(QUERY_BODY + '(' + objList + ')', conn, true); - - //Clear of the fields that alread has FT applied and keep a reduced filter - ftFieldsInOrg.map((record) => { - let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; - const index = fieldList.indexOf(field); - if (index > -1) { - fieldList.splice(index, 1); - } - }); - - if (fieldList.length > 0) { - //Now retrieve the fields from the org - let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); - let sfpOrg = await SFPOrg.create({ connection: conn }); - let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); - - //Modify the component set - //Parsing is risky due to various encoding, so do an inplace replacement - for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { - let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); - - metadataOfComponent = metadataOfComponent.replace( - 'false', - 'true' - ); - - fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); - } - - return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; - } else SFPLogger.log(`No fields are required to be updated,skipping updates to Feed History tracking`, LoggerLevel.INFO, logger); - } - - public getName(): string { - return 'Feed Tracking Enabler'; - } -} diff --git a/packages/core/src/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts b/packages/core/src/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts deleted file mode 100644 index 04dc9533c..000000000 --- a/packages/core/src/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Connection } from "@salesforce/core"; -import DeploySourceToOrgImpl, { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; -import SfpPackage from "../SfpPackage"; -import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; -import SFPLogger,{COLOR_KEY_MESSAGE,Logger,LoggerLevel} from "@dxatscale/sfp-logger" -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import SFPOrg from "../../org/SFPOrg"; -import DeploymentExecutor, { DeploySourceResult } from "../../deployers/DeploymentExecutor"; -import PackageComponentPrinter from "../../display/PackageComponentPrinter"; -import DeployErrorDisplayer from "../../display/DeployErrorDisplayer"; - -export abstract class MetdataDeploymentCustomizer implements DeploymentCustomizer -{ - abstract gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet: ComponentSet, conn: Connection, logger: Logger): Promise<{ location: string; componentSet: ComponentSet; }>; - abstract isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise; - abstract getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise; - abstract getName(): string; - - - async execute(sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg:SFPOrg, - logger: Logger, - deploymentContext:DeploymentContext - ):Promise - { - if (await this.isEnabled(sfpPackage, sfpOrg.getConnection(), logger)) { - SFPLogger.log( - `Executing Post Deployer ${COLOR_KEY_MESSAGE(this.getName())}`, - LoggerLevel.INFO, - logger - ); - let modifiedPackage = await this.gatherComponentsToBeDeployed( - sfpPackage, - componentSet, - sfpOrg.getConnection(), - logger - ); - - //Check if there are components to be deployed - //Asssume its sucessfully deployed - if (!modifiedPackage || modifiedPackage.componentSet.getSourceComponents().toArray().length == 0) { - return { - deploy_id: `000000`, - result: true, - message: `No deployment required`, - }; - } - - - //deploy the fht enabled components to the org - let deploymentOptions = await this.getDeploymentOptions( - sfpOrg.getUsername(), - deploymentContext.waitTime, - deploymentContext.apiVersion - ); - - //Print components inside Component Set - let components = modifiedPackage.componentSet.getSourceComponents(); - PackageComponentPrinter.printComponentTable(components, logger); - - let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( - sfpOrg, - modifiedPackage.location, - modifiedPackage.componentSet, - deploymentOptions, - logger - ); - - let result = await deploySourceToOrgImpl.exec(); - if (!result.result) { - DeployErrorDisplayer.displayErrors(result.response, logger); - } - return result; - } else { - SFPLogger.log( - `Post Deployer ${COLOR_KEY_MESSAGE(this.getName())} skipped or not enabled`, - LoggerLevel.INFO, - logger - ); - } - } -} \ No newline at end of file diff --git a/packages/core/src/package/deploymentCustomizers/PicklistEnabler.ts b/packages/core/src/package/deploymentCustomizers/PicklistEnabler.ts deleted file mode 100644 index e2aebca93..000000000 --- a/packages/core/src/package/deploymentCustomizers/PicklistEnabler.ts +++ /dev/null @@ -1,218 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import { DeploymentContext, DeploymentCustomizer } from './DeploymentCustomizer'; -import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; -import SFPOrg from '../../org/SFPOrg'; -import { Schema } from 'jsforce'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; - -const QUERY_BODY = 'SELECT Id FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '; - -export default class PicklistEnabler implements DeploymentCustomizer { - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - if (sfpPackage.packageType === PackageType.Unlocked) { - if ( - sfpPackage.isPickListsFound && - (sfpPackage.packageDescriptor.enablePicklist == undefined || - sfpPackage.packageDescriptor.enablePicklist == true) - ) { - return true; - } - } else return false; - } - - async execute( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg: SFPOrg, - logger: Logger, - deploymentContext: DeploymentContext - ): Promise { - try { - let sourceComponents = componentSet.getSourceComponents().toArray(); - let components = []; - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name == registry.types.customobject.name) { - components.push(...sourceComponent.getChildren()); - } - - if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { - components.push(sourceComponent); - } - } - - if (components) { - for (const fieldComponent of components) { - let customField = fieldComponent.parseXmlSync().CustomField; - //check for empty picklists - if ( - !customField || - customField['type'] !== 'Picklist' || - !customField.valueSet?.valueSetDefinition - ) { - continue; - } - //no updates for custom metadata picklists - if (customField['fieldManageability']) continue; - - let objName = fieldComponent.parent.fullName; - let picklistName = fieldComponent.name; - let urlId = - QUERY_BODY + "'" + objName + "'" + ' AND QualifiedApiName = ' + "'" + picklistName + "'"; - - let picklistValueSource = await this.getPicklistSource(customField); - - SFPLogger.log( - `Fetching picklist for custom field ${picklistName} on object ${objName}`, - LoggerLevel.INFO, - logger - ); - - let picklistInOrg = await this.getPicklistInOrg(urlId, sfpOrg.getConnection()); - - //check for empty picklists on org and fix first deployment issue - if (!picklistInOrg?.Metadata?.valueSet?.valueSetDefinition) { - SFPLogger.log( - `Picklist field ${objName}.${picklistName} not in target Org. Skipping`, - LoggerLevel.TRACE, - logger - ); - continue; - } - - - let picklistValueInOrg = []; - - for (const value of picklistInOrg.Metadata.valueSet.valueSetDefinition.value) { - //ignore inactive values from org - if (value.isActive == false) { - continue; - } - - let valueInfo: { [key: string]: string } = {}; - valueInfo.fullName = value['valueName']; - decodeURIComponent(valueInfo.fullName); - valueInfo.label = value['label']; - decodeURIComponent(valueInfo.label); - valueInfo.default = value['default'] && value['default'] === true ? 'true' : 'false'; - picklistValueInOrg.push(valueInfo); - } - - let isPickListIdentical = this.arePicklistsIdentical(picklistValueInOrg, picklistValueSource); - - if (!isPickListIdentical) { - this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger); - } else { - SFPLogger.log( - `Picklist for custom field ${objName}.${picklistName} is identical to the source.No deployment`, - LoggerLevel.INFO, - logger - ); - } - } - - return { - deploy_id: `000000`, - result: true, - message: `Patched Picklists`, - }; - } - } catch (error) { - SFPLogger.log(`Unable to process Picklist update due to ${error.message}`, LoggerLevel.WARN, logger); - SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); - } - } - - private async getPicklistInOrg(urlId: string, conn: Connection): Promise { - let response = await QueryHelper.query(urlId, conn, true); - - if (response && Array.isArray(response) && response.length > 0 && response[0].attributes) { - let responseUrl = response[0].attributes.url; - let fieldId = responseUrl.slice(responseUrl.lastIndexOf('.') + 1); - let responsePicklist = await conn.tooling.sobject('CustomField').find({ Id: fieldId }); - - if (responsePicklist) { - return responsePicklist[0]; - } - } - } - - gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - throw new Error('Method not implemented.'); - } - getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise { - throw new Error('Method not implemented.'); - } - - private async getPicklistSource(customField: any): Promise { - let picklistValueSet = []; - let values = customField.valueSet?.valueSetDefinition?.value; - //only push values when picklist > 1 or exactly 1 value - if (Array.isArray(values)) { - for (const value of values) { - //ignore inactive values from source - if(!value?.isActive || value?.isActive == 'true'){ - picklistValueSet.push({fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'] , default: value.default, label: value['label'] ? decodeURI(value['label']) : value['label']}); - } - } - } else if (typeof values === 'object' && 'fullName' in values) { - //ignore inactive values from source - if(!values?.isActive || values?.isActive == 'true'){ - picklistValueSet.push({fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'] , default: values.default, label: values['label'] ? decodeURI(values['label']) : values['label']}); - } - } - return picklistValueSet; - } - - private arePicklistsIdentical(picklistValueInOrg: any[], picklistValueSource: any[]): boolean { - return ( - picklistValueInOrg.length === picklistValueSource.length && - picklistValueInOrg.every((element_1) => - picklistValueSource.some( - (element_2) => - element_1.fullName === element_2.fullName && - element_1.label === element_2.label && - element_1.default === element_2.default - ) - ) - ); - } - - private async deployPicklist(picklistInOrg: any, picklistValueSource: any, conn: Connection, logger: Logger) { - //empty the the old value set - picklistInOrg.Metadata.valueSet.valueSetDefinition.value = []; - picklistValueSource.map((value) => { - picklistInOrg.Metadata.valueSet.valueSetDefinition.value.push(value); - }); - picklistInOrg.Metadata.valueSet.valueSettings = []; - - let picklistToDeploy: any; - picklistToDeploy = { - attributes: picklistInOrg.attributes, - Id: picklistInOrg.Id, - Metadata: picklistInOrg.Metadata, - FullName: picklistInOrg.FullName, - }; - SFPLogger.log(`Update picklist for custom field ${picklistToDeploy.FullName}`, LoggerLevel.INFO, logger); - try { - await conn.tooling.sobject('CustomField').update(picklistToDeploy); - } catch (error) { - throw new Error( - `Unable to update picklist for custom field ${picklistToDeploy.FullName} due to ${error.message}` - ); - } - } - - public getName(): string { - return 'Picklist Enabler'; - } -} diff --git a/packages/core/src/package/deploymentCustomizers/PostDeployersRegistry.ts b/packages/core/src/package/deploymentCustomizers/PostDeployersRegistry.ts deleted file mode 100644 index d2ac675f6..000000000 --- a/packages/core/src/package/deploymentCustomizers/PostDeployersRegistry.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DeploymentCustomizer } from './DeploymentCustomizer'; -import FHTEnabler from './FHTEnabler'; -import FTEnabler from './FTEnabler'; - - -export class PostDeployersRegistry { - static getPostDeployers(): DeploymentCustomizer[] { - let postDeployers: DeploymentCustomizer[] = []; - - //TODO: Make dynamic - let fhtEnabler = new FHTEnabler(); - let ftEnabler = new FTEnabler(); - postDeployers.push(fhtEnabler); - postDeployers.push(ftEnabler); - - return postDeployers; - } -} diff --git a/packages/core/src/package/deploymentCustomizers/PreDeployersRegistry.ts b/packages/core/src/package/deploymentCustomizers/PreDeployersRegistry.ts deleted file mode 100644 index 2e423cbc9..000000000 --- a/packages/core/src/package/deploymentCustomizers/PreDeployersRegistry.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DeploymentCustomizer } from './DeploymentCustomizer'; -import PicklistEnabler from './PicklistEnabler'; - - -export class PreDeployersRegistry { - static getPreDeployers(): DeploymentCustomizer[] { - let preDeployers: DeploymentCustomizer[] = []; - - let picklistEnabler = new PicklistEnabler(); - preDeployers.push(picklistEnabler); - - return preDeployers; - } -} diff --git a/packages/core/src/package/deploymentFilters/DeploymentFilter.ts b/packages/core/src/package/deploymentFilters/DeploymentFilter.ts deleted file mode 100644 index 3f42ac693..000000000 --- a/packages/core/src/package/deploymentFilters/DeploymentFilter.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import { Logger } from "@dxatscale/sfp-logger"; -import SFPOrg from "../../org/SFPOrg"; -import { PackageType } from "../SfpPackage"; - -export interface DeploymentFilter -{ - apply(org: SFPOrg, componentSet: ComponentSet,logger:Logger):Promise; - isToApply(projectConfig: any,packageType:string): boolean; - -} - - diff --git a/packages/core/src/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/core/src/package/deploymentFilters/DeploymentFilterRegistry.ts deleted file mode 100644 index 4e5721e2f..000000000 --- a/packages/core/src/package/deploymentFilters/DeploymentFilterRegistry.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DeploymentFilter } from './DeploymentFilter'; -import EntitlementVersionFilter from './EntitlementVersionFilter'; - - - - -export class DeploymentFilterRegistry { - static getImplementations(): DeploymentFilter[] { - let deploymentFilterImpls: DeploymentFilter[] = []; - - //TODO: Make dynamic - let entitlementVersionFilter = new EntitlementVersionFilter(); - deploymentFilterImpls.push(entitlementVersionFilter); - - - return deploymentFilterImpls; - } -} diff --git a/packages/core/src/package/deploymentFilters/EntitlementVersionFilter.ts b/packages/core/src/package/deploymentFilters/EntitlementVersionFilter.ts deleted file mode 100644 index dac20fefa..000000000 --- a/packages/core/src/package/deploymentFilters/EntitlementVersionFilter.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SFPOrg from '../../org/SFPOrg'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { DeploymentFilter } from './DeploymentFilter'; -import * as fs from 'fs-extra'; -import SettingsFetcher from '../../metadata/SettingsFetcher'; -import { PackageType } from '../SfpPackage'; -const { XMLBuilder } = require('fast-xml-parser'); - -const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`; -const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`; - -export default class EntitlementVersionFilter implements DeploymentFilter { - - public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { - //Only do if entitlment exits in the package - let sourceComponents = componentSet.getSourceComponents().toArray(); - let isEntitlementFound: boolean = false; - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.entitlementprocess.name) { - isEntitlementFound = true; - break; - } - } - if (!isEntitlementFound) return componentSet; - - try { - let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`); - - let query; - if (entitlementSettings.enableEntitlementVersioning == true) { - SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger); - query = EXISTING_SLAPPROCESS_QUERY; - } else { - SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger); - query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING; - } - - SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger); - //Fetch Entitlements currently in the org - let slaProcessesInOrg = await QueryHelper.query(query, org.getConnection(), false); - let modifiedComponentSet = new ComponentSet(); - //Compare version numbers in the org vs version in the component set - //Remove if the version numbers match - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.entitlementprocess.name) { - let slaProcessLocal = sourceComponent.parseXmlSync(); - - let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find( - (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name'] - ); - - if ( - slaProcessMatchedByName && - entitlementSettings.enableEntitlementVersioning && - slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber - ) { - //This is a deployment candidate - //Modify versionMaster tag to match in the org - slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster; - let builder = new XMLBuilder({ - format: true, - ignoreAttributes: false, - attributeNamePrefix: '@_', - }); - let xmlContent = builder.build(slaProcessLocal); - fs.writeFileSync(sourceComponent.xml, xmlContent); - modifiedComponentSet.add(sourceComponent); - } else if (slaProcessMatchedByName) { - SFPLogger.log( - `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`, - LoggerLevel.INFO, - logger - ); - } else { - //Doesnt exist, deploy - modifiedComponentSet.add(sourceComponent); - } - } else { - modifiedComponentSet.add(sourceComponent); - } - } - - SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger); - return modifiedComponentSet; - } catch (error) { - SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger); - return componentSet; - } - } - - public isToApply(projectConfig: any, packageType: string): boolean { - if (packageType != PackageType.Source) return false; - - if (projectConfig?.plugins?.sfpowerscripts?.disableEntitlementFilter) return false; - else return true; - } - - - - -} - -interface SlaProcess { - Name: string; - NameNorm: string; - VersionNumber: string; - VersionMaster: string; -} diff --git a/packages/core/src/package/diff/PackageComponentDiff.ts b/packages/core/src/package/diff/PackageComponentDiff.ts deleted file mode 100644 index a41bb16c8..000000000 --- a/packages/core/src/package/diff/PackageComponentDiff.ts +++ /dev/null @@ -1,424 +0,0 @@ -import * as xml2js from 'xml2js'; -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as rimraf from 'rimraf'; -import * as _ from 'lodash'; -import simplegit from 'simple-git'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import ProjectConfig from '../../project/ProjectConfig'; -import MetadataFiles from '../../metadata/MetadataFiles'; -import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo'; -import { MetadataResolver } from '@salesforce/source-deploy-retrieve'; -import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil'; - -const deleteNotSupported = ['RecordType']; -const git = simplegit(); -let sfdxManifest; - -export default class PackageComponentDiff { - private gitDiffUtils: GitDiffUtils; - - destructivePackageObjPre: any[]; - destructivePackageObjPost: any[]; - resultOutput: { - action: string; - metadataType: string; - componentName: string; - message: string; - path: string; - }[]; - public constructor( - private logger: Logger, - private sfdxPackage: string, - private revisionFrom?: string, - private revisionTo?: string, - private isDestructive?: boolean - ) { - if (this.revisionTo == null || this.revisionTo.trim() === '') { - this.revisionTo = 'HEAD'; - } - if (this.revisionFrom == null) { - this.revisionFrom = ''; - } - this.destructivePackageObjPost = []; - this.destructivePackageObjPre = []; - this.resultOutput = []; - - sfdxManifest = ProjectConfig.getSFDXProjectConfig(null); - this.gitDiffUtils = new GitDiffUtils(); - } - - public async build(outputFolder: string) { - rimraf.sync(outputFolder); - - const sepRegex = /\n|\r/; - let data = ''; - - //check if same commit - const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]); - const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]); - if (commitFrom === commitTo) { - throw new Error(`Unable to compute diff, as both commits are same`); - } - //Make it relative to make the command works from a project created as a subfolder in a repository - data = await git.diff([ - '--raw', - this.revisionFrom, - this.revisionTo, - '--relative', - ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path, - ]); - - let content = data.split(sepRegex); - let diffFile: DiffFile = await this.parseContent(content); - await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger); - - let filesToCopy = diffFile.addedEdited; - let deletedFiles = diffFile.deleted; - - deletedFiles = deletedFiles.filter((deleted) => { - let found = false; - let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path); - for (let i = 0; i < filesToCopy.length; i++) { - let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path); - if (deletedMetadata === addedOrEdited) { - found = true; - break; - } - } - return !found; - }); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - - const resolver = new MetadataResolver(); - - if (filesToCopy && filesToCopy.length > 0) { - for (let i = 0; i < filesToCopy.length; i++) { - - try { - let filePath = filesToCopy[i].path; - - let sourceComponents = resolver.getComponentsFromPath(filePath); - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - if(path.extname(sourceComponent.content)) - await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); - else - await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) { - await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); - } else { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - } - } - } catch (error) { - - if(error.message.includes(`Unable to find the required file`)) - throw error; - - //Metadata resolver is not respecting forceignores at this stage - // So it fails on diff packages with post deploy, so lets ignore and move on - SFPLogger.log( - `Error while inferencing type of ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`, - LoggerLevel.TRACE, - this.logger - ); - } - } - } - - if (this.isDestructive) { - SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger); - await this.createDestructiveChanges(deletedFiles, outputFolder); - } - - //Folder is empty after all this operations, return without copying additional files - if (fs.readdirSync(outputFolder).length === 0) { - rimraf.sync(outputFolder); - return null; - } - - SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger); - - return this.resultOutput; - } - - //TODO: Refactor using proper ignore - private checkForIngore(pathToIgnore: any[], filePath: string) { - pathToIgnore = pathToIgnore || []; - if (pathToIgnore.length === 0) { - return true; - } - - let returnVal = true; - pathToIgnore.forEach((ignore) => { - if ( - path.resolve(ignore) === path.resolve(filePath) || - path.resolve(filePath).includes(path.resolve(ignore)) - ) { - returnVal = false; - } - }); - return returnVal; - } - - private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) { - if (_.isNil(this.destructivePackageObjPost)) { - this.destructivePackageObjPost = []; - } else { - this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => { - return !_.isNil(metaType.members) && metaType.members.length > 0; - }); - } - this.destructivePackageObjPre = []; - //returns root, dir, base and name - for (let i = 0; i < filePaths.length; i++) { - let filePath = filePaths[i].path; - try { - let matcher = filePath.match(SOURCE_EXTENSION_REGEX); - let extension = ''; - if (matcher) { - extension = matcher[0]; - } else { - extension = path.parse(filePath).ext; - } - - let name = MetadataInfo.getMetadataName(filePath); - - if (name) { - if (!MetadataFiles.isCustomMetadata(filePath, name)) { - // avoid to generate destructive for Standard Components - //Support on Custom Fields and Custom Objects for now - - this.resultOutput.push({ - action: 'Skip', - componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name), - metadataType: 'StandardField/CustomMetadata', - message: '', - path: '--', - }); - - continue; - } - let member = MetadataFiles.getMemberNameFromFilepath(filePath, name); - if (name === METADATA_INFO.CustomField.xmlName) { - let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], ''); - if (isFormular) { - this.destructivePackageObjPre = this.buildDestructiveTypeObj( - this.destructivePackageObjPre, - name, - member - ); - - SFPLogger.log( - `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, - LoggerLevel.DEBUG, - this.logger - ); - - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'Manual Intervention Required', - }); - } else { - this.destructivePackageObjPost = this.buildDestructiveTypeObj( - this.destructivePackageObjPost, - name, - member - ); - } - SFPLogger.log( - `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, - LoggerLevel.DEBUG, - this.logger - ); - - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'destructiveChanges.xml', - }); - } else { - if (!deleteNotSupported.includes(name)) { - this.destructivePackageObjPost = this.buildDestructiveTypeObj( - this.destructivePackageObjPost, - name, - member - ); - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'destructiveChanges.xml', - }); - } else { - //add the component in the manual action list - // TODO - } - } - } - } catch (ex) { - this.resultOutput.push({ - action: 'ERROR', - componentName: '', - metadataType: '', - message: ex.message, - path: filePath, - }); - } - } - - this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml'); - } - - private writeDestructivechanges(destrucObj: Array, outputFolder: string, fileName: string) { - //ensure unique component per type - for (let i = 0; i < destrucObj.length; i++) { - destrucObj[i].members = _.uniq(destrucObj[i].members); - } - destrucObj = destrucObj.filter((metaType) => { - return metaType.members && metaType.members.length > 0; - }); - - if (destrucObj.length > 0) { - let dest = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: destrucObj, - }, - }; - - let destructivePackageName = fileName; - let filepath = path.join(outputFolder, destructivePackageName); - let builder = new xml2js.Builder(); - let xml = builder.buildObject(dest); - fs.writeFileSync(filepath, xml); - } - } - - private buildDestructiveTypeObj(destructiveObj, name, member) { - let typeIsPresent = false; - for (let i = 0; i < destructiveObj.length; i++) { - if (destructiveObj[i].name === name) { - typeIsPresent = true; - destructiveObj[i].members.push(member); - break; - } - } - let typeNode: any; - if (typeIsPresent === false) { - typeNode = { - name: name, - members: [member], - }; - destructiveObj.push(typeNode); - } - return destructiveObj; - } - - private async parseContent(fileContents): Promise { - const statusRegEx = /\sA\t|\sM\t|\sD\t/; - const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/; - const tabRegEx = /\t/; - const deletedFileRegEx = new RegExp(/\sD\t/); - const lineBreakRegEx = /\r?\n|\r|( $)/; - - let metadataFiles = new MetadataFiles(); - - let diffFile: DiffFile = { - deleted: [], - addedEdited: [], - }; - - for (let i = 0; i < fileContents.length; i++) { - if (statusRegEx.test(fileContents[i])) { - let lineParts = fileContents[i].split(statusRegEx); - - let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, '')); - finalPath = finalPath.trim(); - finalPath = finalPath.replace('\\303\\251', 'é'); - - if (!(await metadataFiles.isInModuleFolder(finalPath))) { - continue; - } - - if (!metadataFiles.accepts(finalPath)) { - continue; - } - - let revisionPart = lineParts[0].split(/\t|\s/); - - if (deletedFileRegEx.test(fileContents[i])) { - //Deleted - diffFile.deleted.push({ - revisionFrom: revisionPart[2].substring(0, 9), - revisionTo: revisionPart[3].substring(0, 9), - path: finalPath, - }); - } else { - // Added or edited - diffFile.addedEdited.push({ - revisionFrom: revisionPart[2].substring(0, 9), - revisionTo: revisionPart[3].substring(0, 9), - path: finalPath, - }); - } - } else if (renamedRegEx.test(fileContents[i])) { - let lineParts = fileContents[i].split(renamedRegEx); - - let paths = lineParts[1].trim().split(tabRegEx); - - let finalPath = path.join('.', paths[1].trim()); - finalPath = finalPath.replace('\\303\\251', 'é'); - let revisionPart = lineParts[0].split(/\t|\s/); - - if (!(await metadataFiles.isInModuleFolder(finalPath))) { - continue; - } - - if (!metadataFiles.accepts(paths[0].trim())) { - continue; - } - - diffFile.addedEdited.push({ - revisionFrom: '0000000', - revisionTo: revisionPart[3], - renamedPath: path.join('.', paths[0].trim()), - path: finalPath, - }); - - //allow deletion of renamed components - diffFile.deleted.push({ - revisionFrom: revisionPart[2], - revisionTo: '0000000', - path: paths[0].trim(), - }); - } - } - return diffFile; - } -} -enum AdapterId { - Bundle = 'bundle', - Decomposed = 'decomposed', - Default = 'default', - MatchingContentFile = 'matchingContentFile', - MixedContent = 'mixedContent', -} diff --git a/packages/core/src/package/diff/PackageDiffImpl.ts b/packages/core/src/package/diff/PackageDiffImpl.ts deleted file mode 100644 index 356d9f3f8..000000000 --- a/packages/core/src/package/diff/PackageDiffImpl.ts +++ /dev/null @@ -1,166 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -import Git from '../../git/Git'; -import IgnoreFiles from '../../ignore/IgnoreFiles'; -import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import ProjectConfig from '../../project/ProjectConfig'; -import GitTags from '../../git/GitTags'; -import lodash = require('lodash'); -import { EOL } from 'os'; -import { PackageType } from '../SfpPackage'; - -export class PackageDiffOptions { - skipPackageDescriptorChange?: boolean = false; - //If not set, utlize latest git tags - useLatestGitTags?:boolean=true; - packagesMappedToLastKnownCommitId?: { [p: string]: string }; - pathToReplacementForceIgnore?: string; -} - -export default class PackageDiffImpl { - public constructor( - private logger: Logger, - private sfdx_package: string, - private project_directory: string|null, - private diffOptions?: PackageDiffOptions - ) {} - - public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> { - let git: Git = await Git.initiateRepo(this.logger,this.project_directory); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory); - let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`, - ), - LoggerLevel.TRACE, - this.logger - ); - - let tag: string; - if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) { - tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId); - } else { - tag = await this.getLatestTagFromGit(git, this.sfdx_package); - } - - if (tag) { - SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger); - - // Get the list of modified files between the tag and HEAD refs - let modified_files: string[]; - try { - modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); - } catch (error) { - SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`)); - SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`)); - SFPLogger.log(COLOR_ERROR(`Actual error received:`)); - SFPLogger.log(COLOR_ERROR(error)); - throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`) - } - - let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package); - - if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files); - - SFPLogger.log( - `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`, - LoggerLevel.TRACE, - this.logger - ); - - // Check whether the package has been modified - for (let filename of modified_files) { - - let normalizedPkgPath = path.normalize(pkgDescriptor.path); - let normalizedFilename = path.normalize(filename); - - let relativePath = path.relative(normalizedPkgPath, normalizedFilename); - - if (!relativePath.startsWith('..')) { - SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger); - return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag }; - } - } - - SFPLogger.log( - `Checking for changes to package descriptor in sfdx-project.json`, - LoggerLevel.TRACE, - this.logger - ); - let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor); - if (isPackageDescriptorChanged) { - return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag }; - } - - return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; - } else { - SFPLogger.log( - `Tag missing for ${this.sfdx_package}...marking package for build anyways`, - LoggerLevel.TRACE, - this.logger - ); - return { isToBeBuilt: true, reason: `Previous version not found` }; - } - } - - private applyForceIgnoreToModifiedFiles(modified_files: string[]) { - let forceignorePath: string; - if (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore; - else if (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore'); - else forceignorePath = '.forceignore'; - - let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString()); - - // Filter the list of modified files with .forceignore - modified_files = ignoreFiles.filter(modified_files); - - return modified_files; - } - - private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise { - const gitTags: GitTags = new GitTags(git, sfdx_package); - let tags: string[] = await gitTags.listTagsOnBranch(); - - SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG); - if (tags.length > 10) { - SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); - } else { - SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); - } - - return tags.pop(); - } - - private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise { - let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]); - let projectConfig = JSON.parse(projectConfigJson); - - let packageDescriptorFromLatestTag: string; - for (let dir of projectConfig['packageDirectories']) { - if (this.sfdx_package === dir.package) { - packageDescriptorFromLatestTag = dir; - } - } - - if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) { - SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger); - - //skip check and ignore - if (this.diffOptions?.skipPackageDescriptorChange) { - SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger); - return false; - } else return true; - } else return false; - } - - private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string { - if (packagesToCommits[sfdx_package] != null) { - return packagesToCommits[sfdx_package]; - } else { - return null; - } - } -} diff --git a/packages/core/src/package/generators/SfpPackageContentGenerator.ts b/packages/core/src/package/generators/SfpPackageContentGenerator.ts deleted file mode 100644 index ab4875b31..000000000 --- a/packages/core/src/package/generators/SfpPackageContentGenerator.ts +++ /dev/null @@ -1,301 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import * as rimraf from 'rimraf'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { mkdirpSync } from 'fs-extra'; -import * as fs from 'fs-extra'; -import PackageComponentDiff from '../diff/PackageComponentDiff'; -let path = require('path'); - -export default class SfpPackageContentGenerator { - public static isPreDeploymentScriptAvailable: boolean = false; - public static isPostDeploymentScriptAvailable: boolean = false; - - public static async generateSfpPackageDirectory( - logger: Logger, - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - packageDirectory: string, - versionNumber:string, - destructiveManifestFilePath?: string, - configFilePath?: string, - pathToReplacementForceIgnore?: string, - revisionFrom?: string, - revisionTo?: string - ): Promise { - let artifactDirectory: string = `.sfpowerscripts/${this.makefolderid(5)}_source`, - rootDirectory: string; - - if (projectDirectory) { - rootDirectory = projectDirectory; - } else { - rootDirectory = ''; - } - - if (packageDirectory == null) packageDirectory = ''; - - mkdirpSync(artifactDirectory); - - //Ensure the directory is clean - rimraf.sync(path.join(artifactDirectory, packageDirectory)); - - //Create a new directory - fs.mkdirsSync(path.join(artifactDirectory, packageDirectory)); - - SfpPackageContentGenerator.createScripts(artifactDirectory, rootDirectory, sfdx_package); - - SfpPackageContentGenerator.createForceIgnores(artifactDirectory, rootDirectory); - - - if (pathToReplacementForceIgnore) - SfpPackageContentGenerator.replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger); - - if (destructiveManifestFilePath) { - SfpPackageContentGenerator.copyDestructiveManifests( - destructiveManifestFilePath, - artifactDirectory, - rootDirectory, - logger - ); - } - - if (configFilePath) { - SfpPackageContentGenerator.copyConfigFilePath(configFilePath, artifactDirectory, rootDirectory, logger); - } - - SfpPackageContentGenerator.handleUnpackagedMetadata( - sfdx_package, - projectConfig, - rootDirectory, - artifactDirectory - ); - - SfpPackageContentGenerator.createPackageManifests( - artifactDirectory, - rootDirectory, - projectConfig, - sfdx_package, - versionNumber - ); - - fs.copySync(path.join(rootDirectory, packageDirectory), path.join(artifactDirectory, packageDirectory)); - - return artifactDirectory; - } - - private static handleUnpackagedMetadata( - sfdx_package: string, - projectConfig: any, - rootDirectory: string, - artifactDirectory: string - ) { - const packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdx_package, projectConfig); - if (packageDescriptor.unpackagedMetadata?.path) { - if (fs.pathExistsSync(packageDescriptor.unpackagedMetadata.path)) { - let unpackagedMetadataDir: string = path.join(artifactDirectory, `unpackagedMetadata`); - mkdirpSync(unpackagedMetadataDir); - fs.copySync(path.join(rootDirectory, packageDescriptor.unpackagedMetadata.path), unpackagedMetadataDir); - } else { - throw new Error(`unpackagedMetadata ${packageDescriptor.unpackagedMetadata.path} does not exist`); - } - } - } - - private static createPackageManifests( - artifactDirectory: string, - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - versionNumber:string - ) { - // Create pruned package manifest in source directory - let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdx_package); - - //Ensure version numbers are used from - cleanedUpProjectManifest.packageDirectories[0].versionNumber=versionNumber - - //Handle unpackaged metadata - if (fs.existsSync(path.join(artifactDirectory, 'unpackagedMetadata'))) { - cleanedUpProjectManifest.packageDirectories[0].unpackagedMetadata.path = path.join('unpackagedMetadata'); - cleanedUpProjectManifest.packageDirectories.push({ path: path.join('unpackagedMetadata'), default: false }); - } - - //Setup preDeployment Script Path - if (fs.existsSync(path.join(artifactDirectory, 'scripts', `preDeployment`))) - cleanedUpProjectManifest.packageDirectories[0].preDeploymentScript = path.join('scripts', `preDeployment`); - - //Setup postDeployment Script Path - if (fs.existsSync(path.join(artifactDirectory, 'scripts', `postDeployment`))) - cleanedUpProjectManifest.packageDirectories[0].postDeploymentScript = path.join( - 'scripts', - `postDeployment` - ); - - fs.writeFileSync(path.join(artifactDirectory, 'sfdx-project.json'), JSON.stringify(cleanedUpProjectManifest)); - - // Copy original package manifest - let manifestsDir: string = path.join(artifactDirectory, `manifests`); - mkdirpSync(manifestsDir); - fs.copySync(path.join(projectDirectory, 'sfdx-project.json'), path.join(manifestsDir, 'sfdx-project.json.ori')); - } - - /** - * Create scripts directory containing preDeploy & postDeploy - * @param artifactDirectory - * @param projectDirectory - * @param sfdx_package - */ - private static createScripts(artifactDirectory: string, projectDirectory: string, sfdx_package): void { - let scriptsDir: string = path.join(artifactDirectory, `scripts`); - mkdirpSync(scriptsDir); - - let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(projectDirectory, sfdx_package); - - if (packageDescriptor.preDeploymentScript) { - if (projectDirectory) - packageDescriptor.preDeploymentScript = path.join( - projectDirectory, - packageDescriptor.preDeploymentScript - ); - - if (fs.existsSync(packageDescriptor.preDeploymentScript)) { - fs.copySync(packageDescriptor.preDeploymentScript, path.join(scriptsDir, `preDeployment`)); - } else { - throw new Error(`preDeploymentScript ${packageDescriptor.preDeploymentScript} does not exist`); - } - } - - if (packageDescriptor.postDeploymentScript) { - if (projectDirectory) - packageDescriptor.postDeploymentScript = path.join( - projectDirectory, - packageDescriptor.postDeploymentScript - ); - - if (fs.existsSync(packageDescriptor.postDeploymentScript)) { - fs.copySync(packageDescriptor.postDeploymentScript, path.join(scriptsDir, `postDeployment`)); - } else { - throw new Error(`postDeploymentScript ${packageDescriptor.postDeploymentScript} does not exist`); - } - } - } - - /** - * Create root forceignore and forceignores directory containing ignore files for different stages - * @param artifactDirectory - * @param projectDirectory - */ - private static createForceIgnores(artifactDirectory: string, projectDirectory: string): void { - let forceIgnoresDir: string = path.join(artifactDirectory, `forceignores`); - mkdirpSync(forceIgnoresDir); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let ignoreFiles = projectConfig.plugins?.sfpowerscripts?.ignoreFiles; - - //TODO: Make this readable - //This is a fix when sfppackage is used in stages where build is not involved - //So it has to be build from the root of the unzipped directory - //and whatever mentioned in .json is already translated - - let rootForceIgnore: string = path.join(projectDirectory, '.forceignore'); - let copyForceIgnoreForStage = (stage) => { - if (ignoreFiles?.[stage]) { - if (fs.existsSync(path.join(projectDirectory, ignoreFiles[stage]))) { - fs.copySync( - path.join(projectDirectory, ignoreFiles[stage]), - path.join(forceIgnoresDir, '.' + stage + 'ignore') - ); - } else if (fs.existsSync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'))) { - fs.copySync( - path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'), - path.join(forceIgnoresDir, '.' + stage + 'ignore') - ); - } else throw new Error(`${ignoreFiles[stage]} does not exist`); - } else fs.copySync(rootForceIgnore, path.join(forceIgnoresDir, '.' + stage + 'ignore')); - - //append additional entry to force ignore file - //TODO: Revisit the location - fs.appendFileSync( path.join(forceIgnoresDir, '.' + stage + 'ignore'),"\n**/postDeploy"); - }; - - let stages: string[] = ['prepare', 'validate', 'quickbuild', 'build']; - stages.forEach((stage) => copyForceIgnoreForStage(stage)); - - fs.copySync(rootForceIgnore, path.join(artifactDirectory, '.forceignore')); - } - - /** - * Replaces root forceignore with provided forceignore - * @param artifactDirectory - * @param pathToReplacementForceIgnore - */ - private static replaceRootForceIgnore( - artifactDirectory: string, - pathToReplacementForceIgnore: string, - logger: Logger - ): void { - if (fs.existsSync(pathToReplacementForceIgnore)) { - fs.copySync(pathToReplacementForceIgnore, path.join(artifactDirectory, '.forceignore')); - } else { - SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, logger); - SFPLogger.log( - 'Package creation will continue using the unchanged forceignore in the root directory', - LoggerLevel.INFO, - logger - ); - } - } - - private static copyDestructiveManifests( - destructiveManifestFilePath: string, - artifactDirectory: string, - projectDirectory: any, - logger: Logger - ) { - if (fs.existsSync(destructiveManifestFilePath)) { - try { - fs.mkdirsSync(path.join(artifactDirectory, 'destructive')); - fs.copySync( - path.join(projectDirectory, destructiveManifestFilePath), - path.join(artifactDirectory, 'destructive', 'destructiveChanges.xml') - ); - } catch (error) { - SFPLogger.log( - 'Unable to read/parse destructive manifest, Please check your artifacts, Will result in an error while deploying', - LoggerLevel.WARN, - logger - ); - } - } - } - - private static copyConfigFilePath( - configFilePath: string, - artifactDirectory: string, - projectDirectory: any, - logger: Logger - ) { - if (fs.existsSync(configFilePath)) { - try { - fs.mkdirsSync(path.join(artifactDirectory, 'config')); - fs.copySync( - path.join(projectDirectory, configFilePath), - path.join(artifactDirectory, 'config', 'project-scratch-def.json') - ); - } catch (error) { - SFPLogger.log(error, LoggerLevel.TRACE, logger); - SFPLogger.log('Utilizing default config file path', LoggerLevel.TRACE, logger); - } - } - } - - private static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/core/src/package/packageCreators/CreateDataPackageImpl.ts b/packages/core/src/package/packageCreators/CreateDataPackageImpl.ts deleted file mode 100644 index 24998370d..000000000 --- a/packages/core/src/package/packageCreators/CreateDataPackageImpl.ts +++ /dev/null @@ -1,86 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; -import path from 'path'; -import FileSystem from '../../utils/FileSystem'; -import { CreatePackage } from './CreatePackage'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; - -const SFDMU_CONFIG = 'export.json'; -const VLOCITY_CONFIG = 'VlocityComponents.yaml'; - -export default class CreateDataPackageImpl extends CreatePackage { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Data; - } - - isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean { - let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory)); - - let hasExportJson = files.find((file) => path.basename(file) === 'export.json'); - - let hasCsvFile = files.find((file) => path.extname(file) === '.csv'); - - let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config - - if(hasYAMLFile) return false; - - if (!hasExportJson || !hasCsvFile) return true; - else return false; - } - - preCreatePackage(sfpPackage) { - this.validateDataPackage(sfpPackage.resolvedPackageDirectory); - } - - createPackage(sfpPackage: SfpPackage) { - //Do Nothing, as no external calls or processing is required - } - - postCreatePackage(sfpPackage: SfpPackage) {} - - printAdditionalPackageSpecificHeaders() {} - - // Validate type of data package and existence of the correct configuration files - private validateDataPackage(packageDirectory: string) { - const files = FileSystem.readdirRecursive(packageDirectory); - let isSfdmu: boolean; - let isVlocity: boolean; - - for (const file of files) { - if (path.basename(file) === SFDMU_CONFIG) isSfdmu = true; - if (path.basename(file) === VLOCITY_CONFIG) isVlocity = true; - } - - if (isSfdmu && isVlocity) { - throw new Error( - `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration` - ); - } else if (isSfdmu) { - SFPLogger.log( - `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, - LoggerLevel.INFO, - this.logger - ); - } else if (isVlocity) { - SFPLogger.log( - `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, - LoggerLevel.INFO, - this.logger - ); - } else { - throw new Error( - `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfpowerscripts only support vlocity or sfdmu based data packages` - ); - } - } -} diff --git a/packages/core/src/package/packageCreators/CreateDiffPackageImpl.ts b/packages/core/src/package/packageCreators/CreateDiffPackageImpl.ts deleted file mode 100644 index a0bacd531..000000000 --- a/packages/core/src/package/packageCreators/CreateDiffPackageImpl.ts +++ /dev/null @@ -1,271 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; -import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import SFPOrg from '../../org/SFPOrg'; -import CreateSourcePackageImpl from './CreateSourcePackageImpl'; -import PackageToComponent from '../components/PackageToComponent'; -import path from 'path'; -import * as fs from 'fs-extra'; -import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher'; -import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor'; -import PackageManifest from '../components/PackageManifest'; -import MetadataCount from '../components/MetadataCount'; -import * as rimraf from 'rimraf'; -import Component from '../../dependency/Component'; -import PackageComponentDiff from '../diff/PackageComponentDiff'; - -export default class CreateDiffPackageImp extends CreateSourcePackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Diff; - } - - printAdditionalPackageSpecificHeaders() {} - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - async preCreatePackage(sfpPackage: SfpPackage) { - const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); - - //Fetch Baseline commit from DevHub - let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg); - - if (this.packageCreationParams.revisionFrom) { - this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom; - } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) { - this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]; - } else { - this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion; - } - - if (this.packageCreationParams.revisionTo) { - this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo; - } else { - this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion; - } - } - - private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) { - let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts(); - let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts); - return packagesInstalledInOrgMappedToCommits; - } - - public async createPackage(sfpPackage: SfpPackage) { - //Unresolved SHAs can be same if the package is not installed in the org or is the same - if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) { - try { - let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff( - this.logger, - this.sfpPackage.packageName, - this.sfpPackage.commitSHAFrom, - this.sfpPackage.commitSHATo, - true - ); - await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff')); - } catch (error) { - //if both are same after git resolution.. just do nothing, treat is a normal source package - if (error.message.includes('Unable to compute diff, as both commits are same')) { - SFPLogger.log( - `Both commits are same, treating it as an empty package`, - LoggerLevel.WARN, - this.logger - ); - //Create an empty diff directory to force skip of packages - const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`); - fs.mkdirpSync(diffSrcDir); - } else throw error; - } - - await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger); - - await this.replaceSourceWithDiff( - sfpPackage.workingDirectory, - sfpPackage.packageDirectory, - `diff/${sfpPackage.packageDirectory}` - ); - - SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { - package: sfpPackage.packageName, - type: sfpPackage.packageType, - }); - } - } - - postCreatePackage(sfpPackage) {} - - private async replaceSourceWithDiff( - workingDirectory: string, - packageDirectory: string, - diffPackageDirectory: string - ) { - const srcDir = path.join(workingDirectory, packageDirectory); - const diffSrcDir = path.join(workingDirectory, diffPackageDirectory); - - // Check if src directories exist, if so remove them - if (fs.pathExistsSync(srcDir)) await fs.remove(srcDir); - - // Rename diff/src directory to src - if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir); - else { - // Ensure package directory exists - await fs.mkdirpSync(diffSrcDir); - await fs.move(diffSrcDir, srcDir); - } - - //check if destructiveChanges.xml exist in diff directory - const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml'); - if (fs.existsSync(destructiveChangesPath)) { - //Move destructiveChanges.xml to diff directory - await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml')); - } - //remove diffSrcDir - if (fs.pathExistsSync(path.join(workingDirectory, 'diff'))) - fs.rmSync(path.join(workingDirectory, 'diff'), { recursive: true, force: true }); - } - - async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) { - let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; - packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts); - - return packagesMappedToLastKnownCommitId; - - async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> { - const packagesToCommits: { [p: string]: string } = {}; - let jsonOverrides = {}; - - // Add an option to override diff package from during debugging - // Also useful for when the record is yet to be baselined - try { - const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8'); - jsonOverrides = JSON.parse(jsonData); - } catch (error) { - console.log('No JSON override file found or there is an error reading it'); - } - - // Merge the installedArtifacts data with the JSON overrides - if (installedArtifacts) { - installedArtifacts.forEach((artifact) => { - packagesToCommits[artifact.Name] = artifact.CommitId__c; - }); - } - - // Add additional packages from the JSON overrides that are not in installedArtifacts - Object.keys(jsonOverrides).forEach((pkgName) => { - if (!packagesToCommits.hasOwnProperty(pkgName)) { - packagesToCommits[pkgName] = jsonOverrides[pkgName]; - } - }); - - if (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; - - return packagesToCommits; - } - } - - private async introspectDiffPackageCreated( - sfpPackage: SfpPackage, - packageParams: SfpPackageParams, - logger: Logger - ): Promise { - let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff'); - if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) { - let changedComponents = new PackageToComponent( - sfpPackage.packageName, - path.join(workingDirectory, sfpPackage.packageDirectory) - ).generateComponents(); - - let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher( - sfpPackage, - changedComponents, - logger - ); - let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses(); - - //Convert again for finding the values in the diff package - let sourceToMdapiConvertor = new SourceToMDAPIConvertor( - workingDirectory, - sfpPackage.packageDescriptor.path, - sfpPackage.apiVersion, - logger - ); - - let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath; - - const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath); - - sfpPackage.payload = packageManifest.manifestJson; - sfpPackage.apexTestClassses = impactedTestClasses; - sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage( - changedComponents, - sfpPackage.apexClassesSortedByTypes - ); - sfpPackage.isApexFound = packageManifest.isApexInPackage(); - sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); - sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); - sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); - - sfpPackage.metadataCount = await MetadataCount.getMetadataCount( - workingDirectory, - sfpPackage.packageDescriptor.path - ); - rimraf.sync(mdapiDirPath); - } else { - //Souce Diff Directory is empty - sfpPackage.payload = {}; - sfpPackage.apexTestClassses = []; - sfpPackage.apexClassWithOutTestClasses = []; - sfpPackage.isApexFound = false; - sfpPackage.isProfilesFound = false; - sfpPackage.isPermissionSetGroupFound = false; - sfpPackage.isPayLoadContainTypesSupportedByProfiles = false; - sfpPackage.metadataCount = 0; - } - - function getOnlyChangedClassesFromPackage( - changedComponents: Component[], - apexClassesSortedByTypes: ApexSortedByType - ): string[] { - // Check if the parameters are not empty or undefined - if (!changedComponents || !apexClassesSortedByTypes) { - return undefined; - } - - // Check if the 'class' property exists in apexClassesSortedByTypes - if (!apexClassesSortedByTypes.class) { - return undefined; - } - - // Get the names of all classes in the ApexSortedByType - let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name); - let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name); - const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name); - apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name)); - apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name)); - - // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass' - const filteredComponents = changedComponents.filter( - (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass' - ); - - // Extract the fullName property from the filtered components - const filteredChangedClasses = filteredComponents.map((component) => component.fullName); - - return filteredChangedClasses; - } - } -} diff --git a/packages/core/src/package/packageCreators/CreatePackage.ts b/packages/core/src/package/packageCreators/CreatePackage.ts deleted file mode 100644 index 8d9133dcd..000000000 --- a/packages/core/src/package/packageCreators/CreatePackage.ts +++ /dev/null @@ -1,146 +0,0 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; - -export abstract class CreatePackage { - private startTime: number; - - constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams?: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - //Initialize Params - if (this.params == null) this.params = {}; - } - - public async exec(): Promise { - //Capture Start TimegetSFDXProjectConfig - this.startTime = Date.now(); - - //Print Header - this.printHeader(); - - //Check if the package is empty - await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path); - //Call lifecycle commands - await this.preCreatePackage(this.sfpPackage); - await this.createPackage(this.sfpPackage); - await this.postCreatePackage(this.sfpPackage); - - //Add addtional descriptors available - this.writeDeploymentStepsToArtifact(this.sfpPackage); - - //Send Metrics to Logging system - this.sendMetricsWhenSuccessfullyCreated(); - - return this.sfpPackage; - } - - abstract getTypeOfPackage(); - - abstract preCreatePackage(sfpPackage: SfpPackage); - abstract createPackage(sfpPackage: SfpPackage); - abstract postCreatePackage(sfpPackage: SfpPackage); - - private sendMetricsWhenSuccessfullyCreated() { - let elapsedTime = Date.now() - this.startTime; - - this.sfpPackage.creation_details = { - creation_time: elapsedTime, - timestamp: Date.now(), - }; - - if (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked) - SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - }); - - SFPStatsSender.logCount('package.created', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - - SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - } - - private writeDeploymentStepsToArtifact(packageDescriptor: any) { - if (packageDescriptor.assignPermSetsPreDeployment) { - if (packageDescriptor.assignPermSetsPreDeployment instanceof Array) - this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment; - else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); - } - - if (packageDescriptor.assignPermSetsPostDeployment) { - if (packageDescriptor.assignPermSetsPostDeployment instanceof Array) - this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment; - else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); - } - } - - private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) { - if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) { - if (this.packageCreationParams.breakBuildIfEmpty) - throw new Error(`Package directory ${packageDirectory} is empty`); - else this.printEmptyArtifactWarning(); - } - } - - abstract isEmptyPackage(projectDirectory: string, packageDirectory: string); - - protected printEmptyArtifactWarning() { - SFPLogger.printHeaderLine( - `WARNING! Empty aritfact encountered`, - COLOR_WARNING, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - 'Either this folder is empty or the application of .forceignore results in an empty folder', - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger); - SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger); - } - - private printHeader() { - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create package`)}`), LoggerLevel.INFO, this.logger); - SFPLogger.log( - COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`), - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`), - LoggerLevel.INFO, - this.logger - ); - - SFPLogger.log( - COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`), - LoggerLevel.INFO, - this.logger - ); - - this.printAdditionalPackageSpecificHeaders(); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - abstract printAdditionalPackageSpecificHeaders(); -} diff --git a/packages/core/src/package/packageCreators/CreateSourcePackageImpl.ts b/packages/core/src/package/packageCreators/CreateSourcePackageImpl.ts deleted file mode 100644 index 0d9afb51a..000000000 --- a/packages/core/src/package/packageCreators/CreateSourcePackageImpl.ts +++ /dev/null @@ -1,117 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@dxatscale/sfp-logger'; -import { EOL } from 'os'; -import { ApexSortedByType, FileDescriptor } from '../../apex/parser/ApexTypeFetcher'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { CreatePackage } from './CreatePackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; -import { COLOR_INFO } from '@dxatscale/sfp-logger'; -import { COLOR_HEADER } from '@dxatscale/sfp-logger'; -import { COLOR_WARNING } from '@dxatscale/sfp-logger'; -const Table = require('cli-table'); - -export default class CreateSourcePackageImpl extends CreatePackage { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Source; - } - - printAdditionalPackageSpecificHeaders() {} - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - preCreatePackage(sfpPackage: SfpPackage) {} - - public async createPackage(sfpPackage: SfpPackage) { - this.handleApexTestClasses(sfpPackage); - - SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { - package: sfpPackage.packageName, - type: sfpPackage.packageType, - }); - } - - postCreatePackage(sfpPackage) {} - - protected handleApexTestClasses(sfpPackage: SfpPackage) { - let classTypes: ApexSortedByType = sfpPackage.apexClassesSortedByTypes; - - if (sfpPackage.isApexFound && classTypes?.testClass?.length == 0) { - this.printSlowDeploymentWarning(); - sfpPackage.isTriggerAllTests = true; - } else if (sfpPackage.isApexFound && classTypes?.testClass?.length > 0) { - if (classTypes?.parseError?.length > 0) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - SFPLogger.log( - 'Unable to parse these classes to correctly identify test classes, Its not your issue, its ours!'+ - 'Please raise a issue in our repo!', - LoggerLevel.INFO, - this.logger - ); - this.printClassesIdentified(classTypes?.parseError); - sfpPackage.isTriggerAllTests = true; - } else { - this.printHintForOptimizedDeployment(); - sfpPackage.isTriggerAllTests = false; - this.printClassesIdentified(classTypes?.testClass); - sfpPackage.apexTestClassses = []; - classTypes?.testClass.forEach((element) => { - sfpPackage.apexTestClassses.push(element.name); - }); - } - } - } - - private printHintForOptimizedDeployment() { - SFPLogger.printHeaderLine('OPTION FOR DEPLOYMENT OPTIMIZATION AVAILABLE',COLOR_HEADER,LoggerLevel.INFO,this.logger); - SFPLogger.log( - `Following apex test classes were identified and can be used for deploying this package,${EOL}` + - `in an optimal manner, provided each individual class meets the test coverage requirement of 75% and above${EOL}` + - `Ensure each apex class/trigger is validated for coverage in the validation stage`, - null, - this.logger - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - private printSlowDeploymentWarning() { - SFPLogger.printHeaderLine('WARNING! YOU MIGHT NOT BE ABLE TO DEPLOY OR WILL HAVE A SLOW DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,this.logger); - SFPLogger.log( - `This package has apex classes/triggers, however apex test classes were not found, You would not be able to deploy` + - `to production org optimally if each class do not have coverage of 75% and above,We will attempt deploying` + - `this package by triggering all local tests in the org which could be realy costly in terms of deployment time!`, - null, - this.logger - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - private printClassesIdentified(fetchedClasses: FileDescriptor[]) { - if (fetchedClasses === null || fetchedClasses === undefined) return; - - let table = new Table({ - head: ['Class', 'Error'], - chars: ZERO_BORDER_TABLE - }); - - for (let fetchedClass of fetchedClasses) { - let item = [fetchedClass.name, fetchedClass.error ? JSON.stringify(fetchedClass.error) : 'N/A']; - table.push(item); - } - SFPLogger.log('Following apex test classes were identified', LoggerLevel.INFO, this.logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); - } -} diff --git a/packages/core/src/package/packageCreators/CreateUnlockedPackageImpl.ts b/packages/core/src/package/packageCreators/CreateUnlockedPackageImpl.ts deleted file mode 100644 index c70e44967..000000000 --- a/packages/core/src/package/packageCreators/CreateUnlockedPackageImpl.ts +++ /dev/null @@ -1,262 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import * as fs from 'fs-extra'; -import { delay } from '../../utils/Delay'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { CreatePackage } from './CreatePackage'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import PackageVersionCoverage from '../coverage/PackageVersionCoverage'; -import { Connection, SfProject } from '@salesforce/core'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import { EOL } from 'os'; -import SFPOrg, { PackageTypeInfo } from '../../org/SFPOrg'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import { PackageVersion, PackageVersionCreateRequestResult } from '@salesforce/packaging'; -import { Duration } from '@salesforce/kit'; -import PackageDependencyDisplayer from '../../display/PackageDependencyDisplayer'; -const path = require('path'); - -export default class CreateUnlockedPackageImpl extends CreatePackage { - private static packageTypeInfos: PackageTypeInfo[]; - private isOrgDependentPackage: boolean = false; - private connection: Connection; - private devhubOrg: SFPOrg; - workingDirectory: string; - - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Unlocked; - } - - async preCreatePackage(sfpPackage: SfpPackage) { - this.devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); - - this.connection = this.devhubOrg.getConnection(); - - let packageId = ProjectConfig.getPackageId(sfpPackage.projectConfig, this.sfpPackage.packageName); - - // Get working directory - this.workingDirectory = sfpPackage.workingDirectory; - - //Get the one in working directory, this is always hardcoded to match - this.params.configFilePath = path.join('config', 'project-scratch-def.json'); - - //Get Type of Package - SFPLogger.log('Fetching Package Type Info from DevHub', LoggerLevel.INFO, this.logger); - let packageTypeInfos = await this.getPackageTypeInfos(); - let packageTypeInfo = packageTypeInfos.find((pkg) => pkg.Id == packageId); - if (packageTypeInfo == null) { - SFPLogger.log( - 'Unable to find a package info for this particular package, Are you sure you created this package?', - LoggerLevel.WARN, - this.logger - ); - throw new Error('Unable to fetch Package Info'); - } - - if (packageTypeInfo.IsOrgDependent == 'Yes') this.isOrgDependentPackage = true; - - SFPLogger.log(`Package ${packageTypeInfo.Name}`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`IsOrgDependent ${packageTypeInfo.IsOrgDependent}`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Package Id ${packageTypeInfo.Id}`, LoggerLevel.INFO, this.logger); - SFPLogger.log('-------------------------', LoggerLevel.INFO, this.logger); - - //cleanup sfpowerscripts constructs in working directory - this.deleteSFPowerscriptsAdditionsToProjectConfig(this.workingDirectory); - - //Resolve the package dependencies - if (this.isOrgDependentPackage) { - // Store original dependencies to artifact - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } else if (!this.isOrgDependentPackage && !this.packageCreationParams.isSkipValidation) { - sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - this.workingDirectory, - this.sfpPackage.packageName - ); - //Store the resolved dependencies - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } else { - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } - - //Print Dependencies - PackageDependencyDisplayer.printPackageDependencies(sfpPackage.dependencies,sfpPackage.projectConfig, this.logger); - - } - - async createPackage(sfpPackage: SfpPackage) { - const sfProject = await SfProject.resolve(this.workingDirectory); - - // fix for #1202 - // bug packaging lib doesnt support unpackaged metadata from working directory which is not the root - // it keeps on searching for the unpackage in the root folder - // so fix up the path manually - let targetPackageDir = sfProject.getPackageDirectories()[0]; - if (targetPackageDir['unpackagedMetadata']) - targetPackageDir['unpackagedMetadata'] = { path: path.join(this.workingDirectory, 'unpackagedMetadata') }; - - let result = await PackageVersion.create( - { - connection: this.devhubOrg.getConnection(), - project: sfProject, - installationkey: this.packageCreationParams.installationkey, - installationkeybypass: this.packageCreationParams.installationkeybypass, - tag: sfpPackage.tag, - skipvalidation: - this.packageCreationParams.isSkipValidation && !this.isOrgDependentPackage ? true : false, - codecoverage: - this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage ? true : false, - versionnumber: sfpPackage.versionNumber, - definitionfile: path.join(this.workingDirectory, this.params.configFilePath), - packageId: this.sfpPackage.packageName, - }, - { timeout: Duration.minutes(0), frequency: Duration.seconds(30) } - ); - - SFPLogger.log(`Package creation for ${this.sfpPackage.packageName} Initiated`, LoggerLevel.INFO, this.logger); - //Poll for package creation every 30 seconds - let currentPackageCreationStatus: PackageVersionCreateRequestResult; - while (true) { - await delay(30000); //Poll every 30 seconds - currentPackageCreationStatus = await PackageVersion.getCreateStatus( - result.Id, - this.devhubOrg.getConnection() - ); - - //Too Verbose when reading errors.. use only for debug - SFPLogger.log( - `Status: ${COLOR_KEY_MESSAGE(currentPackageCreationStatus.Status)}, Next Status check in 30 seconds`, - LoggerLevel.DEBUG, - this.logger - ); - if (currentPackageCreationStatus.Status === `Success`) { - break; - } else if (currentPackageCreationStatus.Status === 'Error') { - let errorMessage = ''; - const errors = currentPackageCreationStatus?.Error; - if (errors?.length) { - errorMessage = 'Creation errors: '; - for (let i = 0; i < errors.length; i++) { - errorMessage += `\n${i + 1}) ${errors[i]}`; - } - } - throw new Error(`Unable to create ${this.sfpPackage.packageName} due to \n` + errorMessage); - } - } - - SFPLogger.log(`Package Result:${JSON.stringify(currentPackageCreationStatus)}`, LoggerLevel.TRACE, this.logger); - - //Get the full details on the package and throw an error if the result is null, usually when the comamnd is timed out - if (currentPackageCreationStatus.SubscriberPackageVersionId) { - sfpPackage.package_version_id = currentPackageCreationStatus.SubscriberPackageVersionId; - await this.getPackageInfo(sfpPackage); - } else { - throw new Error( - `The build for ${this.sfpPackage.packageName} was not completed in the wait time ${this.packageCreationParams.waitTime} provided.${EOL} - You might want to increase the wait time or better check the dependencies or convert to different package type ${EOL} - Read more about it here https://docs.dxatscale.io/development-practices/types-of-packaging/unlocked-packages#build-options-with-unlocked-packages` - ); - } - - //Break if coverage is low - if (this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage) { - if (!sfpPackage.has_passed_coverage_check) - throw new Error('This package has not meet the minimum coverage requirement of 75%'); - } - } - - postCreatePackage(sfpPackage: SfpPackage) { - //copy the original config back as existing one would have cleaned up - fs.copyFileSync( - path.join(this.workingDirectory, 'sfdx-project-bak.json'), - path.join(this.workingDirectory, 'sfdx-project.json') - ); - fs.unlinkSync(path.join(this.workingDirectory, 'sfdx-project-bak.json')); - if (sfpPackage.isDependencyValidated) { - SFPStatsSender.logGauge('package.testcoverage', sfpPackage.test_coverage, { - package: sfpPackage.package_name, - from: 'createpackage', - }); - } - } - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - printAdditionalPackageSpecificHeaders() {} - - private deleteSFPowerscriptsAdditionsToProjectConfig(workingDirectory: string) { - let projectManifestFromWorkingDirectory = ProjectConfig.getSFDXProjectConfig(workingDirectory); - let packageDescriptorInWorkingDirectory = ProjectConfig.getPackageDescriptorFromConfig( - this.sfpPackage.packageName, - projectManifestFromWorkingDirectory - ); - - fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project-bak.json'), projectManifestFromWorkingDirectory); - - //Cleanup sfpowerscripts constructs - if (this.isOrgDependentPackage) delete packageDescriptorInWorkingDirectory['dependencies']; - - delete packageDescriptorInWorkingDirectory['type']; - delete packageDescriptorInWorkingDirectory['assignPermSetsPreDeployment']; - delete packageDescriptorInWorkingDirectory['assignPermSetsPostDeployment']; - delete packageDescriptorInWorkingDirectory['skipDeployOnOrgs']; - delete packageDescriptorInWorkingDirectory['skipTesting']; - delete packageDescriptorInWorkingDirectory['skipCoverageValidation']; - delete packageDescriptorInWorkingDirectory['ignoreOnStages']; - delete packageDescriptorInWorkingDirectory['ignoreDeploymentErrors']; - delete packageDescriptorInWorkingDirectory['preDeploymentScript']; - delete packageDescriptorInWorkingDirectory['postDeploymentScript']; - delete packageDescriptorInWorkingDirectory['aliasfy']; - delete packageDescriptorInWorkingDirectory['checkpointForPrepare']; - delete packageDescriptorInWorkingDirectory['testSynchronous']; - delete packageDescriptorInWorkingDirectory['tags']; - - fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project.json'), projectManifestFromWorkingDirectory); - } - - private async getPackageInfo(sfpPackage: SfpPackage) { - let packageVersionCoverage: PackageVersionCoverage = new PackageVersionCoverage(this.connection, this.logger); - let count = 0; - while (count < 10) { - count++; - try { - SFPLogger.log('Fetching Version Number and Coverage details', LoggerLevel.INFO, this.logger); - - let pkgInfoResult = await packageVersionCoverage.getCoverage(sfpPackage.package_version_id); - - sfpPackage.isDependencyValidated = !this.packageCreationParams.isSkipValidation; - sfpPackage.package_version_number = pkgInfoResult.packageVersionNumber; - sfpPackage.test_coverage = pkgInfoResult.coverage; - sfpPackage.has_passed_coverage_check = pkgInfoResult.HasPassedCodeCoverageCheck; - break; - } catch (error) { - SFPLogger.log( - `Unable to fetch package version info due to ${error.message}`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log('Retrying...', LoggerLevel.INFO, this.logger); - await delay(2000); - continue; - } - } - } - - private async getPackageTypeInfos() { - if (CreateUnlockedPackageImpl.packageTypeInfos == null) { - CreateUnlockedPackageImpl.packageTypeInfos = await this.devhubOrg.listAllPackages(); - } - return CreateUnlockedPackageImpl.packageTypeInfos; - } -} diff --git a/packages/core/src/package/packageFormatConvertors/SourceToMDAPIConvertor.ts b/packages/core/src/package/packageFormatConvertors/SourceToMDAPIConvertor.ts deleted file mode 100644 index 1ff72b860..000000000 --- a/packages/core/src/package/packageFormatConvertors/SourceToMDAPIConvertor.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; -import path from 'path'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class SourceToMDAPIConvertor { - public constructor( - private projectDirectory: string, - private sourceDirectory: string, - private sourceApiVersion: string, - private logger?: Logger - ) {} - - public async convert() { - let mdapiDir = `.sfpowerscripts/${this.makefolderid(5)}_mdapi`; - //Create destination directory - if (this.projectDirectory != null) mdapiDir = path.resolve(this.projectDirectory, mdapiDir); - - //Source Directory is nested inside project directory when used with artifacts - //TODO: projectDirectory nomenclature is incorrect, should be parentDirectory perhaps? - let resolvedSourceDirectory = this.sourceDirectory; - if (this.projectDirectory != null) - resolvedSourceDirectory = path.resolve(this.projectDirectory, this.sourceDirectory); - - //Build component set from provided source directory - let componentSet = ComponentSet.fromSource({ - fsPaths: [resolvedSourceDirectory], - }); - - if (this.sourceApiVersion) componentSet.sourceApiVersion = this.sourceApiVersion; - - const converter = new MetadataConverter(); - let convertResult = await converter.convert(componentSet, 'metadata', { - type: 'directory', - outputDirectory: mdapiDir, - }); - SFPLogger.log(`Source converted successfully to ${mdapiDir}`, LoggerLevel.TRACE, this.logger); - SFPLogger.log(`ConvertResult:` + JSON.stringify(convertResult), LoggerLevel.TRACE, this.logger); - - return convertResult; - } - - private makefolderid(length): string { - var result = ''; - var characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/core/src/package/packageInstallers/InstallDataPackageImpl.ts b/packages/core/src/package/packageInstallers/InstallDataPackageImpl.ts deleted file mode 100644 index 7e488f0d9..000000000 --- a/packages/core/src/package/packageInstallers/InstallDataPackageImpl.ts +++ /dev/null @@ -1,104 +0,0 @@ -const fs = require('fs-extra'); -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import SFDMURunImpl from '../../sfdmuwrapper/SFDMURunImpl'; -import VlocityPackDeployImpl from '../../vlocitywrapper/VlocityPackDeployImpl'; -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -const path = require('path'); -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; - -export default class InstallDataPackageImpl extends InstallPackage { - public constructor( - sfpPackage: SfpPackage, - targetOrg:SFPOrg, - logger: Logger, - options: SfpPackageInstallationOptions, - ) { - super(sfpPackage, targetOrg, logger,options); - } - - public async install() { - try { - //Fetch the sfdxcommand executor for the type - let dataPackageDeployer: SFDXCommand = await this.getSFDXCommand( - this.sfpPackage.sourceDir, - this.packageDirectory - ); - - SFPLogger.log(`Executing installation command: ${dataPackageDeployer.getGeneratedSFDXCommandWithParams()}`,LoggerLevel.INFO,this.logger); - let result = await dataPackageDeployer.exec(false); - - SFPLogger.log(result, LoggerLevel.INFO, this.logger); - } catch (error) { - let csvIssuesReportFilepath: string = path.join( - this.sfpPackage.sourceDir, - this.packageDirectory, - `CSVIssuesReport.csv` - ); - if (fs.existsSync(csvIssuesReportFilepath)) { - SFPLogger.log( - `\n---------------------WARNING: SFDMU detected CSV issues, verify the following files -------------------------------`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log(fs.readFileSync(csvIssuesReportFilepath, 'utf8'), LoggerLevel.INFO, this.logger); - } - throw error; - } - } - private async getSFDXCommand(sourceDirectory: string, packageDirectory: string): Promise { - //Determine package type - let packageType: string = this.determinePackageType(path.join(sourceDirectory, packageDirectory)); - - //Pick the type of SFDX command to use - let dataPackageDeployer: SFDXCommand; - if (packageType === 'sfdmu') { - let orgDomainUrl = await new OrgDetailsFetcher( this.sfpOrg.getUsername()).getOrgDomainUrl(); - - dataPackageDeployer = new SFDMURunImpl( - sourceDirectory, - this.sfpOrg.getUsername(), - orgDomainUrl, - packageDirectory, - this.logger, - LoggerLevel.INFO - ); - } else if (packageType === 'vlocity') { - dataPackageDeployer = new VlocityPackDeployImpl( - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - packageDirectory, - null, - null - ); - } else { - throw new Error('Unsupported package type'); - } - - return dataPackageDeployer; - } - - private determinePackageType(packageDirectory: string): string { - if (fs.pathExistsSync(path.join(packageDirectory, 'export.json'))) { - SFPLogger.log( - `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, - LoggerLevel.INFO, - this.logger - ); - return 'sfdmu'; - } else if (fs.pathExistsSync(path.join(packageDirectory, 'VlocityComponents.yaml'))) { - SFPLogger.log( - `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, - LoggerLevel.INFO, - this.logger - ); - return 'vlocity'; - } else { - throw new Error( - `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfpowerscripts only support vlocity or sfdmu based data packages` - ); - } - } -} diff --git a/packages/core/src/package/packageInstallers/InstallPackage.ts b/packages/core/src/package/packageInstallers/InstallPackage.ts deleted file mode 100644 index 830fb5f4e..000000000 --- a/packages/core/src/package/packageInstallers/InstallPackage.ts +++ /dev/null @@ -1,497 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { PackageInstallationResult, PackageInstallationStatus } from './PackageInstallationResult'; -import ProjectConfig from '../../project/ProjectConfig'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import AssignPermissionSets from '../../permsets/AssignPermissionSets'; -import ScriptExecutor from '../../scriptExecutor/ScriptExecutorHelpers'; -import { Connection } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import FileSystem from '../../utils/FileSystem'; -import OrgDetailsFetcher, { OrgDetails } from '../../org/OrgDetailsFetcher'; -import path = require('path'); -import PermissionSetGroupUpdateAwaiter from '../../permsets/PermissionSetGroupUpdateAwaiter'; -import SfpOrg from '../../org/SFPOrg'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; -import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import getFormattedTime from '../../utils/GetFormattedTime'; -import { TestLevel } from '../../apextest/TestOptions'; -import { PostDeployersRegistry } from '../deploymentCustomizers/PostDeployersRegistry'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import PackageComponentPrinter from '../../display/PackageComponentPrinter'; -import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; -import { PreDeployersRegistry } from '../deploymentCustomizers/PreDeployersRegistry'; -import { AnalyzerRegistry } from '../../package/analyser/AnalyzerRegistry'; - -export class SfpPackageInstallationOptions { - installationkey?: string; - apexcompile?: string = 'package'; - securitytype?: string = 'none'; - upgradetype?: string = 'mixed-mode'; - waitTime?: string; - apiVersion?: string; - publishWaitTime?: number = 60; - skipTesting?: boolean; - optimizeDeployment?: boolean; - deploymentType?: DeploymentType; - disableArtifactCommit?: boolean = false; - isInstallingForValidation?: boolean; - skipIfPackageInstalled: boolean; - isDryRun?: boolean = false; - pathToReplacementForceIgnore?: string; -} - -export abstract class InstallPackage { - protected connection: Connection; - protected packageDescriptor; - protected packageDirectory; - - private _isArtifactToBeCommittedInOrg: boolean = true; - - public constructor( - protected sfpPackage: SfpPackage, - protected sfpOrg: SfpOrg, - protected logger: Logger, - protected options: SfpPackageInstallationOptions - ) { } - - public async exec(): Promise { - let startTime = Date.now(); - let elapsedTime: number; - try { - this.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - this.sfpPackage.sourceDir, - this.sfpPackage.packageName - ); - - this.connection = this.sfpOrg.getConnection(); - - if (await this.isPackageToBeInstalled(this.options.skipIfPackageInstalled)) { - if (!this.options.isDryRun) { - await this.waitTillAllPermissionSetGroupIsUpdated(); - await this.assignPermsetsPreDeployment(); - await this.executePreDeploymentScripts(); - await this.setPackageDirectoryForPackage(); - await this.executePreDeployers(); - await this.checkPackageDirectoryExists(); - await this.install(); - await this.assignPermsetsPostDeployment(); - await this.executePostDeployers(); - await this.executePostDeploymentScript(); - await this.commitPackageInstallationStatus(); - - elapsedTime = Date.now() - startTime; - this.sendMetricsWhenSuccessfullyInstalled(elapsedTime); - } - return { result: PackageInstallationStatus.Succeeded, elapsedTime: elapsedTime }; - } else { - SFPLogger.log('Skipping Package Installation', LoggerLevel.INFO, this.logger); - return { result: PackageInstallationStatus.Skipped }; - } - } catch (error) { - elapsedTime = Date.now() - startTime; - this.sendMetricsWhenFailed(elapsedTime); - return { - result: PackageInstallationStatus.Failed, - message: error.message, - elapsedTime: elapsedTime, - }; - } - } - - checkPackageDirectoryExists() { - let absPackageDirectory: string = path.join(this.sfpPackage.sourceDir, this.packageDirectory); - if (!fs.existsSync(absPackageDirectory)) { - throw new Error(`Package directory ${absPackageDirectory} does not exist`); - } - } - - private async waitTillAllPermissionSetGroupIsUpdated() { - try { - //Package Has Permission Set Group - let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( - this.connection, - this.logger - ); - await permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated(); - } catch (error) { - //Ignore error - // Lets try proceeding - SFPLogger.log( - `Unable to check the status of Permission Set Groups due to ${error}`, - LoggerLevel.WARN, - this.logger - ); - } - } - - protected async setPackageDirectoryForPackage() { - if (this.packageDescriptor.aliasfy) { - const searchDirectory = path.join(this.sfpPackage.sourceDir, this.packageDescriptor.path); - const files = FileSystem.readdirRecursive(searchDirectory, true); - - let aliasDir: string; - - let alias = await this.sfpOrg.getAlias(); - aliasDir = files.find( - (file) => path.basename(file) === alias && fs.lstatSync(path.join(searchDirectory, file)).isDirectory() - ); - - SFPLogger.log(`Using alias directory ${aliasDir ? aliasDir : 'default'}`, LoggerLevel.INFO, this.logger); - - if (!aliasDir) { - const orgDetails = await new OrgDetailsFetcher(this.sfpOrg.getUsername()).getOrgDetails(); - - if (orgDetails.isSandbox) { - // If the target org is a sandbox, find a 'default' directory to use as package directory - aliasDir = files.find( - (file) => - path.basename(file) === 'default' && - fs.lstatSync(path.join(searchDirectory, file)).isDirectory() - ); - } - } - - if (!aliasDir) { - throw new Error( - `Aliasfied package '${this.sfpPackage.packageName}' does not have an alias with '${alias}' or 'default' directory` - ); - } - - this.packageDirectory = path.join(this.packageDescriptor.path, aliasDir); - } - else { - this.packageDirectory = path.join(this.packageDescriptor['path']); - } - - } - - private sendMetricsWhenFailed(elapsedTime: number) { - SFPLogger.log( - `Package ${COLOR_KEY_MESSAGE( - this.sfpPackage.package_name - )} installation attempt failed,it took ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` - ); - SFPStatsSender.logCount('package.installation.failure', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - } - - private sendMetricsWhenSuccessfullyInstalled(elapsedTime: number) { - SFPLogger.log( - `Package ${COLOR_KEY_MESSAGE(this.sfpPackage.package_name)} installation took ${COLOR_KEY_MESSAGE( - getFormattedTime(elapsedTime) - )}`, - LoggerLevel.INFO, - this.logger - ); - SFPStatsSender.logElapsedTime('package.installation.elapsed_time', elapsedTime, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - SFPStatsSender.logCount('package.installation', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - } - - //Set this to disable whethere info about the artifact has to be recorded in the org - public set isArtifactToBeCommittedInOrg(toCommit: boolean) { - this._isArtifactToBeCommittedInOrg = toCommit; - } - - private async commitPackageInstallationStatus() { - if (this._isArtifactToBeCommittedInOrg) { - try { - await this.sfpOrg.updateArtifactInOrg(this.logger, this.sfpPackage); - } catch (error) { - SFPLogger.log( - 'Unable to commit information about the package into org..Check whether prerequisities are installed', - LoggerLevel.WARN, - this.logger - ); - } - } - } - - protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { - if (skipIfPackageInstalled) { - let installationStatus = await this.sfpOrg.isArtifactInstalledInOrg(this.logger, this.sfpPackage); - return !installationStatus.isInstalled; - } else if(this.sfpPackage.packageType == PackageType.Diff) - { - // If diff package, check if there are any changes to be deployed, else skip - if(!this.sfpPackage.destructiveChanges && this.sfpPackage.metadataCount==0) - { - return false; - } - } - - return true; // Always install packages if skipIfPackageInstalled is false - } - - private async assignPermsetsPreDeployment() { - try { - if (this.sfpPackage.assignPermSetsPreDeployment) { - SFPLogger.log('Assigning permission sets before deployment:', LoggerLevel.INFO, this.logger); - - await AssignPermissionSets.applyPermsets( - this.sfpPackage.assignPermSetsPreDeployment, - this.connection, - this.sfpPackage.sourceDir, - this.logger - ); - } - } catch (error) { - //Proceed ahead not a critical error to break installation - SFPLogger.log(`Unable to assign permsets (Pre Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public async executePreDeploymentScripts() { - let preDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `preDeployment`); - if (fs.existsSync(preDeploymentScript)) { - let alias = await this.sfpOrg.getAlias(); - SFPLogger.log('Executing preDeployment script', LoggerLevel.INFO, this.logger); - await ScriptExecutor.executeScript( - this.logger, - preDeploymentScript, - this.sfpPackage.packageName, - this.sfpOrg.getUsername(), - alias ? alias : this.sfpOrg.getUsername(), - this.sfpPackage.sourceDir, - this.sfpPackage.packageDirectory - ); - } - } - - abstract install(); - - private async assignPermsetsPostDeployment() { - try { - if (this.sfpPackage.assignPermSetsPostDeployment) { - SFPLogger.log('Assigning permission sets after deployment:', LoggerLevel.INFO, this.logger); - - await AssignPermissionSets.applyPermsets( - this.sfpPackage.assignPermSetsPostDeployment, - this.connection, - this.sfpPackage.sourceDir, - this.logger - ); - } - } catch (error) { - //Proceed ahead not a critical error to break installation - SFPLogger.log(`Unable to assign permsets (Post Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public async executePostDeploymentScript() { - let postDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `postDeployment`); - if (fs.existsSync(postDeploymentScript)) { - SFPLogger.log('Executing postDeployment script', LoggerLevel.INFO, this.logger); - let alias = await this.sfpOrg.getAlias(); - await ScriptExecutor.executeScript( - this.logger, - postDeploymentScript, - this.sfpPackage.packageName, - this.sfpOrg.getUsername(), - alias ? alias : this.sfpOrg.getUsername(), - this.sfpPackage.sourceDir, - this.sfpPackage.packageDirectory - ); - } - } - - private async executePostDeployers() { - SFPLogger.log(`Executing Post Deployers`, LoggerLevel.INFO, this.logger); - - //Gather componentSet - let componentSet = ComponentSet.fromSource( - path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) - ); - - for (const postDeployer of PostDeployersRegistry.getPostDeployers()) { - try { - if (await postDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { - SFPLogger.log( - `Executing Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, - LoggerLevel.INFO, - this.logger - ); - - await postDeployer.execute( - this.sfpPackage, - componentSet, - this.sfpOrg, - this.logger, - {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} - ); - - } else { - SFPLogger.log( - `Post Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped or not enabled`, - LoggerLevel.INFO, - this.logger - ); - } - } catch (error) { - SFPLogger.log( - `Unable to process post deploy for ${postDeployer.getName()} due to ${error.message}`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped due to error`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - private async executePreDeployers() { - SFPLogger.log(`Executing Pre Deployers`, LoggerLevel.INFO, this.logger); - - //Gather componentSet - let componentSet = ComponentSet.fromSource( - path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) - ); - - let analyzers = AnalyzerRegistry.getAnalyzers(); - for (const analyzer of analyzers) { - if(await analyzer.isEnabled(this.sfpPackage, this.logger)) - { - SFPLogger.log(`Executing ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); - this.sfpPackage = await analyzer.analyze(this.sfpPackage,componentSet, this.logger); - } - else - { - SFPLogger.log(`Skipped ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); - } - } - - for (const preDeployer of PreDeployersRegistry.getPreDeployers()) { - try { - if (await preDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { - SFPLogger.log( - `Executing Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())}`, - LoggerLevel.INFO, - this.logger - ); - - await preDeployer.execute( - this.sfpPackage, - componentSet, - this.sfpOrg, - this.logger, - {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} - ); - - } else { - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped or not enabled`, - LoggerLevel.INFO, - this.logger - ); - } - } catch (error) { - SFPLogger.log( - `Unable to process pre deploy for ${preDeployer.getName()} due to ${error.message}`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped due to error`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - protected async generateDeploymentOptions( - waitTime: string, - optimizeDeployment: boolean, - skipTest: boolean, - target_org: string, - apiVersion: string - ): Promise { - let deploymentOptions: DeploymentOptions = { - ignoreWarnings: true, - waitTime: waitTime, - }; - deploymentOptions.ignoreWarnings = true; - deploymentOptions.waitTime = waitTime; - deploymentOptions.apiVersion = apiVersion; - - //Find Org Type - let orgDetails: OrgDetails; - try { - orgDetails = await new OrgDetailsFetcher(target_org).getOrgDetails(); - } catch (err) { - SFPLogger.log(`Unable to fetch org details,assuming it is production`, LoggerLevel.WARN, this.logger); - orgDetails = { - instanceUrl: undefined, - isScratchOrg: false, - isSandbox: false, - organizationType: undefined, - sfdxAuthUrl: undefined, - status: undefined, - }; - } - - - if (this.options.deploymentType == DeploymentType.MDAPI_DEPLOY && this.sfpPackage.isApexFound && this.options.isInstallingForValidation == false) { - if (orgDetails.isSandbox) { - //enforce during selective deployment - if (skipTest) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( - this.sfpPackage.apexTestClassses - ); - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } else { - if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( - this.sfpPackage.apexTestClassses - ); - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } - } - // #Issue 1417 - // Handle the use-cases of a not optimized source package validating - else if (this.sfpPackage.packageType == PackageType.Source && this.sfpPackage.isApexFound && this.options.isInstallingForValidation && !optimizeDeployment ) { - if (skipTest) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } else { - if (orgDetails.isSandbox) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = 'skip'; - } - } - - deploymentOptions.rollBackOnError = true; - return deploymentOptions; - } - - private getAStringOfSpecificTestClasses(apexTestClassses: string[]) { - let specifedTests = apexTestClassses.join(); - return specifedTests; - } -} diff --git a/packages/core/src/package/packageInstallers/InstallSourcePackageImpl.ts b/packages/core/src/package/packageInstallers/InstallSourcePackageImpl.ts deleted file mode 100644 index b154c7e38..000000000 --- a/packages/core/src/package/packageInstallers/InstallSourcePackageImpl.ts +++ /dev/null @@ -1,397 +0,0 @@ -import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; -import ReconcileProfileAgainstOrgImpl from '../components/ReconcileProfileAgainstOrgImpl'; -import DeployDestructiveManifestToOrgImpl from '../components/DeployDestructiveManifestToOrgImpl'; -import SFPLogger, { COLOR_SUCCESS, COLOR_WARNING, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import * as fs from 'fs-extra'; -const path = require('path'); -const tmp = require('tmp'); -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import { TestLevel } from '../../apextest/TestOptions'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import ProjectConfig from '../../project/ProjectConfig'; -import { DeploymentFilterRegistry } from '../deploymentFilters/DeploymentFilterRegistry'; -import DeploymentOptionDisplayer from '../../display/DeploymentOptionDisplayer'; -import PackageComponentPrinter from '../../display/PackageComponentPrinter'; -import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; -import { COLOR_ERROR } from '@dxatscale/sfp-logger'; -import { globSync } from 'glob'; - -export default class InstallSourcePackageImpl extends InstallPackage { - private pathToReplacementForceIgnore: string; - private deploymentType: DeploymentType; - - - - public constructor( - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - options: SfpPackageInstallationOptions, - logger: Logger - ) { - super(sfpPackage, targetOrg, logger, options); - this.options = options; - this.pathToReplacementForceIgnore = options.pathToReplacementForceIgnore; - this.deploymentType = options.deploymentType; - } - - public async install() { - let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); - let tempDir = tmpDirObj.name; - - try { - //Handle the right force ignore file - this.handleForceIgnores(); - - // Apply Destructive Manifest - await this.applyDestructiveChanges(); - - - //Apply Reconcile if Profiles are found - //To Reconcile we have to go for multiple deploys, first we have to reconcile profiles and deploy the metadata - let isReconcileActivated = false; - let isReconcileErrored = false; - let profileFolders; - ({ - profileFolders, - isReconcileActivated, - isReconcileErrored, - } = await this.reconcileProfilesBeforeDeployment( - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - tempDir - )); - - let deploymentOptions: DeploymentOptions; - let result: DeploySourceResult; - //Construct Deploy Command for actual payload - deploymentOptions = await this.generateDeploymentOptions( - this.options.waitTime, - this.options.optimizeDeployment, - this.options.skipTesting, - this.sfpOrg.getUsername(), - this.options.apiVersion - ); - - //enable source tracking - if (this.deploymentType === DeploymentType.SOURCE_PUSH) { - deploymentOptions.sourceTracking = true; - } - - //Make a copy.. dont mutate sourceDirectory - let resolvedSourceDirectory = this.sfpPackage.sourceDir; - - let emptyCheck = this.handleEmptyPackage(resolvedSourceDirectory, this.packageDirectory); - - if (emptyCheck.isToSkip == true) { - SFPLogger.log( - `${COLOR_SUCCESS(`Skipping the package as there is nothing to be deployed`)}`, - LoggerLevel.INFO, - this.logger - ); - return { - deploy_id: `000000`, - result: true, - message: `Package is empty, nothing to install,skipped`, - }; - } else if (emptyCheck.isToSkip == false) { - - //Create componentSet To Be Deployed - let componentSet = ComponentSet.fromSource( - path.resolve(emptyCheck.resolvedSourceDirectory, this.packageDirectory) - ); - - //Apply Filters - let deploymentFilters = DeploymentFilterRegistry.getImplementations(); - - for (const deploymentFilter of deploymentFilters) { - if ( - deploymentFilter.isToApply( - ProjectConfig.getSFDXProjectConfig(emptyCheck.resolvedSourceDirectory), - this.sfpPackage.packageType - ) - ) - componentSet = await deploymentFilter.apply(this.sfpOrg, componentSet, this.logger); - } - - //Check if there are components to be deployed after filtering - //Assume its successfully deployed - if (componentSet.size == 0) { - return { - deploy_id: `000000`, - result: true, - message: `Package contents were filtered out, nothing to install`, - }; - } - - //Print components inside Component Set - let components = componentSet.getSourceComponents(); - PackageComponentPrinter.printComponentTable(components, this.logger); - - - if (!this.options.isInstallingForValidation) { - DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); - } - - let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( - this.sfpOrg, - this.sfpPackage.sourceDir, - componentSet, - deploymentOptions, - this.logger - ); - - result = await deploySourceToOrgImpl.exec(); - - if (result.result) { - //Apply PostDeployment Activities - try { - if (isReconcileActivated) { - //Bring back the original profiles, reconcile and redeploy again - await this.reconcileAndRedeployProfiles( - profileFolders, - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - this.packageDirectory, - tempDir, - deploymentOptions - ); - } - } catch (error) { - - SFPLogger.log( - 'Failed to apply reconcile the second time, Partial Metadata applied', - LoggerLevel.INFO, - this.logger - ); - } - } else if (result.result === false) { - DeployErrorDisplayer.displayErrors(result.response, this.logger); - throw new Error(result.message); - } - } - //} - } catch (error) { - tmpDirObj.removeCallback(); - throw error; - } - } - - private handleEmptyPackage( - sourceDirectory: string, - packageDirectory: string - ): { isToSkip: boolean; resolvedSourceDirectory: string } { - //Check empty conditions - let status = PackageEmptyChecker.isToBreakBuildForEmptyDirectory(sourceDirectory, packageDirectory, false); - - - if (status.result == 'break') { - throw new Error('No components in the package, Please check your build again'); - } else if (status.result == 'skip') { - return { - isToSkip: true, - resolvedSourceDirectory: sourceDirectory, - }; - } else { - return { - isToSkip: false, - resolvedSourceDirectory: sourceDirectory, - }; - } - } - - private handleForceIgnores() { - if (this.pathToReplacementForceIgnore) { - this.replaceForceIgnoreInSourceDirectory(this.sfpPackage.sourceDir, this.pathToReplacementForceIgnore); - - - //Handle Diff condition - // if (this.isDiffFolderAvailable) - // this.replaceForceIgnoreInSourceDirectory( - // path.join(this.sfpPackage.sourceDir, 'diff'), - // this.pathToReplacementForceIgnore - // ); - } - } - - private async applyDestructiveChanges() { - - if(this.sfpPackage.destructiveChanges) - { - try { - SFPLogger.log( - 'Attempt to delete components mentioned in destructive manifest', - LoggerLevel.INFO, - this.logger - ); - let deployDestructiveManifestToOrg = new DeployDestructiveManifestToOrgImpl( - this.sfpOrg, - path.join(this.sfpPackage.sourceDir, 'destructive', 'destructiveChanges.xml') - ); - - await deployDestructiveManifestToOrg.exec(); - } catch (error) { - SFPLogger.log( - `We attempted a deletion of components, However we are not successful. \ - Either the components are already deleted or there are components which \ - have dependency to components in the manifest. \ - Please check whether this manifest works! \ - Actual Error Observed: \ - -------------------------------------- \ - ${COLOR_ERROR(error.message)}`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - private async reconcileProfilesBeforeDeployment(sourceDirectoryPath: string, target_org: string, tempDir: string) { - let profileFolders: any; - let isReconcileActivated: boolean = false; - let isReconcileErrored: boolean = false; - try { - //Hard exit.. no reconcile set in orchestrator - if (this.sfpPackage.reconcileProfiles == false) return { isReconcileActivated: false }; - - //Handle diff for fastfeedback - if (this.sfpPackage.isProfilesFound) { - } else { - return { isReconcileActivated: false }; - } - - SFPLogger.log( - 'Attempting reconcile to profiles as payload contain profiles', - LoggerLevel.INFO, - this.logger - ); - //copy the original profiles to temporary location - profileFolders = globSync('**/profiles', { - cwd: path.join(sourceDirectoryPath), - }); - if (profileFolders.length > 0) { - profileFolders.forEach((folder) => { - fs.copySync(path.join(sourceDirectoryPath, folder), path.join(tempDir, folder)); - }); - } - //Now Reconcile - let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( - this.sfpOrg, - path.join(sourceDirectoryPath), - this.logger - ); - await reconcileProfileAgainstOrg.exec(); - isReconcileActivated = true; - } catch (err) { - SFPLogger.log('Failed to reconcile profiles:' + err, LoggerLevel.INFO, this.logger); - isReconcileErrored = true; - if (profileFolders.length > 0) { - SFPLogger.log('Restoring original profiles as preprocessing failed', LoggerLevel.INFO, this.logger); - profileFolders.forEach((folder) => { - fs.copySync(path.join(tempDir, folder), path.join(this.sfpPackage.sourceDir, folder)); - }); - } - } - return { profileFolders, isReconcileActivated, isReconcileErrored }; - } - - private async reconcileAndRedeployProfiles( - profileFolders: string[], - sourceDirectoryPath: string, - target_org: string, - sourceDirectory: string, - tmpdir: string, - deploymentOptions: any - ) { - //if no profile supported metadata, no point in - //doing a reconcile - if (this.sfpPackage.isProfilesFound == false) return; - if (this.sfpPackage.isPayLoadContainTypesSupportedByProfiles == false) return; - - - if (profileFolders.length > 0) { - SFPLogger.log(`Restoring original profiles for reconcile and deploy`, LoggerLevel.INFO, this.logger); - profileFolders.forEach((folder) => { - fs.copySync(path.join(tmpdir, folder), path.join(sourceDirectoryPath, folder)); - }); - - //Now Reconcile - let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( - this.sfpOrg, - sourceDirectoryPath, - this.logger - ); - await reconcileProfileAgainstOrg.exec(); - - //Now deploy the profiles alone - - const profilesDirs = globSync('**/profiles/', { - cwd: path.join(sourceDirectoryPath, sourceDirectory), - absolute: true, - }); - - const profileDeploymentStagingDirectory = path.join( - sourceDirectoryPath, - 'ProfileDeploymentStagingDirectory' - ); - fs.mkdirpSync(path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); - - for (const dir of profilesDirs) { - // Duplicate profiles are overwritten - fs.copySync(dir, path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); - } - - fs.copySync( - path.join(sourceDirectoryPath, 'sfdx-project.json'), - path.join(profileDeploymentStagingDirectory, 'sfdx-project.json') - ); - fs.copySync( - path.join(sourceDirectoryPath, '.forceignore'), - path.join(profileDeploymentStagingDirectory, '.forceignore') - ); - - //Create componentSet To Be Deployed - let componentSet = ComponentSet.fromSource( - path.resolve(profileDeploymentStagingDirectory, sourceDirectory) - ); - - DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); - let deploySourceToOrgImpl: DeploySourceToOrgImpl = new DeploySourceToOrgImpl( - this.sfpOrg, - this.sfpPackage.sourceDir, - componentSet, - deploymentOptions, - this.logger - ); - let profileReconcile: DeploySourceResult = await deploySourceToOrgImpl.exec(); - - if (!profileReconcile.result) { - DeployErrorDisplayer.displayErrors(profileReconcile.response, this.logger); - SFPLogger.log('Unable to deploy reconciled profiles', LoggerLevel.INFO, this.logger); - } - } - } - - - - /** - * Replaces forceignore in source directory with provided forceignore - * @param sourceDirectory - * @param pathToReplacementForceIgnore - */ - private replaceForceIgnoreInSourceDirectory(sourceDirectory: string, pathToReplacementForceIgnore: string): void { - if (fs.existsSync(pathToReplacementForceIgnore)) - fs.copySync(pathToReplacementForceIgnore, path.join(sourceDirectory, '.forceignore')); - else { - SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, this.logger); - SFPLogger.log( - 'Package installation will continue using the unchanged forceignore in the source directory', - null, - this.logger - ); - } - } -} diff --git a/packages/core/src/package/packageInstallers/InstallUnlockedPackage.ts b/packages/core/src/package/packageInstallers/InstallUnlockedPackage.ts deleted file mode 100644 index 517f55c21..000000000 --- a/packages/core/src/package/packageInstallers/InstallUnlockedPackage.ts +++ /dev/null @@ -1,91 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; -import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import { EOL } from 'os'; - -export default class InstallUnlockedPackage extends InstallPackage { - private packageVersionId; - - public constructor( - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - options: SfpPackageInstallationOptions, - logger: Logger - ) { - super(sfpPackage, targetOrg, logger, options); - this.packageVersionId = sfpPackage.package_version_id; - this.options = options; - } - - public async install() { - let installUnlockedPackageWrapper: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( - this.logger, - this.sfpOrg.getUsername(), - this.packageVersionId, - this.options, - this.sfpPackage.packageName - ); - await installUnlockedPackageWrapper.install(this.sfpPackage.payload); - } - - /** - * Checks whether unlocked package version is installed in org. - * Overrides base class method. - * @param skipIfPackageInstalled - * @returns - */ - protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { - try { - if (skipIfPackageInstalled) { - SFPLogger.log( - `${EOL}Checking whether package ${COLOR_KEY_MESSAGE( - this.sfpPackage.package_name - )} with ID ${COLOR_KEY_MESSAGE( - this.packageVersionId - )} is installed in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - let installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); - - let packageFound = installedPackages.find((installedPackage) => { - return installedPackage.subscriberPackageVersionId.substring(0,14) === this.packageVersionId.substring(0,14); - }); - - if (packageFound) { - SFPLogger.log( - `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - return false; - } else { - SFPLogger.log( - `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, - LoggerLevel.INFO, - this.logger - ); - return true; - } - } else { - SFPLogger.log( - 'Skip if package to be installed is false, Proceeding with installation', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } catch (error) { - SFPLogger.log( - 'Unable to check whether this package is installed in the target org', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } -} diff --git a/packages/core/src/package/packageInstallers/InstallUnlockedPackageCollection.ts b/packages/core/src/package/packageInstallers/InstallUnlockedPackageCollection.ts deleted file mode 100644 index 5f99a2723..000000000 --- a/packages/core/src/package/packageInstallers/InstallUnlockedPackageCollection.ts +++ /dev/null @@ -1,134 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import Package2Detail from '../Package2Detail'; -import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; -import SFPOrg from '../../org/SFPOrg'; -import { SfpPackageInstallationOptions } from './InstallPackage'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import { EOL } from 'os'; - -export default class InstallUnlockedPackageCollection { - private installedPackages: Package2Detail[]; - constructor(private sfpOrg: SFPOrg, private logger: Logger,private dryRun:boolean=false) {} - - public async install( - package2s: Package2Detail[], - skipIfInstalled: boolean, - ignoreErrorIfAHigherVersionPackageIsInstalled: boolean = true - ) { - this.installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); - - SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); - - for (const package2 of package2s) { - if ( - package2.subscriberPackageVersionId && - this.isPackageToBeInstalled(skipIfInstalled, package2.subscriberPackageVersionId, package2.name) - ) { - SFPLogger.log( - `Installing Package ${package2.name} in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - let installUnlockedPackageImpl: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( - this.logger, - this.sfpOrg.getUsername(), - package2.subscriberPackageVersionId, - new SfpPackageInstallationOptions(), - package2.name - ); - if (package2.key) installUnlockedPackageImpl.setInstallationKey(package2.key); - try { - if(!this.dryRun) - await installUnlockedPackageImpl.install(); - } catch (error) { - let message: string = error.message; - if ( - message.includes(`A newer version of this package is currently installed`) && - ignoreErrorIfAHigherVersionPackageIsInstalled - ) { - SFPLogger.log( - `A higher version of this package is already installed and cant be dowgraded,skipping`, - LoggerLevel.WARN, - this.logger - ); - continue; - } else { - SFPLogger.log( - `Unable to install ${package2.name} in ${this.sfpOrg.getUsername()} due to ${message}`, - LoggerLevel.ERROR, - this.logger - ); - throw error; - } - } - } else { - SFPLogger.log( - `Skipping Installing of package ${COLOR_KEY_MESSAGE( - package2.name - )} in ${this.sfpOrg.getUsername()}`, - LoggerLevel.WARN, - this.logger - ); - } - } - - SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); - } - - /** - * Checks whether unlocked package version is installed in org. - * Overrides base class method. - * @param skipIfPackageInstalled - * @returns - */ - protected isPackageToBeInstalled( - skipIfPackageInstalled: boolean, - packageVersionId: string, - pacakgeName?: string - ): boolean { - try { - if (skipIfPackageInstalled) { - SFPLogger.log( - `${EOL}Checking whether package ${COLOR_KEY_MESSAGE(pacakgeName)} with ID ${COLOR_KEY_MESSAGE( - packageVersionId)}is installed in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - - let packageFound = this.installedPackages.find((installedPackage) => { - return installedPackage.subscriberPackageVersionId.substring(0,15) === packageVersionId.substring(0,15); - }); - - if (packageFound) { - SFPLogger.log( - `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - return false; - } else { - SFPLogger.log( - `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, - LoggerLevel.INFO, - this.logger - ); - return true; - } - } else { - SFPLogger.log( - 'Skip if package to be installed is false, Proceeding with installation', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } catch (error) { - SFPLogger.log( - 'Unable to check whether this package is installed in the target org', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } -} diff --git a/packages/core/src/package/packageInstallers/InstallUnlockedPackageImpl.ts b/packages/core/src/package/packageInstallers/InstallUnlockedPackageImpl.ts deleted file mode 100644 index fac5e2abf..000000000 --- a/packages/core/src/package/packageInstallers/InstallUnlockedPackageImpl.ts +++ /dev/null @@ -1,96 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_SUCCESS, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; -import SFPOrg from '../../org/SFPOrg'; -import { PackageInstallCreateRequest, PackagingSObjects, SubscriberPackageVersion } from '@salesforce/packaging'; -import { delay } from '../../utils/Delay'; -import { SfpPackageInstallationOptions } from './InstallPackage'; - - - -export default class InstallUnlockedPackageImpl { - public constructor( - private logger: Logger, - private targetUserName: string, - private packageId: string, - private installationOptions: SfpPackageInstallationOptions, - private packageName?:string - ) { - } - - public setInstallationKey(installationKey: string) { - this.installationOptions.installationkey = installationKey; - } - - public async install(payloadToDisplay?: any): Promise { - let connection = (await SFPOrg.create({ aliasOrUsername: this.targetUserName })).getConnection(); - //Print Metadata carried in the package - if (payloadToDisplay) PackageMetadataPrinter.printMetadataToDeploy(payloadToDisplay, this.logger); - - const subscriberPackageVersion = new SubscriberPackageVersion({ - connection, - aliasOrId: this.packageId, - password: this.installationOptions.installationkey, - }); - - const request: PackageInstallCreateRequest = { - SubscriberPackageVersionKey: await subscriberPackageVersion.getId(), - Password: this.installationOptions.installationkey as PackageInstallCreateRequest['Password'], - ApexCompileType: 'package' as PackageInstallCreateRequest['ApexCompileType'], - SecurityType: this.installationOptions.securitytype as PackageInstallCreateRequest['SecurityType'], - UpgradeType: this.installationOptions.upgradetype as PackageInstallCreateRequest['UpgradeType'], - EnableRss: true, - }; - - //Fire a package installation - let pkgInstallRequest = await subscriberPackageVersion.install(request, {}); - let status = this.parseStatus( - pkgInstallRequest, - this.targetUserName, - this.packageName ? this.packageName : this.packageId, - this.logger - ); - while (status == 'IN_PROGRESS') { - pkgInstallRequest = await SubscriberPackageVersion.getInstallRequest(pkgInstallRequest.Id, connection); - status = this.parseStatus( - pkgInstallRequest, - this.targetUserName, - this.packageName ? this.packageName : this.packageId, - this.logger - ); - await delay(30000); //Poll every 30 seconds - } - } - public parseStatus( - request: PackagingSObjects.PackageInstallRequest, - username: string, - pkgName: string, - logger: Logger - ): 'IN_PROGRESS' | 'SUCCESS' { - const { Status } = request; - if (Status === 'SUCCESS') { - SFPLogger.log( - `Status: ${COLOR_SUCCESS(`Succesfully Installed`)} ${pkgName} to ${username} with Id ${request.Id}`, - LoggerLevel.INFO, - logger - ); - return Status; - } else if (['IN_PROGRESS', 'UNKNOWN'].includes(Status)) { - SFPLogger.log( - `Status: ${COLOR_KEY_MESSAGE(`In Progress`)} Installing ${pkgName} to ${username} with Id ${request.Id}`, - LoggerLevel.INFO, - logger - ); - return 'IN_PROGRESS'; - } else { - let errorMessage = ''; - const errors = request?.Errors?.errors; - if (errors?.length) { - errorMessage = 'Installation errors: '; - for (let i = 0; i < errors.length; i++) { - errorMessage += `\n${i + 1}) ${errors[i].message}`; - } - } - throw new Error(`Unable to install ${pkgName} due to \n` + errorMessage); - } - } -} diff --git a/packages/core/src/package/packageInstallers/PackageInstallationResult.ts b/packages/core/src/package/packageInstallers/PackageInstallationResult.ts deleted file mode 100644 index 584155ed1..000000000 --- a/packages/core/src/package/packageInstallers/PackageInstallationResult.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type PackageInstallationResult = { - result: PackageInstallationStatus; - deploy_id?: string; - message?: string; - elapsedTime?:number; - isPreScriptExecutionSuceeded?: boolean; - isPostScriptExecutionSuceeeded?:boolean; - numberOfComponentsDeployed?:number; -}; - -export enum PackageInstallationStatus { - Skipped, - Succeeded, - Failed, -} diff --git a/packages/core/src/package/packageMerger/PackageMergeManager.ts b/packages/core/src/package/packageMerger/PackageMergeManager.ts deleted file mode 100644 index f06c97f2e..000000000 --- a/packages/core/src/package/packageMerger/PackageMergeManager.ts +++ /dev/null @@ -1,160 +0,0 @@ -import SfpPackage, { PackageType } from '../SfpPackage'; -import SfpPackageBuilder from '../../package/SfpPackageBuilder'; -const tmp = require('tmp'); -import * as fs from 'fs-extra'; -const path = require('path'); -import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; -import { Logger } from '@dxatscale/sfp-logger'; - -export default class PackageMergeManager { - public constructor(private sfpPackages: SfpPackage[], private logger?: Logger) {} - - public async mergePackages(targetOrAlias?: string): Promise { - let mergeResult: MergeResult = new MergeResult(); - mergeResult.skippedPackages = []; - mergeResult.unlockedPackages = []; - mergeResult.mergedPackages = []; - - mergeResult.requestedMergeOrder = this.sfpPackages; - - //Use the .sfpowerscripts directory - let tmpDir = tmp.dirSync({ unsafeCleanup: true }); - let locationOfCopiedDirectory = tmpDir.name; - //Create a temporary folder - let mergedProjectDir = path.join(locationOfCopiedDirectory, `${this.makefolderid(5)}_merged`); - mergeResult.mergedProjectDirectory = mergedProjectDir; - - let mergedPackageDir = path.join(mergedProjectDir, 'force-app'); - fs.mkdirpSync(mergedPackageDir); - - //Create sfdx project.json - fs.writeJSONSync(path.join(mergedProjectDir, 'sfdx-project.json'), this.getMergedProjectManifest(), { - spaces: 4, - }); - - const converter = new MetadataConverter(); - - for (const sfpPackage of this.sfpPackages) { - let componentSet: ComponentSet; - - if (sfpPackage.packageType == PackageType.Data) { - mergeResult.skippedPackages.push(sfpPackage); - continue; - } else if (sfpPackage.packageType == PackageType.Unlocked) { - //Push for now - mergeResult.skippedPackages.push(sfpPackage); - mergeResult.unlockedPackages.push(sfpPackage); - continue; - } else { - //handle alaisfy directory - if (sfpPackage.packageDescriptor.aliasfy) { - let aliasFolder = path.join( - process.cwd(), - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - targetOrAlias ? targetOrAlias : 'default' - ); - if (fs.existsSync(aliasFolder)) { - componentSet = ComponentSet.fromSource(aliasFolder); - } else { - continue; - } - } else { - componentSet = ComponentSet.fromSource( - path.join(process.cwd(), sfpPackage.projectDirectory, sfpPackage.packageDirectory) - ); - } - - fs.copyFileSync( - path.join(sfpPackage.projectDirectory, 'forceignores', '.buildignore'), - path.join(mergedProjectDir, '.forceignore') - ); - console.log('copied file'); - - //Merge - let results = await converter.convert(componentSet, 'source', { - type: 'merge', - mergeWith: ComponentSet.fromSource(mergedPackageDir).getSourceComponents(), - defaultDirectory: mergedPackageDir, - - forceIgnoredPaths: new Set([ - path.join(process.cwd(), sfpPackage.projectDirectory, 'forceignores', '.buildignore'), - ]), - }); - - for (const component of results.converted) { - if (this.isXmlFileSuffixDuped(component.xml)) { - this.dedupeXmlFileSuffix(component.xml); - } - } - mergeResult.mergedPackages.push(sfpPackage); - } - } - - //Build SfpPackage - if (mergeResult.mergedPackages.length > 0) { - let mergedSfPPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - this.logger, - mergeResult.mergedProjectDirectory, - 'merged', - { - branch: 'temp', - packageVersionNumber: '1.0.0.0', - sourceVersion: '00000000', - }, - null - ); - mergeResult.mergedPackage = mergedSfPPackage; - } - - tmpDir.removeCallback(); - return mergeResult; - } - - private isXmlFileSuffixDuped(xmlFile: string): boolean { - return xmlFile.match(/-meta\.xml/g)?.length === 2; - } - - private dedupeXmlFileSuffix(xmlFile: string): string { - let deduped = xmlFile.replace(/-meta\.xml/, ''); - fs.renameSync(xmlFile, deduped); - - return deduped; - } - - private getMergedProjectManifest() { - let projectManifest = { - packageDirectories: [ - { - path: 'force-app', - package: 'merged', - versionNumber: '2.0.0.0', - default: true, - }, - ], - namespace: '', - sourceApiVersion: '53.0', - }; - return projectManifest; - } - - private makefolderid(length): string { - var result = ''; - var characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} - -export class MergeResult { - mergedProjectDirectory: string; - mergedPackage: SfpPackage; - mergedPackages: SfpPackage[]; - skippedPackages?: SfpPackage[]; - unlockedPackages?: SfpPackage[]; - requestedMergeOrder: SfpPackage[]; -} diff --git a/packages/core/src/package/promote/PromoteUnlockedPackageImpl.ts b/packages/core/src/package/promote/PromoteUnlockedPackageImpl.ts deleted file mode 100644 index 4ca8b05be..000000000 --- a/packages/core/src/package/promote/PromoteUnlockedPackageImpl.ts +++ /dev/null @@ -1,34 +0,0 @@ -import SFPLogger from '@dxatscale/sfp-logger'; -import { SfProject } from '@salesforce/core'; -import { PackageSaveResult, PackageVersion } from '@salesforce/packaging'; -import SFPOrg from '../../org/SFPOrg'; - -export default class PromoteUnlockedPackageImpl { - public constructor( - private project_directory: string, - private package_version_id: string, - private devhub_alias: string - ) {} - - public async promote(): Promise { - let hubOrg = await SFPOrg.create({ aliasOrUsername: this.devhub_alias }); - let project = await SfProject.resolve(this.project_directory); - - const packageVersion = new PackageVersion({ - connection: hubOrg.getConnection(), - project: project, - idOrAlias: this.package_version_id, - }); - const packageVersionData = await packageVersion.getData(); - - let result: PackageSaveResult; - try { - result = await packageVersion.promote(); - result.id = packageVersionData.SubscriberPackageVersionId; - } catch (e) { - if (e.message.includes('previously released')) { - SFPLogger.log(`Package ${this.package_version_id} is already promoted, Ignoring`); - } else throw e; - } - } -} diff --git a/packages/core/src/package/propertyFetchers/AssignPermissionSetFetcher.ts b/packages/core/src/package/propertyFetchers/AssignPermissionSetFetcher.ts deleted file mode 100644 index b6c00bdcd..000000000 --- a/packages/core/src/package/propertyFetchers/AssignPermissionSetFetcher.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Logger } from '@dxatscale/sfp-logger'; -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; - -export default class AssignPermissionSetFetcher implements PropertyFetcher { - public getSfpowerscriptsProperties(packageContents: SfpPackage, packageLogger?: Logger) { - if (packageContents.packageDescriptor.assignPermSetsPreDeployment) { - if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) { - packageContents.assignPermSetsPreDeployment = - packageContents.packageDescriptor.assignPermSetsPreDeployment; - } else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); - } - - if (packageContents.packageDescriptor.assignPermSetsPostDeployment) { - if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) { - packageContents.assignPermSetsPostDeployment = - packageContents.packageDescriptor.assignPermSetsPostDeployment; - } else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); - } - - return packageContents; - } -} diff --git a/packages/core/src/package/propertyFetchers/DestructiveManifestPathFetcher.ts b/packages/core/src/package/propertyFetchers/DestructiveManifestPathFetcher.ts deleted file mode 100644 index d9c224278..000000000 --- a/packages/core/src/package/propertyFetchers/DestructiveManifestPathFetcher.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as fs from 'fs-extra'; -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; -import xml2json from '../../utils/xml2json'; -import { Logger } from '@dxatscale/sfp-logger'; - -export default class DestructiveManifestPathFetcher implements PropertyFetcher { - public async getSfpowerscriptsProperties(packageContents: SfpPackage, packageLogger?: Logger) { - let destructiveChangesPath: string; - - if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) { - throw new Error('Project Config (sfdx-project.json) is null'); - } - - if (packageContents.packageDescriptor['destructiveChangePath']) { - destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath']; - packageContents.destructiveChangesPath = destructiveChangesPath; - } - - try { - if (destructiveChangesPath != null) { - packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8')); - } - } catch (error) { - throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest'); - } - return packageContents; - } -} diff --git a/packages/core/src/package/propertyFetchers/PropertyFetcher.ts b/packages/core/src/package/propertyFetchers/PropertyFetcher.ts deleted file mode 100644 index 49465d8c2..000000000 --- a/packages/core/src/package/propertyFetchers/PropertyFetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Logger } from '@dxatscale/sfp-logger'; -import SfpPackage from '../SfpPackage'; - -export default interface PropertyFetcher { - /** - * Retrieves property from packageDescriptor and adds its to SfpPackage by reference - * @param packageContents - * @param packageLogger - */ - getSfpowerscriptsProperties(packageContents: SfpPackage, packageLogger?: Logger); -} diff --git a/packages/core/src/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts b/packages/core/src/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts deleted file mode 100644 index 39920307a..000000000 --- a/packages/core/src/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; - -export default class ReconcilePropertyFetcher implements PropertyFetcher { - getSfpowerscriptsProperties(packageContents: SfpPackage, packageLogger?: any) { - if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) { - packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles; - } - } -} diff --git a/packages/core/src/package/validators/PackageEmptyChecker.ts b/packages/core/src/package/validators/PackageEmptyChecker.ts deleted file mode 100644 index 8d05ba782..000000000 --- a/packages/core/src/package/validators/PackageEmptyChecker.ts +++ /dev/null @@ -1,85 +0,0 @@ -import path from 'path'; -import { readFileSync, existsSync } from 'fs'; -import FileSystem from '../../utils/FileSystem'; -import ignore from 'ignore'; - -export default class PackageEmptyChecker { - public static isToBreakBuildForEmptyDirectory( - projectDir: string, - sourceDirectory: string, - isToBreakBuildIfEmpty: boolean - ): { - message: string; - result: string; - } { - let directoryToCheck; - let status: { message: string; result: string } = { - message: '', - result: '', - }; - - if (projectDir != null) { - directoryToCheck = path.join(projectDir, sourceDirectory); - } else directoryToCheck = sourceDirectory; - - try { - if (!existsSync(directoryToCheck)) { - //Folder do not exists, break build - if (isToBreakBuildIfEmpty) { - status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'break'; - } else { - status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'skip'; - } - return status; - } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) { - if (isToBreakBuildIfEmpty) { - status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'break'; - } else { - status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'skip'; - } - return status; - } else { - status.result = 'continue'; - return status; - } - } catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist - } else if (!isToBreakBuildIfEmpty) { - status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`; - status.result = 'skip'; - return status; - } else throw err; - } - } - - public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean { - let dirToCheck; - - if (projectDirectory != null) { - dirToCheck = path.join(projectDirectory, sourceDirectory); - } else { - dirToCheck = sourceDirectory; - } - - let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false); - // Include source directory in filepaths, as it can be a pattern in forceignore - files = files.map((file) => path.join(sourceDirectory, file)); - - let forceignorePath; - if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore'); - else forceignorePath = path.join(process.cwd(), '.forceignore'); - - // Ignore files that are listed in .forceignore - files = ignore() - .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'. - .filter(files); - - if (files == null || files.length === 0) return true; - else return false; - } -} diff --git a/packages/core/src/package/version/Package2VersionFetcher.ts b/packages/core/src/package/version/Package2VersionFetcher.ts deleted file mode 100644 index 879b84971..000000000 --- a/packages/core/src/package/version/Package2VersionFetcher.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import semver from 'semver'; - -/** - * Fetcher for second-generation package version in Dev Hub - */ -export default class Package2VersionFetcher { - private readonly query: string = - 'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version '; - - constructor(private conn: Connection) {} - - /** - * Fetch Package2 versions by Package2 Id - * Sorts by semantic version, in descending order - * @param package2Id - * @param versionNumber - * @param isValidatedPackages - * @returns - */ - async fetchByPackage2Id( - package2Id: string, - versionNumber?: string, - isValidatedPackages?: boolean - ): Promise { - let query = this.query; - - let whereClause: string = `where Package2Id='${package2Id}' `; - - if (versionNumber) { - // TODO: validate version number - const versions = versionNumber.split('.'); - - if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; - if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; - if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; - if (versions[3]) whereClause += `and BuildNumber=${versions[3]} `; - } - - if (isValidatedPackages) whereClause += `and ValidationSkipped = false `; - - whereClause += `and IsDeprecated = false `; - query += whereClause; - - - const records = await QueryHelper.query(query, this.conn, true); - - - if (records.length > 1) { - return records.sort((a, b) => { - const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`; - const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`; - return semver.rcompare(v1, v2); - }); - } else return records; - } - - async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise { - let query = this.query; - - let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`; - query += whereClause; - - const records = await QueryHelper.query(query, this.conn, true); - return records[0]; - } - - async fetchByPackageBranchAndName( - packageBranch: string, - packageName: string, - versionNumber?: string, - ): Promise { - - let query = this.query; - - let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `; - if (versionNumber) { - // TODO: validate version number - const versions = versionNumber.split('.'); - if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; - if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; - if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; - } - query += whereClause; - - let orderByClause: string = `order by CreatedDate desc`; - query += orderByClause; - - const records = await QueryHelper.query(query, this.conn, true); - return records; - - } -} - -export interface Package2Version { - SubscriberPackageVersionId: string; - Package2Id: string; - Package2: { Name: string }; - IsPasswordProtected: boolean; - IsReleased: boolean; - MajorVersion: number; - MinorVersion: number; - PatchVersion: number; - BuildNumber: number; - CodeCoverage: { apexCodeCoveragePercentage: number }; - HasPassedCodeCoverageCheck: boolean; - Branch: string; -} diff --git a/packages/core/src/package/version/Package2VersionInstaller.ts b/packages/core/src/package/version/Package2VersionInstaller.ts deleted file mode 100644 index 94c57a5a9..000000000 --- a/packages/core/src/package/version/Package2VersionInstaller.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class Package2VersionInstaller { - public constructor( - logger: Logger, - logLevel: LoggerLevel, - working_directory: string, - private targetUserName: string, - private packageId: string, - private waitTime: string, - private publishWaitTime?: string, - private installationkey?: string, - private securityType?: string, - private upgradeType?: string, - private apiVersion?: string, - private apexCompile: string = 'package' - ) {} - - public setInstallationKey(installationKey: string) { - this.installationkey = installationKey; - } - - - - -} diff --git a/packages/core/src/package/version/PackageVersionLister.ts b/packages/core/src/package/version/PackageVersionLister.ts deleted file mode 100644 index 9075d5292..000000000 --- a/packages/core/src/package/version/PackageVersionLister.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { SfProject } from '@salesforce/core'; -import { Package } from '@salesforce/packaging'; -import SFPOrg from '../../org/SFPOrg'; - -export default class PackageVersionLister { - - constructor(private hubOrg:SFPOrg) - { - - } - - public async listAllReleasedVersions(projectDir: string) { - - const sfProject = await SfProject.resolve(projectDir); - - const records = await Package.listVersions(this.hubOrg.getConnection(), sfProject, { - createdLastDays: undefined, - concise: true, - modifiedLastDays: undefined, - packages: [], - isReleased: true, - orderBy: undefined, - verbose: false, - }); - - const results: any[] = []; - - if (records?.length > 0) { - records.forEach((record) => { - results.push({ - Package2Id: record.Package2Id, - Branch: record.Branch, - Tag: record.Tag, - MajorVersion: record.MajorVersion, - MinorVersion: record.MinorVersion, - PatchVersion: record.PatchVersion, - BuildNumber: record.BuildNumber, - Id: record.Id, - SubscriberPackageVersionId: record.SubscriberPackageVersionId, - ConvertedFromVersionId: record.ConvertedFromVersionId, - Name: record.Name, - NamespacePrefix: record.Package2.NamespacePrefix, - Package2Name: record.Package2.Name, - Version: [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join( - '.' - ), - IsReleased: record.IsReleased, - CreatedDate: new Date(record.CreatedDate).toISOString().replace('T', ' ').substring(0, 16), - LastModifiedDate: new Date(record.LastModifiedDate) - .toISOString() - .replace('T', ' ') - .substring(0, 16), - ReleaseVersion: - record.ReleaseVersion == null ? '' : Number.parseFloat(record.ReleaseVersion).toFixed(1), - BuildDurationInSeconds: record.BuildDurationInSeconds == null ? '' : record.BuildDurationInSeconds, - }); - }); - } - - return results; - } -} diff --git a/packages/core/src/package/version/PackageVersionUpdater.ts b/packages/core/src/package/version/PackageVersionUpdater.ts deleted file mode 100644 index 55786d1b1..000000000 --- a/packages/core/src/package/version/PackageVersionUpdater.ts +++ /dev/null @@ -1,18 +0,0 @@ -import SfpPackage from '../SfpPackage'; - -export default class PackageVersionUpdater { - public constructor() {} - - public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string { - if (!sfpPackage.versionNumber) { - throw new Error('The package doesnt have a version attribute, Please check your definition'); - } else { - let segments = sfpPackage.versionNumber.split('.'); - let numberToBeAppended = parseInt(buildNumber); - - if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number'); - else segments[3] = buildNumber; - return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`; - } - } -} diff --git a/packages/core/src/permsets/AssignPermissionSets.ts b/packages/core/src/permsets/AssignPermissionSets.ts deleted file mode 100644 index b4d7e2255..000000000 --- a/packages/core/src/permsets/AssignPermissionSets.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Connection } from '@salesforce/core'; -import { Logger } from '@dxatscale/sfp-logger'; -import AssignPermissionSetsImpl from './AssignPermissionSetsImpl'; - -export default class AssignPermissionSets { - static async applyPermsets(permsets: string[], conn: Connection, sourceDirectory: string, logger: Logger) { - let assignPermissionSetsImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - conn, - permsets, - sourceDirectory, - logger - ); - - let results = await assignPermissionSetsImpl.exec(); - if (results.failedAssignments.length > 0) throw new Error('Unable to assign permsets'); - } -} diff --git a/packages/core/src/permsets/AssignPermissionSetsImpl.ts b/packages/core/src/permsets/AssignPermissionSetsImpl.ts deleted file mode 100644 index b8c7322ce..000000000 --- a/packages/core/src/permsets/AssignPermissionSetsImpl.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Connection } from '@salesforce/core'; -import child_process = require('child_process'); -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import PermissionSetFetcher from './PermissionSetFetcher'; -import { ZERO_BORDER_TABLE } from '../display/TableConstants'; -const Table = require('cli-table'); - -export default class AssignPermissionSetsImpl { - constructor( - private conn: Connection, - private permSets: string[], - private project_directory: string, - private packageLogger: Logger - ) {} - - public async exec(): Promise<{ - successfullAssignments: { - username: string; - permset: string; - }[]; - failedAssignments: { - username: string; - permset: string; - }[]; - }> { - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn); - let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment(); - - let failedAssignments: { - username: string; - permset: string; - }[] = []; - let successfullAssignments: { - username: string; - permset: string; - }[] = []; - - for (let permSet of this.permSets) { - let permSetAssignmentMatch = assignedPermSets.find((record) => { - return record.PermissionSet.Name === permSet; - }); - - if (permSetAssignmentMatch !== undefined) { - // Treat permsets that have already been assigned as successes - successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - continue; - } - - try { - let permsetAssignmentJson: string = child_process.execSync( - `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`, - { - cwd: this.project_directory, - encoding: 'utf8', - stdio: ['pipe', 'pipe', 'inherit'], - } - ); - - let permsetAssignment = JSON.parse(permsetAssignmentJson); - if (permsetAssignment.status === 0) - successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - } catch (err) { - failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - } - } - - if (successfullAssignments.length > 0) { - SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger); - this.printPermsetAssignments(successfullAssignments); - } - - if (failedAssignments.length > 0) { - SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger); - this.printPermsetAssignments(failedAssignments); - } - - return { successfullAssignments, failedAssignments }; - } - - private printPermsetAssignments(assignments: { username: string; permset: string }[]) { - let table = new Table({ - head: ['Username', 'Permission Set Assignment'], - chars: ZERO_BORDER_TABLE - }); - - assignments.forEach((assignment) => { - table.push([assignment.username, assignment.permset]); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger); - } -} diff --git a/packages/core/src/permsets/PermissionSetFetcher.ts b/packages/core/src/permsets/PermissionSetFetcher.ts deleted file mode 100644 index 5133d9958..000000000 --- a/packages/core/src/permsets/PermissionSetFetcher.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -/* - * Retrieve Permsets for a user from a target org - */ -export default class PermissionSetFetcher { - constructor(private username: string, private conn: Connection) {} - - public async fetchAllPermsetAssignment() { - const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`; - - return QueryHelper.query(query, this.conn, false); - } -} diff --git a/packages/core/src/permsets/PermissionSetGroupUpdateAwaiter.ts b/packages/core/src/permsets/PermissionSetGroupUpdateAwaiter.ts deleted file mode 100644 index daddae0b9..000000000 --- a/packages/core/src/permsets/PermissionSetGroupUpdateAwaiter.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Connection } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { delay } from '../utils/Delay'; - -const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`; - -export default class PermissionSetGroupUpdateAwaiter { - constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {} - - async waitTillAllPermissionSetGroupIsUpdated() { - SFPLogger.log( - `Checking status of permission sets group..`, - LoggerLevel.INFO, - this.logger - ); - while (true) { - try { - let records = await QueryHelper.query(psGroupQuery, this.connection, false); - if (records.length > 0) { - SFPLogger.log( - `Pausing deployment as ${records.length} PermissionSetGroups are being updated`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`, - LoggerLevel.INFO, - this.logger - ); - await delay(this.intervalBetweenRepeats); - } else { - SFPLogger.log( - `Proceeding with deployment, as no PermissionSetGroups are being updated`, - LoggerLevel.INFO, - this.logger - ); - break; - } - } catch (error) { - SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger); - throw error; - } - } - } -} diff --git a/packages/core/src/project/ProjectConfig.ts b/packages/core/src/project/ProjectConfig.ts deleted file mode 100644 index e9a03d559..000000000 --- a/packages/core/src/project/ProjectConfig.ts +++ /dev/null @@ -1,281 +0,0 @@ -const fs = require('fs-extra'); -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import _ from 'lodash'; -import { PackageType } from '../package/SfpPackage'; -let path = require('path'); - -/** - * Helper functions for retrieving info from project config - */ -export default class ProjectConfig { - /** - * Returns 0H Id of package from project config - * @param projectConfig - * @param sfdxPackage - */ - public static getPackageId(projectConfig: any, sfdxPackage: string) { - if (projectConfig['packageAliases']?.[sfdxPackage]) { - return projectConfig['packageAliases'][sfdxPackage]; - } else { - throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); - } - } - - /** - * Returns package names, as an array of strings - * @param projectDirectory - */ - public static getAllPackages(projectDirectory: string): string[] { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let sfdxpackages = []; - projectConfig['packageDirectories'].forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); - }); - return sfdxpackages; - } - - public static getAllExternalPackages( - projectConfig: any - ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] { - let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = []; - let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); - const packageAliases = projectConfig.packageAliases || {}; - Object.entries(packageAliases).forEach(([key, value]) => { - if ( - !_.find( - packagesInCurrentDirectory, - (elem) => { - return elem.package == key; - }, - 0 - ) - ) - externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string }); - }); - return externalPackages; - } - - /** - * Returns package names from projectConfig, as an array of strings - * @param projectDirectory - */ - public static getAllPackagesFromProjectConfig(projectConfig: any): string[] { - let sfdxpackages = []; - projectConfig.packageDirectories.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); - }); - return sfdxpackages; - } - - public static getAllPackagesAndItsDependencies( - projectConfig: any - ): Map { - let pkgWithDependencies = new Map(); - let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); - for (let pkg of packages) { - if (pkg.dependencies) { - pkgWithDependencies.set(pkg.package, pkg.dependencies); - } - } - return pkgWithDependencies; - } - - public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let sfdxpackages = []; - projectConfig.packageDirectories?.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); - }); - return sfdxpackages; - } - - public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] { - let sfdxpackages = []; - projectConfig.packageDirectories?.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); - }); - return sfdxpackages; - } - - /** - * Returns package manifest as JSON object - * @param projectDirectory - */ - public static getSFDXProjectConfig(projectDirectory: string): any { - let projectConfigJSON: string; - - if (projectDirectory) { - projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json'); - } else { - projectConfigJSON = 'sfdx-project.json'; - } - - try { - return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8')); - } catch (error) { - throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`); - } - } - - /** - * Returns type of package - * @param projectConfig - * @param sfdxPackage - */ - public static getPackageType( - projectConfig: any, - sfdxPackage: string - ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff { - let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); - - if (projectConfig['packageAliases']?.[sfdxPackage]) { - return PackageType.Unlocked; - } else { - if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data; - else if(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff - else - return PackageType.Source; - } - } - - /** - * Returns package descriptor from package manifest at project directory - * @param projectDirectory - * @param sfdxPackage - */ - public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - - let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); - - return sfdxPackageDescriptor; - } - - /** - * Returns package descriptor from project config JSON object - * @param sfdxPackage - * @param projectConfig - */ - public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) { - let sfdxPackageDescriptor: any; - - if (sfdxPackage) { - projectConfig['packageDirectories'].forEach((pkg) => { - if (sfdxPackage == pkg['package']) { - sfdxPackageDescriptor = pkg; - } - }); - } - - if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`); - - return sfdxPackageDescriptor; - } - - /** - * Returns descriptor of default package - * @param projectDirectory - */ - public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any { - let packageDirectory: string; - let sfdxPackageDescriptor: any; - - let projectConfig = this.getSFDXProjectConfig(projectDirectory); - - //Return the default package directory - projectConfig['packageDirectories'].forEach((pkg) => { - if (pkg['default'] == true) { - packageDirectory = pkg['path']; - sfdxPackageDescriptor = pkg; - } - }); - - if (packageDirectory == null) throw new Error('Package or package directory not exist'); - else return sfdxPackageDescriptor; - } - - /** - * Returns pruned package manifest, containing sfdxPackage only - * @param projectDirectory - * @param sfdxPackage - */ - public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any { - const projectConfig = this.getSFDXProjectConfig(projectDirectory); - - return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage); - } - - /** - * Returns pruned package manifest, containing sfdxPackage only - * @param projectConfig - * @param sfdxPackage - */ - public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any { - if (sfdxPackage) { - let i = projectConfig['packageDirectories'].length; - while (i--) { - if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) { - projectConfig['packageDirectories'].splice(i, 1); - } - } - } else { - let i = projectConfig['packageDirectories'].length; - while (i--) { - if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) { - projectConfig['packageDirectories'].splice(i, 1); - } - } - } - projectConfig['packageDirectories'][0]['default'] = true; //add default = true - return projectConfig; - } - - /** - * Returns pruned package manifest, containing sfdxPackages only - * @param projectConfig - * @param sfdxPackages - */ - public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any { - let revisedPackageDirectory = []; - let originalPackageDirectory = projectConfig['packageDirectories']; - for (let pkg of originalPackageDirectory) { - for (const sfdxPackage of sfdxPackages) { - if (pkg.name == sfdxPackage) { - pkg.default = false; - revisedPackageDirectory.push(pkg); - } - } - } - projectConfig['packageDirectories'][0]['default'] = true; //add default = true - projectConfig.packageDirectories = revisedPackageDirectory; - return projectConfig; - } - - /** - * Returns pruned package manifest, containing sfdxPackages only - * @param projectConfig - * @param sfdxPackages - */ - public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any { - const projectConfig = this.getSFDXProjectConfig(projectDirectory); - return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages); - } - - - - public static async updateProjectConfigWithDependencies( - projectConfig: any, - dependencyMap: Map - ) { - let updatedprojectConfig = await _.cloneDeep(projectConfig); - updatedprojectConfig.packageDirectories.map((pkg) => { - return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) }); - }); - - return updatedprojectConfig; - } -} diff --git a/packages/core/src/project/UserDefinedExternalDependency.ts b/packages/core/src/project/UserDefinedExternalDependency.ts deleted file mode 100644 index 64a8f2f75..000000000 --- a/packages/core/src/project/UserDefinedExternalDependency.ts +++ /dev/null @@ -1,61 +0,0 @@ -import SFPLogger from '@dxatscale/sfp-logger'; -import { Connection, LoggerLevel } from '@salesforce/core'; -import _ from 'lodash'; -import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver'; - -/** - * Functions to deal with externalDependencyMap supplied by the user - * to aid in resolving transitive dependencies - */ -export default class UserDefinedExternalDependencyMap { - - - public fetchDependencyEntries(projectConfig: any) { - if (projectConfig.plugins?.sfpowerscripts?.externalDependencyMap) { - let externalDependencyMap = projectConfig.plugins.sfpowerscripts.externalDependencyMap; - SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG); - return externalDependencyMap; - } - else - return {}; - } - - public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) { - let externalDependencies = []; - let updatedProjectConfig = await _.cloneDeep(projectConfig); - let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null); - - let externalDependencyMap = this.fetchDependencyEntries(projectConfig); - - let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); - - for (let externalPackage2 of externalPackage2s) { - externalDependencies.push(externalPackage2.name); - } - for (let dependency of externalDependencies) { - if (!Object.keys(externalDependencyMap).includes(dependency)) { - externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }]; - } - } - updatedProjectConfig.plugins.sfpowerscripts.externalDependencyMap = externalDependencyMap; - return updatedProjectConfig; - } - - public async cleanupEntries(projectConfig: any) { - let updatedProjectConfig = await _.cloneDeep(projectConfig); - if (updatedProjectConfig?.plugins?.sfpowerscripts?.externalDependencyMap) { - const externalDependencyMap = updatedProjectConfig.plugins.sfpowerscripts.externalDependencyMap; - for (let externalPackage of Object.keys(externalDependencyMap)) { - if (externalDependencyMap[externalPackage][0].package == '') { - delete externalDependencyMap[externalPackage]; - } else if ( - externalDependencyMap[externalPackage][0].package != '' && - externalDependencyMap[externalPackage][0].versionNumber == '' - ) { - delete externalDependencyMap[externalPackage][0].versionNumber; - } - } - } - return updatedProjectConfig; - } -} diff --git a/packages/core/src/queryHelper/ChunkCollection.ts b/packages/core/src/queryHelper/ChunkCollection.ts deleted file mode 100644 index c6a6c9b7d..000000000 --- a/packages/core/src/queryHelper/ChunkCollection.ts +++ /dev/null @@ -1,38 +0,0 @@ - - -/** - * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars) - * @param collection values in SOQL WHERE clause - * @param chunkSize default is 4000 - * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000 - */ -export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] { - const result: string[][] = []; - chunkSize = chunkSize - offset; - - let chunk: string[] = []; - let numberOfCharsInChunk: number = 0; - for (const elem of collection) { - if (elem.length + 2 > chunkSize) { - throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`); - } - - const commasAndQuotes = 2*(chunk.length+1) + chunk.length; - if (numberOfCharsInChunk + elem.length + commasAndQuotes <= chunkSize) { - chunk.push(elem); - numberOfCharsInChunk += elem.length; - } else { - result.push(chunk); - - // Create new chunk - chunk = []; - numberOfCharsInChunk = 0; - chunk.push(elem); - numberOfCharsInChunk += elem.length; - } - } - - result.push(chunk); - - return result; -} \ No newline at end of file diff --git a/packages/core/src/queryHelper/QueryHelper.ts b/packages/core/src/queryHelper/QueryHelper.ts deleted file mode 100644 index 9b077895c..000000000 --- a/packages/core/src/queryHelper/QueryHelper.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Connection } from '@salesforce/core'; - -const retry = require('async-retry'); - -export default class QueryHelper { - static async query(query: string, conn: Connection, isTooling: boolean): Promise { - return retry( - async (bail) => { - let records; - if (isTooling) records = (await conn.tooling.query(query)).records; - else records = (await conn.query(query)).records; - - return records; - }, - { retries: 3, minTimeout: 2000 } - ); - } -} diff --git a/packages/core/src/scratchorg/PasswordGenerator.ts b/packages/core/src/scratchorg/PasswordGenerator.ts deleted file mode 100644 index 785389967..000000000 --- a/packages/core/src/scratchorg/PasswordGenerator.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Connection, User, AuthInfo, LoggerLevel } from '@salesforce/core'; -import SFPLogger from '@dxatscale/sfp-logger'; - -export default class PasswordGenerator { - public async exec(userName: string) { - const query = `SELECT id FROM User WHERE username = '${userName}'`; - - const authInfo = await AuthInfo.create({ username: userName }); - const userConnection = await Connection.create({ authInfo: authInfo }); - let userRecord = (await userConnection.query(query)).records as any; - let passwordBuffer = User.generatePasswordUtf8(); - let pwd; - - await passwordBuffer.value(async (buffer: Buffer) => { - try { - pwd = buffer.toString('utf8'); - - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - // @ts-ignore TODO: expose `soap` on Connection however appropriate - const soap = userConnection.soap; - await soap.setPassword(userRecord[0].Id, pwd); - } catch (e) { - console.log(e); - pwd = undefined; - if (e.message === 'INSUFFICIENT_ACCESS: Cannot set password for self') { - SFPLogger.log( - `${e.message}. Incase of scratch org, Add "features": ["EnableSetPasswordInApi"] in your project-scratch-def.json then create your scratch org.`, - LoggerLevel.WARN - ); - } else { - SFPLogger.log(`${e.message}`, LoggerLevel.WARN); - } - } - }); - - return { - username: userName, - password: pwd, - }; - } -} diff --git a/packages/core/src/scratchorg/ScratchOrg.ts b/packages/core/src/scratchorg/ScratchOrg.ts deleted file mode 100644 index 8c700d757..000000000 --- a/packages/core/src/scratchorg/ScratchOrg.ts +++ /dev/null @@ -1,18 +0,0 @@ -export default interface ScratchOrg { - failureMessage?: string; - tag?: string; - recordId?: string; - orgId?: string; - loginURL?: string; - signupEmail?: string; - username?: string; - alias?: string; - password?: string; - isScriptExecuted?: boolean; - expiryDate?: string; - accessToken?: string; - instanceURL?: string; - status?: string; - sfdxAuthUrl?: string; - elapsedTime?:number -} diff --git a/packages/core/src/scratchorg/ScratchOrgOperator.ts b/packages/core/src/scratchorg/ScratchOrgOperator.ts deleted file mode 100644 index 0864e8cd2..000000000 --- a/packages/core/src/scratchorg/ScratchOrgOperator.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { AuthInfo, Org, StateAggregator } from '@salesforce/core'; -import ScratchOrg from './ScratchOrg'; -import PasswordGenerator from './PasswordGenerator'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import { Duration } from '@salesforce/kit'; -import { ScratchOrgRequest } from '@salesforce/core'; -import { COLOR_KEY_MESSAGE } from '@dxatscale/sfp-logger'; -import getFormattedTime from '../utils/GetFormattedTime'; -import SFPStatsSender from '../stats/SFPStatsSender'; -const retry = require('async-retry'); - -export default class ScratchOrgOperator { - constructor(private hubOrg: Org) {} - - public async create( - alias: string, - config_file_path: string, - expiry: number, - waitTime: number = 6 - ): Promise { - SFPLogger.log('Parameters: ' + alias + ' ' + config_file_path + ' ' + expiry + ' ', LoggerLevel.TRACE); - - let startTime = Date.now(); - SFPLogger.log(`Requesting Scratch Org ${alias}..`, LoggerLevel.INFO); - let scatchOrgResult = await this.requestAScratchOrg( - alias, - config_file_path, - Duration.days(expiry), - Duration.minutes(waitTime) - ); - SFPLogger.log(JSON.stringify(scatchOrgResult), LoggerLevel.TRACE); - - //create scratchOrg object - let scratchOrg: ScratchOrg = { - alias: alias, - orgId: scatchOrgResult.orgId, - username: scatchOrgResult.username, - loginURL: scatchOrgResult.loginURL, - elapsedTime: Date.now() - startTime, - }; - - try { - //Get Sfdx Auth URL - const authInfo = await AuthInfo.create({ username: scratchOrg.username }); - scratchOrg.sfdxAuthUrl = authInfo.getSfdxAuthUrl(); - } catch (error) { - throw new Error( - `Unable to set auth URL, Ignoring this scratch org, as its not suitable for pool due to ${error.message}` - ); - } - - //Generate Password - let passwordData = await new PasswordGenerator().exec(scratchOrg.username); - - scratchOrg.password = passwordData.password; - - if (!passwordData.password) { - throw new Error('Unable to setup password to scratch org'); - } else { - SFPLogger.log(`Password successfully set for ${scratchOrg.alias}`, LoggerLevel.DEBUG); - } - - SFPLogger.log( - `Creation request for Scratch Org ${scratchOrg.alias} is completed successfully in ${COLOR_KEY_MESSAGE( - getFormattedTime(scratchOrg.elapsedTime) - )}`, - LoggerLevel.INFO - ); - SFPStatsSender.logElapsedTime(`scratchorg.creation.time`,scratchOrg.elapsedTime) - return scratchOrg; - } - - public async delete(scratchOrgIds: string[]) { - let hubConn = this.hubOrg.getConnection(); - - await retry( - async (bail) => { - let result = await hubConn.del('ActiveScratchOrg', scratchOrgIds); - }, - { retries: 3, minTimeout: 3000 } - ); - } - - private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration) { - const createCommandOptions: ScratchOrgRequest = { - durationDays: expireIn.days, - nonamespace: false, - noancestors: false, - wait: waitTime, - retry: 3, - definitionfile: definitionFile, - }; - - const { username, scratchOrgInfo, authFields, warnings } = await this.hubOrg.scratchOrgCreate( - createCommandOptions - ); - - await this.setAliasForUsername(username, alias); - - return { - username: username, - loginURL: scratchOrgInfo.LoginUrl, - warnings, - orgId: authFields.orgId, - }; - } - - public async shareScratchOrgThroughEmail(emailId: string, scratchOrg: ScratchOrg) { - let hubOrgUserName = this.hubOrg.getUsername(); - let apiVersion = this.hubOrg.getConnection().retrieveMaxApiVersion(); - let body = `${hubOrgUserName} has fetched a new scratch org from the Scratch Org Pool!\n - All the post scratch org scripts have been succesfully completed in this org!\n - The Login url for this org is : ${scratchOrg.loginURL}\n - Username: ${scratchOrg.username}\n - Password: ${scratchOrg.password}\n - Please use sfdx force:auth:web:login -r ${scratchOrg.loginURL} -a command to authenticate against this Scratch org

- Thank you for using SFPLogger!`; - - const options = { - method: 'POST', - body: JSON.stringify({ - inputs: [ - { - emailBody: body, - emailAddresses: emailId, - emailSubject: `${hubOrgUserName} created you a new Salesforce org`, - senderType: 'CurrentUser', - }, - ], - }), - url: `/services/data/v${apiVersion}actions/standard/emailSimple`, - }; - - await retry( - async (bail) => { - await this.hubOrg.getConnection().requestPost(options.url, options.body); - }, - { retries: 3, minTimeout: 30000 } - ); - - SFPLogger.log(`Succesfully send email to ${emailId} for ${scratchOrg.username}`, LoggerLevel.INFO); - } - - private async setAliasForUsername(username: string, aliasToSet: string): Promise { - const stateAggregator = await StateAggregator.getInstance(); - stateAggregator.aliases.set(aliasToSet, { username: username }); - await stateAggregator.aliases.write(); - } -} diff --git a/packages/core/src/scratchorg/pool/ClientSourceTracking.ts b/packages/core/src/scratchorg/pool/ClientSourceTracking.ts deleted file mode 100644 index b0bad5b97..000000000 --- a/packages/core/src/scratchorg/pool/ClientSourceTracking.ts +++ /dev/null @@ -1,205 +0,0 @@ -const path = require('path'); -import * as fs from 'fs-extra'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { Connection, SfProject } from '@salesforce/core'; -import SFPOrg from '../../org/SFPOrg'; -import { SourceTracking } from '@salesforce/source-tracking'; -import ProjectConfig from '../../project/ProjectConfig'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import { EOL } from 'os'; -import { PackageType } from '../../package/SfpPackage'; -import Git from '../../git/Git'; - -const tmp = require('tmp'); - -export default class ClientSourceTracking { - private conn: Connection; - private org: SFPOrg; - private logger: Logger; - - private sfdxOrgIdDir; - - private constructor() {} - - static async create(conn: Connection, logger: Logger) { - const clientSourceTracking = new ClientSourceTracking(); - - clientSourceTracking.conn = conn; - - clientSourceTracking.org = await SFPOrg.create({ connection: clientSourceTracking.conn }); - clientSourceTracking.logger = logger; - - clientSourceTracking.sfdxOrgIdDir = `.sf/orgs/${clientSourceTracking.org.getOrgId()}`; - - return clientSourceTracking; - } - - async creatSourceTrackingFiles(): Promise { - await this.createRemoteSourceTracking(); - await this.createLocalSourceTracking(); - } - - private async createRemoteSourceTracking() { - const project = await SfProject.resolve(); - const tracking = await SourceTracking.create({ - org: this.org, - project: project, - }); - - tracking.resetRemoteTracking(); - } - - /** - * Create local source tracking from sfpowerscripts artifacts installed in scratch org - */ - private async createLocalSourceTracking() { - - let git; - try { - git = await Git.initiateRepoAtTempLocation(this.logger); - - const sfpowerscriptsArtifacts = await this.org.getInstalledArtifacts(); - - if(sfpowerscriptsArtifacts.length==0) - throw new Error(`Unable to find any artifacts in the org`); - - //clean up MPD to just one package, so that source tracking lib - //does do a full scan and break - this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), sfpowerscriptsArtifacts[0].Name); - - const project = await SfProject.resolve(git.getRepositoryPath()); - - // Create local source tracking files in temp repo - const tracking = await SourceTracking.create({ - org: this.org, - project: project, - }); - - - - SFPLogger.log( - `Total Artifacts to Analyze: ${sfpowerscriptsArtifacts.length}`, - LoggerLevel.INFO, - this.logger - ); - - let count = 1; - for (const artifact of sfpowerscriptsArtifacts) { - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log( - COLOR_HEADER(`Package ${count} of ${sfpowerscriptsArtifacts.length}`), - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log(`Analyzing package ${COLOR_KEY_MESSAGE(artifact.Name)}`, LoggerLevel.INFO, this.logger); - // Checkout version of source code from which artifact was created - await git.checkout(artifact.CommitId__c,true) - - SFPLogger.log( - `Version pushed while preparing this org is ${artifact.Version__c} with SHA ${artifact.CommitId__c}`, - LoggerLevel.INFO, - this.logger - ); - - //clean up MPD to per package, to speed up - this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), artifact.Name); - - const projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); - - try { - const packageType = ProjectConfig.getPackageType(projectConfig, artifact.Name); - if (packageType === PackageType.Unlocked || packageType === PackageType.Source) { - let componentSet = ComponentSet.fromSource( - path.join( - git.getRepositoryPath(), - ProjectConfig.getPackageDescriptorFromConfig(artifact.Name, projectConfig).path - ) - ); - let components = componentSet.getSourceComponents(); - - //Get all components in the directory - //Count for logging purposes. dont have to waste processing convering - //a lazy collection to array once again - let componentCount = 1; - let componentPaths: string[] = []; - for (const component of components) { - componentCount++; - componentPaths.push(component.xml); - if (component.content) componentPaths.push(component.content); - } - - await tracking.updateLocalTracking({ - files: componentPaths, - }); - SFPLogger.log( - `Updated source tracking for package: ${artifact.Name} with ${componentCount} items`, - LoggerLevel.INFO, - this.logger - ); - } else SFPLogger.log(`Encountered data package... skipping`, LoggerLevel.INFO, this.logger); - } catch (error) { - if(error.message.includes) - { - SFPLogger.log( - ` sfpowerscripts is unable to sync the package ${artifact.name}${EOL}, - as it not able to find the find equivalent git references`, - LoggerLevel.ERROR, - this.logger); - } - else - SFPLogger.log( - `Unable to update local source tracking due to ${error.message}`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log(`Skipping package.. ${artifact.Name}`, LoggerLevel.WARN, this.logger); - } - count++; - } - - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Copying the temporary repository over to original location`, LoggerLevel.INFO, this.logger); - // Copy source tracking files from temp repo to actual repo - fs.mkdirpSync(path.join(this.sfdxOrgIdDir, 'localSourceTracking')); - fs.copySync( - path.join(git.getRepositoryPath(), this.sfdxOrgIdDir, 'localSourceTracking'), - path.join(this.sfdxOrgIdDir, 'localSourceTracking') - ); - } catch (error) { - - if(error.message.includes(`reference is not a tree`)) - { - SFPLogger.log( - `sfpowerscripts is unable to sync this repository, - as it not able to find the matching git references${EOL} - Are you sure this pool was created from the same repository?`, - LoggerLevel.ERROR, - this.logger); - } - else - SFPLogger.log( - `Unable to update local source tracking due to ${error.message}`, - LoggerLevel.ERROR, - this.logger - ); - } finally { - if(git) - git.deleteTempoRepoIfAny(); - } - } - - private cleanupSFDXProjectJsonTonOnePackage(projectDir: string, packageName: string) { - try { - let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectDirectory(projectDir, packageName); - fs.writeJSONSync(path.join(projectDir, 'sfdx-project.json'), cleanedUpProjectManifest, { - spaces: 4, - }); - } catch (error) { - SFPLogger.log( - `sfdx-project.json not found/unable to write, skipping..` + error.message, - LoggerLevel.DEBUG, - this.logger - ); - } - } -} diff --git a/packages/core/src/scratchorg/pool/OrphanedOrgsDeleteImpl.ts b/packages/core/src/scratchorg/pool/OrphanedOrgsDeleteImpl.ts deleted file mode 100644 index 24f8078bd..000000000 --- a/packages/core/src/scratchorg/pool/OrphanedOrgsDeleteImpl.ts +++ /dev/null @@ -1,47 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class OrphanedOrgsDeleteImpl extends PoolBaseImpl { - public constructor(hubOrg: Org, private logger:Logger) { - super(hubOrg); - this.hubOrg = hubOrg; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getOrphanedScratchOrgs()) as any; - - let scratchOrgToDelete: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - let scrathOrgIds: string[] = []; - for (let element of results.records) { - if (element.Description?.includes(`"requestedBy":"sfpowerscripts"`)) { - let soDetail: ScratchOrg = {}; - soDetail.orgId = element.ScratchOrg; - soDetail.username = element.SignupUsername; - soDetail.status = 'recovered'; - scratchOrgToDelete.push(soDetail); - scrathOrgIds.push(`'${element.Id}'`); - } - } - - if (scrathOrgIds.length > 0) { - let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( - scrathOrgIds.join(',') - ); - - if (activeScrathOrgs.records.length > 0) { - for (let scratchOrg of activeScrathOrgs.records) { - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); - SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is recovered`,LoggerLevel.TRACE,this.logger); - } - } - } - } - - return scratchOrgToDelete; - } -} diff --git a/packages/core/src/scratchorg/pool/PoolBaseImpl.ts b/packages/core/src/scratchorg/pool/PoolBaseImpl.ts deleted file mode 100644 index ba7ef6c41..000000000 --- a/packages/core/src/scratchorg/pool/PoolBaseImpl.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Org } from '@salesforce/core'; -import { Result } from 'neverthrow'; -import ScratchOrg from '../ScratchOrg'; -import { PoolConfig } from './PoolConfig'; -import { PoolError } from './PoolError'; -import PreRequisiteCheck from './prequisitecheck/PreRequisiteCheck'; - -export abstract class PoolBaseImpl { - protected hubOrg: Org; - - constructor(hubOrg: Org) { - this.hubOrg = hubOrg; - } - - public async execute(): Promise|void> { - let prerequisiteCheck: PreRequisiteCheck = new PreRequisiteCheck(this.hubOrg); - await prerequisiteCheck.checkForPrerequisites(); - return this.onExec(); - } - - protected abstract onExec(): Promise|void>; -} diff --git a/packages/core/src/scratchorg/pool/PoolConfig.ts b/packages/core/src/scratchorg/pool/PoolConfig.ts deleted file mode 100644 index b18fc05f2..000000000 --- a/packages/core/src/scratchorg/pool/PoolConfig.ts +++ /dev/null @@ -1,40 +0,0 @@ -import ScratchOrg from '../ScratchOrg'; - -export interface PoolConfig { - tag: string; - maxAllocation: number; - waitTime?: number; - expiry?: number; - batchSize?: number; - configFilePath: string; - releaseConfigFile?:string; - succeedOnDeploymentErrors?: boolean; - keys?: string; - installAll: boolean; - enableSourceTracking: boolean; - relaxAllIPRanges?: boolean; - ipRangesToBeRelaxed?: []; - retryOnFailure?: boolean; - fetchArtifacts: { - artifactFetchScript?: string; - npm?: { - npmrcPath?: string; - scope: string; - }; - }; - disableSourcePackageOverride?:boolean; - snapshotPool?:string; - postDeploymentScriptPath: string; - preDependencyInstallationScriptPath: string; - enableVlocity?: boolean; - min_allocation?: number; - current_allocation?: number; - to_allocate?: number; - to_satisfy_min?: number; - to_satisfy_max?: number; - scratchOrgs?: ScratchOrg[]; - failedToCreate?: number; - maxRetryCount?:number; - - -} diff --git a/packages/core/src/scratchorg/pool/PoolCreateImpl.ts b/packages/core/src/scratchorg/pool/PoolCreateImpl.ts deleted file mode 100644 index f50df6b41..000000000 --- a/packages/core/src/scratchorg/pool/PoolCreateImpl.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { Org } from '@salesforce/core'; -import Bottleneck from 'bottleneck'; -import { PoolConfig } from './PoolConfig'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgLimitsFetcher from './services/fetchers/ScratchOrgLimitsFetcher'; -import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; -import * as rimraf from 'rimraf'; -import * as fs from 'fs-extra'; -import PoolJobExecutor, { ScriptExecutionResult } from './PoolJobExecutor'; -import { PoolError, PoolErrorCodes } from './PoolError'; -import SFPLogger, { COLOR_KEY_MESSAGE, LoggerLevel } from '@dxatscale/sfp-logger'; -import { Result, ok, err } from 'neverthrow'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import { EOL } from 'os'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; -import PoolFetchImpl from './PoolFetchImpl'; -import { COLOR_SUCCESS } from '@dxatscale/sfp-logger'; -import { COLOR_ERROR } from '@dxatscale/sfp-logger'; -import getFormattedTime from '../../utils/GetFormattedTime'; -import OrphanedOrgsDeleteImpl from './OrphanedOrgsDeleteImpl'; -import path from 'path'; - -export default class PoolCreateImpl extends PoolBaseImpl { - private limiter; - private scriptExecutorWrappedForBottleneck; - private limits: any; - private scratchOrgInfoFetcher: ScratchOrgInfoFetcher; - private scratchOrgInfoAssigner: ScratchOrgInfoAssigner; - private scratchOrgOperator: ScratchOrgOperator; - private totalToBeAllocated: number; - private totalAllocated: number = 0; - - public constructor( - hubOrg: Org, - private pool: PoolConfig, - private poolScriptExecutor: PoolJobExecutor, - private logLevel: LoggerLevel - ) { - super(hubOrg); - this.limiter = new Bottleneck({ - maxConcurrent: this.pool.batchSize, - }); - - this.scriptExecutorWrappedForBottleneck = this.limiter.wrap(this.scriptExecutor); - } - - protected async onExec(): Promise> { - await this.hubOrg.refreshAuth(); - - const scriptExecPromises: Array> = []; - - - //fetch current status limits - this.limits = await new ScratchOrgLimitsFetcher(this.hubOrg).getScratchOrgLimits(); - - //Create Service classes - this.scratchOrgInfoFetcher = new ScratchOrgInfoFetcher(this.hubOrg); - this.scratchOrgInfoAssigner = new ScratchOrgInfoAssigner(this.hubOrg); - - //Create Operator - this.scratchOrgOperator = new ScratchOrgOperator(this.hubOrg); - - // Setup Logging Directory - rimraf.sync('script_exec_outputs'); - fs.mkdirpSync('script_exec_outputs'); - - //Compute allocation - try { - if (!this.pool.snapshotPool) { - SFPLogger.log(COLOR_KEY_MESSAGE('Computing Allocation..'), LoggerLevel.INFO); - try { - this.totalToBeAllocated = await this.computeAllocation(); - } catch (error) { - return err({ - success: 0, - failed: 0, - message: `Unable to access fields on ScratchOrgInfo, Please check the profile being used`, - errorCode: PoolErrorCodes.PrerequisiteMissing, - }); - } - - if (this.totalToBeAllocated === 0) { - if (this.limits.ActiveScratchOrgs.Remaining > 0) { - return err({ - success: 0, - failed: 0, - message: `The tag provided ${this.pool.tag} is currently at the maximum capacity , No scratch orgs will be allocated`, - errorCode: PoolErrorCodes.Max_Capacity, - }); - } else { - return err({ - success: 0, - failed: 0, - message: `There is no capacity to create a pool at this time, Please try again later`, - errorCode: PoolErrorCodes.No_Capacity, - }); - } - } - - //Generate Scratch Orgs - this.pool.scratchOrgs = await this.generateScratchOrgs( - this.pool, - this.scratchOrgOperator, - this.scratchOrgInfoAssigner - ); - } else { - this.pool.scratchOrgs = await this.fetchScratchOrgsFromSnapshotPool( - this.pool, - this.scratchOrgInfoFetcher, - this.scratchOrgInfoAssigner - ); - } - } catch (error) { - return err({ - success: 0, - failed: this.pool.failedToCreate, - message: `All requested scratch orgs failed to provision, Please check your code or config \n Failed with ${error.message}`, - errorCode: PoolErrorCodes.UnableToProvisionAny, - }); - } - - // Assign workers to executed scripts - for (const scratchOrg of this.pool.scratchOrgs) { - const result = this.scriptExecutorWrappedForBottleneck(scratchOrg, this.hubOrg.getUsername()); - scriptExecPromises.push(result); - } - - await Promise.all(scriptExecPromises); - - this.pool = await this.finalizeGeneratedScratchOrgs( - this.pool, - this.scratchOrgOperator, - this.scratchOrgInfoFetcher - ); - - if (!this.pool.scratchOrgs || this.pool.scratchOrgs.length == 0) { - return err({ - success: 0, - failed: this.pool.failedToCreate, - message: `All requested scratch orgs failed to provision, Please check your code or config`, - errorCode: PoolErrorCodes.UnableToProvisionAny, - }); - } - return ok(this.pool); - - - } - - private async computeAllocation(): Promise { - //Compute current pool requirement - const activeCount = await this.scratchOrgInfoFetcher.getCountOfActiveScratchOrgsByTag(this.pool.tag); - return this.allocateScratchOrgsPerTag(this.limits.ActiveScratchOrgs.Remaining, activeCount, this.pool); - } - - private allocateScratchOrgsPerTag( - remainingScratchOrgs: number, - countOfActiveScratchOrgs: number, - pool: PoolConfig - ) { - pool.current_allocation = countOfActiveScratchOrgs; - pool.to_allocate = 0; - pool.to_satisfy_max = - pool.maxAllocation - pool.current_allocation > 0 ? pool.maxAllocation - pool.current_allocation : 0; - - if (pool.to_satisfy_max > 0 && pool.to_satisfy_max <= remainingScratchOrgs) { - pool.to_allocate = pool.to_satisfy_max; - } else if (pool.to_satisfy_max > 0 && pool.to_satisfy_max > remainingScratchOrgs) { - pool.to_allocate = remainingScratchOrgs; - } - - SFPLogger.log( - `${EOL}Current Allocation of ScratchOrgs in the pool ${this.pool.tag}: ` + pool.current_allocation, - LoggerLevel.INFO - ); - SFPLogger.log('Remaining Active scratchOrgs in the org: ' + remainingScratchOrgs, LoggerLevel.INFO); - SFPLogger.log('ScratchOrgs to be allocated: ' + pool.to_allocate, LoggerLevel.INFO); - return pool.to_allocate; - } - - private async generateScratchOrgs( - pool: PoolConfig, - scratchOrgOperator: ScratchOrgOperator, - scratchOrgInfoAssigner: ScratchOrgInfoAssigner - ) { - //Generate Scratch Orgs - SFPLogger.log(COLOR_KEY_MESSAGE('Generate Scratch Orgs..'), LoggerLevel.INFO); - - const scratchOrgPromises = new Array>(); - - const scratchOrgCreationLimiter = new Bottleneck({ - maxConcurrent: pool.batchSize, - }); - - addDescriptionToScratchOrg(pool); - - const startTime = Date.now(); - for (let i = 1; i <= pool.to_allocate; i++) { - const scratchOrgPromise: Promise = scratchOrgCreationLimiter.schedule(() => - scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime) - ); - scratchOrgPromises.push(scratchOrgPromise); - } - - SFPLogger.log(`Waiting for all scratch org request to complete, Please wait`); - //Wait for all orgs to be created - const scratchOrgCreationResults = await Promise.allSettled(scratchOrgPromises); - //Only worry about scrath orgs that have suceeded - const isFulfilled = (p: PromiseSettledResult): p is PromiseFulfilledResult => p.status === 'fulfilled'; - const isRejected = (p: PromiseSettledResult): p is PromiseRejectedResult => p.status === 'rejected'; - - let scratchOrgs = scratchOrgCreationResults.filter(isFulfilled).map((p) => p.value); - const rejectedScratchOrgs = scratchOrgCreationResults.filter(isRejected).map((p) => p.reason); - for (const reason of rejectedScratchOrgs) { - if (reason.message.includes(`The client has timed out`)) { - //Log how many we were able to create - const elapsedTime = Date.now() - startTime; - SFPLogger.log( - `A scratch org creation was rejected due to saleforce not responding within the set wait time of ${pool.waitTime} mins \n` + - `Time elasped so far ${COLOR_KEY_MESSAGE( - getFormattedTime(elapsedTime) - )},You might need to inrease the wait time further and rety ` - ); - } else SFPLogger.log(`A scratch org creation was rejected due to ${reason.message}`); - } - - //Log how many we were able to create - const elapsedTime = Date.now() - startTime; - SFPLogger.log( - `Created ${COLOR_SUCCESS(scratchOrgs.length)} of ${pool.to_allocate} successfully with ${COLOR_ERROR( - rejectedScratchOrgs.length - )} failures in ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` - ); - - SFPStatsSender.logElapsedTime(`pool.scratchorg.creation.time`, elapsedTime, { pool: pool.tag }); - if (scratchOrgs && scratchOrgs.length > 0) { - //Splice scratchorgs that are having incorrect status of deleted , Why salesforce why?? - let index = scratchOrgs.length; - while (index--) { - try { - const orgDetails = await new OrgDetailsFetcher(scratchOrgs[index].username).getOrgDetails(); - if (orgDetails.status === 'Deleted') { - throw new Error( - `Throwing away scratch org ${this.pool.scratchOrgs[index].alias} as it has a status of deleted` - ); - } - } catch (error) { - scratchOrgs.splice(index, 1); - } - } - - scratchOrgs = await this.scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); - - const scratchOrgInprogress = []; - - scratchOrgs.forEach((scratchOrg) => { - scratchOrgInprogress.push({ - Id: scratchOrg.recordId, - Pooltag__c: this.pool.tag, - Password__c: scratchOrg.password, - SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, - Allocation_status__c: 'In Progress', - }); - }); - - if (scratchOrgInprogress.length > 0) { - //set pool tag - await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); - } - return scratchOrgs; - } else throw new Error(`No scratch orgs were sucesfully generated`); - - function addDescriptionToScratchOrg(pool: PoolConfig) { - - const configClonePath = path.join('.sfpowerscripts','scratchorg-configs',`${ makeFileId(8)}.json`); - fs.mkdirpSync('.sfpowerscripts/scratchorg-configs'); - fs.copyFileSync(pool.configFilePath,configClonePath); - - const scratchOrgDefn = fs.readJSONSync(configClonePath); - if (!scratchOrgDefn.description) - scratchOrgDefn.description = JSON.stringify({ - requestedBy: 'sfpowerscripts', - pool: pool.tag, - requestedAt: new Date().toISOString(), - }); - else - scratchOrgDefn.description = scratchOrgDefn.description.concat( - ' ', - JSON.stringify({ - requestedBy: 'sfpowerscripts', - pool: pool.tag, - requestedAt: new Date().toISOString(), - }) - ); - fs.writeJSONSync(configClonePath, scratchOrgDefn, { spaces: 4 }); - pool.configFilePath = configClonePath; - } - - function makeFileId(length): string { - let result = ''; - const characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } - } - - private async fetchScratchOrgsFromSnapshotPool( - pool: PoolConfig, - scratchOrgInfoFetcher: ScratchOrgInfoFetcher, - scratchOrgInfoAssigner: ScratchOrgInfoAssigner - ) { - //Generate Scratch Orgs - SFPLogger.log( - COLOR_KEY_MESSAGE(`Fetching Scratch Orgs from snapshot pool ${this.pool.snapshotPool}`), - LoggerLevel.INFO - ); - - let scratchOrgs = (await new PoolFetchImpl( - this.hubOrg, - this.pool.snapshotPool, - false, - true, - undefined, - undefined, - undefined, - true, - this.pool.maxAllocation - ).execute()) as ScratchOrg[]; - scratchOrgs = await scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); - - const scratchOrgInprogress = []; - - if (scratchOrgs && scratchOrgs.length > 0) { - scratchOrgs.forEach((scratchOrg) => { - scratchOrgInprogress.push({ - Id: scratchOrg.recordId, - Pooltag__c: this.pool.tag, - Password__c: scratchOrg.password, - SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, - Allocation_status__c: 'In Progress', - }); - }); - - if (scratchOrgInprogress.length > 0) { - //set pool tag - await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); - } - return scratchOrgs; - } else { - throw new Error('No scratch orgs were found to be fetched'); - } - } - - private async finalizeGeneratedScratchOrgs( - pool: PoolConfig, - scratchOrgOperator: ScratchOrgOperator, - scratchOrgInfoFetcher: ScratchOrgInfoFetcher - ) { - pool.failedToCreate = 0; - for (let i = pool.scratchOrgs.length - 1; i >= 0; i--) { - const scratchOrg = pool.scratchOrgs[i]; - if (scratchOrg.isScriptExecuted) { - continue; - } - - SFPLogger.log( - `Failed to execute scripts for ${scratchOrg.username} with alias ${scratchOrg.alias} due to ${scratchOrg.failureMessage}`, - LoggerLevel.ERROR - ); - - try { - //Delete scratchorgs that failed to execute script - - const activeScratchOrgRecordId = await scratchOrgInfoFetcher.getActiveScratchOrgRecordIdGivenScratchOrg( - scratchOrg.orgId - ); - - await scratchOrgOperator.delete([activeScratchOrgRecordId]); - console.log(`Succesfully deleted scratchorg ${scratchOrg.username}`); - } catch (error) { - SFPLogger.log( - `Unable to delete the scratchorg ${scratchOrg.username}.. due to\n` + error, - LoggerLevel.ERROR - ); - } - - pool.failedToCreate += 1; - pool.scratchOrgs.splice(i, 1); - } - return pool; - } - - private async scriptExecutor(scratchOrg: ScratchOrg): Promise { - SFPLogger.log( - `Executing Preparation Job ${scratchOrg.alias} with username: ${scratchOrg.username}`, - LoggerLevel.INFO - ); - - const startTime = Date.now(); - const result = await this.poolScriptExecutor.execute(scratchOrg, this.hubOrg, this.logLevel); - - if (result.isOk()) { - scratchOrg.isScriptExecuted = true; - const submitInfoToPool = await this.scratchOrgInfoAssigner.setScratchOrgInfo({ - Id: scratchOrg.recordId, - Allocation_status__c: 'Available', - }); - if (!submitInfoToPool) { - scratchOrg.isScriptExecuted = false; - scratchOrg.failureMessage = 'Unable to set the scratch org record in Pool'; - SFPStatsSender.logCount('prepare.org.failed'); - } else { - SFPStatsSender.logCount('prepare.org.succeeded'); - } - - SFPStatsSender.logElapsedTime('prepare.org.singlejob.elapsed_time', Date.now() - startTime, { - poolname: this.pool.tag, - }); - } else { - scratchOrg.isScriptExecuted = false; - scratchOrg.failureMessage = result.error.message; - SFPStatsSender.logCount('prepare.org.failed'); - } - - return scratchOrg; - } -} diff --git a/packages/core/src/scratchorg/pool/PoolDeleteImpl.ts b/packages/core/src/scratchorg/pool/PoolDeleteImpl.ts deleted file mode 100644 index ecc496643..000000000 --- a/packages/core/src/scratchorg/pool/PoolDeleteImpl.ts +++ /dev/null @@ -1,65 +0,0 @@ -import SFPLogger from '@dxatscale/sfp-logger'; -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; -import { Logger } from '@dxatscale/sfp-logger'; -import { LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class PoolDeleteImpl extends PoolBaseImpl { - private tag: string; - private mypool: boolean; - private allScratchOrgs: boolean; - private inprogressonly: boolean; - - public constructor(hubOrg: Org, tag: string, mypool: boolean, allScratchOrgs: boolean, inprogressonly: boolean,private logger:Logger) { - super(hubOrg); - this.hubOrg = hubOrg; - this.tag = tag; - this.mypool = mypool; - this.allScratchOrgs = allScratchOrgs; - this.inprogressonly = inprogressonly; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - this.mypool, - !this.allScratchOrgs - )) as any; - - let scratchOrgToDelete: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - let scrathOrgIds: string[] = []; - for (let element of results.records) { - if (!this.inprogressonly || element.Allocation_status__c === 'In Progress') { - let soDetail: ScratchOrg = {}; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.expiryDate = element.ExpirationDate; - soDetail.status = 'Deleted'; - - scratchOrgToDelete.push(soDetail); - scrathOrgIds.push(`'${element.Id}'`); - } - } - - if (scrathOrgIds.length > 0) { - let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( - scrathOrgIds.join(',') - ); - - if (activeScrathOrgs.records.length > 0) { - for (let scratchOrg of activeScrathOrgs.records) { - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); - SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is deleted successfully`,LoggerLevel.TRACE,this.logger); - } - } - } - } - - return scratchOrgToDelete; - } -} diff --git a/packages/core/src/scratchorg/pool/PoolError.ts b/packages/core/src/scratchorg/pool/PoolError.ts deleted file mode 100644 index 820346576..000000000 --- a/packages/core/src/scratchorg/pool/PoolError.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface PoolError { - success: number; - failed: number; - errorCode: PoolErrorCodes; - message?: string; -} - -export enum PoolErrorCodes { - Max_Capacity = 'MaxCapacity', - No_Capacity = 'NoCapacity', - PrerequisiteMissing = 'PrerequisitesMissing', - UnableToProvisionAny = 'UnableToProvisionAny', -} diff --git a/packages/core/src/scratchorg/pool/PoolFetchImpl.ts b/packages/core/src/scratchorg/pool/PoolFetchImpl.ts deleted file mode 100644 index 654a1d3a1..000000000 --- a/packages/core/src/scratchorg/pool/PoolFetchImpl.ts +++ /dev/null @@ -1,244 +0,0 @@ -import SFPLogger from '@dxatscale/sfp-logger'; -import { AuthInfo, LoggerLevel, Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import { getUserEmail } from './services/fetchers/GetUserEmail'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; -import ClientSourceTracking from './ClientSourceTracking'; -import isValidSfdxAuthUrl from './prequisitecheck/IsValidSfdxAuthUrl'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class PoolFetchImpl extends PoolBaseImpl { - private tag: string; - private mypool: boolean; - private sendToUser: string; - private alias: string; - private setdefaultusername: boolean; - private authURLEnabledScratchOrg: boolean; - private isSourceTrackingToBeSet: boolean = false; - - public constructor( - hubOrg: Org, - tag: string, - mypool: boolean, - authURLEnabledScratchOrg: boolean, - sendToUser?: string, - alias?: string, - setdefaultusername?: boolean, - private fetchAllScratchOrgs?: boolean, - private limitBy?:number - ) { - super(hubOrg); - this.tag = tag; - this.mypool = mypool; - this.authURLEnabledScratchOrg = authURLEnabledScratchOrg; - this.sendToUser = sendToUser; - this.alias = alias; - this.setdefaultusername = setdefaultusername; - } - - public setSourceTrackingOnFetch() { - this.isSourceTrackingToBeSet = true; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - this.mypool, - true - )) as any; - - let availableSo = []; - if (results.records.length > 0) { - availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); - } - if (availableSo.length == 0) { - throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); - } - - if (this.fetchAllScratchOrgs) { - return this.fetchAllScratchOrg(availableSo,this.limitBy); - } else return this.fetchSingleScratchOrg(availableSo); - } - - private async fetchAllScratchOrg(availableSo: any[],limitBy?:number): Promise { - let fetchedSOs: ScratchOrg[] = []; - - if (availableSo.length > 0) { - SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); - - let count = 1; - for (let element of availableSo) { - if (this.authURLEnabledScratchOrg) { - if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { - SFPLogger.log( - `Iterating through pool to find a scratch org with valid authURL`, - LoggerLevel.TRACE - ); - continue; - } - } - - - - SFPLogger.log( - `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, - LoggerLevel.TRACE - ); - let soDetail: any = {}; - soDetail['Id'] = element.Id; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; - soDetail.status = 'Available'; - soDetail.alias = `SO` + count; - fetchedSOs.push(soDetail); - - - if(limitBy && count==limitBy) - break; - - count++; - } - } - - for (const soDetail of fetchedSOs) { - //Login to the org - let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); - if (!isLoginSuccessFull) { - SFPLogger.log(`Unable to login to scratchorg ${soDetail.username}}`, LoggerLevel.ERROR); - fetchedSOs = fetchedSOs.filter((item) => item.username !== soDetail.username); - } - } - - return fetchedSOs; - } - - private async fetchSingleScratchOrg(availableSo: any[]): Promise { - let soDetail: ScratchOrg; - - if (availableSo.length > 0) { - SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); - - for (let element of availableSo) { - if (this.authURLEnabledScratchOrg) { - if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { - SFPLogger.log( - `Iterating through pool to find a scratch org with valid authURL`, - LoggerLevel.TRACE - ); - continue; - } - } - - let allocateSO = await new ScratchOrgInfoAssigner(this.hubOrg).setScratchOrgInfo({ - Id: element.Id, - Allocation_status__c: 'Allocate', - }); - if (allocateSO === true) { - SFPLogger.log( - `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, - LoggerLevel.TRACE - ); - soDetail = {}; - soDetail['Id'] = element.Id; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; - soDetail.status = 'Assigned'; - - break; - } else { - SFPLogger.log( - `Scratch org ${element.SignupUsername} allocation failed. trying to get another Scratch org from ${this.tag} pool`, - LoggerLevel.TRACE - ); - } - } - } - - if (availableSo.length == 0 || !soDetail) { - throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); - } - - if (this.sendToUser) { - //Fetch the email for user id - let emailId; - try { - emailId = await getUserEmail(this.sendToUser, this.hubOrg); - } catch (error) { - SFPLogger.log( - 'Unable to fetch details of the specified user, Check whether the user exists in the org ', - LoggerLevel.ERROR - ); - throw new Error('Failed to fetch user details'); - } - - try { - //Send an email for username - await new ScratchOrgOperator(this.hubOrg).shareScratchOrgThroughEmail(emailId, soDetail); - } catch (error) { - SFPLogger.log( - 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org', - LoggerLevel.ERROR - ); - throw new Error( - 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org' - ); - } - } else { - //Login to the org - let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); - //Attempt to Fetch Source Tracking Files and silently continue if it fails - if (isLoginSuccessFull && this.isSourceTrackingToBeSet) { - try { - const conn = (await Org.create({ aliasOrUsername: soDetail.username })).getConnection(); - const clientSourceTracking = await ClientSourceTracking.create(conn, null); - await clientSourceTracking.creatSourceTrackingFiles(); - } catch (error) { - SFPLogger.log('Retriveing Source Tracking skipped.. ' + error.message, LoggerLevel.TRACE); - } - } - } - return soDetail; - } - - private async loginToScratchOrgIfSfdxAuthURLExists(soDetail: ScratchOrg): Promise { - try { - if (soDetail.sfdxAuthUrl && isValidSfdxAuthUrl(soDetail.sfdxAuthUrl)) { - - - const oauth2Options = AuthInfo.parseSfdxAuthUrl(soDetail.sfdxAuthUrl); - const authInfo = await AuthInfo.create({ oauth2Options }); - await authInfo.save({...authInfo.getFields(),isScratch:true,devHubUsername:this.hubOrg.getUsername(),expirationDate:soDetail.expiryDate}); - - await authInfo.handleAliasAndDefaultSettings({ - alias: this.alias?this.alias:soDetail.alias, - setDefault: true, - setDefaultDevHub: false, - }); - - const result = authInfo.getFields(true); - // ensure the clientSecret field... even if it is empty - // as per https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/auth/sfdxurl/store.ts - result.clientSecret = result.clientSecret ?? ''; - await AuthInfo.identifyPossibleScratchOrgs(result, authInfo); - - return true; - } else { - SFPLogger.log('Unable to autenticate to the scratch org', LoggerLevel.INFO); - return false; - } - } catch (error) { - SFPLogger.log('Unable to autenticate to the scratch org due ' + error.message, LoggerLevel.ERROR); - return false; - } - } -} diff --git a/packages/core/src/scratchorg/pool/PoolJobExecutor.ts b/packages/core/src/scratchorg/pool/PoolJobExecutor.ts deleted file mode 100644 index 79786a790..000000000 --- a/packages/core/src/scratchorg/pool/PoolJobExecutor.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolConfig } from './PoolConfig'; -import ScratchOrg from '../ScratchOrg'; -import { Result } from 'neverthrow'; -import * as fs from 'fs-extra'; -import { EOL } from 'os'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; - -export default abstract class PoolJobExecutor { - protected logToFilePath: string; - - constructor(protected pool: PoolConfig) {} - - async execute( - scratchOrg: ScratchOrg, - hubOrg: Org, - logLevel: LoggerLevel - ): Promise> { - this.logToFilePath = `.sfpowerscripts/prepare_logs/${scratchOrg.alias}.log`; - //Create file logger - fs.outputFileSync(this.logToFilePath, `sfpowerscripts--log${EOL}`); - SFPLogger.log(`Preparation Log files for ${scratchOrg.username} written to ${this.logToFilePath}`); - return this.executeJob(scratchOrg, hubOrg, this.logToFilePath, logLevel); - } - - abstract executeJob( - scratchOrg: ScratchOrg, - hubOrg: Org, - logToFilePath: string, - logLevel: LoggerLevel - ): Promise>; -} - -export interface ScriptExecutionResult { - scratchOrgUsername: string; -} - -export interface JobError { - message: string; - scratchOrgUsername: string; -} diff --git a/packages/core/src/scratchorg/pool/PoolListImpl.ts b/packages/core/src/scratchorg/pool/PoolListImpl.ts deleted file mode 100644 index bf5ad0d64..000000000 --- a/packages/core/src/scratchorg/pool/PoolListImpl.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; - -export default class PoolListImpl extends PoolBaseImpl { - private tag: string; - private allScratchOrgs: boolean; - - public constructor(hubOrg: Org, tag: string, allScratchOrgs: boolean) { - super(hubOrg); - this.hubOrg = hubOrg; - this.tag = tag; - this.allScratchOrgs = allScratchOrgs; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - null, - !this.allScratchOrgs - )) as any; - - let scratchOrgList: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - for (let element of results.records) { - let soDetail: ScratchOrg = {}; - soDetail.tag = element.Pooltag__c; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - if (element.Allocation_status__c === 'Assigned') { - soDetail.status = 'In use'; - } else if (element.Allocation_status__c === 'Available') { - soDetail.status = 'Available'; - } else { - soDetail.status = 'Provisioning in progress'; - } - - scratchOrgList.push(soDetail); - } - } - - return scratchOrgList; - } -} diff --git a/packages/core/src/scratchorg/pool/PoolOrgDeleteImpl.ts b/packages/core/src/scratchorg/pool/PoolOrgDeleteImpl.ts deleted file mode 100644 index 435d6fac7..000000000 --- a/packages/core/src/scratchorg/pool/PoolOrgDeleteImpl.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class PoolOrgDeleteImpl extends PoolBaseImpl { - username: string; - - public constructor(hubOrg: Org, username: string) { - super(hubOrg); - this.hubOrg = hubOrg; - this.username = username; - } - - protected async onExec(): Promise { - try { - let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgIdGivenUserName(this.username); - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrgId); - } catch (err) { - throw new Error( - `Either the scratch org doesn't exist or you do not have the correct permissions, Failed with ` + - err.message - ); - } - } -} diff --git a/packages/core/src/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts b/packages/core/src/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts deleted file mode 100644 index 9cd50260a..000000000 --- a/packages/core/src/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts +++ /dev/null @@ -1,19 +0,0 @@ -export default function isValidSfdxAuthUrl(sfdxAuthUrl: string): boolean { - if (sfdxAuthUrl.match(/force:\/\/(?[a-zA-Z0-9._]+)@.+/)) { - return true; - } else { - let match = sfdxAuthUrl.match( - /force:\/\/(?[a-zA-Z0-9._=]+):(?[a-zA-Z0-9]*):(?[a-zA-Z0-9._=]+)@.+/ - ); - - if (match !== null) { - if (match.groups.refreshToken === 'undefined') { - return false; - } else { - return true; - } - } else { - return false; - } - } -} diff --git a/packages/core/src/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts b/packages/core/src/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts deleted file mode 100644 index a08d9db81..000000000 --- a/packages/core/src/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Org } from '@salesforce/core'; -const retry = require('async-retry'); -import { Result, ok, err } from 'neverthrow'; -import { PoolConfig } from '../PoolConfig'; -import { PoolError, PoolErrorCodes } from '../PoolError'; - -export default class PreRequisiteCheck { - private static isPrerequisiteChecked: boolean = false; - private static isPrerequisiteMet = false; - private static describeResult; - - private hubOrg: Org; - - constructor(hubOrg: Org) { - this.hubOrg = hubOrg; - } - - public async checkForPrerequisites(): Promise { - let sfdxAuthUrlFieldExists = false; - let conn = this.hubOrg.getConnection(); - let expectedValues = ['In Progress', 'Available', 'Allocate', 'Assigned','Return']; - let availableValues: string[] = []; - if (!PreRequisiteCheck.isPrerequisiteChecked) { - await retry( - async (bail) => { - PreRequisiteCheck.describeResult = await conn.sobject('ScratchOrgInfo').describe(); - if (PreRequisiteCheck.describeResult) { - for (const field of PreRequisiteCheck.describeResult.fields) { - if (field.name === 'SfdxAuthUrl__c') { - sfdxAuthUrlFieldExists = true; - } - - if (field.name === 'Allocation_status__c' && field.picklistValues.length >= 4) { - for (let picklistValue of field.picklistValues) { - if (picklistValue.active) { - availableValues.push(picklistValue.value); - } - } - } - } - } - }, - { retries: 3, minTimeout: 30000 } - ); - - PreRequisiteCheck.isPrerequisiteChecked = true; - //If there are values returned, its not compatible - let statusValuesAvailable = - expectedValues.filter((item) => { - return !availableValues.includes(item); - }).length <= 1 - ? true - : false; - - if (sfdxAuthUrlFieldExists && statusValuesAvailable) PreRequisiteCheck.isPrerequisiteMet = true; - } - - if (!PreRequisiteCheck.isPrerequisiteMet) { - throw new Error( `Required Prerequisite values in ScratchOrgInfo is missing in the DevHub` + - `For more information Please refer https://sfpowerscripts.dxatscale.io/getting-started/prerequisites \n`); - } - } -} diff --git a/packages/core/src/scratchorg/pool/services/fetchers/GetUserEmail.ts b/packages/core/src/scratchorg/pool/services/fetchers/GetUserEmail.ts deleted file mode 100644 index 397b46ea6..000000000 --- a/packages/core/src/scratchorg/pool/services/fetchers/GetUserEmail.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LoggerLevel, Org } from '@salesforce/core'; - -let retry = require('async-retry'); -import SFPLogger from '@dxatscale/sfp-logger'; - -export async function getUserEmail(username: string, hubOrg: Org) { - let hubConn = hubOrg.getConnection(); - - return retry( - async (bail) => { - if (!username) { - bail(new Error('username cannot be null. provide a valid username')); - return; - } - let query = `SELECT email FROM user WHERE username='${username}'`; - - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - - if (results.records.size < 1) { - bail(new Error(`No user found with username ${username} in devhub.`)); - return; - } - return results.records[0].Email; - }, - { retries: 3, minTimeout: 3000 } - ); -} diff --git a/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts b/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts deleted file mode 100644 index 112fcbc67..000000000 --- a/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts +++ /dev/null @@ -1,187 +0,0 @@ -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; -import { Org } from '@salesforce/core'; -import ScratchOrg from '../../../ScratchOrg'; -const retry = require('async-retry'); -const ORDER_BY_FILTER = ' ORDER BY CreatedDate DESC'; - -export default class ScratchOrgInfoFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgRecordId(scratchOrgs: ScratchOrg[]) { - if (scratchOrgs == undefined || scratchOrgs.length == 0) return; - - let hubConn = this.hubOrg.getConnection(); - - let scratchOrgIds = scratchOrgs - .map(function (scratchOrg) { - scratchOrg.orgId = scratchOrg.orgId.slice(0, 15); - return `'${scratchOrg.orgId}'`; - }) - .join(','); - - let query = `SELECT Id, ScratchOrg FROM ScratchOrgInfo WHERE ScratchOrg IN ( ${scratchOrgIds} )`; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - - return retry( - async (bail) => { - const results = (await hubConn.query(query)) as any; - let resultAsObject = this.arrayToObject(results.records, 'ScratchOrg'); - - SFPLogger.log(JSON.stringify(resultAsObject), LoggerLevel.TRACE); - - scratchOrgs.forEach((scratchOrg) => { - scratchOrg.recordId = resultAsObject[scratchOrg.orgId]['Id']; - }); - - return scratchOrgs; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getScratchOrgsByTag(tag: string, isMyPool: boolean, unAssigned: boolean) { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query; - - if (tag) - query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - else - query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c != null AND Status = 'Active' `; - - if (isMyPool) { - query = query + ` AND createdby.username = '${this.hubOrg.getUsername()}' `; - } - if (unAssigned) { - // if new version compatible get Available / In progress - query = - query + `AND ( Allocation_status__c ='Available' OR Allocation_status__c = 'In Progress' ) `; - } - query = query + ORDER_BY_FILTER; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getOrphanedScratchOrgs() { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query; - query = `SELECT Id, Pooltag__c, SignupUsername, Description, ScratchOrg FROM ScratchOrgInfo WHERE Pooltag__c = null AND Status = 'Active'`; - query = query + ORDER_BY_FILTER; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgsByInfoId(scrathOrgIds: string) { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, SignupUsername FROM ActiveScratchOrg WHERE ScratchOrgInfoId IN (${scrathOrgIds}) `; - - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getCountOfActiveScratchOrgsByTag(tag: string): Promise { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - SFPLogger.log('RESULT:' + JSON.stringify(results), LoggerLevel.TRACE); - return results.totalSize; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getCountOfActiveScratchOrgsByTagAndUsername(tag: string): Promise { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results.totalSize; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgRecordIdGivenScratchOrg(scratchOrgId: string): Promise { - let hubConn = this.hubOrg.getConnection(); - return retry( - async (bail) => { - let query = `SELECT Id FROM ActiveScratchOrg WHERE ScratchOrg = '${scratchOrgId}'`; - let records = (await hubConn.query(query)).records; - - SFPLogger.log('Retrieve Active ScratchOrg Id:' + JSON.stringify(records), LoggerLevel.TRACE); - return records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgRecordsAsMapByUser(hubOrg: Org) { - let conn = this.hubOrg.getConnection(); - let query = - 'SELECT count(id) In_Use, SignupEmail FROM ActiveScratchOrg GROUP BY SignupEmail ORDER BY count(id) DESC'; - const results = (await conn.query(query)) as any; - SFPLogger.log(`Info Fetched: ${JSON.stringify(results)}`, LoggerLevel.DEBUG); - - let scratchOrgRecordAsMapByUser = this.arrayToObject(results.records, 'SignupEmail'); - return scratchOrgRecordAsMapByUser; - } - - public async getScratchOrgIdGivenUserName(username: string) { - let conn = this.hubOrg.getConnection(); - let query = `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername = '${username}'`; - return retry( - async (bail) => { - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await conn.query(query)) as any; - return results.records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getScratchOrgInfoIdGivenUserName(username: string) { - let conn = this.hubOrg.getConnection(); - let query = `SELECT Id FROM ScratchOrgInfo WHERE SignupUsername = '${username}'`; - return retry( - async (bail) => { - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await conn.query(query)) as any; - return results.records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - private arrayToObject = (array, keyfield) => - array.reduce((obj, item) => { - obj[item[keyfield]] = item; - return obj; - }, {}); -} diff --git a/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts b/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts deleted file mode 100644 index d8d54a45e..000000000 --- a/packages/core/src/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Org } from '@salesforce/core'; - -export default class ScratchOrgLimitsFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgLimits(): Promise { - let conn = this.hubOrg.getConnection(); - let apiVersion = await conn.retrieveMaxApiVersion(); - let query_uri = `${conn.instanceUrl}/services/data/v${apiVersion}/limits`; - const result = await conn.request(query_uri); - return result; - } -} diff --git a/packages/core/src/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts b/packages/core/src/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts deleted file mode 100644 index b45d8d0a3..000000000 --- a/packages/core/src/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { LoggerLevel, Org } from '@salesforce/core'; -let retry = require('async-retry'); -import SFPLogger from '@dxatscale/sfp-logger'; -import ScratchOrgInfoFetcher from '../fetchers/ScratchOrgInfoFetcher'; -import ObjectCRUDHelper from '../../../../utils/ObjectCRUDHelper'; - -export default class ScratchOrgInfoAssigner { - constructor(private hubOrg: Org) {} - - public async setScratchOrgInfo(soInfo: any): Promise { - let hubConn = this.hubOrg.getConnection(); - let result = await ObjectCRUDHelper.updateRecord(hubConn,'ScratchOrgInfo',soInfo); - if(result) return true; - } - - public async setScratchOrgStatus(username: string, status: 'Allocate' | 'InProgress' | 'Return'): Promise { - let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgInfoIdGivenUserName(username); - - return this.setScratchOrgInfo({ - Id: scratchOrgId, - Allocation_status__c: status, - }); - } -} diff --git a/packages/core/src/scriptExecutor/ScriptExecutorHelpers.ts b/packages/core/src/scriptExecutor/ScriptExecutorHelpers.ts deleted file mode 100644 index 7cd66415b..000000000 --- a/packages/core/src/scriptExecutor/ScriptExecutorHelpers.ts +++ /dev/null @@ -1,19 +0,0 @@ -import ExecuteCommand from '@dxatscale/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import defaultShell from '../utils/DefaultShell'; - -export default class scriptExecutorHelpers { - static async executeScript(logger: Logger, ...args: string[]) { - let cmd: string; - let argStr =args.join(' '); - if (process.platform !== 'win32') { - cmd = `${defaultShell()} -e ${argStr}`; - } else { - cmd = `cmd.exe /c ${argStr}`; - } - - SFPLogger.log(`Executing command.. ${cmd}`,LoggerLevel.INFO,logger); - let scriptExecutor: ExecuteCommand = new ExecuteCommand(logger, LoggerLevel.INFO, true); - let result = await scriptExecutor.execCommand(cmd, null); - } - } diff --git a/packages/core/src/sfdmuwrapper/SFDMURunImpl.ts b/packages/core/src/sfdmuwrapper/SFDMURunImpl.ts deleted file mode 100644 index 3c44ed4fd..000000000 --- a/packages/core/src/sfdmuwrapper/SFDMURunImpl.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class SFDMURunImpl extends SFDXCommand { - public constructor( - working_directory: string, - target_org: string, - private targetOrgDomain: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, working_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'sf sfdmu run'; - } - getCommandName(): string { - return 'sfdmu run'; - } - - getGeneratedParams(): string { - let command = `--path ${this.packageDirectory} -s csvfile -u ${this.target_org} --noprompt --canmodify ${this.targetOrgDomain}`; - if (this.logLevel) command += ` --loglevel ${LoggerLevel[this.logLevel]}`; - return command; - } -} diff --git a/packages/core/src/stats/NativeMetricSender.ts b/packages/core/src/stats/NativeMetricSender.ts deleted file mode 100644 index bd08c59f8..000000000 --- a/packages/core/src/stats/NativeMetricSender.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Logger } from '@dxatscale/sfp-logger'; - -export abstract class NativeMetricSender { - constructor(protected logger: Logger) {} - - abstract initialize(apiHost: string, apiKey: string): void; - - abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void; - - abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void; - - protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] { - if (tags != null && !Array.isArray(tags)) { - let transformedTagArray: string[] = []; - for (const [key, value] of Object.entries(tags)) { - transformedTagArray.push(`${key}:${value}`); - } - return transformedTagArray; - } - return tags as string[]; - } -} diff --git a/packages/core/src/stats/SFPStatsSender.ts b/packages/core/src/stats/SFPStatsSender.ts deleted file mode 100644 index 629f57d27..000000000 --- a/packages/core/src/stats/SFPStatsSender.ts +++ /dev/null @@ -1,114 +0,0 @@ -import StatsDClient, { ClientOptions, StatsD } from 'hot-shots'; -import * as fs from 'fs-extra'; -import { EOL } from 'os'; -import { NativeMetricSender } from './NativeMetricSender'; -import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender'; -import { Logger } from '@dxatscale/sfp-logger'; -import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender'; -import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender'; - -export default class SFPStatsSender { - private static client: StatsD; - private static metricsLogger; - private static nativeMetricsSender: NativeMetricSender; - - static initialize(port: string, host: string, protocol: string) { - let options: ClientOptions = { - host: host, - port: port == null ? 8125 : Number(port), - protocol: protocol == 'tcp' ? 'tcp' : 'udp', - prefix: 'sfpowerscripts.', - }; - SFPStatsSender.client = new StatsDClient(options); - } - - static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) { - switch (type) { - case 'DataDog': - this.nativeMetricsSender = new DataDogMetricsSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - case 'NewRelic': - this.nativeMetricsSender = new NewRelicMetricSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - case 'Splunk': - this.nativeMetricsSender = new SplunkMetricSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - default: - throw new Error('Invalid Metric Type'); - } - } - - static initializeLogBasedMetrics() { - try { - fs.mkdirpSync('.sfpowerscripts/logs'); - SFPStatsSender.metricsLogger = `.sfpowerscripts/logs/metrics.log`; - } catch (error) { - console.log('Unable to initiate Log based metrics', error); - } - } - - static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags); - - //Native Datadog integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags); - } - - let metrics = { - metric: `sfpowerscripts.${metric}`, - type: `timers`, - value: elapsedMilliSeconds, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags); - - //Native Metrics integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags); - } - - let metrics = { - metric: `sfpowerscripts.${metric}`, - type: `guage`, - value: value, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logCount(metric: string, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags); - - //Native Metrics integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags); - } - - let metrics = { - metric: `sfpowerscripts.${metric}`, - type: `count`, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logMetrics(key: any, logger?: any) { - if (logger) { - fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8'); - } - } -} diff --git a/packages/core/src/stats/nativeMetricSenderImpl/DataDogMetricSender.ts b/packages/core/src/stats/nativeMetricSenderImpl/DataDogMetricSender.ts deleted file mode 100644 index c2d0bf892..000000000 --- a/packages/core/src/stats/nativeMetricSenderImpl/DataDogMetricSender.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { BufferedMetricsLogger } from 'datadog-metrics'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { NativeMetricSender } from '../NativeMetricSender'; - -export class DataDogMetricsSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private nativeDataDogMetricsLogger: BufferedMetricsLogger; - - public initialize(apiHost: string, apiKey: string) { - try { - this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({ - apiHost: apiHost, - apiKey: apiKey, - prefix: 'sfpowerscripts.', - flushIntervalSeconds: 0, - }); - } catch (error) { - SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger); - } - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - try { - let transformedTags = this.transformTagsToStringArray(tags); - this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags); - this.nativeDataDogMetricsLogger.flush(); - } catch (error) { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.TRACE, - this.logger - ); - } - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - try { - let transformedTags = this.transformTagsToStringArray(tags); - this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags); - this.nativeDataDogMetricsLogger.flush(); - } catch (error) { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.TRACE, - this.logger - ); - } - } -} diff --git a/packages/core/src/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts b/packages/core/src/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts deleted file mode 100644 index ff43eaaf8..000000000 --- a/packages/core/src/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { NativeMetricSender } from '../NativeMetricSender'; -import { telemetry } from '@newrelic/telemetry-sdk'; -import { - CountMetric, - GaugeMetric, - MetricBatch, - MetricClient, -} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export class NewRelicMetricSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private nrMetricClient: telemetry.metrics.MetricClient; - - //Ignore API Host, as newrelic sdk doesnt need it - public initialize(apiHost: string, apiKey: string) { - try { - this.nrMetricClient = new MetricClient({ apiKey: apiKey }); - } catch (error) { - SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - metric = `sfpowerscripts.${metric}`; - const guageMetric = new GaugeMetric(metric, value); - guageMetric.attributes = tags as { [key: string]: string }; - const batch = new MetricBatch({}, Date.now(), 1); - batch.addMetric(guageMetric); - this.nrMetricClient.send(batch, (error, response, body) => { - if (response) { - SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); - } - if (error) - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - metric = `sfpowerscripts.${metric}`; - const countMetric = new CountMetric(metric); - countMetric.record(1); - countMetric.attributes = tags as { [key: string]: string }; - const batch = new MetricBatch({}, Date.now(), 1); - batch.addMetric(countMetric); - - this.nrMetricClient.send(batch, (error, response, body) => { - if (response) { - SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); - } - if (error) - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } -} diff --git a/packages/core/src/stats/nativeMetricSenderImpl/SplunkMetricSender.ts b/packages/core/src/stats/nativeMetricSenderImpl/SplunkMetricSender.ts deleted file mode 100644 index 1c163c076..000000000 --- a/packages/core/src/stats/nativeMetricSenderImpl/SplunkMetricSender.ts +++ /dev/null @@ -1,49 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; -import { NativeMetricSender } from '../NativeMetricSender'; -import axios ,{AxiosInstance} from 'axios'; - - - -export class SplunkMetricSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private instance: AxiosInstance; - - public initialize(apiHost: string, apiKey: string) { - this.instance = axios.create({ - baseURL: apiHost, - headers: {'Authorization': apiKey, 'Content-Type': 'application/json'} - }); - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - metric = `sfpowerscripts.${metric}`; - const payload = {source: "sfpowerscripts",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}}; - this.instance.post('', JSON.stringify(payload)) - .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) - .catch((error) => { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - metric = `sfpowerscripts.${metric}`; - const payload = {source: "sfpowerscripts",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}}; - this.instance.post('', JSON.stringify(payload)) - .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) - .catch((error) => { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } -} - diff --git a/packages/core/src/utils/AliasList.ts b/packages/core/src/utils/AliasList.ts deleted file mode 100644 index f7d41dbb3..000000000 --- a/packages/core/src/utils/AliasList.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { StateAggregator } from '@salesforce/core'; - - -export async function convertAliasToUsername(alias: string) { - const stateAggregator = await StateAggregator.getInstance(); - await stateAggregator.orgs.readAll(); - return await stateAggregator.aliases.resolveUsername(alias) -} - -export async function convertUsernameToAlias(username: string) { - - const stateAggregator = await StateAggregator.getInstance(); - await stateAggregator.orgs.readAll(); - return await stateAggregator.aliases.resolveAlias(username) - -} diff --git a/packages/core/src/utils/ChunkArray.ts b/packages/core/src/utils/ChunkArray.ts deleted file mode 100644 index 7cd6fa0d8..000000000 --- a/packages/core/src/utils/ChunkArray.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function chunkArray(perChunk: number, inputArray: any[]): Array { - let chunks = [], - i = 0, - n = inputArray.length; - - while (i < n) { - chunks.push(inputArray.slice(i, (i += perChunk))); - } - - return chunks; -} diff --git a/packages/core/src/utils/DefaultShell.ts b/packages/core/src/utils/DefaultShell.ts deleted file mode 100644 index 63a1ddf8f..000000000 --- a/packages/core/src/utils/DefaultShell.ts +++ /dev/null @@ -1,7 +0,0 @@ -const SFPOWERSCRIPTS_DEFAULT_SHELL = `sh`; - -export default function defaultShell(): string { - return process.env.SFPOWERSCRIPTS_DEFAULT_SHELL - ? process.env.SFPOWERSCRIPTS_DEFAULT_SHELL - : SFPOWERSCRIPTS_DEFAULT_SHELL; -} diff --git a/packages/core/src/utils/Delay.ts b/packages/core/src/utils/Delay.ts deleted file mode 100644 index 80eb87107..000000000 --- a/packages/core/src/utils/Delay.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function delay(ms: number = 0) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/packages/core/src/utils/FileSystem.ts b/packages/core/src/utils/FileSystem.ts deleted file mode 100644 index d77a7744d..000000000 --- a/packages/core/src/utils/FileSystem.ts +++ /dev/null @@ -1,52 +0,0 @@ -import fs = require('fs-extra'); -import path = require('path'); - -export default class FileSystem { - /** - * List nested files within a directory - * @param directory - * @param includeDirectories - * @returns - */ - static readdirRecursive( - searchDirectory: string, - includeDirectories: boolean = false, - isAbsolute: boolean = false - ): string[] { - const result: string[] = []; - - if (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`); - - (function readdirRecursiveHandler(directory: string): void { - const files: string[] = fs.readdirSync(directory); - - files.forEach((file) => { - let filepath: string; - if (isAbsolute) { - filepath = path.resolve(directory, file); - } else { - filepath = path.join(directory, file); - } - - if (fs.lstatSync(filepath).isDirectory()) { - if (includeDirectories) { - if (isAbsolute) { - result.push(path.resolve(filepath)); - } else { - result.push(path.relative(searchDirectory, filepath)); - } - } - readdirRecursiveHandler(filepath); - } else { - if (isAbsolute) { - result.push(path.resolve(filepath)); - } else { - result.push(path.relative(searchDirectory, filepath)); - } - } - }); - })(searchDirectory); - - return result; - } -} diff --git a/packages/core/src/utils/Fileutils.ts b/packages/core/src/utils/Fileutils.ts deleted file mode 100644 index b121332b0..000000000 --- a/packages/core/src/utils/Fileutils.ts +++ /dev/null @@ -1,204 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const _ = require('lodash'); -const os = require('os'); - -const SEP = /\/|\\/; - -export const PLUGIN_CACHE_FOLDER = 'sfpowerkit'; - -export default class FileUtils { - /** - * Delete file or directories recursively from the project - * @param deletedComponents Files or directories to delete - */ - public static deleteComponents(deletedComponents: string[]) { - deletedComponents.forEach((component) => { - if (fs.existsSync(component)) { - if (fs.lstatSync(component).isDirectory()) { - FileUtils.deleteFolderRecursive(component); - } else { - fs.unlinkSync(component); - } - } - }); - } - /** - * Load all files from the given folder with the given extension - * @param folder the folder from which files wille be loaded - * @param extension File extension to load. - */ - public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] { - let result: string[] = []; - let pathExists = fs.existsSync(folder); - let folderName = path.basename(folder); - if (!pathExists) { - console.log('Folder does not exist:', folderName); - return result; - } - let content: string[] = fs.readdirSync(folder); - content.forEach((file) => { - let curFile = path.join(folder, file); - let stats = fs.statSync(curFile); - if (stats.isFile()) { - if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') { - result.push(curFile); - } - } else if (stats.isDirectory()) { - let files: string[] = this.getAllFilesSync(curFile, extension); - result = _.concat(result, files); - } - }); - return result; - } - - public static getGlobalCacheDir() { - let homedir = os.homedir(); - let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; - if (!fs.existsSync(configDir)) { - console.log('Config folder does not exists, Creating Folder'); - fs.mkdirSync(configDir); - } - - return configDir; - } - - /** - * Get the cache path for the given cache file name - * @param fileName - */ - public static getGlobalCachePath(fileName: string) { - let homedir = os.homedir(); - let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; - if (!fs.existsSync(configDir)) { - console.log('Config folder does not exists, Creating Folder'); - fs.mkdirSync(configDir); - } - return configDir + path.sep + fileName; - } - - /** - * Create a folder path recursively - * @param targetDir - * @param param1 - */ - public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) { - const sep = path.sep; - const initDir = path.isAbsolute(targetDir) ? sep : ''; - const baseDir = isRelativeToScript ? __dirname : '.'; - - targetDir.split(sep).reduce((parentDir, childDir) => { - const curDir = path.resolve(baseDir, parentDir, childDir); - try { - fs.mkdirSync(curDir); - } catch (err) { - if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') { - throw err; - } - } - return curDir; - }, initDir); - } - /** - * Get the file name withoud extension - * @param filePath file path - * @param extension extension - */ - public static getFileNameWithoutExtension(filePath: string, extension?: string): string { - let fileParts = filePath.split(SEP); - let fileName = fileParts[fileParts.length - 1]; - if (extension) { - fileName = fileName.substr(0, fileName.lastIndexOf(extension)); - } else { - fileName = fileName.substr(0, fileName.indexOf('.')); - } - return fileName; - } - - /** - * Copu folder recursively - * @param src source folder to copy - * @param dest destination folder - */ - public static copyRecursiveSync(src, dest) { - let exists = fs.existsSync(src); - if (exists) { - let stats = fs.statSync(src); - let isDirectory = stats.isDirectory(); - if (isDirectory) { - exists = fs.existsSync(dest); - if (!exists) { - fs.mkdirSync(dest); - } - fs.readdirSync(src).forEach(function (childItemName) { - FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); - }); - } else { - fs.copyFileSync(src, dest); - } - } - } - /** - * Get path to a given folder base on the parent folder - * @param src Parent folder - * @param foldername folder to build the path to - */ - public static getFolderPath(src, foldername) { - let exists = fs.existsSync(src); - let toReturn = ''; - if (exists) { - let stats = fs.statSync(src); - let isDirectory = stats.isDirectory(); - if (isDirectory) { - let childs = fs.readdirSync(src); - for (let i = 0; i < childs.length; i++) { - let childItemName = childs[i]; - if (childItemName === foldername) { - toReturn = path.join(src, childItemName); - } else { - let childStat = fs.statSync(path.join(src, childItemName)); - if (childStat.isDirectory()) { - toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername); - } - } - if (toReturn !== '') { - break; - } - } - } - } - return toReturn; - } - - /** - * Delete a folder and its content recursively - * @param folder folder to delete - */ - public static deleteFolderRecursive(folder) { - if (fs.existsSync(folder)) { - fs.readdirSync(folder).forEach(function (file, index) { - let curPath = path.join(folder, file); - if (fs.lstatSync(curPath).isDirectory()) { - // recurse - //console.log("Delete recursively"); - FileUtils.deleteFolderRecursive(curPath); - } else { - // delete file - //console.log("Delete file "+ curPath); - fs.unlinkSync(curPath); - } - }); - //console.log("delete folder "+ folder); - fs.rmdirSync(folder); - } - } - public static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/core/src/utils/GetFormattedTime.ts b/packages/core/src/utils/GetFormattedTime.ts deleted file mode 100644 index 0c4fd9057..000000000 --- a/packages/core/src/utils/GetFormattedTime.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default function getFormattedTime(milliseconds: number): string { - let date = new Date(0); - date.setMilliseconds(milliseconds); - let timeString = date.toISOString().substr(11, 12); - return timeString; -} diff --git a/packages/core/src/utils/ObjectCRUDHelper.ts b/packages/core/src/utils/ObjectCRUDHelper.ts deleted file mode 100644 index e4db23cc5..000000000 --- a/packages/core/src/utils/ObjectCRUDHelper.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Connection } from '@salesforce/core'; -import { Record, SaveResult } from 'jsforce'; -import { isArray } from 'lodash'; - -const retry = require('async-retry'); - -export default class ObjectCRUDHelper { - static async updateRecord(conn: Connection, sObject: string, record: Record): Promise { - return retry( - async (bail) => { - let result = await conn.update(sObject, record); - if (isArray(result)) { - let isAllRecordsSucceeded = true; - for (const individualResult of result as SaveResult[]) { - if (!individualResult.success) { - isAllRecordsSucceeded = false; - } - } - if (isAllRecordsSucceeded) return 'All records updated'; - else throw new Error('Some records have been failed to update'); - } else if ((result as SaveResult).success) return (result as SaveResult).id; - else bail(); - }, - { retries: 3, minTimeout: 2000 } - ); - } - - static async createRecord(conn: Connection, sObject: string, record: Record): Promise { - return retry( - async (bail) => { - let result = await conn.create(sObject, record); - if (result.success) return result.id; - else bail(); - }, - { retries: 3, minTimeout: 2000 } - ); - } -} diff --git a/packages/core/src/utils/OnExit.ts b/packages/core/src/utils/OnExit.ts deleted file mode 100644 index 5daeff556..000000000 --- a/packages/core/src/utils/OnExit.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ChildProcess } from 'child_process'; - -export async function onExit(childProcess: ChildProcess, message?: string): Promise<{}> { - return new Promise((resolve, reject) => { - childProcess.once('close', (code: number, signal: string) => { - if (code === 0 || (code === null && signal === 'SIGTERM')) { - resolve(undefined); - } else { - reject(new Error(message ? message : `Exit with error code ${code}`)); - } - }); - - childProcess.once('error', (err: Error) => { - reject(new Error(message ? message : err.message)); - }); - }); -} diff --git a/packages/core/src/utils/RandomId.ts b/packages/core/src/utils/RandomId.ts deleted file mode 100644 index 36d0d7272..000000000 --- a/packages/core/src/utils/RandomId.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function makeRandomId(length): string { - let result = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} diff --git a/packages/core/src/utils/VersionNumberConverter.ts b/packages/core/src/utils/VersionNumberConverter.ts deleted file mode 100644 index b86c233eb..000000000 --- a/packages/core/src/utils/VersionNumberConverter.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Converts build-number dot delimeter to hyphen - * If dot delimeter does not exist, returns input - * @param version - */ -export default function convertBuildNumDotDelimToHyphen(version: string) { - let convertedVersion = version; - - let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version); - if (version[indexOfBuildNumDelimiter] === '.') { - convertedVersion = - version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1); - } - return convertedVersion; -} - -/** - * Get the index of the build-number delimeter - * Returns null if unable to find index of delimeter - * @param version - */ -function getIndexOfBuildNumDelimeter(version: string) { - let numOfDelimetersTraversed: number = 0; - for (let i = 0; i < version.length; i++) { - if (!Number.isInteger(parseInt(version[i], 10))) { - numOfDelimetersTraversed++; - } - if (numOfDelimetersTraversed === 3) { - return i; - } - } - return null; -} diff --git a/packages/core/src/utils/extractDomainFromUrl.ts b/packages/core/src/utils/extractDomainFromUrl.ts deleted file mode 100644 index 1f7844797..000000000 --- a/packages/core/src/utils/extractDomainFromUrl.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Extracts domain name from full URL string - * @param url - * @returns - */ -export default function extractDomainFromUrl(url: string): string { - if (!url) return url; - const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); - return matches && matches[1]; -} diff --git a/packages/core/src/utils/xml2json.ts b/packages/core/src/utils/xml2json.ts deleted file mode 100644 index 9fdeb2d78..000000000 --- a/packages/core/src/utils/xml2json.ts +++ /dev/null @@ -1,10 +0,0 @@ -const xmlParser = require('xml2js').Parser({ explicitArray: false }); - -export default function xml2json(xml) { - return new Promise((resolve, reject) => { - xmlParser.parseString(xml, function (err, json) { - if (err) reject(err); - else resolve(json); - }); - }); -} diff --git a/packages/core/src/vlocitywrapper/VlocityInitialInstall.ts b/packages/core/src/vlocitywrapper/VlocityInitialInstall.ts deleted file mode 100644 index 19c2ef9cb..000000000 --- a/packages/core/src/vlocitywrapper/VlocityInitialInstall.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class VlocityInitialInstall extends SFDXCommand { - public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packUpdateSettings'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} --nojob installVlocityInitial`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/core/src/vlocitywrapper/VlocityPackDeployImpl.ts b/packages/core/src/vlocitywrapper/VlocityPackDeployImpl.ts deleted file mode 100644 index bd411c6a9..000000000 --- a/packages/core/src/vlocitywrapper/VlocityPackDeployImpl.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'path'; -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class VlocityPackDeployImpl extends SFDXCommand { - public constructor( - project_directory: string, - target_org: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packDeploy'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} -job ${path.join( - this.packageDirectory, - 'VlocityComponents.yaml' - )} packDeploy`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/core/src/vlocitywrapper/VlocityPackUpdateSettings.ts b/packages/core/src/vlocitywrapper/VlocityPackUpdateSettings.ts deleted file mode 100644 index d09c5101d..000000000 --- a/packages/core/src/vlocitywrapper/VlocityPackUpdateSettings.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class VlocityPackUpdateSettings extends SFDXCommand { - public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packUpdateSettings'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} --nojob packUpdateSettings`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/core/src/vlocitywrapper/VlocityRefreshBase.ts b/packages/core/src/vlocitywrapper/VlocityRefreshBase.ts deleted file mode 100644 index 9deae7966..000000000 --- a/packages/core/src/vlocitywrapper/VlocityRefreshBase.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'path'; -import { SFDXCommand } from '@dxatscale/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; - -export default class VlocityRefreshBase extends SFDXCommand { - public constructor( - project_directory: string, - target_org: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:refreshVlocityBase'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} -job ${path.join( - this.packageDirectory, - 'VlocityComponents.yaml' - )} refreshVlocityBase`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/core/tests/apextest/ApexTestSuite.test.ts b/packages/core/tests/apextest/ApexTestSuite.test.ts deleted file mode 100644 index d3192e4fd..000000000 --- a/packages/core/tests/apextest/ApexTestSuite.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { jest, expect } from '@jest/globals'; -const fs = require('fs-extra'); -import ApexTestSuite from '../../src/apextest/ApexTestSuite'; -import * as globSync from 'glob'; - - - -describe('Provided an apex test suite from a source directory', () => { - it('should return all the apexclasses', () => { - - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/test.testSuite-meta.xml'); - }); - - - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - - - AccountAccountRelationTriggerTest - AccountContactRelationTriggerTest - AccountTeamMemberTriggerTest - AccountTriggerTest - ContactTriggerTest - - `; - }); - - let resultTestClasses = new Array(); - resultTestClasses.push(`AccountAccountRelationTriggerTest`); - resultTestClasses.push(`AccountContactRelationTriggerTest`); - resultTestClasses.push(`AccountTeamMemberTriggerTest`); - resultTestClasses.push(`AccountTriggerTest`); - resultTestClasses.push(`ContactTriggerTest`); - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); - }); - - it('should throw an error if apex test suite is not avaiable in the directory', async () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return []; - }); - - - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - - expect(apexTestSuite.getConstituentClasses()).rejects.toThrowError(); - }); - - it('should return apexclass even if there is only one', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/test.testSuite-meta.xml');; - }); - - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - - - AccountAccountRelationTriggerTest - - `; - }); - - let resultTestClasses = new Array(); - resultTestClasses.push(`AccountAccountRelationTriggerTest`); - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); - }); -}); diff --git a/packages/core/tests/artifacts/ArtifactsFromFileSystem.test.ts b/packages/core/tests/artifacts/ArtifactsFromFileSystem.test.ts deleted file mode 100644 index 374ae8145..000000000 --- a/packages/core/tests/artifacts/ArtifactsFromFileSystem.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import ArtifactFetcher from '../../src/artifacts/ArtifactFetcher'; -import * as globSync from 'glob'; - -describe('Provided a path to the artifacts folder containing sfpowerscripts artifact', () => { - it('should return all the artifacts, if a package name is not provided', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return [ - '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', - '/path/to/core2_sfpowerscripts_artifact_1.0.0-2.zip', - '/path/to/core3_sfpowerscripts_artifact_1.0.0-3.zip', - '/path/to/my-package_sfpowerscripts_artifact_3.30.53-NEXT.tgz' - ]; - }); - - - let artifacts = ArtifactFetcher.findArtifacts('artifacts'); - expect(artifacts).toEqual( - [ - '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', - '/path/to/core2_sfpowerscripts_artifact_1.0.0-2.zip', - '/path/to/core3_sfpowerscripts_artifact_1.0.0-3.zip', - '/path/to/my-package_sfpowerscripts_artifact_3.30.53-NEXT.tgz' - ] - ); - }); - - it('provided only one artifact exists for a package and a package name is provided, it should just return the one artifact', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip'); - }); - - let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip')); - }); - - it('provided multiple artifacts of the same package exists and a package name is provied, it should return the latest', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return [ - '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', - '/path/to/core_sfpowerscripts_artifact_1.0.0-3.zip', - '/path/to/core_sfpowerscripts_artifact_1.0.0-4.zip', - '/path/to/core_sfpowerscripts_artifact_1.0.0-5.tgz' - ]; - }); - let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-5.tgz')); - }); -}); diff --git a/packages/core/tests/coverage/IndividualClassCoverage.test.ts b/packages/core/tests/coverage/IndividualClassCoverage.test.ts deleted file mode 100644 index 6337b484b..000000000 --- a/packages/core/tests/coverage/IndividualClassCoverage.test.ts +++ /dev/null @@ -1,167 +0,0 @@ -import IndividualClassCoverage from '../../src/apex/coverage/IndividualClassCoverage'; -import { expect } from '@jest/globals'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; - -describe('Given a test coverage report', () => { - it('should be able to get a list of all classes and its test coverage', () => { - let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( - testCoverage, - new ConsoleLogger() - ); - let expectedValue = [ - { name: 'CustomerServices', coveredPercent: 87 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'ReservationManagerController', coveredPercent: 72 }, - { name: 'ReservationManager', coveredPercent: 93 }, - ]; - expect(individualClasCoverage.getIndividualClassCoverage()).toEqual(expectedValue); - }); - - it('given a coverage threshold, provide a list of classes that do not satisfy the threshold', () => { - let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( - testCoverage, - new ConsoleLogger() - ); - let validationResult = individualClasCoverage.validateIndividualClassCoverage( - individualClasCoverage.getIndividualClassCoverage(), - 75 - ); - expect(validationResult.classesWithInvalidCoverage).toContainEqual({ - name: 'ReservationManagerController', - coveredPercent: 72, - }); - }); -}); - -let testCoverage = [ - { - id: '01p0w000001qr8HAAQ', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87, - }, - { - id: '01p0w000001qr8JAAQ', - name: 'MarketServices', - totalLines: 3, - lines: { - '3': 1, - '4': 1, - '16': 1, - }, - totalCovered: 3, - coveredPercent: 100, - }, - { - id: '01p0w000001qr8NAAQ', - name: 'ReservationManagerController', - totalLines: 32, - lines: { - '4': 1, - '7': 1, - '8': 1, - '17': 1, - '22': 1, - '23': 1, - '25': 1, - '26': 1, - '27': 1, - '28': 1, - '29': 1, - '30': 1, - '31': 1, - '32': 1, - '33': 1, - '34': 1, - '35': 1, - '36': 1, - '37': 1, - '39': 1, - '41': 1, - '42': 0, - '43': 0, - '44': 0, - '45': 0, - '46': 0, - '47': 0, - '48': 0, - '50': 0, - '52': 0, - '56': 1, - '57': 1, - }, - totalCovered: 23, - coveredPercent: 72, - }, - { - id: '01p0w000001qr8MAAQ', - name: 'ReservationManager', - totalLines: 28, - lines: { - '3': 1, - '6': 1, - '7': 1, - '8': 1, - '9': 1, - '10': 1, - '12': 1, - '13': 1, - '15': 1, - '20': 1, - '24': 1, - '25': 1, - '26': 1, - '27': 1, - '29': 1, - '30': 1, - '31': 1, - '34': 1, - '35': 1, - '36': 1, - '37': 1, - '39': 1, - '40': 1, - '41': 1, - '42': 1, - '43': 0, - '44': 0, - '48': 1, - }, - totalCovered: 26, - coveredPercent: 93, - }, -]; diff --git a/packages/core/tests/git/GitTags.test.ts b/packages/core/tests/git/GitTags.test.ts deleted file mode 100644 index fb10c4f87..000000000 --- a/packages/core/tests/git/GitTags.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import GitTags from '../../src/git/GitTags'; -import Git from '../../src/git/Git'; - -import child_process = require('child_process'); - -let tags: string[]; -jest.mock('../../src/git/Git', () => { - class Git { - tag = jest.fn().mockReturnValue(tags); - log = jest.fn().mockReturnValue(gitLog); - getRepositoryPath() - { - return process.cwd(); - } - static async initiateRepo(){ - return new Git(); - } - } - - return Git; -}); - -describe('Given a package, listTagsOnBranch', () => { - beforeEach(() => { - const childProcessMock = jest.spyOn(child_process, 'execSync'); - childProcessMock.mockImplementation(() => showRefs); - }); - - it('should return tags belonging to package, on current branch', async () => { - tags = coreTags; - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual(coreTags.slice(0, 4)); - }); - - it('should return an empty array if there are no tags', async () => { - tags = []; - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual([]); - }); - - it('should return an empty array if there are no tags belonging to package, on current branch', async () => { - tags = coreTags.slice(4); - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual([]); - }); -}); - -// Last two tags are not found on the current branch -const coreTags = [ - 'core_v1.0.0.11', - 'core_v1.0.0.43', - 'core_v1.0.0.48', - 'core_v1.0.0.53', - 'core_v1.0.0.85', - 'core_v1.0.0.163', -]; - -// Commits on current branch -const gitLog = [ - '9d7795b9e2391a93b72ae7cf391f55eac5a869c1', - '65ed6f19bb87d31e56efd49cd50a6a19ba172626', - '9e244f0048f53858fe5e5aff210805389f10e523', - '544b52bea434aed68770adb23c168bb89a35b031', -]; - -const showRefs = Buffer.from( - 'fc29c8bedb5cc32b425825aeec6c5ae054704b85 refs/tags/core_v1.0.0.11\n' + - '9d7795b9e2391a93b72ae7cf391f55eac5a869c1 refs/tags/core_v1.0.0.11^{}\n' + - '4fcb4b948d174e721093ff63ffff59cb220ddd7b refs/tags/core_v1.0.0.43\n' + - '65ed6f19bb87d31e56efd49cd50a6a19ba172626 refs/tags/core_v1.0.0.43^{}\n' + - 'ed45cbda7daee5152db1353960fe0ae3b8ad5ed2 refs/tags/core_v1.0.0.48\n' + - '9e244f0048f53858fe5e5aff210805389f10e523 refs/tags/core_v1.0.0.48^{}\n' + - '9eb7e59ef46890495b4c7d9e6cfb2c5e2ef85851 refs/tags/core_v1.0.0.53\n' + - '544b52bea434aed68770adb23c168bb89a35b031 refs/tags/core_v1.0.0.53^{}\n' + - '4af7e0c6b1f663e5b1c2ecc9e424fba2af8e0d63 refs/tags/core__v1.0.0.85\n' + - '46dd375e91d5c00a0f9b64ee38350171f9cf4e50 refs/tags/core_v1.0.0.85^{}\n' + - '1a5c15c8decb0a939447aebf057e1d0889f4eeb6 refs/tags/core_v1.0.0.163\n' + - '86f2f2d107564b053c40abe66555c354f3b7f0f8 refs/tags/core_v1.0.0.163^{}\n' -); diff --git a/packages/core/tests/org/ArtifactsToOrg.test.ts b/packages/core/tests/org/ArtifactsToOrg.test.ts deleted file mode 100644 index 8176b7d77..000000000 --- a/packages/core/tests/org/ArtifactsToOrg.test.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { ConsoleLogger, VoidLogger } from '@dxatscale/sfp-logger'; -import { AnyJson, ensureJsonMap, JsonMap, ensureString } from '@salesforce/ts-types'; -import SFPOrg from '../../src/org/SFPOrg'; -import SfpPackage from '../../src/package/SfpPackage'; - - -const $$ = new TestContext(); -const createOrg = async () => { - - const testData = new MockTestOrgData(); - await $$.stubAuths(testData); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - - return await SFPOrg.create({ aliasOrUsername: testData.username }); -}; - -describe('Fetch a list of sfpowerscripts artifacts from an org', () => { - it('Return a blank list of sfpowerscripts artifact, if there are no previously installed artifacts ', async () => { - let org = await createOrg(); - - let records = { records: [] }; - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(records); - }; - - let artifacts = await org.getInstalledArtifacts(); - expect(artifacts).toEqual([]); - }); - - it('Return a list of sfpowerscripts artifact, if there are previously installed artifacts ', async () => { - let org = await createOrg(); - - let records = { records:[ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'sfpowerscripts-package', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }, - ]}; - - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(records); - }; - - let artifacts = await org.getInstalledArtifacts(); - let expectedpackage = { - Id: 'a0zR0000003F1FuIAK', - Name: 'sfpowerscripts-package', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }; - expect(artifacts).toEqual([expectedpackage]); - }); - - it('When unable to fetch, it should return a blank list', async () => { - let org = await createOrg(); - - $$.fakeConnectionRequest = (request) => { - return Promise.reject('Failed'); - }; - - let artifacts = await org.getInstalledArtifacts(); - expect(artifacts).toEqual([]); - },45000); -}); - -describe('Update a sfpowerscripts artifact to an org', () => { - it('Update a sfpowerscripts artifact, installing it the first time', async () => { - let org = await createOrg(); - - let records = { records: [] }; - - let pushResult = { - id: 'a0zR0000003F1FuIAK', - success: true, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request = ensureJsonMap(request); - if (_request.method == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function () { - throw new Error('Function not implemented.'); - }, - }; - - let result = await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); - expect(result).toEqual(pushResult.id); - }); - - it('Update a sfpowerscripts artifact, installing a newer version of it', async () => { - let org = await createOrg(); - - let records = { records : [ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'core', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - } - ]}; - - let pushResult: AnyJson = { - id: 'a0zR0000003F1FuIAK', - success: true, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request: JsonMap = ensureJsonMap(request); - if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function (): any { - throw new Error('Function not implemented.'); - }, - }; - - let result = await org.updateArtifactInOrg(new ConsoleLogger(), sfpPackage); - - expect(result).toEqual(pushResult.id); - }); - - it('Update a sfpowerscripts artifact and resulting an error,should throw an exception', async () => { - let org = await createOrg(); - - let records={ records : [ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'core', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }, - ]}; - - let pushResult: AnyJson = { - success: false, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request: JsonMap = ensureJsonMap(request); - if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function () { - throw new Error('Function not implemented.'); - }, - }; - - try { - await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); - } catch (error) { - expect(error.message).toContain('Aborted'); - } - }); -}); diff --git a/packages/core/tests/org/ListAllPackages.test.ts b/packages/core/tests/org/ListAllPackages.test.ts deleted file mode 100644 index 5a5888ed2..000000000 --- a/packages/core/tests/org/ListAllPackages.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AnyJson } from '@salesforce/ts-types'; -import SFPOrg from '../../lib/org/SFPOrg'; -import { OrgConfigProperties } from '@salesforce/core'; - -const $$ = new TestContext(); - -describe('Retrieve all packages from devhub', () => { - it('should return all the packages provided a devhub', async () => { - - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { - records: [ - { - attributes: { - type: 'Package2', - url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005000k9bNSXQ', - }, - Id: '0Ho1P005000k9bNSXQ', - Name: 'async-framework', - Description: null, - NamespacePrefix: null, - ContainerOptions: 'Unlocked', - IsOrgDependent: false, - }, - { - attributes: { - type: 'Package2', - url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005100k9bNSXQ', - }, - Id: '0Ho1P005100k9bNSXQ', - Name: 'async-framework2', - Description: null, - NamespacePrefix: null, - ContainerOptions: 'Unlocked', - IsOrgDependent: true, - }, - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - const org: SFPOrg = await SFPOrg.create({ aliasOrUsername: testData.username }); - - let packages = await org.listAllPackages(); - expect(packages).toHaveLength(2); - expect(packages[0].Name).toMatch('async-framework'); - expect(packages[0].Id).toMatch('0Ho1P005000k9bNSXQ'); - expect(packages[0].IsOrgDependent).toMatch('No'); - expect(packages[1].IsOrgDependent).toMatch('Yes'); //Translate true to Yes - }); -}); diff --git a/packages/core/tests/package/Package2VersionFetcher.test.ts b/packages/core/tests/package/Package2VersionFetcher.test.ts deleted file mode 100644 index 7eaffe1df..000000000 --- a/packages/core/tests/package/Package2VersionFetcher.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo } from '@salesforce/core'; -import Package2VersionFetcher from '../../src/package/version/Package2VersionFetcher'; -import { AnyJson } from '@salesforce/ts-types'; - -const $$ = new TestContext(); - -let conn: Connection; - -describe("Given a PackageDependencyResolver", () => { - - beforeEach(async () => { - const testData = new MockTestOrgData(); - - testData.makeDevHub(); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: any = { - records: [ - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' - }, - SubscriberPackageVersionId: '04t5i000000V2DiAAK', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 17, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'king' - }, - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' - }, - SubscriberPackageVersionId: '04t5i000000UyCJAA0', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 16, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'king' - } - ], - }; - $$.fakeConnectionRequest = (request: any): Promise => { - return Promise.resolve(records); - }; - conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - }) - it('should return an array of Package2Version records if matching records found', async () => { - // Mock the query method in QueryHelper to return some dummy data - const package2VersionFetcher = new Package2VersionFetcher(conn); - - const result = await package2VersionFetcher.fetchByPackageBranchAndName('king', 'core'); - - expect(result[0].Package2.Name).toEqual('core'); - expect(result[0].Branch).toEqual('king'); - }); - -}); - diff --git a/packages/core/tests/package/PackageDiffImpl.test.ts b/packages/core/tests/package/PackageDiffImpl.test.ts deleted file mode 100644 index 69a44d44a..000000000 --- a/packages/core/tests/package/PackageDiffImpl.test.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { jest, expect } from '@jest/globals'; -const fs = require('fs'); -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import PackageDiffImpl, { PackageDiffOptions } from '../../src/package/diff/PackageDiffImpl'; -import ProjectConfig from '../../src/project/ProjectConfig'; - -let gitTags: string[] = []; -let gitDiff: string[] = []; -let gitShow: string = ''; - -jest.mock('../../src/git/Git', () => { - class Git { - diff = jest.fn().mockReturnValue(gitDiff); - show = jest.fn().mockReturnValue(gitShow); - static async initiateRepo(){ - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../src/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let ignoreFilterResult: string[] = []; -jest.mock('../../src/ignore/IgnoreFiles', () => { - class IgnoreFiles { - filter = jest.fn().mockReturnValue(ignoreFilterResult); - } - - return IgnoreFiles; -}); - -describe('Determines whether a given package has changed', () => { - beforeEach(() => { - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return JSON.parse(packageConfigJson); - }); - - const fsMock = jest.spyOn(fs, 'readFileSync'); - fsMock.mockImplementation(() => { - return '**README.md'; - }); - }); - - it('should throw error if package does not exist', () => { - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl( - new ConsoleLogger(), - 'UNKNOWN-PACKAGE', - null, - ); - expect(() => packageDiffImpl.exec()).rejects.toThrowError(); - }); - - it('should return true if package metadata has changed', async () => { - gitTags = coreTags; - gitDiff = [`packages/domains/core/X/Y/Z/A-meta.xml`]; - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Found change(s) in package`); - - packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core-b', null); - result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - - }); - - it('should return true if package descriptor has changed', async () => { - gitTags = coreTags; - gitDiff = ['sfdx-project.json']; - gitShow = packageDescriptorChange; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Package Descriptor Changed`); - }); - - it('should return false even if package descriptor has changed when asked to ignore ', async () => { - gitTags = coreTags; - gitDiff = ['sfdx-project.json']; - gitShow = packageDescriptorChange; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,{skipPackageDescriptorChange:true}); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - }); - - it('should return false if only config file has changed', async () => { - gitDiff = ['config/project-scratch-def.json']; - - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - gitTags = coreTags; - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - expect(result.reason).toEqual(`No changes found`); - }); - - it('should return true if package does not have any tags', async () => { - gitTags = []; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Previous version not found`); - }); - - it('should return true if packageToCommits is an empty object', async () => { - let packageDiffOptions = new PackageDiffOptions(); - packageDiffOptions.packagesMappedToLastKnownCommitId={}; - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,packageDiffOptions); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Previous version not found`); - }); - - it('should return false if package metadata and package config has not changed', async () => { - gitTags = coreTags; - gitDiff = [`packages/access-mgmt/X/Y/Z/A-meta.xml`, `packages/bi/X/Y/Z/B-meta.xml`]; - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - expect(result.reason).toEqual(`No changes found`); - }); -}); - -const coreTags = [ - `core_v1.0.0.2`, - `core_v1.0.0.3`, - `core_v1.0.0.5`, - `core_v1.0.0.6`, - `core_v1.0.0.7`, - `core_v1.0.0.8`, - `core_v1.0.0.9`, - `core_v1.0.0.10`, -]; - -const packageConfigJson: string = ` -{ - "packageDirectories": [ - { - "path": "packages/temp", - "default": true, - "package": "temp", - "versionName": "temp", - "versionNumber": "1.0.0.0", - "ignoreOnStage": ["prepare","validate","build"] - }, - { - "path": "packages/domains/core", - "package": "core", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA", - "PermSetB", - "PermSetC" - ] - }, - { - "path": "packages/domains/core-b", - "package": "core-b", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA", - "PermSetB", - "PermSetC" - ] - }, - { - "path": "packages/frameworks/mass-dataload", - "package": "mass-dataload", - "default": false, - "type":"data", - "versionName": "mass-dataload", - "versionNumber": "1.0.0.0" - }, - { - "path": "packages/access-mgmt", - "package": "access-mgmt", - "default": false, - "versionName": "access-mgmt", - "versionNumber": "1.0.0.0", - "reconcileProfiles": "true" - }, - { - "path": "packages/bi", - "package": "bi", - "default": false, - "versionName": "bi", - "versionNumber": "1.0.0.0", - "ignoreOnStage":["prepare","validate"] - } - ], - "namespace": "", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "50.0", - "packageAliases": { - "bi":"0x002232323232", - "core":"0H04X00000000XXXXX" - } -}`; - -const packageDescriptorChange: string = ` -{ - "packageDirectories": [ - { - "path": "packages/temp", - "default": true, - "package": "temp", - "versionName": "temp", - "versionNumber": "1.0.0.0", - "ignoreOnStage": ["prepare","validate","build"] - }, - { - "path": "packages/domains/core", - "package": "core", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA" - ] - }, - { - "path": "packages/frameworks/mass-dataload", - "package": "mass-dataload", - "default": false, - "type":"data", - "versionName": "mass-dataload", - "versionNumber": "1.0.0.0" - }, - { - "path": "packages/access-mgmt", - "package": "access-mgmt", - "default": false, - "versionName": "access-mgmt", - "versionNumber": "1.0.0.0", - "reconcileProfiles": "true" - }, - { - "path": "packages/bi", - "package": "bi", - "default": false, - "versionName": "bi", - "versionNumber": "1.0.0.0", - "ignoreOnStage":["prepare","validate"] - } - ], - "namespace": "", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "50.0", - "packageAliases": { - "bi":"0x002232323232", - "core":"0H04X00000000XXXXX" - } -} -`; diff --git a/packages/core/tests/package/PackageManifest.test.ts b/packages/core/tests/package/PackageManifest.test.ts deleted file mode 100644 index 39bc07eda..000000000 --- a/packages/core/tests/package/PackageManifest.test.ts +++ /dev/null @@ -1,300 +0,0 @@ -import fs from 'fs-extra'; -import { jest, expect } from '@jest/globals'; -import PackageManifest from '../../src/package/components/PackageManifest'; - -describe('Given a mdapi directory that contains manifest file', () => { - beforeEach(() => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML; - }); - }); - - it('should return the manifest in json format', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON); - }); - - it('should return the manifest in xml format', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.manifestXml).toEqual(packageManifestXML); - }); - - it('should return true if there is apex', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isApexInPackage()).toBe(true); - }); - - it('should return undefined if there are no triggers', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.fetchTriggers()).toBe(undefined); - }); - - it('should return false if there are no profiles', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isProfilesInPackage()).toBe(false); - }); - - it('should return false if there are no permission set groups', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(false); - }); -}); - -describe('Given a list of components', () => { - it('should create a package manifest from scratch', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest).toBeInstanceOf(PackageManifest); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON_b); - expect(packageManifest.manifestXml).toEqual(packageManifestXML_b); - }); - - it('should fetch triggers', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.fetchTriggers()).toEqual(['ContractTrigger']); - }); - - it('should return true if there are permission set groups ', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(true); - }); - - it('should return true if there are profiles', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.isProfilesInPackage()).toBe(true); - }); - - it('should return true if there are types supported by profiles', async () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - expect(packageManifest.isPayLoadContainTypesSupportedByProfiles()).toBe(true); - }); - - it('should return true if there are types other than', async () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - expect(packageManifest.isPayloadContainTypesOtherThan('Profile')).toBe(true); - }); -}); - -describe('Given a manifest json payload', () => { - it('should create an instance of PackageManifest', async () => { - const packageManifest: PackageManifest = await PackageManifest.createWithJSONManifest(packageManifestJSON); - - expect(packageManifest).toBeInstanceOf(PackageManifest); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON); - expect(packageManifest.manifestXml).toEqual(packageManifestXML); - }); -}); - -const components: { fullName: string; type: string }[] = [ - { - fullName: 'ContractService', - type: 'ApexClass', - }, - { - fullName: 'ContractTrigger', - type: 'ApexTrigger', - }, - { - fullName: 'ContractVariables__mdt-ContractVariables Layout', - type: 'Layout', - }, - { - fullName: 'Contract.Reason__c', - type: 'CustomField', - }, - { - fullName: 'Contract.ContractTerm__c', - type: 'CustomField', - }, - { - fullName: 'Contract', - type: 'CustomObject', - }, - { - fullName: 'ContractPermissionSetGroup', - type: 'PermissionSetGroup', - }, - { - fullName: 'Contractor', - type: 'Profile', - }, -]; - -const packageManifestJSON_b = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: [ - { - name: 'ApexClass', - members: ['ContractService'], - }, - { - name: 'ApexTrigger', - members: ['ContractTrigger'], - }, - { - name: 'Layout', - members: ['ContractVariables__mdt-ContractVariables Layout'], - }, - { - name: 'CustomField', - members: ['Contract.Reason__c', 'Contract.ContractTerm__c'], - }, - { - name: 'CustomObject', - members: ['Contract'], - }, - { - name: 'PermissionSetGroup', - members: ['ContractPermissionSetGroup'], - }, - { - name: 'Profile', - members: ['Contractor'], - }, - ], - version: '50.0', - }, -}; - -const packageManifestXML_b: string = ` - - - ApexClass - ContractService - - - ApexTrigger - ContractTrigger - - - Layout - ContractVariables__mdt-ContractVariables Layout - - - CustomField - Contract.Reason__c - Contract.ContractTerm__c - - - CustomObject - Contract - - - PermissionSetGroup - ContractPermissionSetGroup - - - Profile - Contractor - - 50.0 -`; - -const packageManifestJSON = { - Package: { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [ - { - name: 'AuraDefinitionBundle', - members: ['openRecordAction', 'selectObject'], - }, - { - name: 'ApexClass', - members: [ - 'CustomerServices', - 'CustomerServicesTest', - 'MarketServices', - 'MarketServicesTest', - 'TestDataFactory', - ], - }, - { - name: 'CustomMetadata', - members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], - }, - { - name: 'Layout', - members: 'Customer_Fields__mdt-Customer Fields Layout', - }, - { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, - { - name: 'LightningMessageChannel', - members: ['Flow_Status_Change', 'Tile_Selection'], - }, - { name: 'CustomObject', members: 'Customer_Fields__mdt' }, - { - name: 'CustomField', - members: [ - 'Customer_Fields__mdt.Customer_City__c', - 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', - 'Customer_Fields__mdt.Customer_Email__c', - 'Customer_Fields__mdt.Customer_Name__c', - 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', - 'Customer_Fields__mdt.Customer_State__c', - 'Customer_Fields__mdt.Customer_Status__c', - 'Customer_Fields__mdt.Sobject_Type__c', - ], - }, - ], - version: '50.0', - }, -}; - -const packageManifestXML: string = ` - - - AuraDefinitionBundle - openRecordAction - selectObject - - - ApexClass - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - - CustomMetadata - Customer_Fields.Contact_Customer_Fields - Customer_Fields.Lead_Customer_Fields - - - Layout - Customer_Fields__mdt-Customer Fields Layout - - - LightningComponentBundle - errorPanel - ldsUtils - - - LightningMessageChannel - Flow_Status_Change - Tile_Selection - - - CustomObject - Customer_Fields__mdt - - - CustomField - Customer_Fields__mdt.Customer_City__c - Customer_Fields__mdt.Customer_Draft_Status_Values__c - Customer_Fields__mdt.Customer_Email__c - Customer_Fields__mdt.Customer_Name__c - Customer_Fields__mdt.Customer_Reservation_Status_Value__c - Customer_Fields__mdt.Customer_State__c - Customer_Fields__mdt.Customer_Status__c - Customer_Fields__mdt.Sobject_Type__c - - 50.0 -`; diff --git a/packages/core/tests/package/SFPackageBuilder.test.ts b/packages/core/tests/package/SFPackageBuilder.test.ts deleted file mode 100644 index dd617810c..000000000 --- a/packages/core/tests/package/SFPackageBuilder.test.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import SfpPackage, { PackageType, SfpPackageParams } from '../../src/package/SfpPackage'; -import SfpPackageBuilder, { PackageCreationParams } from '../../src/package/SfpPackageBuilder'; -import * as fs from "fs-extra"; -import { Logger } from '@dxatscale/sfp-logger'; - - -let packageType = PackageType.Source; -jest.mock('../../src/project/ProjectConfig', () => { - class ProjectConfig { - static getSFDXPackageDescriptor(projectDirectory, sfdx_package) { - return { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - } - - static getSFDXProjectConfig(projectDirectory) { - return { - packageDirectories: [ - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - }; - } - static getPackageType(projectConfig: any, sfdxPackage: string) { - return packageType; - } - } - return ProjectConfig; -}); - -jest.mock('../../src/package/generators/SfpPackageContentGenerator', () => { - class SfpPackageContentGenerator { - static async generateSfpPackageDirectory( - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - packageDirectory: string, - destructiveManifestFilePath?: string, - configFilePath?: string, - pathToReplacementForceIgnore?: string - ): Promise { - return '.sfpowerscripts/3sIRD_source'; - } - } - - return SfpPackageContentGenerator; -}); - -jest.mock('../../src/package/packageFormatConvertors/SourceToMDAPIConvertor', () => { - class SourceToMDAPIConvertor { - convert = jest.fn().mockReturnValueOnce(Promise.resolve({ packagePath: 'mdapidir' })); - } - return SourceToMDAPIConvertor; -}); - -jest.mock('../../src/package/components/MetadataCount', () => { - class MetadataCount { - static getMetadataCount = jest.fn().mockReturnValue(Promise.resolve(20)); - } - return MetadataCount; -}); - -jest.mock('../../src/apex/parser/ApexTypeFetcher', () => { - class ApexTypeFetcher { - getClassesClassifiedByType = jest.fn(); - getTestClasses = jest - .fn() - .mockReturnValue( - new Array( - 'AccountTriggerHandlerTest', - 'Generate_Dose_Admin_PdfTest', - 'RecordHunterController_Test', - 'SObjectController2Test', - 'Send_Receipt_Test', - 'TestDataFactory', - 'TestFileRestriction', - 'appoinmentSchedulerControllerTest' - ) - ); - - getClassesOnlyExcludingTestsAndInterfaces = jest - .fn() - .mockReturnValue( - new Array( - 'AccountTriggerHandler', - 'Data_TableV2_Controller', - 'Generate_Dose_Admin_Pdf', - 'Generate_QR_Code', - 'RecordHunterController', - 'RecordHunterField', - 'RecordHunterLexer', - 'SObjectController2', - 'Send_Receipt' - ) - ); - } - - return ApexTypeFetcher; -}); - -jest.mock('../../src/package/packageCreators/CreateUnlockedPackageImpl', () => { - class CreateUnlockedPackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) {} - - public async exec(): Promise { - return this.sfpPackage; - } - } - return CreateUnlockedPackageImpl; -}); - -// jest.mock('../../src/package/packageCreators/CreatePackage', () => { -// class CreatePackage { -// public constructor( -// protected projectDirectory: string, -// protected sfpPackage: SfpPackage, -// protected packageCreationParams: PackageCreationParams, -// protected logger?: Logger, -// protected params?: SfpPackageParams -// ) {} -// } -// return CreatePackage; -// }); - -jest.mock('../../src/package/packageCreators/CreateSourcePackageImpl', () => { - - - class CreateSourcePackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - - } - - public async exec(): Promise { - this.sfpPackage.packageType = PackageType.Source; - return this.sfpPackage; - } - getTypeOfPackage() {} - isEmptyPackage(projectDirectory: string, packageDirectory: string){} - preCreatePackage(sfpPackage: SfpPackage) {} - createPackage(sfpPackage: SfpPackage) {} - postCreatePackage(sfpPackage: SfpPackage) {} - printAdditionalPackageSpecificHeaders() {} - } - return CreateSourcePackageImpl; -}); - -describe.skip('Given a sfdx package, build a sfpowerscripts package', () => { - it('should build a sfpowerscripts package', async () => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML; - }); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - null, - null, - 'ESBaseCodeLWC' - ); - expect(sfpPackage.isProfilesFound).toStrictEqual(false); - expect(sfpPackage.isApexFound).toStrictEqual(true); - expect(sfpPackage.isPermissionSetGroupFound).toStrictEqual(true); - expect(sfpPackage.triggers).toBeUndefined(); - expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); - expect(sfpPackage.payload).toStrictEqual(packageManifestJSON); - expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); - expect(sfpPackage.packageDescriptor).toStrictEqual({ - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }); - expect(sfpPackage.apexTestClassses).toStrictEqual( - new Array( - 'AccountTriggerHandlerTest', - 'Generate_Dose_Admin_PdfTest', - 'RecordHunterController_Test', - 'SObjectController2Test', - 'Send_Receipt_Test', - 'TestDataFactory', - 'TestFileRestriction', - 'appoinmentSchedulerControllerTest' - ) - ); - expect(sfpPackage.apexClassWithOutTestClasses).toStrictEqual( - new Array( - 'AccountTriggerHandler', - 'Data_TableV2_Controller', - 'Generate_Dose_Admin_Pdf', - 'Generate_QR_Code', - 'RecordHunterController', - 'RecordHunterField', - 'RecordHunterLexer', - 'SObjectController2', - 'Send_Receipt' - ) - ); - }); - - it('should build a sfpowerscripts package when there is only one type', async () => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML2; - }); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - null, - null, - 'ESBaseCodeLWC' - ); - expect(sfpPackage.isProfilesFound).toStrictEqual(true); - expect(sfpPackage.isApexFound).toStrictEqual(false); - expect(sfpPackage.triggers).toBeUndefined(); - expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); - expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); - expect(sfpPackage.packageDescriptor).toStrictEqual({ - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }); - expect(sfpPackage.isPayLoadContainTypesSupportedByProfiles).toStrictEqual(false); - }); -}); - -let packageManifestJSON = { - Package: { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [ - { - name: 'AuraDefinitionBundle', - members: ['openRecordAction', 'selectObject'], - }, - { - name: 'ApexClass', - members: [ - 'CustomerServices', - 'CustomerServicesTest', - 'MarketServices', - 'MarketServicesTest', - 'TestDataFactory', - ], - }, - { - name: 'CustomMetadata', - members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], - }, - { - name: 'Layout', - members: 'Customer_Fields__mdt-Customer Fields Layout', - }, - { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, - { - name: 'LightningMessageChannel', - members: ['Flow_Status_Change', 'Tile_Selection'], - }, - { name: 'CustomObject', members: 'Customer_Fields__mdt' }, - { name: 'PermissionSetGroup', members: 'TestPermissionSetGroup' }, - { - name: 'CustomField', - members: [ - 'Customer_Fields__mdt.Customer_City__c', - 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', - 'Customer_Fields__mdt.Customer_Email__c', - 'Customer_Fields__mdt.Customer_Name__c', - 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', - 'Customer_Fields__mdt.Customer_State__c', - 'Customer_Fields__mdt.Customer_Status__c', - 'Customer_Fields__mdt.Sobject_Type__c', - ], - }, - ], - version: '50.0', - }, -}; - -let packageManifestXML: string = ` - - - - AuraDefinitionBundle - openRecordAction - selectObject - - - ApexClass - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - - CustomMetadata - Customer_Fields.Contact_Customer_Fields - Customer_Fields.Lead_Customer_Fields - - - Layout - Customer_Fields__mdt-Customer Fields Layout - - - LightningComponentBundle - errorPanel - ldsUtils - - - LightningMessageChannel - Flow_Status_Change - Tile_Selection - - - CustomObject - Customer_Fields__mdt - - - PermissionSetGroup - TestPermissionSetGroup - - - CustomField - Customer_Fields__mdt.Customer_City__c - Customer_Fields__mdt.Customer_Draft_Status_Values__c - Customer_Fields__mdt.Customer_Email__c - Customer_Fields__mdt.Customer_Name__c - Customer_Fields__mdt.Customer_Reservation_Status_Value__c - Customer_Fields__mdt.Customer_State__c - Customer_Fields__mdt.Customer_Status__c - Customer_Fields__mdt.Sobject_Type__c - - 50.0 - -`; - -let packageManifestXML2: string = ` - - - - Profile - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - 50.0 - -`; diff --git a/packages/core/tests/package/analysers/FHTAnalyzer.test.ts b/packages/core/tests/package/analysers/FHTAnalyzer.test.ts deleted file mode 100644 index 7babd5eda..000000000 --- a/packages/core/tests/package/analysers/FHTAnalyzer.test.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import FHTAnalyser from '../../../src/package/analyser/FHTAnalyzer'; -import SfpPackage, { PackageType } from '../../../src/package/SfpPackage'; -const fs = require('fs-extra'); -import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; -import { VoidLogger } from '@dxatscale/sfp-logger'; - -let isYamlFileFound: boolean = true; - -describe('FHT Analyzer', () => { - beforeEach(() => { - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - Account: - - Name - - Phone - Contact: - - Name - - Phone - `; - }); - const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); - fsExistSyncMock.mockImplementationOnce(() => { - return isYamlFileFound; - }); - }); - - it('Should not be enabled for data packages', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Data, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); - }); - - it('Should be enabled for source packages by default', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Source, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it('Should be enabled for unlocked packages by default', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - }); - - it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); - }); - - it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(fhtFields).not.toHaveProperty('Test__c'); - }); - - it(' When no yaml is provided, package has history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = false; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); - }); -}); diff --git a/packages/core/tests/package/analysers/FTAnalyzer.test.ts b/packages/core/tests/package/analysers/FTAnalyzer.test.ts deleted file mode 100644 index 190530589..000000000 --- a/packages/core/tests/package/analysers/FTAnalyzer.test.ts +++ /dev/null @@ -1,363 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import FTAnalyser from '../../../src/package/analyser/FTAnalyzer'; -import SfpPackage, { PackageType } from '../../../src/package/SfpPackage'; -const fs = require('fs-extra'); -import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; -import { VoidLogger } from '@dxatscale/sfp-logger'; - -let isYamlFileFound: boolean = true; - -describe('FT Analyzer', () => { - beforeEach(() => { - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - Account: - - Name - - Phone - Contact: - - Name - - Phone - `; - }); - const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); - fsExistSyncMock.mockImplementationOnce(() => { - return isYamlFileFound; - }); - }); - - it('Should not be enabled for data packages', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Data, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); - }); - - it('Should be enabled for source packages by default', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Source, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it('Should be enabled for unlocked packages by default', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - }); - - it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); - }); - - it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - false - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(ftFields).not.toHaveProperty('Test__c'); - }); - - it(' When no yaml is provided, package has feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = false; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); - }); -}); diff --git a/packages/core/tests/package/coverage/PackageTestCoverage.test.ts b/packages/core/tests/package/coverage/PackageTestCoverage.test.ts deleted file mode 100644 index d7e19ed6c..000000000 --- a/packages/core/tests/package/coverage/PackageTestCoverage.test.ts +++ /dev/null @@ -1,330 +0,0 @@ -import PackageTestCoverage from '../../../src/package/coverage/PackageTestCoverage'; -import { jest, expect } from '@jest/globals'; -import { ConsoleLogger, Logger } from '@dxatscale/sfp-logger'; -import ApexClassFetcher from '../../../src/apex/ApexClassFetcher'; -import ApexTriggerFetcher from '../../../src/apex/ApexTriggerFetcher'; -import ApexCodeCoverageAggregateFetcher from '../../../src/apex/coverage/ApexCodeCoverageAggregateFetcher'; - -import { AuthInfo, ConfigAggregator, Connection, Org, OrgConfigProperties } from '@salesforce/core'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import SfpPackage, { PackageType } from '../../../src/package/SfpPackage'; -import SfpPackageBuilder from '../../../src/package/SfpPackageBuilder'; -const $$ = new TestContext(); - -let packageType = PackageType.Unlocked; - - - -jest.mock('../../../src/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.apexClassWithOutTestClasses = new Array('CustomerServices', 'MarketServices'); - sfpPackage.triggers = new Array('AccountTrigger'); - sfpPackage.packageType = packageType; - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - - -const setupConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; - } - - - -describe('Given a sfpowerscripts package and code coverage report, a package coverage calculator', () => { - it('should be able to provide the coverage of a provided unlocked package', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); - }); - - it('should able to validate whether the coverage of unlocked package is above a certain threshold', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 80; - let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should able to validate whether the coverage of unlocked package is above mandatory threshold', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 75; - let result = await packageTestCoverage.validateTestCoverage(); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should be able to provide the coverage of a provided source package', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); - }); - - it('should able to validate whether the coverage of source package is above a certain threshold', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 80; - let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should able to validate whether the coverage of source package is above mandatory threshold', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 75; - let result = await packageTestCoverage.validateTestCoverage(); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should account for untouched classes and triggers when calculating package test coverage', async () => { - const conn = await setupConnection(); - - jest.spyOn(ApexClassFetcher.prototype, 'fetchApexClassByName').mockResolvedValue([ - { Id: '01p0w000001n1SfAAI', Name: 'MarketServices' }, - ]); - jest.spyOn(ApexTriggerFetcher.prototype, 'fetchApexTriggerByName').mockResolvedValue([ - { Id: '01p2O000003s9qcQAA', Name: 'AccountTrigger' }, - ]); - jest.spyOn(ApexCodeCoverageAggregateFetcher.prototype, 'fetchACCAById').mockResolvedValue([ - { ApexClassOrTriggerId: '01p0w000001n1SfAAI', NumLinesCovered: 0, NumLinesUncovered: 3, Coverage: {} }, - { ApexClassOrTriggerId: '01p2O000003s9qcQAA', NumLinesCovered: 0, NumLinesUncovered: 4, Coverage: {} }, - ]); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - testCoverageWithUntouchedClasses, - new ConsoleLogger(), - conn - ); - let result = await packageTestCoverage.validateTestCoverage(); - - expect(result.result).toBe(false); - expect(result.packageTestCoverage).toBe(71); - expect(result.classesCovered).toEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 0 }, - { name: 'AccountTrigger', coveredPercent: 0 }, - ]); - expect(result.classesWithInvalidCoverage).toEqual([ - { name: 'MarketServices', coveredPercent: 0 }, - { name: 'AccountTrigger', coveredPercent: 0 }, - ]); - }); -}); - -let succesfulTestCoverage = [ - { - id: '01p0w000001n1SdAAI', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87.09677419354838, - }, - { - id: '01p0w000001n1SfAAI', - name: 'MarketServices', - totalLines: 3, - lines: { - '3': 1, - '4': 1, - '16': 1, - }, - totalCovered: 3, - coveredPercent: 100, - }, - { - id: '01p2O000003s9qcQAA', - name: 'AccountTrigger', - totalLines: 4, - lines: { - '3': 1, - '5': 1, - '10': 1, - '11': 1, - }, - totalCovered: 4, - coveredPercent: 100, - }, -]; - -const testCoverageWithUntouchedClasses = [ - { - id: '01p0w000001n1SdAAI', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87.09677419354838, - }, -]; diff --git a/packages/core/tests/package/dependencies/PackageDependencyResolver.test.ts b/packages/core/tests/package/dependencies/PackageDependencyResolver.test.ts deleted file mode 100644 index 20a4fd870..000000000 --- a/packages/core/tests/package/dependencies/PackageDependencyResolver.test.ts +++ /dev/null @@ -1,346 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; -import PackageDependencyResolver from '../../../src/package/dependencies/PackageDependencyResolver'; -const $$ = new TestContext(); - -const setupFakeConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(response); - }; - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; -} - -jest.mock('../../../../core/src/git/Git', () => { - class Git { - static async initiateRepo() - { - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../../core/src/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let conn: Connection; -let gitTags; -let response; - -describe("Given a PackageDependencyResolver", () => { - - beforeEach(async () => { - conn = await setupFakeConnection(); - gitTags = coreGitTags; - response = coreResponse; - }) - - it("should resolve package dependencies to current branch", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management", "contact-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.2"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.2"); - }); - - it("should skip dependency resolution for packages that are not queued for build", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should skip dependencies on packages from the same build", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core", "candidate-management", "contact-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should skip dependencies on a subscriber package version id", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - const packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - const techFrameworkDependency = packageDescriptor.dependencies.find(dependency => dependency.package.startsWith("tech-framework")); - expect(techFrameworkDependency.versionNumber).toBeUndefined(); - }); - - it("should throw if dependency package version cannot be found for current branch ", async () => { - gitTags = []; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - - it("should throw if there are no validated dependency package versions", async () => { - response = {records: []}; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - - it("should throw if there are no validated dependency package id", async () => { - response = {records: []}; - const packageDependencyResolver = new PackageDependencyResolver(conn, falseProjectConfig, ["contact-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - it('should return the latest branched package version id if matching records found', async () => { - // Mock the query method in QueryHelper to return some dummy data - response = { - records: [ - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' - }, - SubscriberPackageVersionId: '04t5i000000V2DiAAK', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 17, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'inspection' - }, - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' - }, - SubscriberPackageVersionId: '04t5i000000UyCJAA0', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 16, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'inspection' - } - ], - }; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["inspections"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - expect(resolvedProjectConfig.packageAliases['core@0.1.0.17-inspection']).toEqual('04t5i000000V2DiAAK'); - }); - - // TODO: test cache -}); - -let coreGitTags = ['core_v1.0.0.2']; - -let coreResponse = { - records: [ - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx3', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 3, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx2', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 2, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx1', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 1, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - ] -} - -const projectConfig = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST', - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/inspections', - package: 'inspections', - default: false, - versionName: 'inspections-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST', - branch: 'inspection' - } - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "core": '0Ho4a00000000xxxxx', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2' - } -}; - -const falseProjectConfig = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2' - } -}; - diff --git a/packages/core/tests/package/dependencies/TransitiveDependencyResolver.test.ts b/packages/core/tests/package/dependencies/TransitiveDependencyResolver.test.ts deleted file mode 100644 index 6c47df882..000000000 --- a/packages/core/tests/package/dependencies/TransitiveDependencyResolver.test.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; -import TransitiveDependencyResolver from '../../../src/package/dependencies/TransitiveDependencyResolver'; -const $$ = new TestContext(); - -const setupFakeConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(response); - }; - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; -} - -jest.mock('../../../../core/src/git/Git', () => { - class Git { - static async initiateRepo() - { - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../../core/src/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let conn: Connection; -let gitTags; -let response; - -describe("Given a TransitiveDependencyResolver", () => { - - beforeEach(async () => { - conn = await setupFakeConnection(); - - }) - - it("should resolve missing package dependencies with transitive dependency", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - let resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let dependencies = resolvedDependencies.get('candidate-management'); - expect(dependencies?.find(dependency => dependency.package === "temp")).toBeTruthy(); - expect(dependencies?.find(dependency => dependency.package === "temp")?.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should resolve package dependencies in the same order as its dependent packages", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let baseIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "base"); - expect(baseIndex).toBe(2); - let tempIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "temp"); - expect(tempIndex).toBe(3); - let coreIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "core"); - expect(coreIndex).toBe(4); - - }); - - - it("should resolve package dependencies with a higher version of a given package if a higher version is specified", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let dependencies = resolvedDependencies.get('quote-management'); - expect(dependencies?.find(dependency => dependency.package === "core")?.versionNumber).toBe("1.2.0.LATEST"); - - }); - - it("should have only one version of a package", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - expect(verifyUniquePkgs(resolvedDependencies.get('quote-management'))).toBeTruthy(); - - }); - - it("should expand the dependencies of external packages", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - let externalDependencyIndex = resolvedDependencies.get('contact-management')?.findIndex(dependency => dependency.package === "sfdc-framework"); - expect(externalDependencyIndex).toBe(0); - - }); - - function verifyUniquePkgs(arr) { - let pkgs = {}; - for (let i = 0; i < arr.length; i++) { - if (arr[i].hasOwnProperty('package')) { - if (pkgs.hasOwnProperty(arr[i].package)) { - return false; - } - pkgs[arr[i].package] = true; - } - } - return true; - } - - - // TODO: test cache -}); - -const projectConfig = { - packageDirectories: [ - { - path: 'packages/base', - default: true, - package: 'base', - versionName: 'temp', - versionNumber: '1.0.2.NEXT', - }, - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'base', - versionNumber: '1.0.2.LATEST' - } - ] - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'temp', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - }, - { - package: 'candidate-management', - versionNumber: '1.0.0.LATEST' - }, - ] - }, - { - path: 'packages/quote-management', - package: 'quote-management', - default: false, - versionName: 'quote-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.2.0.LATEST' - }, - { - package: 'candidate-management', - versionNumber: '1.0.0.LATEST' - }, - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2', - "sfdc-framework":"04t1000x00x00x" - }, - "plugins": { - "sfpowerscripts": { - "disableTransitiveDependencyResolver": false, - "externalDependencyMap": { - "tech-framework@2.0.0.38": [ - { - "package": "sfdc-framework" - } - ] - } - } - } -}; - diff --git a/packages/core/tests/package/deploymentFilters/EntitlementVersionFilter.test.ts b/packages/core/tests/package/deploymentFilters/EntitlementVersionFilter.test.ts deleted file mode 100644 index 8373e209a..000000000 --- a/packages/core/tests/package/deploymentFilters/EntitlementVersionFilter.test.ts +++ /dev/null @@ -1,500 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext, } from '@salesforce/core/lib/testSetup'; -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import { AnyJson } from '@salesforce/ts-types'; -import SFPOrg from '../../../src/org/SFPOrg'; -import { ComponentSet, VirtualDirectory, VirtualTreeContainer } from '@salesforce/source-deploy-retrieve'; -import EntitlementVersionFilter from '../../../src/package/deploymentFilters/EntitlementVersionFilter'; -import { OrgConfigProperties } from '@salesforce/core'; - -const fs = require('fs-extra'); - - -const $$ = new TestContext(); -const createOrg = async () => { - const testData = new MockTestOrgData(); - - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - - return await SFPOrg.create({ aliasOrUsername: testData.username }); -}; - -let entitlementSetting:any={}; -jest.mock('../../../src/metadata/MetadataFetcher', () => { - class MetadataFetcher { - getSetttingMetadata= jest.fn().mockReturnValue(entitlementSetting) - } - - return MetadataFetcher; -}); - - -describe('Filter entitlements during deployment', () => { - - beforeEach(() => { - const fsMock = jest.spyOn(fs, 'writeFileSync'); - fsMock.mockImplementationOnce(() => { - return ; - }); - }); - - it('Should return a component set by filtering entitlement versions which are existing in the org', async () => { - - let org = await createOrg(); - let records: AnyJson = { - records: [ - { - Name: 'TestEntitlement1', - NameNorm: 'testentitlement1_v1', - VersionNumber: 1, - VersionMaster:'5522N000000c01Q', - } - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_2) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - entitlementSetting={ - "enableEntitlementVersioning":true - }; - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); - - - - }); - - it('Should only return component sets when the version number is higher than whats existing in the org', async () => { - entitlementSetting={enableEntitlementVersioning:true}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - { - Name: 'TestEntitlement1', - NameNorm: 'testentitlement1_v1', - VersionNumber: 1, - VersionMaster:'5522N000000c01Q', - }, - { - Name: 'TestEntitlement2', - NameNorm: 'testentitlement2_v1', - VersionNumber: 1, - VersionMaster:'5522O000000LlFu', - } - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_2) - }, - { - name: 'testentitlement2_v2.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_2_V2) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v2`)).toBeDefined(); - - - - }); - - - it('should return all components when there are no existing versions in the org', async () => { - entitlementSetting={enableEntitlementVersioning:true}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_1) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeDefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); - - - - }); - - it('should return all components when entitlement versioning is not enabled in the org', async () => { - entitlementSetting={enableEntitlementVersioning:undefined}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'TestEntitlement.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); - - - - - }); - - it('should return the same components when unable to fetch entitlement settings', async () => { - entitlementSetting=undefined; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'TestEntitlement.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); - - - - - }); - -}); - - -const TESTENTITLEMENT_1=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement1 - 5522O000000LlFu - 1 - -` - -const TESTENTITLEMENT_2=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement2 - 5522O000000LlFu - 1 - -` - -const TESTENTITLEMENT_2_V2=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement2 - 5522O000000LlFu - 2 - -` - -const TESTENTITLEMENT_NO_VERSION_NUMBER=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement - -` diff --git a/packages/core/tests/package/packageMerger/PackageMergeManager.test.ts b/packages/core/tests/package/packageMerger/PackageMergeManager.test.ts deleted file mode 100644 index 06927ae56..000000000 --- a/packages/core/tests/package/packageMerger/PackageMergeManager.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import ArtifactFetcher from '../../../src/artifacts/ArtifactFetcher'; -import SfpPackage from '../../../src/package/SfpPackage'; -import SfpPackageBuilder from '../../../src/package/SfpPackageBuilder'; -import PackageMergeManager from '../../../src/package/packageMerger/PackageMergeManager' -import { ConsoleLogger } from '@dxatscale/sfp-logger'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import { jest, expect } from '@jest/globals'; - -const path = require('path'); - -describe('Given multiple sfpPackages, packageManager should be', () => { - it('able to merge into a single package', async () => { - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementation(() => { - return set; - }); - // TODO: Complete along with PackageMergeManager Feature - // let artifacts = ArtifactFetcher.fetchArtifacts(path.join(__dirname, 'artifacts1'), undefined, undefined); - // let sfpPackages: SfpPackage[] = []; - - // for (const artifact of artifacts) { - // let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); - // sfpPackages.push(sfpPackage); - // } - - // let packageMerger = new PackageMergeManager(sfpPackages); - // let mergeResult = await packageMerger.mergePackages(); - - // expect(mergeResult.mergedPackages.length).toBeGreaterThanOrEqual(2); - // expect(mergeResult.mergedPackage.apexTestClassses?.length).toBeGreaterThanOrEqual(7); - // expect(mergeResult.mergedPackage.isApexFound).toBeTruthy(); - - - }); -}); diff --git a/packages/core/tests/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip b/packages/core/tests/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip deleted file mode 100644 index b5436df6dd5882319d3577edc14132a05275fe3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8405 zcmeHLc{mi>8y*bV2FXqcNtQt*OVP;A*s@)OF-FEV%vhsE#LbPscOQjDOzu`_A`$=e*}N)TIEj007j~07HPVX@3$B zyo($Fcmf0fWB~vG9EC>gv&A@ipnMT%3>=O0@WR-_&|XMK7~D&8`G>6=!VBgA^MZk$ zF(~(wCQww@VW#p)F@bE&ckCUw(zL=U<037{XmVC_9&h!HV&DBr`VgbV03Q&QYcx84 zs;A6Y(?tDC!PU7CGuK|c1HqB&T{#gv&A6sg-|Zat^=h7%FuLAjvEkp z8XbrFGnH>~ew;o~>*SYism#xLxw8XynH${~)FU=Nj+6B%y;h9{ zu52pht}Uve$*oPY&=(VK@j{;a^p(>1c+Y=IFZGiSjx{%2(Q*L=cZ|CUtu{dh0Equ% z%fX#s?#B_XsN-K+?LwrAOSKf!{n&3S`i>| zXa8=>OIIU&$DhCOwTkj|3ad2K&Im8x?lmd#(n826D5r8UTr{)~%_aFtTLg3Uj>?r( z@Nm2s;wt;%j>JP;lO`f1OjvVlHI4IcrUgAYWI~_W@9jEWQ=!IS9@#&^qo*^cTt0Gv z_wufG&Rg1O^U2q4sf*$oijA`mWyDh|*+zKTEY3`Xo_`5cQW$WBfdZo_>FBD>7?u0? zwdZ3xllR=ZVF30KvW$k7%;g_E1d(?`WiPNVZxZ0kToU%>+uBX|weehHP~K=bLUI{m zX|$UW2dg{?dz?lXZ|TiKfE`f;B;;{-!a0y&gm>qbW*V7i1-8;CGkX{V-(YL@(&K5! zOAbm6_Uv@4$irWrnin1y;%2xg%o;0$zdeX8`}Dr()Fq|N8(6lF*Y=$~*b|-*I8}pw zPp0K~xk=EX>2>!sV@P21wV|{G_TS$Z9*(v+`W|^DyCVoas+n2%>?7!$haeQ42(zz_ z=^9H1zdb6L3QK$f0Y5m$V5uZuJW6R8g*33Li+N~-ch%-*2xY+~N2fF-)V1ddIq6s&ot-up;Za&zejw=aBBL54K>Y)ibW zd-ciStMIo6$OBZ(9Hm?9s$>isGg?Y4y;Sd=MhzN-$fUTW1Y#{o(B6-ESGO>2mJGxeC+@@%H0up zd{rZum38gcCNzR91puJ7*+%$^VgsTAN1$UBgKsYW9VzdgXiZF=2%Ibp( zbUT$G+Ek(B(WXVlZT(u{{Bv;4SGvinfwS=(;a%?~gVU}ho*pl+>4q@#_Ges&1P@4W z@9frMvy*Db^K7{09Hjxe5?^$?oJysogl)Ja{hqFqWiY1{P@S^&1?-k;Uqo}*M1cHn zyR<2BZimQ@{%)dY{lrTyFIWg#BNoRhhCY__VfITfzg|dm~*PejNxu^FUa8o*&*?Ej`c(4;cE_ z@%~ef_qEkLvbAb@dL!X3zsB>Y-`8sk3fWpgePFIg!mH}neE!t=Tr0mMH(O3Om^;!D zf$>^>4eLno$u8zkp9M+RY(}W`5 z_^4FFsn5zEs{9f@KWv_9ShyrB6VK1|s9uD>FbN3L$cN}0DQFq2VI|K|8s;oaHom5? zNUdlXHq0LgwWc>L^9yNX;L^9G&Fr_f?mY2nL2^t{0Yob)Zkyf*f7Ma^K{z6MA~jVU zHQ62^ITJR2v+K2xyP4AinCNte1Et+tS$-QdUhVm#yqt01G=yTN`1(xnO?*O4FZ5Bw zc>@!&aT{*?LX8VZNWZ8YOvI(~Tl60(PopnAx~m)fXaJ*&TN)YI4(h-Zp0QXwr| zN@B&EvwC*|249C?Eu?m8fpz$}w9nh~>rrzA%d;u_GuU^=ybc-fa%s0LDlQg#C_1WG zu!ysQ%iWiJNzHQUb6%n#opp{O9#nt>f$O`A=oMHxr1AO!b$7$!uTV>dPIRfOJLcP) zE5}sq>2+coF=!XPornQG9Bbz@xYEQ_%}Yb_(DGStF-n@`PxX`m4e5R;&E!Wa zZKgRFdKR@C=cwvS-(AR67`8jx0r85BdDYVD>(2UEYEJ$cmxTVw)GOvuC#+P>pta=W z0=IU{slQ0J=VcBs;E3bFT+hhN;@7$aI($-fTi5P+`m`!_rTO0M&W_xo(!krGp6F`_ zK4XriJ`jG&_;O)X#UQ=TC!KBPNWaGR*de<0w}0=Z_Y4jHw)Ja|kWGtu3;~At*q4B# z-8R5G@FQV;!*hcn-8TSL**Yl7p7=~8oqKC{K=a>&L*Q_fx4YK{8R-9aB#uags{<*a zrAuD?Wp*TxFiHJ{kK2FF^))|zZ#R1c+SV2h{t|-((QF0#xw#^u8r`e;S=441X=^HK zwfV9{^-N3)9$zpYQxup})VSaGE+hJ`9gqR=5i*80`7YEMM_xU#- zsuMpl(F_(boh0kPGYLD{hV@g=craZSHxsb(sQO<^orVl{iVxb*r7LTF(Bfg+@kYg5 z9>W4-W`Uw;u9>7-;S)E9$tLgt;}8_HH*N!jIgj`xofKf;s!AjZ~`I{xVayz~^ zB#5Tu^1=mmZx-@+OKqcEh}Xx` zBIXjgZIijIa)wrB^nEFa-q7;G1@&$T|9hv1l*`hfe$RDynTYU>3(6));!SnZid?`e zoQ#dwh;QrVg$weh+Y;OAm-a@4kYzT)H!esAv?aooFF_LB+PNgYO_mn1GdLMHNk@8I zkieHpwfe2H437(P{BiKVeYubr*QP^MyGx6h&Xw((Ooya>SN8a7^}7s?3+mrA^lB}< zQTRl)xU`7jv+mez_+PZ+a_DP!W##x={|GE`w!Uh~_3?>nk`(sME#ZIFmg|!c)g_69 zjBrJ6YVKDE;x8m5t+_rKQEigQZ2mnNNqeqON>raD((3@uuw^Iy_kY+So!tNc diff --git a/packages/core/tests/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip b/packages/core/tests/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip deleted file mode 100644 index 6adbcf2731d852b7133e9e771c7a5152ba9df920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35211 zcmeHQcRbeZ_qVgj%BJkS$=-WpQ$qG0*)ngNtgMh(vO>tpC^J+>NOtzh%E&CgTe=g{ z^YnaE{qg&}UcGK9pYy)X^*-l1*SXGh$V)>)VSs_b!h*?zk*nk_p~5IYfq|7$f`RdX zfq@ws=-AoY7|>Z5S=g~?+ZtM1IU3m5>e-lB+u3UC*w~pE>gd@qfWFYSFtF3n*Rj)~ zH?_60oWG)B)z6OY*7gwAhxb_oLxJLYuI;RjfIo~y2@i&^fKpV87#e4U=_uyrB8mMY zQfVwqZU8jtrB-qG+qM!x{!#9Ui7)uaD0J~7+nqctui~By41sV$QEh?~^i=lt_YAQVBfvw$|-{8 z1BP#?>PI=E9z7@WQZ3i)Jf(-#Wg6P=uxXFeVxiFDHMFO zjo&(;&8LSFK%|M44v{Uc)_8#7xrcD7Z#8L>Mm{T>p0=j(PamAo>!Fi;?4c3rT;HHg z6`A!yjT8!5ZO89ca*wDC1r%H%@z%t`%Db3HsY@TgI0B$!A58QW&yly4)Uu(aX-=9! zEv|c0uJ5p<@WIPddRA`+&Cg}P5l>usYE)X*&y=&ap+(fxRN{w%!Q1Lqy_vV&nfLDe zC9k46Uli3)^s-u+4DT@kx1vBJXMAN(Bb`f=QxGI?-RxHh&J#f_tteV3KMb`F$8C+C z*g@|J&!m~<5ixyvm*-|M`P+<$`)KzmAL<6$sX9n=vNEb6mnz~Eo?l@G+ za%_6ddcL21h-?uu&_sk2uTh>VbvMhj@Y7_3B*M;=cQuqW$1-O)KMPJnX(4U5PRwO2 zqnN54wE@n+fIgGe#Q_HGai3ce?B}?%Vr|4qc#|q0WhhZG8DYsx=bJLcwokdRDXJ;r zCXH8-h>cuKNKhTI-l~i`kAEj(Nba^Kw!i#}YpUCG8I!wQQDw-DHe)NJ$XuX{q6G&7WBu2z zO3zrw(#XKv%ILF;(hT88sU^m!Uw4PE&6Wk*W-t$3uzWUB+-^$SfD!O2{jH{eg^X4C zz~EvPm7tar7#WjzS@g9*N~PCS6?OfWOzbn&#rhLUp60)j(#(C|LIoq(Ir@qG%-QJ( zDTS!Z9~y3lfZ-9b)T&D@M=6V6xh}*>#U5oX)D3pg<&~bm@M~|WRIEIX;rSa`X-w@6 z?_AEKrU>%26U5&^Ig71dgopPy-IOi~yhfTw+)-|l12lZF&z>4M;;#=K@T-64sco(7 zZS)KnK(E?&`t1fhwbno_-iH7KZS?R%8I|>&AC zlgQd6>*&@+_bp`5zf&T)r<2?%NdM9o`3m>Nl6h$PTPBw@8lzhjD$FJEko_>yQX}p* zCpLEHUC4j+rr(9Bw%2d=+JM6Y-+Mi93c+q{ESa{5UhT-?p^%vQ?#m90HF&sE;5Jw+-@mJHT>mqDg*9G{-kLj?EA z#=A2(y02bsbR{IqAmzA73|%mPa%-sdZBMY-tKB&vHOEh8>YBZ&XWn=_L4v07I3xbO zL409^o|UDciO~^as8;r|N$!~!Bp8^?&l2Oy8?9}uObztx=zu|kj-8${oxXwLXVVLb z;J2z}L~U^76CLM7AmA31gz&*$Kx5SWQ;)@?u!SKH-!>#dzXus&r3q5S@41@1t`m0?X+Xh_a>FCr-{X+vC+)kS|6zGNDvD(%o{|v?MRo(QJ0;I0a5e;^m*i`KTv&GEzvina6t|HrNw5z>PmvVq&qlbOq zKNiL-Z3%eY<1&v!tIfVaRzYGtb<0M>9~Mb#?Afp_HO39{p0{0D(brzw@5kSm>CJwg zYf!fE#722o+WO|qCr5&MdyWm5lS#n!vs3nsDcc^Q!nZy`?07M;>wT(ib{;l?z?E!bo8CUKKeAdX-tGzcqZZj-! zaU#Jp&}wH4>rM5PY>|gXyuWvk)@r3Yl;MN_W=`KUsims%OC9R99)0L*?^uboY$`+s z+wyZ4q1FT;Ka?bW@Xo17tbZ%p7P^=hNwny_fku3HGol_+f8`9^qMejegaC1Md3qC^ZXs?z6+VJrPqVtZf2 z;&VpU?Tw!HS?n|GzEWILLeoM$&sF#-O+$~pfngFBBXT!CnFQf#u6zYjVHy&BQ-3ic zCq@rbh1`Y4r~dIVund0h`$R;*?_i3(HkdL$P|L=mTT*+ zRt>SBR(+((#Fod`7T0im_3)B!hQWKRz;A$gTX0um*I#E&l%W^*U(3s0PkHGq7p%IL zJ%o31_{jFNWc-pBJQ6vY$_P6Q0$(Ktq$A%?zw#&nWy4zb$mgRCy*bc_>>aVViTBYL+~iBsth)AFMRlf^wyiRJ@Oi;0a}q zqqcUJ>79hv+B!QbCkg3i7mIT!*c|cO-#m8ie$k&0+IV|G@MQvuZwTAPwzntG1=CL} z&PMO+JRJ8k|30<*WqW7~e4U|WLG z(F3L~ejrQfm&>xyF|quCK#kK8sAsNYYin>YdHYd?hP(?d-JWRz_xL`iD_Gdx*3Qa8 z_RAT8*#6Oil7XF_iKUUPyp5HEiN1jiy`H(Py`r?GHzVqxZO~;jWnV}Ug?p;mQKI~& z$exIVXlf;bAKIz2ZPxn&WdYUZ0`6h!IFUw|A#mm{_B{`X5xF-4jbjfp;wd6TMCTei zsbS43Kp}RmJ+*J>Ri&H-?u0sajVGq>C{$Y_*_o#om|6ok-IIzmsYIcp^}At&>KoBY zP|hpUD5R1jNJqVe8W?|aCt31o+a|=4mb;Fqe3Hv}2vsl|v1vP!;GkW+H!oY_xX!s0 zZYq}tF*xZdPb3jB9RO9s??lDOM=Ex<5O3mg_>pvMjL*ywbVA~wpa|vED(<}0l;h>P z=?K=(x!l*gP)wFiBjcjN@0dH7!!EhIFneEGuKyj3ALmCz_R1N+i>JEv?~Nktn0o5) z86{WBh8mv+Z+fItX6qzt_(?CH0XdER>9l30@eTw|<3r$|kiTR)>GqC==$$OgWkYJ< zfjJ+M#m%7bie7bPk&dVf8_=_ElJ{WxNbTNqw3W)Aono)UOR|_uy{&{zHL3g{mtD$l z-1c1OBh}J(2DZwD*K142UQQ7Pj@w8mKR9R02`>Na?#wN5qM|lPc+_J#C& zB-adOLat>*6kSgk4QnSmb1jP+P+tp1VXc%AA`wX~Nl`y2DIExgQbN1Cn{1#0r<}L;);%x3#f=JN~0bo6HeOQ?pC><;$G_-gw2im^HDguCGDoai8VzyOsC1Gi&1(`^O0&t9qcpz+8T(awILR%?&IJ zEbVmcOsp*TJXW-lpye1NV&yg_4;SY}6j*qu7E1tO3FVbJNQ}5V-)J)7yBf4uo7+-_ z`Wj;RDLfm*wtflcoqHA$dg`*oUW80b8bkBv>v)r*YBCfEi_-GEgUJ+i5)$(kyja?_ zoAQ48EfyW)us7MDpntuo7-E1XDTIk}xD#Hrx!2TqQUh7HgfUmDKyYzuVqEJjFYgx zvZbG4_1bfI?#0;v*JZU~6w%kj2`)0Xtfh@?)t{8{-F9)w8M`FX#aynC;WY&lrS-{V zbr`k?yfvz09GUVuEpFx`0#-pKFcuS~PxClW%LZX4__@w4%JmMK8oPFT1a&p%4kVc~ z5f;ZZxt`;1Oj}M2zSCN`WK+Kxlp{84=xPO>jgp4HyYXhF4PjbO!Rf}^hVAu{)u?xc zC@C;hx81e^=%F0LI+NeYM58g6P-_R9IvAQrUg?c*fQE_%G}Pa-1bhjd_e`@GXqv!?xpF0_N>E;e5LMLlO0gn+Zr3X0v&#WWdL(+d zcd0!dA|clZFhtJ^UvM@uGJ5ucIutTsWW*CwC8tXUz9*)qnmY!b1|z=6kr@(#LBcK< z^+P5b`eT!;&<2S%VgMUO6%Nk_b&g<@IiqJix>L0z0WmeY_%F0*`Z>UIyq!buL}@D6 z(B6pS8$_z-X-_QtNL1kwaknEo{R*|(q7Iot8g@3G$_{7V#f&Cs4B3zLRyZ415pLh- z-D=9#j~#i2^0ID|6{c@!GV|l`-B)Fy6MbYV)E`7yKU|lqFk;hS6CR|6JR_sN))crA zY>4YekcdFmM!bZ`-O5Da`e3=Qgogv8|J+TUO5PD;8p^XmrV?irx!G57vDWJov|ae< zC!DPM9>{7)GH2!VaYCB4E#Wu7h_q}H1&6v7z~?Y@n8Htm7~A6@-H^T{!Pc~@KOnP4 zCRW?(3LzpN43qGIk`;lN*yc`tKB;#Wxv^{*>RJ%^on5y}-SDqp=1hU7l~as939#lo zUpKivwdnq^=17S7ZPfI8mbh=o@wZz}SK|Yz3gFTf478r#s+_}{&afI}uf5I5#~@DX zb9~hZ?}rsa+yw#9rYU6e-9Fg6no^YDXzPWNMq7sLvSKSL4QsRV}m)wJA5(StLz_gek%W-d&hDzwS1*-Rj6kQQ1p9V^ysV zxPj_Aw+2aM=atp|PH@TW{aD?b>ZgH~*0s{KO^)UkX9UHfJoH{(XmfG!B?oAE1-Z?x zKh6JSlk7jn;bClcUeB{H??&pn^2(Ph*YIPyj;IrDv^j%5XMOZd8 zVIfVLv}80tNO{WKbFqYziFRo+?bMO@VEB?Ia}yaaJl1=&8M6|Sx8OM$WxMk0*^%>{ z;+;bSR1;)UuJ8KZMM2GV5kFSSmtIe{n##*&pMnF{>C}H#eI*-kG)Yt_>mSZp;K689v@{UYwYLtE#Z(8g0UPkI`p?RTZWK zZ=h{AJT#W#wp39{I@T^zj9kwZofdbIif6CO(3l_%VUZxbT{bAb2oX}3sBY9zrJr$? zqu(0QG(mTMfmI7SdANMc3DGja$d~X6P4^9sbt7LW7nwzE^%lhy-7F|1doI#ZNp|Y1 z;?p0f8{xE?W<8RdwtrAVbV^oXrMp)TbdZKTZjPsvRsae9j#Ye3#_n%OBmHM=hk&Me z8EB>vr(>c&0`nb!^!xw+t9@F8x5(8qBKj=4!P7X#d!Y(Z-r*&lhl4^}0<)Z5z+KLG zmODJ(+`+r*8OHMVr3Cx-;;>F?mUR%f{h$LpWjU)g&q7z@_Q0L>= z6hqzKtVjv>_Hxpf7C4>bnf6rEck(Ja2Xm20FQ%jvB6YDqVsc!MDOZNx4(5D=DM3OU z?8AHsD#G)A^{sP3)#qK{F`(Px9!<%OKk;nj54i9l3FaP0!)>ZCUT2rGs3*51G?{Ni ztC4Oy3+=8FsRs|0(>%2vN#cDG=9cKv);b;1gT2H7TjpFmf>Vo90w6*=RHve&)8tcNC%$TD=>NMeP#1$ zAFsA9CTXxohr~{Z47DPq7~ZeHFIhnX&yYazu$I!obxx4Bg@2+%;8w zhb2%GYkgzzeBq#;3bpDX(Nxi7l%#aSASI5|;Dfn&UR(*iD-NY8wsS`fI#_sY7>SYg z=7z^)RaTBoX16B?2U_LbDMV|HzUIcf>esnWK5p!1i_&6Wq~Fdjw1X%1=kxNYz-(!q zW7)x|gI}KMVZ+nNP#psks>-YsY~M_WR}R zJtTPV%;z6Ye3XHj+1tbV-l{RJV?^{@bcP=st)4~*7U;d!E-Y;V&utdijhmpaZX-qM zyxwdQVd2Z17)<(PcXwjVFRWgdy;3}^_124qGtVO!thh0}I?l6H!o<+QsZwr;QPwC4 zUMS&wKUA8S+a!*76}|n++mtbv$^4WawDNA%>M8cJS%DxEhnmNZG*h_-sspsTg@Kq4 zP#=&%OMLbScJDhvPYy2ZJ9|HLGq8%9Wxo+)fy3gEm zew3p7QL1=VWuC&dO=wNZ15g<&D%t-;YQZLc4y11w3>et2-{c&k@R#NIyNM|f zcUx3yEP;nPz?zs!bh`Lq$ac~qlgNwtvXCZI?YK=6=uv4YrlW6f7fJRbJ`?EE;ZzCv zX#RA4Ae6#1RH_kuO^Q?pu{SXWn*5b&2f-^?DiWz0bTmx~S9QH|LC)qp+@aBhBs4FYZ#Q@;Z`K)l zBU)FSCF**I!6+KBv2;~S4! z!@;`HduWFhBxsB~djcm-jWQQM*1Q;nRMM+1d|ZHUuj5Hi6GksuQ`IJ*YF&-+%qv1; z1+KXw2HsM$8--UrKSiCwv4@9yR*3zYFPE#WcHiv#g2oEGYhlT0Yk9)cHzrGHI#MDm zu1TqqMWks))D`nRZo;IvYMnakGcTD{nfg%e`6t-cENccR;o4NqqMLA~?Tz&WcfY#m z<3|$#r)!-5hGr*NYLTaFC>~LPSKNPrcb(^9|za)q1 zg(4tPL__^PzX(lv+q_obuKiqBlC?s^(>HQL`H&J8#aC2Jr^s#@whpvP&dm(uw9B({ zXg{75N{J1pXIjAI>bDh=fZ~ARBgs%4LknbnYzw>b3ev0-SG!7^*zckN+?+}Ycws9A zS%_@Be7Zgchk%iE2RokmyK#gh5*g2ljC5SQ(px%ij4iehXeb0mU0w;!kIw+=><7X8 zUkBF_L?GN8Wv3@x&#Ov8)Zr@vWKxy0F4Z{5!!v<(m&9Z%nhQ{SMJ=A~4k!%LL3z~j zy(pg9oA~5bc@ZAjK z9`wDxG_9~(v1Zu`O>g96XX7fSx6x|p6iX?|6G^VSQi&RS&knKI2JW_;shNh1_2%=@ z8d-X6RF>RmKXL{Hp^v_mfqb+k54xVk`CfR!g}Io4QKHPr_c*K^?UTnVJCVq^+1>h@ zf@L+S$rm3)Xrzy8Ug}^wZ^#%6PK=2`^YcK z#gk)>(%srw=Hq{nezv{(3B`ifvH~ZF!jf8)U9Gz2(&1TfvBm$STv1EMrP&8$=nHe!N?wa*^x^70=%k;O{W|&g4 z7Lbr~TWbN>&$uEt=@P?QO@!_sb2FT=SYV>u-Y~F`etjAGw#NLj9a`iD1ZabI+?WA> zP?LYJP4DX|vAMJ&52zmzAmbc=m!3o|j}xwCuUgD!(K(3Ml))K{ftu3k{V2M5e=f|j zIJ=<8)SFMpOf}Cxr^3IT zX<6(xtnfgVT?EFAzjPP(b@lk{%|VX!Z~^LZ##zX}kn;uBovvU$62V#m=ip$%wX!)^ z{vNVP9>&-lVW!9uan};zKH8dj{L47bFm@Fc0q8K^f_$6nHtg0Uc0*_bYj-6gua|`k z`XKY5L)KWM%ED$)TUVHK)%Abxfq2(jKN&DQt~0bL<`X&Xsb?wP%NS9 zDLkyPZh3$x{ zmtL`Rl9u-lb*-BuVWxsNXBliR zEkhGbClZ6Gkd1(`=|U#zFi))XxFtGFC%B1GLEtz*G0g)0-`j@Go(*n7NM8;bZr`@0@(* z9@fW*=su;U>_(*1$ttTf1BczIGD;3Lw;5I9Cw9ADbJS+_EkjY`mAnBcG-HkXd|hvi zwr%G~kro`JZfG#7rVwr|ZbQC>OuR?Ht{6S^$GTd{aV&BsI0D&qYYF58s zE9iJ@aDD_GVx%4`rQ20l#GOk34G5*zg!z4T2@zFsD=?-{YOzQsuRXDaF705kPvjJS zp}e9lw6zg?^}_hIh1Eq|H(n)Y{VAB{kWcO{yEiVa=N55Zx@LKe&f(2v8R`2z)@#8G z?eHs@p|=M3kkyes^qmbw@$%TVQ;)Hfre6Hu4|Pf5#d0u~9HKRc%ouaIaf)U6Ir?yZ zTcZK*3hjY6m}VOu;!D0;-H0X6*VHqHC4pz|6fSac>~&LFHWB1Fq?ec$kb5fx#;h6G zz`AhS3w-1_v)0wnyXS$tK+zDvb*sdMfG zqS&jV5B~#bj>0>7>TVF;A_c_++>xwc$S%lG#X*x=?O zZg>lPTV3TNW>lZs887shSta}idw$sJ>5jQE9gJk6&ev6*i3?qN4-#tcd=zTT->K&c zBC&N3FC>rLF2B^Ev#1!(QD;rzuYnWZV%`HgSYu=QY&NK^l9kTO{jNSzjgOy(U~CgU zbx{yY56jY7om`(c2$Kw(_{=)hO_S&DkNdfpT+q9<8j~}go$H>iideNHtwL7Xjmx(= zn@iDV^l^yRIb&RGHflibUd7jP-{W*R#hu@YbolOBJAD!a7AlYtQ-6pRUqF2ctB#+t zhuqq~lKQz8W7ZQ@sL3A1H;8apxlHwreuujGT+@*9e19Z+6#w<=Qi3*jZnHa^PYjBM zW#~69J8-tJKx_Lw-<+p)xy-;|$--8O{%AVV$6=;A8uyB8yg`VBV}?C^m#h+jZlDRy z6}RXq4z8!&bUxH*&*wyt8oPK`Sc>yelHkRPd!xiWg6?Gq$@0FSxsIZNPJ#VVn7dyQ zN0UO>up&FUo=^%m6PMJ@$CNS)VyTWgLqWVrt+AXkj)7>ricL)C1iubo4BUV33J zgfANX-cz^O#LBP7o5v}2Itjbahjk~rwbKbTJ_`lyD?!5dy%?!&Hh(?PdpQ94>Ut_( z?2z#9ChU~IoT*!c3GU@kMAtbR%1j|fq0>@QpgAtgLW^;m5~oMRQHxeqo36a5gpR zuy((#r1t&8+WmVY?tLZ_&aB()6;@jUndtJnbai<9`IU&5r1yw8IEC@Z459-eAO*qK zQltw(W8BxRV5F*7JDt3kJ+TDSD%MQ~XCU6!F#@u?=d`ZxMrgZ*dVYnsoqQ?vUhy3E=wDWc{F(dZuOAI}(fkmu9f_(Yf8a@EZi7mK=+F{pC-{h*F%Y+sGoZWQyQKvJBJ zF`=f$E6q(T1vegCS^L^x>-e_sm)?l^nhW`kb$?%{e>?qXh?FK?0cjTwq@VZc)9**w zJrE7u!UThW6>&g+DB6;Zj$P>q>lNINAliixm7V~n>?oamH^9lUV!ns#QS4Lr=&gsJ zl4A}n0nyuZmuaj_* zLI8tpZlnteWx12|gPEzt8vf->9$Iu;n9H}B64`NuKO*^mG7H44feLDXCY&m~hmErB z48hmrQr4~9x%qadJEY~^oM=?GLVw)dKAnM?F_aq^q~3EHQtO*9lzD7dU+b((sUzOZ zdw89N!}bTazk~k{jsNW=&E?H~Q41uf4X}{tH>@W=PUC=RId&=Q&*-tnXJlj;X)`#9(l&c7 zzPiVxpI6TjC06`K0|UY!9LEwDOKmXnA?qUt_R=zT{1SF9&sqcB{nxlO4dug zKGf0`D3la426hl=yUZqo4R}p5wjR83EK=g^F7lMwKI5$CG>A#&|D^h=_90O0;VzY-~=io=;8@d_t|1a zr0I%s6wbEoT)z(f zK#^q*nTyIi7KVQy6=|HhFd{3WYsDDgNxVQgfdP94r%|wxz#U;NwJlR=x|nK0?_OR( ztbUE(s>hBEwaHWS{L0|u4`cmVZpB^_=pd?4ZYK8OzVdN5S5dBJSph0%XE zmapA=4}<@USo_&mf7{LXMl=4S{B|%bwpJ{*ul>bTa;iicP zVvpN5$5*j?46;4@lVT70?;Qx)pUR_c{XlZk08Rg0$akCk9Y{VtyuHS7`_JC+z<~bx zr-*ydCho9p9BmW_5|Rc``e_kI+s6H9I7}cxpS^J~=Fbl2bEh@XP>ySBuh-iCv!|{8 z|ML288khZOAO~#Ulf;Jg9|rP`q;KaGn5RE^fP1~z4hER;E5&~4%yzQuy?Z(bvSH8t z!XbZ_{iPW2WB_~jb`AhIpALY7JR=CmzB@SDyA1>-4X}K=Kn`!U#ZK2 zF7PuAP=j+Sa|cr0zefBuDn1JRXqPY$dSH}=d#cdCsCTah^C+folc9UJWQsRo4j~SgO#Qf1 z$-xl*Nta->r!oXkF~g659IVZIk-78f0{M9)9|1V*8ZChP_HW5{@~@}-w?zF60JLE^0J3i}M|&n5%;x0j z0@>TS{L2msM=>95EpUL@mgQ8H_Y;`EvncK>{OAq;1MpeE?DHwk{14E977AHA*(0-grozxX>)AGy5!Bc<+Lz6Cu%rE>oPc;8Xu@sMNh z4($H3w-_-2lYhT#^1r-j??xYsG#2|@_`Oan*={xOgzs`TjnM-bpNfR)gxqdlAw{W;YhUgNMt{y5kZ zReba^-hqlmMSm0OlL|5ZiNAZd%0N#VfJXc;fcqUaA76tGyZ@`eGv`zCWhbREj$ZaU zP-5@tgAv=`Jpa_yuY>jLpR{QUJWD?%ZGyJwKLWFNM`-`qTiKURAIwp0eiQucuS!Sn z41w^a0o;MVviOu$bqw9nZ~ROi!x04ibLh4!`}@(KkjOZC0SAOL4G;x9`~BT2{-^6W zKces9=vYzyG|>NJ8so5gY&<;>C#5ouUQjuhPZ5Pv(+CL6cjHb_N#eoW?Hl*E+iG7B zOyFl4;4W~Z_3N2;Ca{)q~251E)(0&W#!=c>2(e2@5y9+9R6zGYn zJ$j$uK((@}r;hkX(el4h@m@JT=t%=S1$v@W=EA=Le4?t4R>dD6UsnH3$WMxz|BbTu pYOFy|8bA%0IQ}il{wK)as2du1-C*xm^U8qD08fL0ukQWr{{TM{Zeaib diff --git a/packages/core/tests/package/propertyFetchers/AssignPermissionSetFetcher.test.ts b/packages/core/tests/package/propertyFetchers/AssignPermissionSetFetcher.test.ts deleted file mode 100644 index 6b4f6a4f2..000000000 --- a/packages/core/tests/package/propertyFetchers/AssignPermissionSetFetcher.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { Logger } from '@dxatscale/sfp-logger'; -import AssignPermissionSetFetcher from '../../../src/package/propertyFetchers/AssignPermissionSetFetcher'; -import PropertyFetcher from '../../../src/package/propertyFetchers/PropertyFetcher'; -import SfpPackage from '../../../src/package/SfpPackage'; -import SfpPackageBuilder from '../../../src/package/SfpPackageBuilder'; - -jest.mock('../../../src/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new AssignPermissionSetFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getSfpowerscriptsProperties(sfpPackage, logger); - } - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - -describe('Given a package descriptor with assignPermSetsPreDeployment or assignPermSetsPostDeployment', () => { - it('Should set assignPermSetsPreDeployment property in SfpPackage', async () => { - let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - assignPermissionSetFetcher.getSfpowerscriptsProperties(sfpPackage); - expect(sfpPackage.assignPermSetsPreDeployment).toStrictEqual(['PermSetB']); - }); - - it('Should set assignPermSetsPostDeployment property in SfpPackage', async () => { - let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - assignPermissionSetFetcher.getSfpowerscriptsProperties(sfpPackage); - expect(sfpPackage.assignPermSetsPostDeployment).toStrictEqual(['PermSetA']); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - assignPermSetsPostDeployment: ['PermSetA'], - assignPermSetsPreDeployment: ['PermSetB'], -}; diff --git a/packages/core/tests/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts b/packages/core/tests/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts deleted file mode 100644 index 62160366c..000000000 --- a/packages/core/tests/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import DestructiveManifestPathFetcher from '../../../src/package/propertyFetchers/DestructiveManifestPathFetcher'; -import SfpPackage from '../../../src/package/SfpPackage'; -const fs = require('fs-extra'); -import { Logger } from '@dxatscale/sfp-logger'; -import PropertyFetcher from '../../../src/package/propertyFetchers/PropertyFetcher'; -import SfpPackageBuilder from '../../../src/package/SfpPackageBuilder'; - - -jest.mock('../../../src/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new DestructiveManifestPathFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getSfpowerscriptsProperties(sfpPackage, logger); - } - - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - - -describe('Given a package descriptor with a destructiveChangePath', () => { - beforeEach(() => { - jest.spyOn(fs, 'readFileSync').mockImplementation(() => { - return destructiveChangesXml; - }); - }); - - it('Should set destructiveChangesPath property in SfpPackage', async () => { - let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - await destructiveManifestPathFetcher.getSfpowerscriptsProperties(sfpPackage); - expect(sfpPackage.destructiveChangesPath).toBe('destructiveChanges.xml'); - }); - - it('Should set destructiveChanges property in SfpPackage', async () => { - let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - await destructiveManifestPathFetcher.getSfpowerscriptsProperties(sfpPackage); - expect(sfpPackage.destructiveChanges).toEqual(destructiveChanges); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - destructiveChangePath: 'destructiveChanges.xml', -}; - -const destructiveChangesXml: string = ` - - - - MyCustomObject__c - CustomObject - - -`; -const destructiveChanges: any = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: { - members: 'MyCustomObject__c', - name: 'CustomObject', - }, - }, -}; diff --git a/packages/core/tests/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts b/packages/core/tests/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts deleted file mode 100644 index 546b58ee3..000000000 --- a/packages/core/tests/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { Logger } from '@dxatscale/sfp-logger'; -import PropertyFetcher from '../../../src/package/propertyFetchers/PropertyFetcher'; -import ReconcileProfilePropertyFetcher from '../../../src/package/propertyFetchers/ReconcileProfilePropertyFetcher'; -import SfpPackage from '../../../src/package/SfpPackage'; -import SfpPackageBuilder from '../../../src/package/SfpPackageBuilder'; - -jest.mock('../../../src/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new ReconcileProfilePropertyFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getSfpowerscriptsProperties(sfpPackage, logger); - } - - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - -describe('Given a package descriptor with reconcileProfiles', () => { - it('Should set reconcileProfiles property in SfpPackage', async () => { - let reconcileProfilePropertyFetcher: ReconcileProfilePropertyFetcher = new ReconcileProfilePropertyFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - reconcileProfilePropertyFetcher.getSfpowerscriptsProperties(sfpPackage); - expect(sfpPackage.reconcileProfiles).toBe(false); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - reconcileProfiles: false, -}; diff --git a/packages/core/tests/permsets/AssignPermissionSets.test.ts b/packages/core/tests/permsets/AssignPermissionSets.test.ts deleted file mode 100644 index 0afa66ede..000000000 --- a/packages/core/tests/permsets/AssignPermissionSets.test.ts +++ /dev/null @@ -1,198 +0,0 @@ -const child_process = require('child_process'); -import AssignPermissionSetsImpl from '../../src/permsets/AssignPermissionSetsImpl'; -import { jest, expect } from '@jest/globals'; -import { VoidLogger } from '@dxatscale/sfp-logger'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; - -const $$ = new TestContext(); - -jest.mock('../../src/permsets/PermissionSetFetcher', () => { - class PermissionSetFetcher { - constructor(private username: string, private conn: Connection) {} - fetchAllPermsetAssignment(): any[] { - return [ - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', - }, - Id: '0Pa2s000000PC8fCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', - }, - Name: 'Salesforce_DX_Permissions', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: 'test-sfvulqawd2w0@example.com', - }, - }, - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', - }, - Id: '0Pa2s000000PC8aCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', - }, - Name: 'X00ex00000018ozT_128_09_43_34_1', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: 'test-sfvulqawd2w0@example.com', - }, - }, - ]; - } - } - return PermissionSetFetcher; -}); - -describe('Given a set of permsets, assign it to the user who is deploying the packages', () => { - it('should assign a set of permset, if its not previously assigned', async () => { - - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(2); - expect(results.failedAssignments).toHaveLength(0); - }); - - it('should assign a partial set of permset, if any of them fails', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(1); - expect(results.failedAssignments).toHaveLength(1); - }); - - it('should assign none, if all of them fails', async () => { - const testData = new MockTestOrgData(); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(0); - expect(results.failedAssignments).toHaveLength(2); - }); -}); diff --git a/packages/core/tests/permsets/PermissionSetFetcher.test.ts b/packages/core/tests/permsets/PermissionSetFetcher.test.ts deleted file mode 100644 index 6d96d2779..000000000 --- a/packages/core/tests/permsets/PermissionSetFetcher.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { expect } from '@jest/globals'; -import PermissionSetFetcher from '../../src/permsets/PermissionSetFetcher'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AnyJson } from '@salesforce/ts-types'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -const $$ = new TestContext(); - -describe('Retrieve assigned permsets provided username and a target org', () => { - it('should return all the permsets for the provided username', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - - let records: AnyJson = { - records: [ - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', - }, - Id: '0Pa2s000000PC8fCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', - }, - Name: 'Salesforce_DX_Permissions', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: testData.username, - }, - }, - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', - }, - Id: '0Pa2s000000PC8aCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', - }, - Name: 'X00ex00000018ozT_128_09_43_34_1', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: testData.username, - }, - }, - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); - expect(permsetRecords).toHaveLength(2); - }); - - it('should return an empty array, if no permsets are assigned', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - - let records: AnyJson = { records: [] }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); - expect(permsetRecords).toHaveLength(0); - }); - - it('should throw an error, if unable to query permsets', async () => { - const testData = new MockTestOrgData(); - - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { records: [] }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - throw new Error('Unable to fetch records'); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - - try { - await permsetListImpl.fetchAllPermsetAssignment(); - } catch (error) { - expect(error).toBeDefined(); - } - }, 500000); -}); diff --git a/packages/core/tests/permsets/PermissionSetGroupUpdateAwaiter.test.ts b/packages/core/tests/permsets/PermissionSetGroupUpdateAwaiter.test.ts deleted file mode 100644 index 07e796a5c..000000000 --- a/packages/core/tests/permsets/PermissionSetGroupUpdateAwaiter.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -import { AnyJson } from '@salesforce/ts-types'; -const $$ = new TestContext(); -import PermissionSetGroupUpdateAwaiter from '../../src/permsets/PermissionSetGroupUpdateAwaiter'; -import { expect } from '@jest/globals'; - -describe('Await till permissionsets groups are updated', () => { - it('should return if all permsets groups are updated', async () => { - const testData = new MockTestOrgData(); - - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { - records: [], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( - connection, - null - ); - await expect(permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated()).resolves.toBeUndefined(); - }); -}); diff --git a/packages/core/tests/project/ProjectConfig.test.ts b/packages/core/tests/project/ProjectConfig.test.ts deleted file mode 100644 index da08c8ecd..000000000 --- a/packages/core/tests/project/ProjectConfig.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -const fs = require("fs-extra"); -import { jest, expect } from '@jest/globals'; -import { PackageType } from '../../src/package/SfpPackage'; -import ProjectConfig from '../../src/project/ProjectConfig'; - -describe('Given a project directory or sfdx-project.json with multiple packages', () => { - //given the below sfdx-project.json - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0x002232323232' }, - }; - - beforeEach(() => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return JSON.stringify(sfdx_project); - }); - }); - - it('Get the package id of an unlocked package', () => { - expect(ProjectConfig.getPackageId(sfdx_project, 'bi')).toBe('0x002232323232'); - }); - - it('Throws an error, if the package id is missing in PackageAlias', () => { - expect(() => { - ProjectConfig.getPackageId(sfdx_project, 'bi2'); - }).toThrowError('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); - }); - - it('Fetches all the package', () => { - const manifestHelperMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - manifestHelperMock.mockImplementation((projectDirectory: string) => { - return sfdx_project; - }); - expect(ProjectConfig.getAllPackages(null)).toStrictEqual([ - 'temp', - 'core', - 'mass-dataload', - 'access-mgmt', - 'bi', - ]); - }); - - it('Fetches all the package from a project config', () => { - - expect(ProjectConfig.getAllPackagesFromProjectConfig(sfdx_project)).toStrictEqual([ - 'temp', - 'core', - 'mass-dataload', - 'access-mgmt', - 'bi', - ]); - }); - - it('Get manifest, provided a directory', () => { - expect(ProjectConfig.getSFDXProjectConfig(null)).toStrictEqual(sfdx_project); - }); - - it('Gets the type of a package', () => { - expect(ProjectConfig.getPackageType(sfdx_project, 'bi')).toBe(PackageType.Unlocked); - expect(ProjectConfig.getPackageType(sfdx_project, 'core')).toBe(PackageType.Source); - expect(ProjectConfig.getPackageType(sfdx_project, 'mass-dataload')).toBe(PackageType.Data); - }); - - - - - it('Gets the package descriptor of a provided package,provided directory', () => { - let corePackage = { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - expect(ProjectConfig.getSFDXPackageDescriptor(null, 'core')).toStrictEqual(corePackage); - }); - - it('Gets the package descriptor of a provided package', () => { - let corePackage = { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - expect(ProjectConfig.getPackageDescriptorFromConfig('core', sfdx_project)).toStrictEqual(corePackage); - }); - - it('Gets the default package, provided directory', () => { - let defaultPackage = { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }; - - expect(ProjectConfig.getDefaultSFDXPackageDescriptor(null)).toStrictEqual(defaultPackage); - }); - - it('Cleans any other package, than the one provided', () => { - let cleaned_sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0x002232323232' }, - }; - - expect(ProjectConfig.cleanupMPDFromProjectDirectory(null, 'temp')).toStrictEqual(cleaned_sfdx_project); - }); - - it(`Gets all the external dependencies of a project`,()=>{ - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0H432322321',bi2:'0H43232232' }, - }; - - - - expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([{ - alias:'bi2', - Package2IdOrSubscriberPackageVersionId:"0H43232232" - }]) - - }); - - it(`Returns empty if there are no external dependencies`,()=>{ - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0H432322321' }, - }; - - expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([]) - - }); - -}); diff --git a/packages/core/tests/queryHelper/ChunkCollection.test.ts b/packages/core/tests/queryHelper/ChunkCollection.test.ts deleted file mode 100644 index 74f5e370d..000000000 --- a/packages/core/tests/queryHelper/ChunkCollection.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { expect } from '@jest/globals'; -import chunkCollection from '../../src/queryHelper/ChunkCollection'; - -describe('Given a collection', () => { - - it('should return a single chunk for a collection less than 3000 chars', () => { - const collection = ["ApexClassA", "ApexClassB", "ApexClassC"]; - const result = chunkCollection(collection); - expect(result.length).toBe(1); - expect(result).toEqual([ - ["ApexClassA", "ApexClassB", "ApexClassC"] - ]); - }); - - - it('should return N chunks for a collection exceeding the chunk size', () => { - const collection = ["ApexClassA", "ApexClassB", "ApexClassC", "ApexClassD"]; - const result = chunkCollection(collection, 1050, 1000); - expect(result.length).toBe(2); - expect(result).toEqual([ - ["ApexClassA", "ApexClassB", "ApexClassC"], - ["ApexClassD"] - ]); - }); - - it('should throw an error if single element in collection exceeds chunk size', () => { - const collection = ["ApexClassWithAnExceedinglyLongNameGreaterThanTheChunkSize"]; - expect(() => {chunkCollection(collection, 1050, 1000)}).toThrow(); - }); -}); diff --git a/packages/core/tests/utils/ChunkArray.test.ts b/packages/core/tests/utils/ChunkArray.test.ts deleted file mode 100644 index 8fdde04b8..000000000 --- a/packages/core/tests/utils/ChunkArray.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from '@jest/globals'; -import { chunkArray } from '../../src/utils/ChunkArray'; - -describe('Given an input array', () => { - const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - - it('should chunk for even chunk size', () => { - const result = chunkArray(2, input); - expect(result.length).toBe(5); - expect(result).toEqual([ - [1, 2], - [3, 4], - [5, 6], - [7, 8], - [9, 10], - ]); - }); - - it('should chunk for odd chunk size', () => { - const result = chunkArray(3, input); - expect(result.length).toBe(4); - expect(result).toEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]); - }); -}); diff --git a/packages/core/tests/utils/FileSystem.test.ts b/packages/core/tests/utils/FileSystem.test.ts deleted file mode 100644 index d76ffadf9..000000000 --- a/packages/core/tests/utils/FileSystem.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { expect } from '@jest/globals'; -import FileSystem from '../../src/utils/FileSystem'; -const path = require('path'); - -describe('Given a search directory', () => { - it('should return nested files', () => { - const resourcesDir = path.join(__dirname, 'resources'); - let files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, false); - expect(files).toEqual(expectedFiles); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, false); - expect(files).toEqual(expectedFilesIncludingDirs); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, true); - expect(files).toEqual(expectedFiles.map((elem) => path.join(resourcesDir, 'a', elem))); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, true); - expect(files).toEqual(expectedFilesIncludingDirs.map((elem) => path.join(resourcesDir, 'a', elem))); - }); -}); - -const expectedFiles = ['b/b1.file', 'b/c/c1.file', 'b/c/c2.file', 'b/d/d1.file', 'b/d/x/x1.file', 'b/e/e1.file']; -const expectedFilesIncludingDirs = [ - 'b', - 'b/b1.file', - 'b/c', - 'b/c/c1.file', - 'b/c/c2.file', - 'b/d', - 'b/d/d1.file', - 'b/d/x', - 'b/d/x/x1.file', - 'b/e', - 'b/e/e1.file', -]; diff --git a/packages/core/tests/utils/extractDomainFromUrl.test.ts b/packages/core/tests/utils/extractDomainFromUrl.test.ts deleted file mode 100644 index f751b2d45..000000000 --- a/packages/core/tests/utils/extractDomainFromUrl.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { expect } from '@jest/globals'; -import extractDomainFromUrl from '../../src/utils/extractDomainFromUrl'; - -describe('Given a URL', () => { - it('should extract the domain name for https', () => { - expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( - 'force-power-8147.cs115.my.salesforce.com' - ); - }); - - it('should extract the domain name for http', () => { - expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( - 'force-power-8147.cs115.my.salesforce.com' - ); - }); - - it('should extract only the domain name', () => { - expect( - extractDomainFromUrl( - 'https://company.lightning.force.com/lightning/o/Account/list?filterName=00B4Y000000VyMDUA0' - ) - ).toBe('company.lightning.force.com'); - }); - - it('should return null for protocol other than http/s', () => { - expect(extractDomainFromUrl('ftp://ftp.example.com/files/fileA')).toBe(null); - }); - - it('should return input for falsy values', () => { - expect(extractDomainFromUrl('')).toBe(''); - expect(extractDomainFromUrl(undefined)).toBe(undefined); - expect(extractDomainFromUrl(null)).toBe(null); - }); -}); diff --git a/packages/core/tests/utils/resources/a/b/b1.file b/packages/core/tests/utils/resources/a/b/b1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tests/utils/resources/a/b/c/c1.file b/packages/core/tests/utils/resources/a/b/c/c1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tests/utils/resources/a/b/c/c2.file b/packages/core/tests/utils/resources/a/b/c/c2.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tests/utils/resources/a/b/d/d1.file b/packages/core/tests/utils/resources/a/b/d/d1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tests/utils/resources/a/b/d/x/x1.file b/packages/core/tests/utils/resources/a/b/d/x/x1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tests/utils/resources/a/b/e/e1.file b/packages/core/tests/utils/resources/a/b/e/e1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json deleted file mode 100644 index c0fdf19e2..000000000 --- a/packages/core/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "experimentalDecorators": true, - "outDir": "./lib", - "rootDir": "./src", - "skipLibCheck": true, - "declarationMap": true, - "baseUrl": "/src", - "paths": {} - }, - "exclude": ["node_modules", "dist", "tests", "lib"] -} diff --git a/packages/forcemula/package.json b/packages/forcemula/package.json index 0060fe19f..470e29b15 100644 --- a/packages/forcemula/package.json +++ b/packages/forcemula/package.json @@ -1,5 +1,5 @@ { - "name": "@dxatscale/forcemula", + "name": "@flxblio/forcemula", "version": "1.0.0", "description": "Extract fields from Salesforce formulas", "main": "src/index.js", @@ -9,7 +9,7 @@ "watch": "jest --silent=false --verbose --detectOpenHandles --coverage --watchAll", "test:coverage": "jest --silent=false --verbose --detectOpenHandles --coverage" }, - "author": "dxatscale", + "author": "flxblio", "license": "MIT", "devDependencies": { "jest": "^29.6.1" diff --git a/packages/sfdx-process-wrapper/package.json b/packages/sfdx-process-wrapper/package.json index 1ffbb719c..079c29fd9 100644 --- a/packages/sfdx-process-wrapper/package.json +++ b/packages/sfdx-process-wrapper/package.json @@ -1,9 +1,9 @@ { - "name": "@dxatscale/sfdx-process-wrapper", + "name": "@flxblio/sfdx-process-wrapper", "version": "1.0.2", "description": "Wraps around SFDXCommand to exeute it using a subprocess", - "author": "dxatscale", - "homepage": "https://github.com/dxatscale/sfpowerscripts#readme", + "author": "flxbl", + "homepage": "https://github.com/flxblio/sfp#readme", "license": "MIT", "main": "lib/index", "types": "lib/index", @@ -11,7 +11,7 @@ "lib": "lib" }, "dependencies": { - "@dxatscale/sfp-logger": "^2.1.2", + "@flxblio/sfp-logger": "^2.1.2", "fs-extra": "^9.1.0" }, "devDependencies": { @@ -24,7 +24,7 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/dxatscale/sfpowerscripts.git" + "url": "git+https://github.com/flxblio/sfp.git" }, "publishConfig": { "access": "public" @@ -35,6 +35,6 @@ "compile": "tsc -b tsconfig.json" }, "bugs": { - "url": "https://github.com/dxatscale/sfpowerscripts/issues" + "url": "https://github.com/flxblio/sfp/issues" } } diff --git a/packages/sfdx-process-wrapper/src/SFDXCommand.ts b/packages/sfdx-process-wrapper/src/SFDXCommand.ts index 7a15821c4..bb2092baa 100644 --- a/packages/sfdx-process-wrapper/src/SFDXCommand.ts +++ b/packages/sfdx-process-wrapper/src/SFDXCommand.ts @@ -1,5 +1,5 @@ import ExecuteCommand from './commandExecutor/ExecuteCommand'; -import SFPLogger, { Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; export abstract class SFDXCommand { public constructor( diff --git a/packages/sfdx-process-wrapper/src/commandExecutor/ExecuteCommand.ts b/packages/sfdx-process-wrapper/src/commandExecutor/ExecuteCommand.ts index d7be83457..d84cd0718 100644 --- a/packages/sfdx-process-wrapper/src/commandExecutor/ExecuteCommand.ts +++ b/packages/sfdx-process-wrapper/src/commandExecutor/ExecuteCommand.ts @@ -1,5 +1,5 @@ import child_process = require('child_process'); -import SFPLogger, { COLOR_TRACE, Logger, LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { COLOR_TRACE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; import defaultProcessOptions from './DefaultProcessOptions'; diff --git a/packages/sfplogger/package.json b/packages/sfplogger/package.json index e87a1e032..d374319dd 100644 --- a/packages/sfplogger/package.json +++ b/packages/sfplogger/package.json @@ -1,5 +1,5 @@ { - "name": "@dxatscale/sfp-logger", + "name": "@flxblio/sfp-logger", "version": "2.1.2", "description": "sfp logger library", "main": "lib/SFPLogger.js", @@ -26,14 +26,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/dxatscale/sfpowerscripts.git" + "url": "git+https://github.com/flxblio/sfp.git" }, - "author": "dxatscale", + "author": "flxblio", "license": "MIT", "bugs": { - "url": "https://github.com/dxatscale/sfpowerscripts/issues" + "url": "https://github.com/flxblio/sfp/issues" }, - "homepage": "https://github.com/dxatscale/sfpowerscripts/tree/main/packages/sfplogger#readme", + "homepage": "https://github.com/flxblio/sfp/tree/main/packages/sfplogger#readme", "keywords": [ "logger", "sfp", diff --git a/packages/sfpowerscripts-cli/.babel.config.js b/packages/sfpowerscripts-cli/.babel.config.js deleted file mode 100644 index 6e7404754..000000000 --- a/packages/sfpowerscripts-cli/.babel.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - - plugins: [ - '@babel/plugin-proposal-optional-chaining', - '@babel/plugin-proposal-nullish-coalescing-operator' - ], -}; \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/.snyk b/packages/sfpowerscripts-cli/.snyk deleted file mode 100644 index d9970733e..000000000 --- a/packages/sfpowerscripts-cli/.snyk +++ /dev/null @@ -1,76 +0,0 @@ -# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. -version: v1.19.0 -ignore: {} -# patches apply the minimum changes required to fix a vulnerability -patch: - SNYK-JS-LODASH-567746: - - '@salesforce/core > jsforce > lodash': - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > jsforce > lodash: - patched: '2021-01-21T01:54:07.552Z' - - '@salesforce/command > cli-ux > lodash': - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > archiver > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > heroku-cli-util > lodash: - patched: '2021-01-21T01:54:07.552Z' - - '@salesforce/command > @oclif/test > fancy-test > lodash': - patched: '2021-01-21T01:54:07.552Z' - - '@salesforce/command > @salesforce/core > jsforce > lodash': - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > archiver > async > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > archiver > archiver-utils > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > archiver > zip-stream > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/command > @oclif/test > fancy-test > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/plugin-analytics > @salesforce/core > jsforce > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/source-deploy-retrieve > @salesforce/core > jsforce > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/plugin-analytics > @salesforce/command > cli-ux > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/source-deploy-retrieve > archiver > async > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > archiver > zip-stream > archiver-utils > lodash: - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/plugin-analytics > @salesforce/command > @oclif/test > fancy-test > lodash: - patched: '2021-01-21T01:54:07.552Z' - - '@salesforce/core > @salesforce/ts-sinon > sinon > nise > @sinonjs/formatio > @sinonjs/samsam > lodash': - patched: '2021-01-21T01:54:07.552Z' - - '@salesforce/command > @salesforce/core > @salesforce/ts-sinon > sinon > nise > @sinonjs/formatio > @sinonjs/samsam > lodash': - patched: '2021-01-21T01:54:07.552Z' - - salesforce-alm > @salesforce/plugin-analytics > @salesforce/core > @salesforce/ts-sinon > sinon > nise > @sinonjs/formatio > @sinonjs/samsam > lodash: - patched: '2021-01-21T01:54:07.552Z' - - snyk > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-nodejs-lockfile-parser > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-go-plugin > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > @snyk/snyk-cocoapods-plugin > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-cpp-plugin > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-docker-plugin > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-go-plugin > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-gradle-plugin > @snyk/java-call-graph-builder > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-docker-plugin > snyk-nodejs-lockfile-parser > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-mvn-plugin > @snyk/java-call-graph-builder > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > @snyk/snyk-cocoapods-plugin > @snyk/cocoapods-lockfile-parser > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-gradle-plugin > @snyk/cli-interface > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-mvn-plugin > @snyk/cli-interface > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' - - snyk > snyk-python-plugin > snyk-poetry-lockfile-parser > @snyk/dep-graph > graphlib > lodash: - patched: '2021-01-21T02:20:34.238Z' diff --git a/packages/sfpowerscripts-cli/CHANGELOG.md b/packages/sfpowerscripts-cli/CHANGELOG.md deleted file mode 100644 index 6c0a4531b..000000000 --- a/packages/sfpowerscripts-cli/CHANGELOG.md +++ /dev/null @@ -1,11 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [20.30.0](https://github.com/flxblio/sfp/compare/@flxblio/sfp@20.29.0...@flxblio/sfp@20.30.0) (2023-03-22) - - -### Features - -* **publish:** Add new flag to delete Git tags by age and limit ([#1275](https://github.com/flxblio/sfp/issues/1275)) ([aae62d6](https://github.com/flxblio/sfp/commit/aae62d6d3e7eb390dddcf2ca46b99b44ca4cc933)) diff --git a/packages/sfpowerscripts-cli/README.md b/packages/sfpowerscripts-cli/README.md deleted file mode 100644 index 0abca1322..000000000 --- a/packages/sfpowerscripts-cli/README.md +++ /dev/null @@ -1,98 +0,0 @@ -

- sfp -

- -![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) -[![GitHub stars](https://img.shields.io/github/stars/flxblio/sfp)](https://github.com/flxblio/sfp/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/flxblio/sfp.svg)](https://github.com/flxblio/sfp/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxblio/sfp/blob/master/LICENSE) -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) - -[![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) - -[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxblio) - -A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxblio.io - -#### Features - -- Features an Orchestrator, which utilizes sfdx-project.json as the source of truth for driving the build system, ensuring very low maintenance on programs often dealing with multiple number of packages -- Builds packages in parallel by respecting dependencies -- Ability to selectively build changed packages in a mono repo -- Ability to deploy only packages that are changed in repo -- Pooling commands to prepare a pool of scratch org's with packages pre installed for optimized Pull/Merge Request validation -- Artifacts Driven, all create commands produce an artifact or operate on an artifact -- Integrate with any CI/CD system of choice -- All commands are enabled with statsD, for collecting metrics about your pipeline. - -There are lot more features to explore. Read more at https://docs.flxblio.io - -The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxblio/sfp) or can be -used by using the [docker image](https://github.com/flxblio/sfp/pkgs/container/sfp) - - - - - -#### Motivation - -- Need for artifact driven build system for package based development models especially on complex and large programs - -- Providing additional functionality that is either not supported by the sfdx-cli, such as data packages or automatically understanding tests in a given package - -- Ease of use, one should not be spending too much time scripting a pipeline. - -#### CI/CD Reference Implementation - -Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxblio.io/implementing-your-ci-cd/github) - -#### Installing sfp locally - -sfp can be installed on your local device using npm - -``` -npm i -g @flxblio/sfp -``` - - -#### Docker - -Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxblio/sfp/pkgs/container/sfp). - -We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. - -#### Build Instructions -To build sfp execute the following on the terminal: -``` -npm i -g lerna #Install Lerna Globally -cd # Navigate to the checked out directory -pnpm i -lerna run build -``` - -To run unit tests - -``` -lerna run test -``` - -To debug and test plugin - -``` - cd packages/sfp-cli - npm link -``` - -#### Maintainers - -List of Maintainers are available in the [link](https://docs.flxblio.io/about-us) - - -#### Where do I reach for queries? - -Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxblio) as well. - - -## License -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_large) diff --git a/packages/sfpowerscripts-cli/bin/run b/packages/sfpowerscripts-cli/bin/run deleted file mode 100755 index ab6300955..000000000 --- a/packages/sfpowerscripts-cli/bin/run +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env node - -const oclif = require('@oclif/core') - -oclif.run().then(require('@oclif/core/flush')).catch(require('@oclif/core/handle')) \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/bin/run.cmd b/packages/sfpowerscripts-cli/bin/run.cmd deleted file mode 100644 index 968fc3075..000000000 --- a/packages/sfpowerscripts-cli/bin/run.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off - -node "%~dp0\run" %* diff --git a/packages/sfpowerscripts-cli/coverage/clover.xml b/packages/sfpowerscripts-cli/coverage/clover.xml deleted file mode 100644 index 2f2b77c16..000000000 --- a/packages/sfpowerscripts-cli/coverage/clover.xml +++ /dev/null @@ -1,2694 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/sfpowerscripts-cli/coverage/coverage-final.json b/packages/sfpowerscripts-cli/coverage/coverage-final.json deleted file mode 100644 index 8fff365e9..000000000 --- a/packages/sfpowerscripts-cli/coverage/coverage-final.json +++ /dev/null @@ -1,72 +0,0 @@ -{"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/ProjectValidation.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/ProjectValidation.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"7":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"8":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"9":{"start":{"line":20,"column":21},"end":{"line":20,"column":117}},"10":{"start":{"line":21,"column":24},"end":{"line":21,"column":48}},"11":{"start":{"line":22,"column":28},"end":{"line":22,"column":57}},"12":{"start":{"line":24,"column":35},"end":{"line":24,"column":104}},"13":{"start":{"line":26,"column":12},"end":{"line":32,"column":null}},"14":{"start":{"line":27,"column":16},"end":{"line":31,"column":null}},"15":{"start":{"line":35,"column":10},"end":{"line":35,"column":null}},"16":{"start":{"line":36,"column":10},"end":{"line":36,"column":null}},"17":{"start":{"line":41,"column":8},"end":{"line":58,"column":null}},"18":{"start":{"line":42,"column":23},"end":{"line":42,"column":34}},"19":{"start":{"line":44,"column":16},"end":{"line":49,"column":null}},"20":{"start":{"line":51,"column":16},"end":{"line":56,"column":null}},"21":{"start":{"line":63,"column":8},"end":{"line":85,"column":null}},"22":{"start":{"line":64,"column":30},"end":{"line":64,"column":91}},"23":{"start":{"line":66,"column":34},"end":{"line":66,"column":50}},"24":{"start":{"line":71,"column":16},"end":{"line":83,"column":null}},"25":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"loc":{"start":{"line":13,"column":4},"end":{"line":17,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":19,"column":11},"end":{"line":19,"column":34}},"loc":{"start":{"line":19,"column":34},"end":{"line":38,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":26,"column":37},"end":{"line":26,"column":38}},"loc":{"start":{"line":26,"column":57},"end":{"line":32,"column":13}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":40,"column":11},"end":{"line":40,"column":31}},"loc":{"start":{"line":40,"column":31},"end":{"line":59,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":41,"column":86},"end":{"line":41,"column":89}},"loc":{"start":{"line":41,"column":93},"end":{"line":58,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":62,"column":11},"end":{"line":62,"column":38}},"loc":{"start":{"line":62,"column":38},"end":{"line":86,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":63,"column":86},"end":{"line":63,"column":89}},"loc":{"start":{"line":63,"column":93},"end":{"line":85,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":16},"end":{"line":69,"column":88}},"type":"binary-expr","locations":[{"start":{"line":68,"column":16},"end":{"line":68,"column":48}},{"start":{"line":69,"column":17},"end":{"line":69,"column":51}},{"start":{"line":69,"column":55},"end":{"line":69,"column":87}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":8,"7":8,"8":8,"9":4,"10":4,"11":4,"12":1,"13":1,"14":7,"15":1,"16":1,"17":2,"18":4,"19":1,"20":1,"21":2,"22":4,"23":4,"24":1,"25":1},"f":{"0":8,"1":4,"2":7,"3":2,"4":4,"5":2,"6":4},"b":{"0":[4,2,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":15,"column":51},"end":{"line":15,"column":53}},"4":{"start":{"line":17,"column":23},"end":{"line":17,"column":50}},"5":{"start":{"line":19,"column":35},"end":{"line":19,"column":76}},"6":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}},"7":{"start":{"line":20,"column":26},"end":{"line":20,"column":92}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":106}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":58},"end":{"line":27,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":45},"end":{"line":19,"column":49}},"loc":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":15,"column":51},"end":{"line":15,"column":53}},"4":{"start":{"line":17,"column":23},"end":{"line":17,"column":52}},"5":{"start":{"line":19,"column":35},"end":{"line":19,"column":76}},"6":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}},"7":{"start":{"line":20,"column":26},"end":{"line":20,"column":94}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":106}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":62},"end":{"line":27,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":45},"end":{"line":19,"column":49}},"loc":{"start":{"line":19,"column":53},"end":{"line":19,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":6,"column":24},"end":{"line":6,"column":40}},"3":{"start":{"line":24,"column":14},"end":{"line":24,"column":16}},"4":{"start":{"line":26,"column":23},"end":{"line":26,"column":66}},"5":{"start":{"line":28,"column":35},"end":{"line":28,"column":76}},"6":{"start":{"line":28,"column":53},"end":{"line":28,"column":64}},"7":{"start":{"line":29,"column":24},"end":{"line":29,"column":180}},"8":{"start":{"line":31,"column":28},"end":{"line":36,"column":38}},"9":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"10":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"11":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":40},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":11},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":67},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":45},"end":{"line":28,"column":49}},"loc":{"start":{"line":28,"column":53},"end":{"line":28,"column":64}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":1,"1":0,"2":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":31},"end":{"line":4,"column":48}},"2":{"start":{"line":4,"column":58},"end":{"line":4,"column":72}},"3":{"start":{"line":10,"column":14},"end":{"line":10,"column":16}},"4":{"start":{"line":13,"column":8},"end":{"line":15,"column":null}},"5":{"start":{"line":14,"column":12},"end":{"line":14,"column":null}},"6":{"start":{"line":18,"column":8},"end":{"line":21,"column":null}},"7":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"8":{"start":{"line":20,"column":13},"end":{"line":20,"column":null}},"9":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"10":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"11":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"12":{"start":{"line":41,"column":8},"end":{"line":45,"column":null}},"13":{"start":{"line":46,"column":41},"end":{"line":48,"column":10}},"14":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"15":{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},"16":{"start":{"line":51,"column":12},"end":{"line":56,"column":null}},"17":{"start":{"line":58,"column":12},"end":{"line":62,"column":null}},"18":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":31}},"loc":{"start":{"line":4,"column":72},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":37}},"loc":{"start":{"line":6,"column":68},"end":{"line":25,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":13,"column":57},"end":{"line":13,"column":60}},"loc":{"start":{"line":13,"column":64},"end":{"line":15,"column":9}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":19,"column":66},"end":{"line":19,"column":69}},"loc":{"start":{"line":19,"column":73},"end":{"line":21,"column":9}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":27,"column":11},"end":{"line":27,"column":42}},"loc":{"start":{"line":29,"column":34},"end":{"line":63,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":46,"column":73},"end":{"line":46,"column":76}},"loc":{"start":{"line":46,"column":80},"end":{"line":48,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":21,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":11},"end":{"line":18,"column":66}},"type":"binary-expr","locations":[{"start":{"line":18,"column":11},"end":{"line":18,"column":31}},{"start":{"line":18,"column":35},"end":{"line":18,"column":66}}]},"2":{"loc":{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":62,"column":null}},{"start":{"line":58,"column":12},"end":{"line":62,"column":null}}]}},"s":{"0":2,"1":9,"2":9,"3":2,"4":2,"5":8,"6":2,"7":0,"8":0,"9":2,"10":0,"11":0,"12":4,"13":4,"14":13,"15":4,"16":2,"17":2,"18":2},"f":{"0":9,"1":2,"2":8,"3":0,"4":4,"5":13},"b":{"0":[0],"1":[2,0],"2":[2,2]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts","statementMap":{"0":{"start":{"line":2,"column":11},"end":{"line":2,"column":30}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":8,"column":31},"end":{"line":8,"column":48}},"5":{"start":{"line":8,"column":58},"end":{"line":8,"column":75}},"6":{"start":{"line":11,"column":39},"end":{"line":14,"column":10}},"7":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"8":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"9":{"start":{"line":18,"column":32},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":35},"end":{"line":20,"column":99}},"11":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"12":{"start":{"line":25,"column":31},"end":{"line":25,"column":50}},"13":{"start":{"line":26,"column":12},"end":{"line":26,"column":null}},"14":{"start":{"line":27,"column":12},"end":{"line":27,"column":null}},"15":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":31}},"loc":{"start":{"line":8,"column":75},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":11},"end":{"line":10,"column":17}},"loc":{"start":{"line":10,"column":38},"end":{"line":29,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":3,"5":3,"6":3,"7":3,"8":3,"9":1,"10":2,"11":1,"12":1,"13":1,"14":1,"15":1},"f":{"0":3,"1":3},"b":{"0":[1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":10,"column":16},"end":{"line":10,"column":38}},"6":{"start":{"line":11,"column":16},"end":{"line":11,"column":46}},"7":{"start":{"line":12,"column":16},"end":{"line":12,"column":30}},"8":{"start":{"line":13,"column":16},"end":{"line":13,"column":38}},"9":{"start":{"line":18,"column":33},"end":{"line":18,"column":35}},"10":{"start":{"line":19,"column":37},"end":{"line":19,"column":39}},"11":{"start":{"line":23,"column":41},"end":{"line":24,"column":null}},"12":{"start":{"line":24,"column":27},"end":{"line":24,"column":75}},"13":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"14":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"15":{"start":{"line":32,"column":27},"end":{"line":32,"column":144}},"16":{"start":{"line":33,"column":27},"end":{"line":33,"column":70}},"17":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"18":{"start":{"line":39,"column":12},"end":{"line":39,"column":null}},"19":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"20":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"21":{"start":{"line":51,"column":16},"end":{"line":55,"column":null}},"22":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"23":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"24":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"25":{"start":{"line":62,"column":65},"end":{"line":62,"column":null}},"26":{"start":{"line":66,"column":20},"end":{"line":66,"column":null}},"27":{"start":{"line":66,"column":64},"end":{"line":66,"column":null}},"28":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"29":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"30":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"31":{"start":{"line":81,"column":12},"end":{"line":85,"column":null}},"32":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"33":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"34":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":13,"column":38},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":39},"end":{"line":89,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":24,"column":13},"end":{"line":24,"column":22}},"loc":{"start":{"line":24,"column":27},"end":{"line":24,"column":75}}}},"branchMap":{"0":{"loc":{"start":{"line":50,"column":16},"end":{"line":50,"column":146}},"type":"binary-expr","locations":[{"start":{"line":50,"column":16},"end":{"line":50,"column":63}},{"start":{"line":50,"column":67},"end":{"line":50,"column":146}}]},"1":{"loc":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":16},"end":{"line":62,"column":null}}]},"2":{"loc":{"start":{"line":66,"column":20},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":20},"end":{"line":66,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0],"2":[0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":17,"column":33},"end":{"line":17,"column":35}},"8":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"9":{"start":{"line":23,"column":34},"end":{"line":23,"column":85}},"10":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"11":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"12":{"start":{"line":32,"column":16},"end":{"line":32,"column":null}},"13":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"14":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"15":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"16":{"start":{"line":47,"column":30},"end":{"line":47,"column":88}},"17":{"start":{"line":49,"column":32},"end":{"line":49,"column":98}},"18":{"start":{"line":51,"column":42},"end":{"line":55,"column":null}},"19":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"20":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"21":{"start":{"line":67,"column":49},"end":{"line":67,"column":97}},"22":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"23":{"start":{"line":70,"column":18},"end":{"line":70,"column":38}},"24":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"25":{"start":{"line":75,"column":35},"end":{"line":75,"column":87}},"26":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"27":{"start":{"line":80,"column":38},"end":{"line":80,"column":115}},"28":{"start":{"line":82,"column":30},"end":{"line":82,"column":91}},"29":{"start":{"line":84,"column":32},"end":{"line":84,"column":101}},"30":{"start":{"line":86,"column":42},"end":{"line":90,"column":null}},"31":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"32":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"33":{"start":{"line":102,"column":49},"end":{"line":102,"column":97}},"34":{"start":{"line":103,"column":8},"end":{"line":103,"column":null}},"35":{"start":{"line":105,"column":8},"end":{"line":109,"column":null}},"36":{"start":{"line":111,"column":38},"end":{"line":111,"column":112}},"37":{"start":{"line":113,"column":30},"end":{"line":113,"column":88}},"38":{"start":{"line":115,"column":32},"end":{"line":115,"column":98}},"39":{"start":{"line":117,"column":42},"end":{"line":121,"column":null}},"40":{"start":{"line":123,"column":8},"end":{"line":123,"column":null}},"41":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"42":{"start":{"line":138,"column":12},"end":{"line":138,"column":null}},"43":{"start":{"line":140,"column":12},"end":{"line":140,"column":null}},"44":{"start":{"line":143,"column":34},"end":{"line":146,"column":10}},"45":{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},"46":{"start":{"line":149,"column":12},"end":{"line":149,"column":null}},"47":{"start":{"line":150,"column":41},"end":{"line":150,"column":85}},"48":{"start":{"line":151,"column":12},"end":{"line":151,"column":null}},"49":{"start":{"line":152,"column":12},"end":{"line":152,"column":null}},"50":{"start":{"line":153,"column":15},"end":{"line":153,"column":null}},"51":{"start":{"line":162,"column":8},"end":{"line":165,"column":null}},"52":{"start":{"line":163,"column":30},"end":{"line":163,"column":52}},"53":{"start":{"line":164,"column":12},"end":{"line":164,"column":null}},"54":{"start":{"line":167,"column":22},"end":{"line":167,"column":96}},"55":{"start":{"line":168,"column":33},"end":{"line":174,"column":10}},"56":{"start":{"line":169,"column":42},"end":{"line":169,"column":80}},"57":{"start":{"line":170,"column":26},"end":{"line":170,"column":47}},"58":{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},"59":{"start":{"line":172,"column":25},"end":{"line":172,"column":40}},"60":{"start":{"line":173,"column":17},"end":{"line":173,"column":null}},"61":{"start":{"line":177,"column":39},"end":{"line":177,"column":60}},"62":{"start":{"line":178,"column":36},"end":{"line":178,"column":56}},"63":{"start":{"line":180,"column":8},"end":{"line":180,"column":null}},"64":{"start":{"line":180,"column":44},"end":{"line":180,"column":76}},"65":{"start":{"line":188,"column":8},"end":{"line":190,"column":null}},"66":{"start":{"line":189,"column":12},"end":{"line":189,"column":null}},"67":{"start":{"line":189,"column":42},"end":{"line":189,"column":null}},"68":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"69":{"start":{"line":202,"column":12},"end":{"line":204,"column":null}},"70":{"start":{"line":205,"column":12},"end":{"line":205,"column":null}},"71":{"start":{"line":210,"column":21},"end":{"line":210,"column":23}},"72":{"start":{"line":211,"column":25},"end":{"line":211,"column":89}},"73":{"start":{"line":212,"column":31},"end":{"line":212,"column":48}},"74":{"start":{"line":213,"column":21},"end":{"line":213,"column":22}},"75":{"start":{"line":214,"column":12},"end":{"line":214,"column":null}},"76":{"start":{"line":216,"column":8},"end":{"line":216,"column":null}},"77":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":98},"end":{"line":40,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":46,"column":12},"end":{"line":46,"column":19}},"loc":{"start":{"line":46,"column":83},"end":{"line":60,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":19}},"loc":{"start":{"line":66,"column":69},"end":{"line":95,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":101,"column":12},"end":{"line":101,"column":19}},"loc":{"start":{"line":101,"column":69},"end":{"line":126,"column":null}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":135,"column":11},"end":{"line":135,"column":18}},"loc":{"start":{"line":135,"column":80},"end":{"line":154,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":160,"column":12},"end":{"line":160,"column":19}},"loc":{"start":{"line":160,"column":56},"end":{"line":181,"column":null}}},"6":{"name":"(anonymous_12)","decl":{"start":{"line":162,"column":38},"end":{"line":162,"column":46}},"loc":{"start":{"line":162,"column":50},"end":{"line":165,"column":9}}},"7":{"name":"(anonymous_13)","decl":{"start":{"line":168,"column":48},"end":{"line":168,"column":56}},"loc":{"start":{"line":168,"column":60},"end":{"line":174,"column":9}}},"8":{"name":"(anonymous_14)","decl":{"start":{"line":180,"column":31},"end":{"line":180,"column":39}},"loc":{"start":{"line":180,"column":44},"end":{"line":180,"column":76}}},"9":{"name":"(anonymous_15)","decl":{"start":{"line":187,"column":12},"end":{"line":187,"column":19}},"loc":{"start":{"line":187,"column":70},"end":{"line":191,"column":null}}},"10":{"name":"(anonymous_16)","decl":{"start":{"line":188,"column":50},"end":{"line":188,"column":58}},"loc":{"start":{"line":188,"column":62},"end":{"line":190,"column":9}}},"11":{"name":"(anonymous_17)","decl":{"start":{"line":198,"column":11},"end":{"line":198,"column":18}},"loc":{"start":{"line":198,"column":98},"end":{"line":207,"column":null}}},"12":{"name":"(anonymous_18)","decl":{"start":{"line":209,"column":12},"end":{"line":209,"column":19}},"loc":{"start":{"line":209,"column":38},"end":{"line":217,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":8},"end":{"line":153,"column":null}},{"start":{"line":153,"column":15},"end":{"line":153,"column":null}}]},"1":{"loc":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"type":"binary-expr","locations":[{"start":{"line":148,"column":12},"end":{"line":148,"column":24}},{"start":{"line":148,"column":28},"end":{"line":148,"column":48}}]},"2":{"loc":{"start":{"line":164,"column":19},"end":{"line":164,"column":51}},"type":"binary-expr","locations":[{"start":{"line":164,"column":19},"end":{"line":164,"column":33}},{"start":{"line":164,"column":37},"end":{"line":164,"column":51}}]},"3":{"loc":{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":173,"column":null}},{"start":{"line":173,"column":17},"end":{"line":173,"column":null}}]},"4":{"loc":{"start":{"line":189,"column":12},"end":{"line":189,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":12},"end":{"line":189,"column":null}}]},"5":{"loc":{"start":{"line":199,"column":12},"end":{"line":199,"column":64}},"type":"binary-expr","locations":[{"start":{"line":199,"column":12},"end":{"line":199,"column":34}},{"start":{"line":199,"column":38},"end":{"line":199,"column":64}}]},"6":{"loc":{"start":{"line":201,"column":19},"end":{"line":201,"column":70}},"type":"binary-expr","locations":[{"start":{"line":201,"column":19},"end":{"line":201,"column":41}},{"start":{"line":201,"column":45},"end":{"line":201,"column":70}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":3,"46":1,"47":1,"48":1,"49":1,"50":2,"51":1,"52":4,"53":4,"54":1,"55":1,"56":4,"57":4,"58":4,"59":4,"60":0,"61":1,"62":1,"63":1,"64":4,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":3,"5":1,"6":4,"7":4,"8":4,"9":0,"10":0,"11":0,"12":0},"b":{"0":[1,2],"1":[3,2],"2":[4,1],"3":[4,0],"4":[0],"5":[0,0],"6":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts","statementMap":{"0":{"start":{"line":2,"column":13},"end":{"line":18,"column":null}},"1":{"start":{"line":22,"column":13},"end":{"line":38,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/Git.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/Git.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":12},"end":{"line":5,"column":26}},"5":{"start":{"line":14,"column":32},"end":{"line":14,"column":51}},"6":{"start":{"line":14,"column":61},"end":{"line":14,"column":76}},"7":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"8":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"9":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"10":{"start":{"line":19,"column":12},"end":{"line":19,"column":null}},"11":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"12":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"14":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":24},"end":{"line":37,"column":52}},"16":{"start":{"line":39,"column":29},"end":{"line":39,"column":50}},"17":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"18":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"19":{"start":{"line":46,"column":25},"end":{"line":46,"column":54}},"20":{"start":{"line":48,"column":29},"end":{"line":48,"column":51}},"21":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"22":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"23":{"start":{"line":55,"column":27},"end":{"line":55,"column":55}},"24":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"25":{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},"26":{"start":{"line":63,"column":12},"end":{"line":63,"column":null}},"27":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"28":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"29":{"start":{"line":68,"column":15},"end":{"line":68,"column":null}},"30":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"31":{"start":{"line":70,"column":30},"end":{"line":70,"column":null}},"32":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"33":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"34":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"35":{"start":{"line":79,"column":12},"end":{"line":79,"column":null}},"36":{"start":{"line":80,"column":12},"end":{"line":80,"column":null}},"37":{"start":{"line":82,"column":12},"end":{"line":85,"column":null}},"38":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"39":{"start":{"line":91,"column":19},"end":{"line":91,"column":46}},"40":{"start":{"line":94,"column":16},"end":{"line":94,"column":null}},"41":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"42":{"start":{"line":100,"column":18},"end":{"line":100,"column":null}},"43":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"44":{"start":{"line":107,"column":16},"end":{"line":107,"column":null}},"45":{"start":{"line":109,"column":33},"end":{"line":109,"column":77}},"46":{"start":{"line":110,"column":16},"end":{"line":110,"column":null}},"47":{"start":{"line":113,"column":12},"end":{"line":116,"column":null}},"48":{"start":{"line":117,"column":12},"end":{"line":117,"column":null}},"49":{"start":{"line":122,"column":31},"end":{"line":122,"column":62}},"50":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}},"51":{"start":{"line":124,"column":49},"end":{"line":124,"column":70}},"52":{"start":{"line":128,"column":40},"end":{"line":128,"column":76}},"53":{"start":{"line":130,"column":8},"end":{"line":130,"column":null}},"54":{"start":{"line":131,"column":22},"end":{"line":131,"column":52}},"55":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"56":{"start":{"line":137,"column":18},"end":{"line":137,"column":42}},"57":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"58":{"start":{"line":139,"column":8},"end":{"line":139,"column":null}},"59":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"60":{"start":{"line":142,"column":8},"end":{"line":142,"column":null}},"61":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"62":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"63":{"start":{"line":148,"column":12},"end":{"line":148,"column":null}},"64":{"start":{"line":151,"column":8},"end":{"line":155,"column":null}},"65":{"start":{"line":156,"column":8},"end":{"line":156,"column":null}},"66":{"start":{"line":160,"column":18},"end":{"line":160,"column":45}},"67":{"start":{"line":161,"column":24},"end":{"line":161,"column":60}},"68":{"start":{"line":163,"column":12},"end":{"line":163,"column":null}},"69":{"start":{"line":165,"column":8},"end":{"line":165,"column":null}},"70":{"start":{"line":166,"column":8},"end":{"line":166,"column":null}},"71":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"72":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"73":{"start":{"line":174,"column":35},"end":{"line":174,"column":null}},"74":{"start":{"line":181,"column":8},"end":{"line":181,"column":null}},"75":{"start":{"line":185,"column":12},"end":{"line":185,"column":null}},"76":{"start":{"line":190,"column":8},"end":{"line":190,"column":null}},"77":{"start":{"line":190,"column":21},"end":{"line":190,"column":null}},"78":{"start":{"line":191,"column":8},"end":{"line":191,"column":null}},"79":{"start":{"line":193,"column":12},"end":{"line":193,"column":null}},"80":{"start":{"line":194,"column":12},"end":{"line":194,"column":null}},"81":{"start":{"line":198,"column":12},"end":{"line":198,"column":null}},"82":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"83":{"start":{"line":205,"column":8},"end":{"line":205,"column":null}},"84":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"85":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"86":{"start":{"line":214,"column":12},"end":{"line":214,"column":null}},"87":{"start":{"line":215,"column":15},"end":{"line":215,"column":null}},"88":{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},"89":{"start":{"line":220,"column":12},"end":{"line":220,"column":null}},"90":{"start":{"line":221,"column":15},"end":{"line":221,"column":null}},"91":{"start":{"line":226,"column":12},"end":{"line":226,"column":null}},"92":{"start":{"line":227,"column":12},"end":{"line":227,"column":null}},"93":{"start":{"line":229,"column":12},"end":{"line":229,"column":null}},"94":{"start":{"line":230,"column":12},"end":{"line":230,"column":null}},"95":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"96":{"start":{"line":238,"column":16},"end":{"line":238,"column":null}},"97":{"start":{"line":240,"column":16},"end":{"line":240,"column":null}},"98":{"start":{"line":243,"column":12},"end":{"line":243,"column":null}},"99":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":32}},"loc":{"start":{"line":14,"column":76},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":10}},"loc":{"start":{"line":24,"column":15},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":4},"end":{"line":28,"column":10}},"loc":{"start":{"line":28,"column":23},"end":{"line":30,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":10}},"loc":{"start":{"line":32,"column":32},"end":{"line":34,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":10}},"loc":{"start":{"line":36,"column":31},"end":{"line":43,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":10}},"loc":{"start":{"line":45,"column":32},"end":{"line":52,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":54,"column":4},"end":{"line":54,"column":10}},"loc":{"start":{"line":54,"column":31},"end":{"line":58,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":60,"column":11},"end":{"line":60,"column":17}},"loc":{"start":{"line":60,"column":62},"end":{"line":73,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":75,"column":11},"end":{"line":75,"column":17}},"loc":{"start":{"line":75,"column":100},"end":{"line":88,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":90,"column":4},"end":{"line":90,"column":10}},"loc":{"start":{"line":90,"column":34},"end":{"line":97,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":99,"column":4},"end":{"line":99,"column":10}},"loc":{"start":{"line":99,"column":36},"end":{"line":101,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":103,"column":4},"end":{"line":103,"column":10}},"loc":{"start":{"line":103,"column":80},"end":{"line":119,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":121,"column":11},"end":{"line":121,"column":17}},"loc":{"start":{"line":121,"column":46},"end":{"line":125,"column":null}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":124,"column":40},"end":{"line":124,"column":44}},"loc":{"start":{"line":124,"column":49},"end":{"line":124,"column":70}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":127,"column":4},"end":{"line":127,"column":17}},"loc":{"start":{"line":127,"column":95},"end":{"line":157,"column":null}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":159,"column":4},"end":{"line":159,"column":17}},"loc":{"start":{"line":159,"column":66},"end":{"line":167,"column":null}}},"16":{"name":"(anonymous_23)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":28}},"loc":{"start":{"line":169,"column":28},"end":{"line":171,"column":null}}},"17":{"name":"(anonymous_24)","decl":{"start":{"line":173,"column":4},"end":{"line":173,"column":10}},"loc":{"start":{"line":173,"column":30},"end":{"line":175,"column":null}}},"18":{"name":"(anonymous_25)","decl":{"start":{"line":177,"column":4},"end":{"line":177,"column":10}},"loc":{"start":{"line":177,"column":39},"end":{"line":187,"column":null}}},"19":{"name":"(anonymous_26)","decl":{"start":{"line":189,"column":4},"end":{"line":189,"column":10}},"loc":{"start":{"line":189,"column":55},"end":{"line":202,"column":null}}},"20":{"name":"(anonymous_27)","decl":{"start":{"line":204,"column":4},"end":{"line":204,"column":20}},"loc":{"start":{"line":204,"column":20},"end":{"line":206,"column":null}}},"21":{"name":"(anonymous_28)","decl":{"start":{"line":208,"column":4},"end":{"line":208,"column":10}},"loc":{"start":{"line":208,"column":28},"end":{"line":210,"column":null}}},"22":{"name":"(anonymous_29)","decl":{"start":{"line":212,"column":4},"end":{"line":212,"column":10}},"loc":{"start":{"line":212,"column":55},"end":{"line":216,"column":null}}},"23":{"name":"(anonymous_30)","decl":{"start":{"line":218,"column":4},"end":{"line":218,"column":10}},"loc":{"start":{"line":218,"column":73},"end":{"line":222,"column":null}}},"24":{"name":"(anonymous_31)","decl":{"start":{"line":224,"column":4},"end":{"line":224,"column":10}},"loc":{"start":{"line":224,"column":40},"end":{"line":232,"column":null}}},"25":{"name":"(anonymous_32)","decl":{"start":{"line":233,"column":4},"end":{"line":233,"column":10}},"loc":{"start":{"line":233,"column":37},"end":{"line":245,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":68,"column":null}},{"start":{"line":68,"column":15},"end":{"line":68,"column":null}}]},"1":{"loc":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":8},"end":{"line":70,"column":null}}]},"2":{"loc":{"start":{"line":75,"column":51},"end":{"line":75,"column":100}},"type":"default-arg","locations":[{"start":{"line":75,"column":61},"end":{"line":75,"column":100}}]},"3":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":null}}]},"4":{"loc":{"start":{"line":124,"column":15},"end":{"line":124,"column":86}},"type":"cond-expr","locations":[{"start":{"line":124,"column":74},"end":{"line":124,"column":78}},{"start":{"line":124,"column":81},"end":{"line":124,"column":86}}]},"5":{"loc":{"start":{"line":152,"column":83},"end":{"line":152,"column":113}},"type":"cond-expr","locations":[{"start":{"line":152,"column":95},"end":{"line":152,"column":104}},{"start":{"line":152,"column":107},"end":{"line":152,"column":113}}]},"6":{"loc":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":8},"end":{"line":174,"column":null}}]},"7":{"loc":{"start":{"line":190,"column":8},"end":{"line":190,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":8},"end":{"line":190,"column":null}}]},"8":{"loc":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"type":"if","locations":[{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},{"start":{"line":215,"column":15},"end":{"line":215,"column":null}}]},"9":{"loc":{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},"type":"if","locations":[{"start":{"line":219,"column":8},"end":{"line":221,"column":null}},{"start":{"line":221,"column":15},"end":{"line":221,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0],"7":[0],"8":[0,0],"9":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":12},"end":{"line":8,"column":19}},"7":{"start":{"line":22,"column":23},"end":{"line":22,"column":34}},"8":{"start":{"line":31,"column":27},"end":{"line":31,"column":75}},"9":{"start":{"line":32,"column":21},"end":{"line":32,"column":51}},"10":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"11":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"12":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":27},"end":{"line":39,"column":71}},"14":{"start":{"line":40,"column":25},"end":{"line":40,"column":32}},"15":{"start":{"line":41,"column":20},"end":{"line":41,"column":48}},"16":{"start":{"line":42,"column":21},"end":{"line":42,"column":22}},"17":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"18":{"start":{"line":43,"column":33},"end":{"line":43,"column":null}},"19":{"start":{"line":44,"column":25},"end":{"line":44,"column":45}},"20":{"start":{"line":45,"column":26},"end":{"line":45,"column":35}},"21":{"start":{"line":46,"column":30},"end":{"line":46,"column":54}},"22":{"start":{"line":47,"column":31},"end":{"line":50,"column":null}},"23":{"start":{"line":51,"column":12},"end":{"line":51,"column":null}},"24":{"start":{"line":53,"column":8},"end":{"line":53,"column":null}},"25":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"26":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"27":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"28":{"start":{"line":66,"column":14},"end":{"line":66,"column":16}},"29":{"start":{"line":67,"column":8},"end":{"line":71,"column":null}},"30":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"31":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"32":{"start":{"line":74,"column":10},"end":{"line":74,"column":null}},"33":{"start":{"line":76,"column":31},"end":{"line":76,"column":43}},"34":{"start":{"line":77,"column":21},"end":{"line":77,"column":22}},"35":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"36":{"start":{"line":79,"column":26},"end":{"line":79,"column":37}},"37":{"start":{"line":81,"column":12},"end":{"line":85,"column":null}},"38":{"start":{"line":87,"column":29},"end":{"line":87,"column":66}},"39":{"start":{"line":89,"column":32},"end":{"line":89,"column":55}},"40":{"start":{"line":92,"column":16},"end":{"line":92,"column":null}},"41":{"start":{"line":95,"column":25},"end":{"line":95,"column":26}},"42":{"start":{"line":96,"column":29},"end":{"line":96,"column":62}},"43":{"start":{"line":97,"column":16},"end":{"line":97,"column":null}},"44":{"start":{"line":99,"column":20},"end":{"line":99,"column":null}},"45":{"start":{"line":102,"column":30},"end":{"line":102,"column":79}},"46":{"start":{"line":103,"column":12},"end":{"line":103,"column":null}},"47":{"start":{"line":108,"column":8},"end":{"line":108,"column":null}},"48":{"start":{"line":110,"column":12},"end":{"line":110,"column":null}},"49":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"50":{"start":{"line":114,"column":8},"end":{"line":119,"column":null}},"51":{"start":{"line":115,"column":32},"end":{"line":115,"column":41}},"52":{"start":{"line":117,"column":16},"end":{"line":117,"column":null}},"53":{"start":{"line":123,"column":26},"end":{"line":126,"column":null}},"54":{"start":{"line":130,"column":12},"end":{"line":130,"column":null}},"55":{"start":{"line":133,"column":12},"end":{"line":133,"column":null}},"56":{"start":{"line":137,"column":12},"end":{"line":137,"column":null}},"57":{"start":{"line":141,"column":12},"end":{"line":141,"column":null}},"58":{"start":{"line":145,"column":12},"end":{"line":161,"column":null}},"59":{"start":{"line":146,"column":28},"end":{"line":146,"column":33}},"60":{"start":{"line":147,"column":29},"end":{"line":147,"column":30}},"61":{"start":{"line":148,"column":32},"end":{"line":148,"column":40}},"62":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"63":{"start":{"line":154,"column":24},"end":{"line":154,"column":null}},"64":{"start":{"line":155,"column":24},"end":{"line":155,"column":null}},"65":{"start":{"line":159,"column":20},"end":{"line":159,"column":null}},"66":{"start":{"line":165,"column":31},"end":{"line":167,"column":14}},"67":{"start":{"line":166,"column":16},"end":{"line":166,"column":null}},"68":{"start":{"line":170,"column":16},"end":{"line":170,"column":null}},"69":{"start":{"line":173,"column":8},"end":{"line":173,"column":null}},"70":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":11},"end":{"line":30,"column":17}},"loc":{"start":{"line":30,"column":80},"end":{"line":34,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":36,"column":11},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":75},"end":{"line":54,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":56,"column":11},"end":{"line":56,"column":17}},"loc":{"start":{"line":56,"column":80},"end":{"line":105,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":67,"column":40},"end":{"line":67,"column":44}},"loc":{"start":{"line":67,"column":48},"end":{"line":71,"column":9}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":107,"column":11},"end":{"line":107,"column":17}},"loc":{"start":{"line":107,"column":84},"end":{"line":120,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":114,"column":40},"end":{"line":114,"column":44}},"loc":{"start":{"line":114,"column":48},"end":{"line":119,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":122,"column":11},"end":{"line":122,"column":28}},"loc":{"start":{"line":122,"column":68},"end":{"line":174,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":145,"column":27},"end":{"line":145,"column":32}},"loc":{"start":{"line":145,"column":36},"end":{"line":161,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":165,"column":62},"end":{"line":165,"column":72}},"loc":{"start":{"line":165,"column":100},"end":{"line":167,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":null}}]},"1":{"loc":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":74,"column":null}}]},"2":{"loc":{"start":{"line":129,"column":12},"end":{"line":129,"column":52}},"type":"binary-expr","locations":[{"start":{"line":129,"column":12},"end":{"line":129,"column":27}},{"start":{"line":129,"column":31},"end":{"line":129,"column":52}}]},"3":{"loc":{"start":{"line":132,"column":12},"end":{"line":132,"column":52}},"type":"binary-expr","locations":[{"start":{"line":132,"column":12},"end":{"line":132,"column":27}},{"start":{"line":132,"column":31},"end":{"line":132,"column":52}}]},"4":{"loc":{"start":{"line":136,"column":12},"end":{"line":136,"column":65}},"type":"binary-expr","locations":[{"start":{"line":136,"column":12},"end":{"line":136,"column":26}},{"start":{"line":136,"column":30},"end":{"line":136,"column":45}},{"start":{"line":136,"column":49},"end":{"line":136,"column":65}}]},"5":{"loc":{"start":{"line":140,"column":12},"end":{"line":140,"column":65}},"type":"binary-expr","locations":[{"start":{"line":140,"column":12},"end":{"line":140,"column":26}},{"start":{"line":140,"column":30},"end":{"line":140,"column":45}},{"start":{"line":140,"column":49},"end":{"line":140,"column":65}}]},"6":{"loc":{"start":{"line":144,"column":12},"end":{"line":144,"column":46}},"type":"binary-expr","locations":[{"start":{"line":144,"column":12},"end":{"line":144,"column":27}},{"start":{"line":144,"column":31},"end":{"line":144,"column":46}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0,0],"4":[0,0,0],"5":[0,0,0],"6":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts","statementMap":{"0":{"start":{"line":4,"column":24},"end":{"line":4,"column":38}},"1":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":8},"end":{"line":8,"column":null}},"3":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"4":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"6":{"start":{"line":27,"column":12},"end":{"line":27,"column":null}},"7":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"8":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"9":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"loc":{"start":{"line":4,"column":38},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":10}},"loc":{"start":{"line":6,"column":29},"end":{"line":9,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":12},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":29},"end":{"line":21,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":18}},"loc":{"start":{"line":23,"column":26},"end":{"line":33,"column":null}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitTags.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/git/GitTags.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":5,"column":24},"end":{"line":5,"column":32}},"2":{"start":{"line":5,"column":42},"end":{"line":5,"column":62}},"3":{"start":{"line":14,"column":29},"end":{"line":19,"column":10}},"4":{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},"5":{"start":{"line":21,"column":29},"end":{"line":21,"column":71}},"6":{"start":{"line":22,"column":13},"end":{"line":22,"column":null}},"7":{"start":{"line":27,"column":32},"end":{"line":27,"column":92}},"8":{"start":{"line":32,"column":35},"end":{"line":36,"column":10}},"9":{"start":{"line":38,"column":29},"end":{"line":38,"column":60}},"10":{"start":{"line":40,"column":32},"end":{"line":40,"column":58}},"11":{"start":{"line":41,"column":8},"end":{"line":41,"column":22}},"12":{"start":{"line":45,"column":48},"end":{"line":45,"column":117}},"13":{"start":{"line":45,"column":75},"end":{"line":45,"column":116}},"14":{"start":{"line":48,"column":8},"end":{"line":50,"column":null}},"15":{"start":{"line":49,"column":40},"end":{"line":49,"column":116}},"16":{"start":{"line":53,"column":45},"end":{"line":53,"column":104}},"17":{"start":{"line":53,"column":66},"end":{"line":53,"column":103}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"19":{"start":{"line":61,"column":19},"end":{"line":61,"column":48}},"20":{"start":{"line":62,"column":24},"end":{"line":62,"column":34}},"21":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"22":{"start":{"line":64,"column":42},"end":{"line":65,"column":null}},"23":{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},"24":{"start":{"line":67,"column":23},"end":{"line":67,"column":96}},"25":{"start":{"line":68,"column":17},"end":{"line":68,"column":null}},"26":{"start":{"line":69,"column":15},"end":{"line":69,"column":null}},"27":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"28":{"start":{"line":75,"column":23},"end":{"line":75,"column":54}},"29":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"30":{"start":{"line":82,"column":12},"end":{"line":85,"column":null}},"31":{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},"32":{"start":{"line":83,"column":39},"end":{"line":83,"column":70}},"33":{"start":{"line":84,"column":21},"end":{"line":84,"column":null}},"34":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"35":{"start":{"line":93,"column":22},"end":{"line":93,"column":51}},"36":{"start":{"line":96,"column":12},"end":{"line":96,"column":null}},"37":{"start":{"line":99,"column":31},"end":{"line":99,"column":69}},"38":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"39":{"start":{"line":105,"column":33},"end":{"line":105,"column":62}},"40":{"start":{"line":109,"column":12},"end":{"line":109,"column":null}},"41":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"42":{"start":{"line":115,"column":12},"end":{"line":115,"column":null}},"43":{"start":{"line":118,"column":29},"end":{"line":118,"column":70}},"44":{"start":{"line":120,"column":29},"end":{"line":129,"column":12}},"45":{"start":{"line":122,"column":41},"end":{"line":122,"column":58}},"46":{"start":{"line":123,"column":30},"end":{"line":123,"column":56}},"47":{"start":{"line":124,"column":12},"end":{"line":124,"column":null}},"48":{"start":{"line":127,"column":33},"end":{"line":127,"column":75}},"49":{"start":{"line":128,"column":12},"end":{"line":128,"column":null}},"50":{"start":{"line":131,"column":8},"end":{"line":131,"column":null}},"51":{"start":{"line":131,"column":39},"end":{"line":131,"column":47}},"52":{"start":{"line":135,"column":53},"end":{"line":135,"column":55}},"53":{"start":{"line":138,"column":8},"end":{"line":143,"column":null}},"54":{"start":{"line":139,"column":8},"end":{"line":142,"column":null}},"55":{"start":{"line":141,"column":40},"end":{"line":141,"column":70}},"56":{"start":{"line":146,"column":37},"end":{"line":146,"column":73}},"57":{"start":{"line":147,"column":34},"end":{"line":147,"column":105}},"58":{"start":{"line":147,"column":75},"end":{"line":147,"column":104}},"59":{"start":{"line":148,"column":8},"end":{"line":148,"column":null}},"60":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":24}},"loc":{"start":{"line":5,"column":62},"end":{"line":5,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":10}},"loc":{"start":{"line":13,"column":26},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"loc":{"start":{"line":25,"column":56},"end":{"line":56,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":64},"end":{"line":45,"column":70}},"loc":{"start":{"line":45,"column":75},"end":{"line":45,"column":116}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":13},"end":{"line":49,"column":35}},"loc":{"start":{"line":49,"column":40},"end":{"line":49,"column":116}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":53,"column":58},"end":{"line":53,"column":61}},"loc":{"start":{"line":53,"column":66},"end":{"line":53,"column":103}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":11},"end":{"line":58,"column":17}},"loc":{"start":{"line":58,"column":40},"end":{"line":72,"column":null}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":74,"column":12},"end":{"line":74,"column":47}},"loc":{"start":{"line":74,"column":76},"end":{"line":89,"column":null}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":82,"column":51},"end":{"line":82,"column":52}},"loc":{"start":{"line":82,"column":85},"end":{"line":85,"column":13}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":92,"column":11},"end":{"line":92,"column":17}},"loc":{"start":{"line":92,"column":40},"end":{"line":101,"column":null}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":104,"column":11},"end":{"line":104,"column":17}},"loc":{"start":{"line":104,"column":67},"end":{"line":132,"column":null}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":121,"column":15},"end":{"line":121,"column":21}},"loc":{"start":{"line":121,"column":24},"end":{"line":125,"column":11}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":126,"column":18},"end":{"line":126,"column":21}},"loc":{"start":{"line":126,"column":24},"end":{"line":129,"column":11}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":131,"column":32},"end":{"line":131,"column":35}},"loc":{"start":{"line":131,"column":39},"end":{"line":131,"column":47}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":134,"column":12},"end":{"line":134,"column":18}},"loc":{"start":{"line":134,"column":54},"end":{"line":149,"column":null}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":138,"column":22},"end":{"line":138,"column":33}},"loc":{"start":{"line":138,"column":37},"end":{"line":143,"column":9}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":141,"column":19},"end":{"line":141,"column":35}},"loc":{"start":{"line":141,"column":40},"end":{"line":141,"column":70}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":147,"column":43},"end":{"line":147,"column":44}},"loc":{"start":{"line":147,"column":75},"end":{"line":147,"column":104}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":22,"column":null}},{"start":{"line":22,"column":13},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},{"start":{"line":69,"column":15},"end":{"line":69,"column":null}}]},"2":{"loc":{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":68,"column":null}},{"start":{"line":68,"column":17},"end":{"line":68,"column":null}}]},"3":{"loc":{"start":{"line":77,"column":12},"end":{"line":77,"column":65}},"type":"binary-expr","locations":[{"start":{"line":77,"column":12},"end":{"line":77,"column":32}},{"start":{"line":77,"column":36},"end":{"line":77,"column":65}}]},"4":{"loc":{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":16},"end":{"line":84,"column":null}},{"start":{"line":84,"column":21},"end":{"line":84,"column":null}}]},"5":{"loc":{"start":{"line":128,"column":19},"end":{"line":128,"column":56}},"type":"binary-expr","locations":[{"start":{"line":128,"column":19},"end":{"line":128,"column":27}},{"start":{"line":128,"column":31},"end":{"line":128,"column":56}}]}},"s":{"0":1,"1":3,"2":3,"3":3,"4":3,"5":2,"6":1,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":24,"14":2,"15":8,"16":2,"17":8,"18":2,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1},"f":{"0":3,"1":3,"2":2,"3":24,"4":8,"5":8,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"b":{"0":[2,1],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"8":{"start":{"line":11,"column":12},"end":{"line":11,"column":19}},"9":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":24,"column":23},"end":{"line":24,"column":25}},"12":{"start":{"line":25,"column":27},"end":{"line":25,"column":65}},"13":{"start":{"line":26,"column":28},"end":{"line":26,"column":47}},"14":{"start":{"line":27,"column":28},"end":{"line":27,"column":91}},"15":{"start":{"line":29,"column":29},"end":{"line":29,"column":68}},"16":{"start":{"line":30,"column":28},"end":{"line":30,"column":81}},"17":{"start":{"line":31,"column":12},"end":{"line":31,"column":null}},"18":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"19":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"20":{"start":{"line":38,"column":23},"end":{"line":38,"column":25}},"21":{"start":{"line":39,"column":27},"end":{"line":39,"column":65}},"22":{"start":{"line":40,"column":28},"end":{"line":40,"column":47}},"23":{"start":{"line":41,"column":28},"end":{"line":41,"column":91}},"24":{"start":{"line":43,"column":29},"end":{"line":43,"column":68}},"25":{"start":{"line":44,"column":28},"end":{"line":44,"column":67}},"26":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"27":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"28":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"29":{"start":{"line":53,"column":21},"end":{"line":53,"column":25}},"30":{"start":{"line":54,"column":28},"end":{"line":54,"column":47}},"31":{"start":{"line":55,"column":28},"end":{"line":55,"column":67}},"32":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"33":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"34":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"35":{"start":{"line":65,"column":28},"end":{"line":65,"column":47}},"36":{"start":{"line":66,"column":24},"end":{"line":66,"column":48}},"37":{"start":{"line":67,"column":28},"end":{"line":67,"column":83}},"38":{"start":{"line":68,"column":49},"end":{"line":68,"column":68}},"39":{"start":{"line":70,"column":29},"end":{"line":70,"column":57}},"40":{"start":{"line":71,"column":28},"end":{"line":71,"column":66}},"41":{"start":{"line":72,"column":12},"end":{"line":72,"column":null}},"42":{"start":{"line":74,"column":27},"end":{"line":74,"column":57}},"43":{"start":{"line":75,"column":28},"end":{"line":75,"column":72}},"44":{"start":{"line":76,"column":26},"end":{"line":76,"column":59}},"45":{"start":{"line":77,"column":12},"end":{"line":77,"column":null}},"46":{"start":{"line":78,"column":12},"end":{"line":78,"column":null}},"47":{"start":{"line":81,"column":16},"end":{"line":81,"column":null}},"48":{"start":{"line":83,"column":35},"end":{"line":83,"column":53}},"49":{"start":{"line":84,"column":34},"end":{"line":84,"column":51}},"50":{"start":{"line":85,"column":45},"end":{"line":85,"column":74}},"51":{"start":{"line":86,"column":47},"end":{"line":86,"column":72}},"52":{"start":{"line":88,"column":20},"end":{"line":88,"column":null}},"53":{"start":{"line":91,"column":35},"end":{"line":91,"column":52}},"54":{"start":{"line":92,"column":36},"end":{"line":92,"column":80}},"55":{"start":{"line":93,"column":34},"end":{"line":93,"column":67}},"56":{"start":{"line":94,"column":20},"end":{"line":94,"column":null}},"57":{"start":{"line":95,"column":36},"end":{"line":95,"column":58}},"58":{"start":{"line":97,"column":20},"end":{"line":97,"column":null}},"59":{"start":{"line":100,"column":35},"end":{"line":100,"column":48}},"60":{"start":{"line":101,"column":36},"end":{"line":101,"column":80}},"61":{"start":{"line":102,"column":34},"end":{"line":102,"column":67}},"62":{"start":{"line":103,"column":20},"end":{"line":103,"column":null}},"63":{"start":{"line":104,"column":36},"end":{"line":104,"column":58}},"64":{"start":{"line":106,"column":20},"end":{"line":106,"column":null}},"65":{"start":{"line":108,"column":36},"end":{"line":108,"column":76}},"66":{"start":{"line":109,"column":20},"end":{"line":109,"column":null}},"67":{"start":{"line":113,"column":8},"end":{"line":113,"column":null}},"68":{"start":{"line":117,"column":38},"end":{"line":117,"column":74}},"69":{"start":{"line":118,"column":19},"end":{"line":118,"column":45}},"70":{"start":{"line":120,"column":12},"end":{"line":174,"column":null}},"71":{"start":{"line":121,"column":28},"end":{"line":121,"column":33}},"72":{"start":{"line":123,"column":29},"end":{"line":123,"column":30}},"73":{"start":{"line":124,"column":32},"end":{"line":124,"column":37}},"74":{"start":{"line":126,"column":24},"end":{"line":126,"column":null}},"75":{"start":{"line":131,"column":24},"end":{"line":131,"column":null}},"76":{"start":{"line":135,"column":28},"end":{"line":135,"column":null}},"77":{"start":{"line":136,"column":28},"end":{"line":136,"column":null}},"78":{"start":{"line":139,"column":28},"end":{"line":139,"column":null}},"79":{"start":{"line":141,"column":39},"end":{"line":143,"column":null}},"80":{"start":{"line":147,"column":48},"end":{"line":147,"column":71}},"81":{"start":{"line":148,"column":49},"end":{"line":148,"column":80}},"82":{"start":{"line":149,"column":32},"end":{"line":149,"column":null}},"83":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"84":{"start":{"line":154,"column":24},"end":{"line":154,"column":null}},"85":{"start":{"line":155,"column":24},"end":{"line":155,"column":null}},"86":{"start":{"line":160,"column":39},"end":{"line":160,"column":57}},"87":{"start":{"line":163,"column":28},"end":{"line":163,"column":null}},"88":{"start":{"line":164,"column":28},"end":{"line":164,"column":null}},"89":{"start":{"line":167,"column":28},"end":{"line":167,"column":null}},"90":{"start":{"line":169,"column":39},"end":{"line":169,"column":90}},"91":{"start":{"line":170,"column":28},"end":{"line":170,"column":null}},"92":{"start":{"line":176,"column":12},"end":{"line":181,"column":null}},"93":{"start":{"line":178,"column":20},"end":{"line":178,"column":null}},"94":{"start":{"line":179,"column":20},"end":{"line":179,"column":null}},"95":{"start":{"line":186,"column":8},"end":{"line":186,"column":null}},"96":{"start":{"line":190,"column":35},"end":{"line":190,"column":119}},"97":{"start":{"line":190,"column":109},"end":{"line":190,"column":118}},"98":{"start":{"line":192,"column":12},"end":{"line":192,"column":null}},"99":{"start":{"line":194,"column":29},"end":{"line":197,"column":10}},"100":{"start":{"line":195,"column":42},"end":{"line":195,"column":74}},"101":{"start":{"line":196,"column":12},"end":{"line":196,"column":null}},"102":{"start":{"line":198,"column":8},"end":{"line":198,"column":null}},"103":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"104":{"start":{"line":210,"column":33},"end":{"line":210,"column":68}},"105":{"start":{"line":211,"column":34},"end":{"line":211,"column":76}},"106":{"start":{"line":212,"column":40},"end":{"line":212,"column":69}},"107":{"start":{"line":213,"column":32},"end":{"line":213,"column":92}},"108":{"start":{"line":215,"column":31},"end":{"line":215,"column":43}},"109":{"start":{"line":218,"column":12},"end":{"line":218,"column":null}},"110":{"start":{"line":221,"column":21},"end":{"line":221,"column":69}},"111":{"start":{"line":223,"column":12},"end":{"line":223,"column":null}},"112":{"start":{"line":227,"column":24},"end":{"line":227,"column":44}},"113":{"start":{"line":229,"column":16},"end":{"line":229,"column":null}},"114":{"start":{"line":230,"column":16},"end":{"line":230,"column":null}},"115":{"start":{"line":234,"column":23},"end":{"line":234,"column":48}},"116":{"start":{"line":237,"column":12},"end":{"line":237,"column":null}},"117":{"start":{"line":240,"column":28},"end":{"line":240,"column":47}},"118":{"start":{"line":243,"column":12},"end":{"line":243,"column":null}},"119":{"start":{"line":246,"column":21},"end":{"line":246,"column":22}},"120":{"start":{"line":247,"column":25},"end":{"line":247,"column":58}},"121":{"start":{"line":248,"column":12},"end":{"line":248,"column":null}},"122":{"start":{"line":250,"column":16},"end":{"line":250,"column":null}},"123":{"start":{"line":255,"column":36},"end":{"line":255,"column":38}},"124":{"start":{"line":257,"column":12},"end":{"line":257,"column":null}},"125":{"start":{"line":259,"column":28},"end":{"line":259,"column":52}},"126":{"start":{"line":260,"column":12},"end":{"line":260,"column":null}},"127":{"start":{"line":262,"column":20},"end":{"line":262,"column":51}},"128":{"start":{"line":263,"column":21},"end":{"line":263,"column":22}},"129":{"start":{"line":265,"column":34},"end":{"line":265,"column":58}},"130":{"start":{"line":266,"column":39},"end":{"line":266,"column":61}},"131":{"start":{"line":267,"column":16},"end":{"line":267,"column":null}},"132":{"start":{"line":268,"column":33},"end":{"line":268,"column":66}},"133":{"start":{"line":269,"column":16},"end":{"line":269,"column":null}},"134":{"start":{"line":276,"column":31},"end":{"line":276,"column":70}},"135":{"start":{"line":277,"column":36},"end":{"line":277,"column":104}},"136":{"start":{"line":278,"column":29},"end":{"line":278,"column":71}},"137":{"start":{"line":279,"column":29},"end":{"line":279,"column":74}},"138":{"start":{"line":281,"column":16},"end":{"line":281,"column":null}},"139":{"start":{"line":287,"column":12},"end":{"line":287,"column":null}},"140":{"start":{"line":288,"column":28},"end":{"line":288,"column":31}},"141":{"start":{"line":289,"column":37},"end":{"line":289,"column":39}},"142":{"start":{"line":290,"column":31},"end":{"line":290,"column":33}},"143":{"start":{"line":291,"column":25},"end":{"line":291,"column":26}},"144":{"start":{"line":292,"column":16},"end":{"line":292,"column":null}},"145":{"start":{"line":293,"column":16},"end":{"line":293,"column":null}},"146":{"start":{"line":295,"column":40},"end":{"line":295,"column":60}},"147":{"start":{"line":296,"column":45},"end":{"line":296,"column":69}},"148":{"start":{"line":297,"column":20},"end":{"line":297,"column":null}},"149":{"start":{"line":298,"column":20},"end":{"line":298,"column":null}},"150":{"start":{"line":299,"column":20},"end":{"line":299,"column":null}},"151":{"start":{"line":300,"column":20},"end":{"line":300,"column":null}},"152":{"start":{"line":301,"column":20},"end":{"line":301,"column":null}},"153":{"start":{"line":304,"column":28},"end":{"line":304,"column":null}},"154":{"start":{"line":307,"column":20},"end":{"line":307,"column":null}},"155":{"start":{"line":311,"column":16},"end":{"line":311,"column":null}},"156":{"start":{"line":314,"column":16},"end":{"line":314,"column":null}},"157":{"start":{"line":319,"column":12},"end":{"line":319,"column":null}},"158":{"start":{"line":320,"column":28},"end":{"line":320,"column":31}},"159":{"start":{"line":321,"column":25},"end":{"line":321,"column":26}},"160":{"start":{"line":322,"column":16},"end":{"line":322,"column":null}},"161":{"start":{"line":323,"column":16},"end":{"line":323,"column":null}},"162":{"start":{"line":325,"column":40},"end":{"line":325,"column":60}},"163":{"start":{"line":326,"column":45},"end":{"line":326,"column":69}},"164":{"start":{"line":327,"column":20},"end":{"line":327,"column":null}},"165":{"start":{"line":328,"column":20},"end":{"line":328,"column":null}},"166":{"start":{"line":332,"column":28},"end":{"line":332,"column":null}},"167":{"start":{"line":335,"column":20},"end":{"line":335,"column":null}},"168":{"start":{"line":339,"column":16},"end":{"line":339,"column":null}},"169":{"start":{"line":14,"column":18},"end":{"line":14,"column":null}},"170":{"start":{"line":13,"column":21},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"loc":{"start":{"line":16,"column":4},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":11}},"loc":{"start":{"line":23,"column":42},"end":{"line":36,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":11}},"loc":{"start":{"line":37,"column":55},"end":{"line":50,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":52,"column":11},"end":{"line":52,"column":18}},"loc":{"start":{"line":52,"column":65},"end":{"line":62,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":18}},"loc":{"start":{"line":63,"column":74},"end":{"line":114,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":116,"column":11},"end":{"line":116,"column":25}},"loc":{"start":{"line":116,"column":63},"end":{"line":183,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":120,"column":35},"end":{"line":120,"column":47}},"loc":{"start":{"line":120,"column":51},"end":{"line":174,"column":13}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":176,"column":26},"end":{"line":176,"column":29}},"loc":{"start":{"line":176,"column":33},"end":{"line":181,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":185,"column":11},"end":{"line":185,"column":18}},"loc":{"start":{"line":185,"column":35},"end":{"line":187,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":189,"column":11},"end":{"line":189,"column":17}},"loc":{"start":{"line":189,"column":50},"end":{"line":199,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":190,"column":100},"end":{"line":190,"column":104}},"loc":{"start":{"line":190,"column":109},"end":{"line":190,"column":118}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":194,"column":54},"end":{"line":194,"column":67}},"loc":{"start":{"line":194,"column":71},"end":{"line":197,"column":9}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":208,"column":11},"end":{"line":208,"column":18}},"loc":{"start":{"line":208,"column":65},"end":{"line":342,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":101}},"type":"binary-expr","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":54}},{"start":{"line":57,"column":58},"end":{"line":57,"column":101}}]},"1":{"loc":{"start":{"line":59,"column":21},"end":{"line":59,"column":85}},"type":"binary-expr","locations":[{"start":{"line":59,"column":21},"end":{"line":59,"column":50}},{"start":{"line":59,"column":54},"end":{"line":59,"column":85}}]},"2":{"loc":{"start":{"line":87,"column":20},"end":{"line":87,"column":73}},"type":"binary-expr","locations":[{"start":{"line":87,"column":20},"end":{"line":87,"column":45}},{"start":{"line":87,"column":49},"end":{"line":87,"column":73}}]},"3":{"loc":{"start":{"line":116,"column":45},"end":{"line":116,"column":63}},"type":"default-arg","locations":[{"start":{"line":116,"column":59},"end":{"line":116,"column":63}}]},"4":{"loc":{"start":{"line":119,"column":12},"end":{"line":119,"column":68}},"type":"binary-expr","locations":[{"start":{"line":119,"column":12},"end":{"line":119,"column":40}},{"start":{"line":119,"column":44},"end":{"line":119,"column":68}}]},"5":{"loc":{"start":{"line":128,"column":24},"end":{"line":129,"column":85}},"type":"binary-expr","locations":[{"start":{"line":128,"column":24},"end":{"line":128,"column":55}},{"start":{"line":129,"column":24},"end":{"line":129,"column":85}}]},"6":{"loc":{"start":{"line":138,"column":28},"end":{"line":138,"column":87}},"type":"binary-expr","locations":[{"start":{"line":138,"column":28},"end":{"line":138,"column":40}},{"start":{"line":138,"column":45},"end":{"line":138,"column":56}},{"start":{"line":138,"column":60},"end":{"line":138,"column":87}}]},"7":{"loc":{"start":{"line":161,"column":24},"end":{"line":161,"column":98}},"type":"binary-expr","locations":[{"start":{"line":161,"column":24},"end":{"line":161,"column":53}},{"start":{"line":161,"column":57},"end":{"line":161,"column":98}}]},"8":{"loc":{"start":{"line":166,"column":28},"end":{"line":166,"column":87}},"type":"binary-expr","locations":[{"start":{"line":166,"column":28},"end":{"line":166,"column":40}},{"start":{"line":166,"column":45},"end":{"line":166,"column":56}},{"start":{"line":166,"column":60},"end":{"line":166,"column":87}}]},"9":{"loc":{"start":{"line":191,"column":12},"end":{"line":191,"column":65}},"type":"binary-expr","locations":[{"start":{"line":191,"column":12},"end":{"line":191,"column":31}},{"start":{"line":191,"column":35},"end":{"line":191,"column":65}}]},"10":{"loc":{"start":{"line":275,"column":12},"end":{"line":275,"column":95}},"type":"binary-expr","locations":[{"start":{"line":275,"column":12},"end":{"line":275,"column":53}},{"start":{"line":275,"column":57},"end":{"line":275,"column":95}}]},"11":{"loc":{"start":{"line":324,"column":20},"end":{"line":324,"column":77}},"type":"binary-expr","locations":[{"start":{"line":324,"column":20},"end":{"line":324,"column":47}},{"start":{"line":324,"column":51},"end":{"line":324,"column":77}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":1,"170":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0,0],"7":[0,0],"8":[0,0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":13},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":22},"end":{"line":44,"column":null}},"5":{"start":{"line":103,"column":41},"end":{"line":103,"column":43}},"6":{"start":{"line":104,"column":27},"end":{"line":104,"column":99}},"7":{"start":{"line":105,"column":25},"end":{"line":105,"column":62}},"8":{"start":{"line":106,"column":31},"end":{"line":106,"column":51}},"9":{"start":{"line":107,"column":8},"end":{"line":145,"column":null}},"10":{"start":{"line":108,"column":35},"end":{"line":108,"column":63}},"11":{"start":{"line":111,"column":20},"end":{"line":111,"column":null}},"12":{"start":{"line":112,"column":20},"end":{"line":112,"column":null}},"13":{"start":{"line":114,"column":20},"end":{"line":114,"column":null}},"14":{"start":{"line":115,"column":20},"end":{"line":115,"column":null}},"15":{"start":{"line":118,"column":12},"end":{"line":118,"column":null}},"16":{"start":{"line":120,"column":44},"end":{"line":120,"column":59}},"17":{"start":{"line":122,"column":20},"end":{"line":122,"column":null}},"18":{"start":{"line":124,"column":16},"end":{"line":124,"column":null}},"19":{"start":{"line":129,"column":16},"end":{"line":142,"column":null}},"20":{"start":{"line":130,"column":41},"end":{"line":130,"column":63}},"21":{"start":{"line":132,"column":62},"end":{"line":132,"column":64}},"22":{"start":{"line":133,"column":24},"end":{"line":133,"column":null}},"23":{"start":{"line":134,"column":24},"end":{"line":134,"column":null}},"24":{"start":{"line":135,"column":24},"end":{"line":135,"column":null}},"25":{"start":{"line":136,"column":24},"end":{"line":136,"column":null}},"26":{"start":{"line":137,"column":24},"end":{"line":137,"column":null}},"27":{"start":{"line":138,"column":24},"end":{"line":138,"column":null}},"28":{"start":{"line":139,"column":24},"end":{"line":139,"column":null}},"29":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"30":{"start":{"line":144,"column":12},"end":{"line":144,"column":null}},"31":{"start":{"line":146,"column":8},"end":{"line":146,"column":null}},"32":{"start":{"line":150,"column":22},"end":{"line":150,"column":64}},"33":{"start":{"line":151,"column":24},"end":{"line":151,"column":26}},"34":{"start":{"line":153,"column":12},"end":{"line":153,"column":null}},"35":{"start":{"line":155,"column":12},"end":{"line":155,"column":null}},"36":{"start":{"line":158,"column":27},"end":{"line":158,"column":29}},"37":{"start":{"line":160,"column":27},"end":{"line":160,"column":45}},"38":{"start":{"line":161,"column":26},"end":{"line":161,"column":43}},"39":{"start":{"line":162,"column":37},"end":{"line":162,"column":66}},"40":{"start":{"line":163,"column":39},"end":{"line":163,"column":64}},"41":{"start":{"line":164,"column":31},"end":{"line":164,"column":54}},"42":{"start":{"line":166,"column":12},"end":{"line":166,"column":null}},"43":{"start":{"line":171,"column":12},"end":{"line":171,"column":null}},"44":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"45":{"start":{"line":181,"column":12},"end":{"line":181,"column":null}},"46":{"start":{"line":186,"column":12},"end":{"line":186,"column":null}},"47":{"start":{"line":188,"column":23},"end":{"line":188,"column":49}},"48":{"start":{"line":189,"column":25},"end":{"line":189,"column":26}},"49":{"start":{"line":190,"column":35},"end":{"line":190,"column":57}},"50":{"start":{"line":196,"column":20},"end":{"line":196,"column":null}},"51":{"start":{"line":197,"column":20},"end":{"line":197,"column":null}},"52":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"53":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"54":{"start":{"line":205,"column":13},"end":{"line":205,"column":null}},"55":{"start":{"line":206,"column":13},"end":{"line":212,"column":null}},"56":{"start":{"line":214,"column":13},"end":{"line":214,"column":null}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":102,"column":4},"end":{"line":102,"column":11}},"loc":{"start":{"line":102,"column":27},"end":{"line":147,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":107,"column":50},"end":{"line":107,"column":58}},"loc":{"start":{"line":107,"column":62},"end":{"line":145,"column":9}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":129,"column":48},"end":{"line":129,"column":55}},"loc":{"start":{"line":129,"column":59},"end":{"line":142,"column":17}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":149,"column":4},"end":{"line":149,"column":11}},"loc":{"start":{"line":149,"column":79},"end":{"line":202,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":149,"column":49},"end":{"line":149,"column":79}},"type":"default-arg","locations":[{"start":{"line":149,"column":75},"end":{"line":149,"column":79}}]},"1":{"loc":{"start":{"line":165,"column":12},"end":{"line":165,"column":116}},"type":"binary-expr","locations":[{"start":{"line":165,"column":12},"end":{"line":165,"column":41}},{"start":{"line":165,"column":46},"end":{"line":165,"column":87}},{"start":{"line":165,"column":91},"end":{"line":165,"column":115}}]},"2":{"loc":{"start":{"line":168,"column":12},"end":{"line":169,"column":83}},"type":"binary-expr","locations":[{"start":{"line":168,"column":12},"end":{"line":168,"column":40}},{"start":{"line":169,"column":13},"end":{"line":169,"column":54}},{"start":{"line":169,"column":58},"end":{"line":169,"column":82}}]},"3":{"loc":{"start":{"line":173,"column":12},"end":{"line":174,"column":83}},"type":"binary-expr","locations":[{"start":{"line":173,"column":12},"end":{"line":173,"column":51}},{"start":{"line":174,"column":13},"end":{"line":174,"column":54}},{"start":{"line":174,"column":58},"end":{"line":174,"column":82}}]},"4":{"loc":{"start":{"line":178,"column":12},"end":{"line":179,"column":83}},"type":"binary-expr","locations":[{"start":{"line":178,"column":12},"end":{"line":178,"column":53}},{"start":{"line":179,"column":13},"end":{"line":179,"column":54}},{"start":{"line":179,"column":58},"end":{"line":179,"column":82}}]},"5":{"loc":{"start":{"line":183,"column":12},"end":{"line":184,"column":83}},"type":"binary-expr","locations":[{"start":{"line":183,"column":12},"end":{"line":183,"column":45}},{"start":{"line":184,"column":13},"end":{"line":184,"column":54}},{"start":{"line":184,"column":58},"end":{"line":184,"column":82}}]},"6":{"loc":{"start":{"line":192,"column":20},"end":{"line":194,"column":62}},"type":"binary-expr","locations":[{"start":{"line":192,"column":20},"end":{"line":192,"column":62}},{"start":{"line":193,"column":21},"end":{"line":193,"column":60}},{"start":{"line":193,"column":64},"end":{"line":193,"column":89}},{"start":{"line":194,"column":20},"end":{"line":194,"column":62}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":149,"11":1,"12":1,"13":1,"14":1,"15":149,"16":4,"17":0,"18":4,"19":9,"20":25,"21":9,"22":9,"23":9,"24":9,"25":9,"26":9,"27":9,"28":9,"29":9,"30":149,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":1,"54":1,"55":1,"56":1},"f":{"0":1,"1":149,"2":25,"3":0},"b":{"0":[0],"1":[0,0,0],"2":[0,0,0],"3":[0,0,0],"4":[0,0,0],"5":[0,0,0],"6":[0,0,0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":11},"end":{"line":3,"column":30}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"5":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":30},"end":{"line":16,"column":28}},"7":{"start":{"line":17,"column":25},"end":{"line":17,"column":74}},"8":{"start":{"line":18,"column":23},"end":{"line":18,"column":38}},"9":{"start":{"line":19,"column":29},"end":{"line":19,"column":103}},"10":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"11":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":16}},"loc":{"start":{"line":8,"column":30},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":17}},"loc":{"start":{"line":12,"column":65},"end":{"line":21,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":5,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":5,"1":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":22}},"7":{"start":{"line":17,"column":13},"end":{"line":21,"column":null}},"8":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"9":{"start":{"line":24,"column":12},"end":{"line":30,"column":null}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"11":{"start":{"line":43,"column":71},"end":{"line":45,"column":null}},"12":{"start":{"line":47,"column":12},"end":{"line":47,"column":null}},"13":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"14":{"start":{"line":49,"column":37},"end":{"line":49,"column":71}},"15":{"start":{"line":50,"column":30},"end":{"line":50,"column":52}},"16":{"start":{"line":53,"column":20},"end":{"line":53,"column":null}},"17":{"start":{"line":55,"column":24},"end":{"line":55,"column":null}},"18":{"start":{"line":56,"column":24},"end":{"line":56,"column":null}},"19":{"start":{"line":61,"column":12},"end":{"line":67,"column":null}},"20":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"21":{"start":{"line":77,"column":25},"end":{"line":77,"column":67}},"22":{"start":{"line":79,"column":8},"end":{"line":87,"column":null}},"23":{"start":{"line":89,"column":26},"end":{"line":89,"column":49}},"24":{"start":{"line":92,"column":12},"end":{"line":101,"column":null}},"25":{"start":{"line":103,"column":12},"end":{"line":113,"column":null}},"26":{"start":{"line":116,"column":8},"end":{"line":124,"column":null}},"27":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"28":{"start":{"line":129,"column":33},"end":{"line":129,"column":67}},"29":{"start":{"line":131,"column":26},"end":{"line":131,"column":48}},"30":{"start":{"line":134,"column":16},"end":{"line":134,"column":null}},"31":{"start":{"line":137,"column":8},"end":{"line":137,"column":null}},"32":{"start":{"line":143,"column":52},"end":{"line":143,"column":54}},"33":{"start":{"line":145,"column":22},"end":{"line":145,"column":85}},"34":{"start":{"line":147,"column":8},"end":{"line":161,"column":null}},"35":{"start":{"line":148,"column":39},"end":{"line":148,"column":231}},"36":{"start":{"line":150,"column":49},"end":{"line":158,"column":null}},"37":{"start":{"line":160,"column":12},"end":{"line":160,"column":null}},"38":{"start":{"line":163,"column":8},"end":{"line":163,"column":null}},"39":{"start":{"line":170,"column":34},"end":{"line":170,"column":73}},"40":{"start":{"line":171,"column":8},"end":{"line":171,"column":null}},"41":{"start":{"line":171,"column":62},"end":{"line":171,"column":97}},"42":{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},"43":{"start":{"line":178,"column":26},"end":{"line":178,"column":108}},"44":{"start":{"line":179,"column":12},"end":{"line":182,"column":null}},"45":{"start":{"line":180,"column":16},"end":{"line":181,"column":null}},"46":{"start":{"line":184,"column":12},"end":{"line":184,"column":null}},"47":{"start":{"line":185,"column":15},"end":{"line":185,"column":null}},"48":{"start":{"line":189,"column":8},"end":{"line":189,"column":null}},"49":{"start":{"line":196,"column":24},"end":{"line":196,"column":64}},"50":{"start":{"line":197,"column":52},"end":{"line":197,"column":54}},"51":{"start":{"line":198,"column":35},"end":{"line":198,"column":74}},"52":{"start":{"line":200,"column":8},"end":{"line":217,"column":null}},"53":{"start":{"line":201,"column":55},"end":{"line":206,"column":null}},"54":{"start":{"line":207,"column":31},"end":{"line":207,"column":94}},"55":{"start":{"line":207,"column":67},"end":{"line":207,"column":93}},"56":{"start":{"line":209,"column":16},"end":{"line":209,"column":null}},"57":{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},"58":{"start":{"line":210,"column":49},"end":{"line":210,"column":92}},"59":{"start":{"line":211,"column":21},"end":{"line":211,"column":null}},"60":{"start":{"line":213,"column":16},"end":{"line":213,"column":null}},"61":{"start":{"line":214,"column":16},"end":{"line":214,"column":null}},"62":{"start":{"line":216,"column":12},"end":{"line":216,"column":null}},"63":{"start":{"line":219,"column":8},"end":{"line":235,"column":null}},"64":{"start":{"line":220,"column":31},"end":{"line":220,"column":103}},"65":{"start":{"line":220,"column":65},"end":{"line":220,"column":102}},"66":{"start":{"line":222,"column":59},"end":{"line":226,"column":null}},"67":{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},"68":{"start":{"line":227,"column":56},"end":{"line":227,"column":99}},"69":{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},"70":{"start":{"line":228,"column":64},"end":{"line":228,"column":99}},"71":{"start":{"line":229,"column":21},"end":{"line":229,"column":null}},"72":{"start":{"line":231,"column":16},"end":{"line":231,"column":null}},"73":{"start":{"line":232,"column":16},"end":{"line":232,"column":null}},"74":{"start":{"line":233,"column":16},"end":{"line":233,"column":null}},"75":{"start":{"line":236,"column":8},"end":{"line":236,"column":null}},"76":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"77":{"start":{"line":241,"column":4},"end":{"line":244,"column":36}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":85},"end":{"line":33,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":39,"column":11},"end":{"line":39,"column":17}},"loc":{"start":{"line":41,"column":30},"end":{"line":70,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":76,"column":11},"end":{"line":76,"column":17}},"loc":{"start":{"line":76,"column":75},"end":{"line":126,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":128,"column":12},"end":{"line":128,"column":18}},"loc":{"start":{"line":128,"column":60},"end":{"line":138,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":142,"column":11},"end":{"line":142,"column":17}},"loc":{"start":{"line":142,"column":43},"end":{"line":164,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":147,"column":25},"end":{"line":147,"column":31}},"loc":{"start":{"line":147,"column":35},"end":{"line":161,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":17}},"loc":{"start":{"line":169,"column":47},"end":{"line":172,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":171,"column":41},"end":{"line":171,"column":57}},"loc":{"start":{"line":171,"column":62},"end":{"line":171,"column":97}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":176,"column":11},"end":{"line":176,"column":17}},"loc":{"start":{"line":176,"column":32},"end":{"line":186,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":179,"column":29},"end":{"line":179,"column":35}},"loc":{"start":{"line":179,"column":39},"end":{"line":182,"column":13}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":188,"column":11},"end":{"line":188,"column":17}},"loc":{"start":{"line":188,"column":25},"end":{"line":190,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":195,"column":11},"end":{"line":195,"column":17}},"loc":{"start":{"line":195,"column":41},"end":{"line":237,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":200,"column":27},"end":{"line":200,"column":35}},"loc":{"start":{"line":200,"column":39},"end":{"line":217,"column":9}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":207,"column":58},"end":{"line":207,"column":62}},"loc":{"start":{"line":207,"column":67},"end":{"line":207,"column":93}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":219,"column":38},"end":{"line":219,"column":57}},"loc":{"start":{"line":219,"column":61},"end":{"line":235,"column":9}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":220,"column":56},"end":{"line":220,"column":60}},"loc":{"start":{"line":220,"column":65},"end":{"line":220,"column":102}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":39},"end":{"line":14,"column":70}},"type":"default-arg","locations":[{"start":{"line":14,"column":57},"end":{"line":14,"column":70}}]},"1":{"loc":{"start":{"line":83,"column":21},"end":{"line":83,"column":52}},"type":"cond-expr","locations":[{"start":{"line":83,"column":34},"end":{"line":83,"column":44}},{"start":{"line":83,"column":47},"end":{"line":83,"column":52}}]},"2":{"loc":{"start":{"line":119,"column":20},"end":{"line":119,"column":null}},"type":"cond-expr","locations":[{"start":{"line":119,"column":33},"end":{"line":119,"column":43}},{"start":{"line":119,"column":46},"end":{"line":119,"column":null}}]},"3":{"loc":{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},"type":"if","locations":[{"start":{"line":177,"column":8},"end":{"line":185,"column":null}},{"start":{"line":185,"column":15},"end":{"line":185,"column":null}}]},"4":{"loc":{"start":{"line":181,"column":20},"end":{"line":181,"column":113}},"type":"cond-expr","locations":[{"start":{"line":181,"column":60},"end":{"line":181,"column":65}},{"start":{"line":181,"column":68},"end":{"line":181,"column":113}}]},"5":{"loc":{"start":{"line":181,"column":68},"end":{"line":181,"column":113}},"type":"cond-expr","locations":[{"start":{"line":181,"column":101},"end":{"line":181,"column":106}},{"start":{"line":181,"column":109},"end":{"line":181,"column":113}}]},"6":{"loc":{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},"type":"if","locations":[{"start":{"line":210,"column":16},"end":{"line":211,"column":null}},{"start":{"line":211,"column":21},"end":{"line":211,"column":null}}]},"7":{"loc":{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},"type":"if","locations":[{"start":{"line":227,"column":16},"end":{"line":229,"column":null}},{"start":{"line":228,"column":21},"end":{"line":229,"column":null}}]},"8":{"loc":{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},"type":"if","locations":[{"start":{"line":228,"column":21},"end":{"line":229,"column":null}},{"start":{"line":229,"column":21},"end":{"line":229,"column":null}}]}},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":6,"7":6,"8":5,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":3,"22":3,"23":3,"24":3,"25":0,"26":2,"27":2,"28":3,"29":3,"30":0,"31":3,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":1,"43":1,"44":1,"45":2,"46":1,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":4,"77":4},"f":{"0":6,"1":0,"2":3,"3":3,"4":0,"5":0,"6":0,"7":0,"8":1,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"b":{"0":[6],"1":[0,3],"2":[2,0],"3":[1,0],"4":[0,2],"5":[1,1],"6":[0,0],"7":[0,0],"8":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":7,"column":12},"end":{"line":10,"column":42}},"2":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":38},"end":{"line":13,"column":null}}}},"branchMap":{},"s":{"0":4,"1":0,"2":0,"3":4},"f":{"0":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"2":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"3":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"4":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":null}},"7":{"start":{"line":61,"column":11},"end":{"line":61,"column":null}},"8":{"start":{"line":94,"column":36},"end":{"line":94,"column":53}},"9":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"10":{"start":{"line":96,"column":8},"end":{"line":96,"column":null}},"11":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"12":{"start":{"line":98,"column":8},"end":{"line":98,"column":null}},"13":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"14":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"15":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"16":{"start":{"line":102,"column":8},"end":{"line":102,"column":null}},"17":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"18":{"start":{"line":107,"column":0},"end":{"line":107,"column":null}},"19":{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},"20":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"21":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"22":{"start":{"line":111,"column":4},"end":{"line":111,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":64,"column":4},"end":{"line":64,"column":15}},"loc":{"start":{"line":64,"column":26},"end":{"line":66,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":68,"column":4},"end":{"line":68,"column":15}},"loc":{"start":{"line":68,"column":28},"end":{"line":70,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":4},"end":{"line":72,"column":15}},"loc":{"start":{"line":72,"column":49},"end":{"line":75,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":77,"column":4},"end":{"line":77,"column":15}},"loc":{"start":{"line":77,"column":26},"end":{"line":79,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":81,"column":4},"end":{"line":81,"column":15}},"loc":{"start":{"line":81,"column":46},"end":{"line":83,"column":null}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":4},"end":{"line":89,"column":null}},"loc":{"start":{"line":89,"column":4},"end":{"line":91,"column":null}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":93,"column":4},"end":{"line":93,"column":10}},"loc":{"start":{"line":93,"column":10},"end":{"line":103,"column":null}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":107,"column":0},"end":{"line":107,"column":12}},"loc":{"start":{"line":107,"column":23},"end":{"line":112,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":107,"column":12},"end":{"line":107,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":12},"end":{"line":107,"column":23}},{"start":{"line":107,"column":12},"end":{"line":107,"column":null}}]}},"s":{"0":13,"1":0,"2":0,"3":0,"4":8,"5":7,"6":12,"7":12,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":13,"18":13,"19":13,"20":13,"21":13,"22":13},"f":{"0":0,"1":0,"2":0,"3":8,"4":7,"5":12,"6":0,"7":13},"b":{"0":[13,13]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"14":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}},"15":{"start":{"line":18,"column":0},"end":{"line":18,"column":null}},"16":{"start":{"line":19,"column":0},"end":{"line":19,"column":null}},"17":{"start":{"line":21,"column":0},"end":{"line":21,"column":null}},"18":{"start":{"line":22,"column":0},"end":{"line":22,"column":null}},"19":{"start":{"line":23,"column":0},"end":{"line":23,"column":null}},"20":{"start":{"line":24,"column":0},"end":{"line":24,"column":null}},"21":{"start":{"line":25,"column":0},"end":{"line":25,"column":null}},"22":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"23":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"24":{"start":{"line":43,"column":50},"end":{"line":46,"column":null}},"25":{"start":{"line":49,"column":24},"end":{"line":49,"column":32}},"26":{"start":{"line":50,"column":37},"end":{"line":50,"column":53}},"27":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"28":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"29":{"start":{"line":53,"column":8},"end":{"line":53,"column":null}},"30":{"start":{"line":54,"column":8},"end":{"line":57,"column":null}},"31":{"start":{"line":58,"column":8},"end":{"line":58,"column":null}},"32":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"33":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"34":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"35":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"36":{"start":{"line":66,"column":8},"end":{"line":66,"column":null}},"37":{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},"38":{"start":{"line":67,"column":44},"end":{"line":67,"column":106}},"39":{"start":{"line":68,"column":13},"end":{"line":68,"column":null}},"40":{"start":{"line":71,"column":12},"end":{"line":71,"column":null}},"41":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"42":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"43":{"start":{"line":80,"column":8},"end":{"line":90,"column":null}},"44":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"45":{"start":{"line":96,"column":41},"end":{"line":100,"column":null}},"46":{"start":{"line":102,"column":12},"end":{"line":102,"column":null}},"47":{"start":{"line":103,"column":53},"end":{"line":103,"column":102}},"48":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"49":{"start":{"line":106,"column":12},"end":{"line":106,"column":null}},"50":{"start":{"line":107,"column":12},"end":{"line":107,"column":null}},"51":{"start":{"line":108,"column":12},"end":{"line":108,"column":null}},"52":{"start":{"line":109,"column":12},"end":{"line":109,"column":null}},"53":{"start":{"line":110,"column":12},"end":{"line":110,"column":null}},"54":{"start":{"line":112,"column":47},"end":{"line":112,"column":87}},"55":{"start":{"line":113,"column":12},"end":{"line":113,"column":null}},"56":{"start":{"line":114,"column":12},"end":{"line":114,"column":null}},"57":{"start":{"line":115,"column":12},"end":{"line":118,"column":null}},"58":{"start":{"line":119,"column":12},"end":{"line":119,"column":null}},"59":{"start":{"line":121,"column":12},"end":{"line":121,"column":null}},"60":{"start":{"line":124,"column":31},"end":{"line":125,"column":null}},"61":{"start":{"line":129,"column":28},"end":{"line":129,"column":59}},"62":{"start":{"line":131,"column":16},"end":{"line":131,"column":null}},"63":{"start":{"line":131,"column":60},"end":{"line":131,"column":null}},"64":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"65":{"start":{"line":138,"column":36},"end":{"line":138,"column":null}},"66":{"start":{"line":140,"column":26},"end":{"line":140,"column":49}},"67":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"68":{"start":{"line":141,"column":45},"end":{"line":141,"column":null}},"69":{"start":{"line":146,"column":16},"end":{"line":152,"column":null}},"70":{"start":{"line":153,"column":16},"end":{"line":153,"column":null}},"71":{"start":{"line":155,"column":16},"end":{"line":161,"column":null}},"72":{"start":{"line":162,"column":16},"end":{"line":162,"column":null}},"73":{"start":{"line":164,"column":16},"end":{"line":170,"column":null}},"74":{"start":{"line":171,"column":16},"end":{"line":171,"column":null}},"75":{"start":{"line":173,"column":16},"end":{"line":173,"column":null}},"76":{"start":{"line":174,"column":16},"end":{"line":174,"column":null}},"77":{"start":{"line":175,"column":16},"end":{"line":181,"column":null}},"78":{"start":{"line":182,"column":16},"end":{"line":182,"column":null}},"79":{"start":{"line":185,"column":8},"end":{"line":185,"column":null}},"80":{"start":{"line":199,"column":12},"end":{"line":199,"column":null}},"81":{"start":{"line":202,"column":60},"end":{"line":202,"column":87}},"82":{"start":{"line":203,"column":16},"end":{"line":206,"column":null}},"83":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"84":{"start":{"line":211,"column":8},"end":{"line":211,"column":null}},"85":{"start":{"line":216,"column":25},"end":{"line":216,"column":41}},"86":{"start":{"line":217,"column":8},"end":{"line":217,"column":null}},"87":{"start":{"line":218,"column":8},"end":{"line":218,"column":null}},"88":{"start":{"line":219,"column":8},"end":{"line":219,"column":null}},"89":{"start":{"line":221,"column":8},"end":{"line":221,"column":null}},"90":{"start":{"line":222,"column":8},"end":{"line":225,"column":null}},"91":{"start":{"line":226,"column":8},"end":{"line":226,"column":null}},"92":{"start":{"line":227,"column":8},"end":{"line":227,"column":null}},"93":{"start":{"line":228,"column":8},"end":{"line":228,"column":null}},"94":{"start":{"line":230,"column":8},"end":{"line":230,"column":null}},"95":{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},"96":{"start":{"line":242,"column":12},"end":{"line":242,"column":null}},"97":{"start":{"line":243,"column":12},"end":{"line":250,"column":null}},"98":{"start":{"line":251,"column":12},"end":{"line":251,"column":null}},"99":{"start":{"line":252,"column":12},"end":{"line":252,"column":null}},"100":{"start":{"line":253,"column":15},"end":{"line":253,"column":null}},"101":{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},"102":{"start":{"line":258,"column":60},"end":{"line":258,"column":72}},"103":{"start":{"line":259,"column":13},"end":{"line":259,"column":null}},"104":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"105":{"start":{"line":265,"column":4},"end":{"line":265,"column":null}},"106":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":24}},"loc":{"start":{"line":34,"column":27},"end":{"line":186,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":193,"column":12},"end":{"line":193,"column":19}},"loc":{"start":{"line":196,"column":52},"end":{"line":212,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":214,"column":11},"end":{"line":214,"column":24}},"loc":{"start":{"line":214,"column":83},"end":{"line":231,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":235,"column":12},"end":{"line":235,"column":19}},"loc":{"start":{"line":235,"column":81},"end":{"line":254,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":257,"column":12},"end":{"line":257,"column":19}},"loc":{"start":{"line":257,"column":75},"end":{"line":260,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"loc":{"start":{"line":264,"column":0},"end":{"line":278,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":58,"column":38},"end":{"line":58,"column":74}},"type":"cond-expr","locations":[{"start":{"line":58,"column":55},"end":{"line":58,"column":71}},{"start":{"line":58,"column":72},"end":{"line":58,"column":74}}]},"1":{"loc":{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":68,"column":null}},{"start":{"line":68,"column":13},"end":{"line":68,"column":null}}]},"2":{"loc":{"start":{"line":131,"column":16},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":16},"end":{"line":131,"column":null}}]},"3":{"loc":{"start":{"line":138,"column":8},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":null}}]},"4":{"loc":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":141,"column":null}}]},"5":{"loc":{"start":{"line":145,"column":12},"end":{"line":153,"column":null}},"type":"switch","locations":[{"start":{"line":145,"column":12},"end":{"line":153,"column":null}},{"start":{"line":154,"column":12},"end":{"line":162,"column":null}},{"start":{"line":163,"column":12},"end":{"line":171,"column":null}},{"start":{"line":172,"column":12},"end":{"line":182,"column":null}}]},"6":{"loc":{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},"type":"if","locations":[{"start":{"line":236,"column":8},"end":{"line":253,"column":null}},{"start":{"line":253,"column":15},"end":{"line":253,"column":null}}]},"7":{"loc":{"start":{"line":237,"column":12},"end":{"line":240,"column":52}},"type":"binary-expr","locations":[{"start":{"line":237,"column":12},"end":{"line":237,"column":75}},{"start":{"line":238,"column":13},"end":{"line":238,"column":57}},{"start":{"line":239,"column":16},"end":{"line":239,"column":46}},{"start":{"line":240,"column":16},"end":{"line":240,"column":52}}]},"8":{"loc":{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},"type":"if","locations":[{"start":{"line":258,"column":8},"end":{"line":259,"column":null}},{"start":{"line":259,"column":13},"end":{"line":259,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":1,"105":0,"106":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0],"3":[0],"4":[0],"5":[0,0,0,0],"6":[0,0],"7":[0,0,0,0],"8":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":8,"column":50},"end":{"line":8,"column":52}},"4":{"start":{"line":11,"column":26},"end":{"line":11,"column":43}},"5":{"start":{"line":12,"column":25},"end":{"line":12,"column":41}},"6":{"start":{"line":13,"column":31},"end":{"line":13,"column":53}},"7":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"8":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"9":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"10":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"11":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":11}},"loc":{"start":{"line":7,"column":23},"end":{"line":19,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":12,"column":7},"end":{"line":12,"column":null}},"7":{"start":{"line":20,"column":62},"end":{"line":20,"column":64}},"8":{"start":{"line":23,"column":30},"end":{"line":27,"column":null}},"9":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"10":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"11":{"start":{"line":41,"column":16},"end":{"line":41,"column":null}},"12":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"13":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"14":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"15":{"start":{"line":55,"column":31},"end":{"line":55,"column":75}},"16":{"start":{"line":59,"column":16},"end":{"line":59,"column":null}},"17":{"start":{"line":62,"column":30},"end":{"line":62,"column":72}},"18":{"start":{"line":64,"column":30},"end":{"line":64,"column":61}},"19":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"20":{"start":{"line":65,"column":41},"end":{"line":65,"column":null}},"21":{"start":{"line":66,"column":16},"end":{"line":66,"column":null}},"22":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"23":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"24":{"start":{"line":73,"column":56},"end":{"line":73,"column":68}},"25":{"start":{"line":74,"column":13},"end":{"line":74,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":10},"end":{"line":11,"column":17}},"loc":{"start":{"line":11,"column":17},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":17,"column":11},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":89},"end":{"line":49,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":51,"column":12},"end":{"line":51,"column":18}},"loc":{"start":{"line":53,"column":34},"end":{"line":70,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":72,"column":11},"end":{"line":72,"column":17}},"loc":{"start":{"line":72,"column":63},"end":{"line":75,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":16},"end":{"line":65,"column":null}}]},"1":{"loc":{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":74,"column":null}},{"start":{"line":74,"column":13},"end":{"line":74,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":4,"8":4,"9":3,"10":4,"11":4,"12":4,"13":0,"14":4,"15":4,"16":0,"17":3,"18":2,"19":2,"20":2,"21":2,"22":4,"23":3,"24":2,"25":1,"26":2},"f":{"0":0,"1":4,"2":4,"3":3},"b":{"0":[2],"1":[2,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"7":{"start":{"line":18,"column":61},"end":{"line":18,"column":63}},"8":{"start":{"line":21,"column":29},"end":{"line":25,"column":null}},"9":{"start":{"line":31,"column":16},"end":{"line":31,"column":null}},"10":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"11":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"12":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"13":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"14":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"15":{"start":{"line":53,"column":31},"end":{"line":53,"column":75}},"16":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"17":{"start":{"line":60,"column":30},"end":{"line":60,"column":72}},"18":{"start":{"line":62,"column":30},"end":{"line":62,"column":61}},"19":{"start":{"line":63,"column":16},"end":{"line":63,"column":null}},"20":{"start":{"line":63,"column":40},"end":{"line":63,"column":null}},"21":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"22":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"23":{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},"24":{"start":{"line":71,"column":56},"end":{"line":71,"column":68}},"25":{"start":{"line":72,"column":13},"end":{"line":72,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":11},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":18},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":17}},"loc":{"start":{"line":15,"column":89},"end":{"line":47,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":18}},"loc":{"start":{"line":51,"column":34},"end":{"line":68,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":70,"column":11},"end":{"line":70,"column":17}},"loc":{"start":{"line":70,"column":63},"end":{"line":73,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":63,"column":16},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":16},"end":{"line":63,"column":null}}]},"1":{"loc":{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":72,"column":null}},{"start":{"line":72,"column":13},"end":{"line":72,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":4,"8":4,"9":3,"10":4,"11":4,"12":4,"13":0,"14":4,"15":4,"16":0,"17":3,"18":2,"19":2,"20":2,"21":2,"22":4,"23":3,"24":2,"25":1,"26":2},"f":{"0":0,"1":4,"2":4,"3":3},"b":{"0":[2],"1":[2,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"4":{"start":{"line":16,"column":35},"end":{"line":16,"column":79}},"5":{"start":{"line":17,"column":29},"end":{"line":17,"column":31}},"6":{"start":{"line":23,"column":20},"end":{"line":23,"column":null}},"7":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}},"8":{"start":{"line":33,"column":38},"end":{"line":33,"column":79}},"9":{"start":{"line":37,"column":24},"end":{"line":37,"column":null}},"10":{"start":{"line":38,"column":24},"end":{"line":38,"column":null}},"11":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"12":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"13":{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},"14":{"start":{"line":49,"column":56},"end":{"line":49,"column":68}},"15":{"start":{"line":50,"column":13},"end":{"line":50,"column":null}},"16":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":18},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":89},"end":{"line":46,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":48,"column":11},"end":{"line":48,"column":17}},"loc":{"start":{"line":48,"column":63},"end":{"line":51,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":24},"end":{"line":36,"column":72}},"type":"binary-expr","locations":[{"start":{"line":36,"column":24},"end":{"line":36,"column":35}},{"start":{"line":36,"column":39},"end":{"line":36,"column":72}}]},"1":{"loc":{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":8},"end":{"line":50,"column":null}},{"start":{"line":50,"column":13},"end":{"line":50,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":15},"end":{"line":5,"column":32}},"4":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"5":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"6":{"start":{"line":33,"column":32},"end":{"line":33,"column":53}},"7":{"start":{"line":35,"column":35},"end":{"line":35,"column":94}},"8":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"9":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"10":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"11":{"start":{"line":50,"column":32},"end":{"line":50,"column":53}},"12":{"start":{"line":52,"column":28},"end":{"line":56,"column":null}},"13":{"start":{"line":58,"column":8},"end":{"line":71,"column":null}},"14":{"start":{"line":59,"column":25},"end":{"line":59,"column":87}},"15":{"start":{"line":59,"column":58},"end":{"line":59,"column":86}},"16":{"start":{"line":62,"column":16},"end":{"line":62,"column":null}},"17":{"start":{"line":65,"column":32},"end":{"line":68,"column":null}},"18":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"19":{"start":{"line":73,"column":24},"end":{"line":75,"column":10}},"20":{"start":{"line":77,"column":25},"end":{"line":79,"column":null}},"21":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"22":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"23":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"24":{"start":{"line":93,"column":32},"end":{"line":93,"column":53}},"25":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"26":{"start":{"line":96,"column":24},"end":{"line":98,"column":10}},"27":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"28":{"start":{"line":102,"column":8},"end":{"line":102,"column":null}},"29":{"start":{"line":110,"column":30},"end":{"line":110,"column":35}},"30":{"start":{"line":116,"column":24},"end":{"line":116,"column":null}},"31":{"start":{"line":117,"column":24},"end":{"line":117,"column":null}},"32":{"start":{"line":121,"column":16},"end":{"line":121,"column":null}},"33":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"34":{"start":{"line":133,"column":35},"end":{"line":133,"column":40}},"35":{"start":{"line":139,"column":24},"end":{"line":139,"column":null}},"36":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"37":{"start":{"line":144,"column":16},"end":{"line":144,"column":null}},"38":{"start":{"line":148,"column":8},"end":{"line":148,"column":null}},"39":{"start":{"line":152,"column":40},"end":{"line":152,"column":45}},"40":{"start":{"line":156,"column":20},"end":{"line":156,"column":null}},"41":{"start":{"line":157,"column":20},"end":{"line":157,"column":null}},"42":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"43":{"start":{"line":163,"column":8},"end":{"line":163,"column":null}},"44":{"start":{"line":171,"column":26},"end":{"line":171,"column":31}},"45":{"start":{"line":177,"column":24},"end":{"line":177,"column":null}},"46":{"start":{"line":178,"column":24},"end":{"line":178,"column":null}},"47":{"start":{"line":185,"column":16},"end":{"line":185,"column":null}},"48":{"start":{"line":189,"column":8},"end":{"line":189,"column":null}},"49":{"start":{"line":202,"column":16},"end":{"line":202,"column":null}},"50":{"start":{"line":205,"column":16},"end":{"line":205,"column":null}},"51":{"start":{"line":213,"column":24},"end":{"line":213,"column":null}},"52":{"start":{"line":216,"column":24},"end":{"line":216,"column":null}},"53":{"start":{"line":218,"column":20},"end":{"line":218,"column":null}},"54":{"start":{"line":223,"column":8},"end":{"line":223,"column":null}},"55":{"start":{"line":227,"column":27},"end":{"line":227,"column":32}},"56":{"start":{"line":232,"column":24},"end":{"line":232,"column":null}},"57":{"start":{"line":233,"column":24},"end":{"line":233,"column":null}},"58":{"start":{"line":237,"column":16},"end":{"line":237,"column":null}},"59":{"start":{"line":240,"column":8},"end":{"line":240,"column":null}},"60":{"start":{"line":244,"column":46},"end":{"line":253,"column":null}},"61":{"start":{"line":256,"column":43},"end":{"line":256,"column":48}},"62":{"start":{"line":261,"column":24},"end":{"line":261,"column":null}},"63":{"start":{"line":262,"column":24},"end":{"line":262,"column":null}},"64":{"start":{"line":266,"column":16},"end":{"line":266,"column":null}},"65":{"start":{"line":269,"column":8},"end":{"line":269,"column":null}},"66":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":8}},"loc":{"start":{"line":14,"column":20},"end":{"line":16,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":8}},"loc":{"start":{"line":21,"column":19},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":25,"column":4},"end":{"line":25,"column":27}},"loc":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":17}},"loc":{"start":{"line":32,"column":40},"end":{"line":41,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":11}},"loc":{"start":{"line":49,"column":97},"end":{"line":85,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":58,"column":28},"end":{"line":58,"column":37}},"loc":{"start":{"line":58,"column":41},"end":{"line":71,"column":9}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":59,"column":49},"end":{"line":59,"column":53}},"loc":{"start":{"line":59,"column":58},"end":{"line":59,"column":86}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":92,"column":4},"end":{"line":92,"column":17}},"loc":{"start":{"line":92,"column":53},"end":{"line":103,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":109,"column":11},"end":{"line":109,"column":30}},"loc":{"start":{"line":109,"column":30},"end":{"line":126,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":132,"column":12},"end":{"line":132,"column":37}},"loc":{"start":{"line":132,"column":37},"end":{"line":149,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":151,"column":11},"end":{"line":151,"column":46}},"loc":{"start":{"line":151,"column":46},"end":{"line":164,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":170,"column":11},"end":{"line":170,"column":26}},"loc":{"start":{"line":170,"column":26},"end":{"line":190,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":196,"column":11},"end":{"line":196,"column":24}},"loc":{"start":{"line":196,"column":24},"end":{"line":224,"column":null}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":226,"column":11},"end":{"line":226,"column":41}},"loc":{"start":{"line":226,"column":62},"end":{"line":241,"column":null}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":243,"column":11},"end":{"line":243,"column":51}},"loc":{"start":{"line":243,"column":51},"end":{"line":270,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":176,"column":24},"end":{"line":176,"column":80}},"type":"binary-expr","locations":[{"start":{"line":176,"column":24},"end":{"line":176,"column":49}},{"start":{"line":176,"column":53},"end":{"line":176,"column":80}}]},"1":{"loc":{"start":{"line":182,"column":16},"end":{"line":183,"column":71}},"type":"binary-expr","locations":[{"start":{"line":182,"column":16},"end":{"line":182,"column":69}},{"start":{"line":183,"column":16},"end":{"line":183,"column":71}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":3,"5":3,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":48,"15":150,"16":6,"17":42,"18":42,"19":6,"20":6,"21":6,"22":6,"23":6,"24":1,"25":1,"26":1,"27":1,"28":1,"29":2,"30":1,"31":1,"32":0,"33":2,"34":0,"35":0,"36":0,"37":0,"38":0,"39":2,"40":1,"41":1,"42":0,"43":2,"44":1,"45":1,"46":1,"47":0,"48":1,"49":2,"50":0,"51":1,"52":0,"53":1,"54":2,"55":1,"56":1,"57":1,"58":0,"59":1,"60":1,"61":1,"62":1,"63":1,"64":0,"65":1,"66":2},"f":{"0":3,"1":3,"2":13,"3":6,"4":6,"5":48,"6":150,"7":1,"8":2,"9":0,"10":2,"11":1,"12":2,"13":1,"14":1},"b":{"0":[2,1],"1":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":31},"end":{"line":6,"column":49}},"2":{"start":{"line":6,"column":58},"end":{"line":6,"column":81}},"3":{"start":{"line":9,"column":40},"end":{"line":9,"column":42}},"4":{"start":{"line":11,"column":27},"end":{"line":11,"column":73}},"5":{"start":{"line":13,"column":32},"end":{"line":13,"column":76}},"6":{"start":{"line":16,"column":41},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"8":{"start":{"line":26,"column":7},"end":{"line":26,"column":null}},"9":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":31}},"loc":{"start":{"line":6,"column":81},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":29}},"loc":{"start":{"line":8,"column":29},"end":{"line":27,"column":null}}}},"branchMap":{},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1},"f":{"0":0,"1":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":14,"column":16},"end":{"line":14,"column":31}},"7":{"start":{"line":15,"column":16},"end":{"line":15,"column":33}},"8":{"start":{"line":16,"column":16},"end":{"line":16,"column":30}},"9":{"start":{"line":17,"column":25},"end":{"line":17,"column":41}},"10":{"start":{"line":11,"column":12},"end":{"line":11,"column":45}},"11":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"12":{"start":{"line":23,"column":39},"end":{"line":23,"column":75}},"13":{"start":{"line":24,"column":33},"end":{"line":24,"column":50}},"14":{"start":{"line":26,"column":35},"end":{"line":29,"column":null}},"15":{"start":{"line":32,"column":33},"end":{"line":32,"column":34}},"16":{"start":{"line":33,"column":35},"end":{"line":33,"column":36}},"17":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"18":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"19":{"start":{"line":41,"column":51},"end":{"line":41,"column":53}},"20":{"start":{"line":43,"column":43},"end":{"line":43,"column":114}},"21":{"start":{"line":45,"column":31},"end":{"line":47,"column":46}},"22":{"start":{"line":47,"column":33},"end":{"line":47,"column":45}},"23":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"24":{"start":{"line":51,"column":44},"end":{"line":51,"column":110}},"25":{"start":{"line":53,"column":29},"end":{"line":55,"column":42}},"26":{"start":{"line":55,"column":31},"end":{"line":55,"column":41}},"27":{"start":{"line":56,"column":12},"end":{"line":56,"column":null}},"28":{"start":{"line":60,"column":53},"end":{"line":62,"column":55}},"29":{"start":{"line":65,"column":48},"end":{"line":65,"column":49}},"30":{"start":{"line":66,"column":16},"end":{"line":68,"column":null}},"31":{"start":{"line":67,"column":20},"end":{"line":67,"column":null}},"32":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"33":{"start":{"line":73,"column":27},"end":{"line":73,"column":72}},"34":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"35":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"36":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"37":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"38":{"start":{"line":91,"column":29},"end":{"line":91,"column":88}},"39":{"start":{"line":94,"column":12},"end":{"line":94,"column":null}},"40":{"start":{"line":95,"column":12},"end":{"line":95,"column":null}},"41":{"start":{"line":103,"column":16},"end":{"line":110,"column":null}},"42":{"start":{"line":112,"column":16},"end":{"line":117,"column":null}},"43":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"44":{"start":{"line":122,"column":51},"end":{"line":124,"column":null}},"45":{"start":{"line":128,"column":16},"end":{"line":134,"column":null}},"46":{"start":{"line":136,"column":16},"end":{"line":142,"column":null}},"47":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"48":{"start":{"line":153,"column":14},"end":{"line":153,"column":16}},"49":{"start":{"line":155,"column":39},"end":{"line":155,"column":75}},"50":{"start":{"line":156,"column":33},"end":{"line":156,"column":50}},"51":{"start":{"line":158,"column":8},"end":{"line":162,"column":null}},"52":{"start":{"line":166,"column":16},"end":{"line":169,"column":null}},"53":{"start":{"line":173,"column":50},"end":{"line":175,"column":null}},"54":{"start":{"line":182,"column":18},"end":{"line":184,"column":14}},"55":{"start":{"line":183,"column":16},"end":{"line":183,"column":null}},"56":{"start":{"line":185,"column":12},"end":{"line":185,"column":null}},"57":{"start":{"line":189,"column":51},"end":{"line":189,"column":118}},"58":{"start":{"line":195,"column":18},"end":{"line":197,"column":14}},"59":{"start":{"line":196,"column":16},"end":{"line":196,"column":null}},"60":{"start":{"line":198,"column":12},"end":{"line":198,"column":null}},"61":{"start":{"line":201,"column":8},"end":{"line":201,"column":null}},"62":{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},"63":{"start":{"line":213,"column":12},"end":{"line":221,"column":null}},"64":{"start":{"line":217,"column":24},"end":{"line":217,"column":null}},"65":{"start":{"line":220,"column":16},"end":{"line":220,"column":null}},"66":{"start":{"line":222,"column":15},"end":{"line":222,"column":null}},"67":{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},"68":{"start":{"line":234,"column":12},"end":{"line":242,"column":null}},"69":{"start":{"line":238,"column":24},"end":{"line":238,"column":null}},"70":{"start":{"line":241,"column":16},"end":{"line":241,"column":null}},"71":{"start":{"line":243,"column":15},"end":{"line":243,"column":null}},"72":{"start":{"line":253,"column":35},"end":{"line":269,"column":10}},"73":{"start":{"line":256,"column":20},"end":{"line":256,"column":null}},"74":{"start":{"line":256,"column":64},"end":{"line":256,"column":null}},"75":{"start":{"line":263,"column":24},"end":{"line":263,"column":null}},"76":{"start":{"line":268,"column":12},"end":{"line":268,"column":null}},"77":{"start":{"line":271,"column":8},"end":{"line":271,"column":null}},"78":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"loc":{"start":{"line":17,"column":41},"end":{"line":20,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":22,"column":11},"end":{"line":22,"column":17}},"loc":{"start":{"line":22,"column":46},"end":{"line":76,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":47,"column":19},"end":{"line":47,"column":28}},"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":45}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":55,"column":19},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":31},"end":{"line":55,"column":41}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":66,"column":60},"end":{"line":66,"column":66}},"loc":{"start":{"line":66,"column":70},"end":{"line":68,"column":17}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":78,"column":11},"end":{"line":78,"column":17}},"loc":{"start":{"line":79,"column":34},"end":{"line":147,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":149,"column":12},"end":{"line":149,"column":47}},"loc":{"start":{"line":149,"column":71},"end":{"line":202,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":182,"column":49},"end":{"line":182,"column":58}},"loc":{"start":{"line":182,"column":62},"end":{"line":184,"column":13}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":195,"column":50},"end":{"line":195,"column":61}},"loc":{"start":{"line":195,"column":65},"end":{"line":197,"column":13}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":211,"column":12},"end":{"line":211,"column":44}},"loc":{"start":{"line":211,"column":88},"end":{"line":223,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":213,"column":36},"end":{"line":213,"column":43}},"loc":{"start":{"line":213,"column":47},"end":{"line":221,"column":13}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":232,"column":12},"end":{"line":232,"column":43}},"loc":{"start":{"line":232,"column":93},"end":{"line":244,"column":null}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":234,"column":42},"end":{"line":234,"column":54}},"loc":{"start":{"line":234,"column":58},"end":{"line":242,"column":13}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":252,"column":12},"end":{"line":252,"column":57}},"loc":{"start":{"line":252,"column":116},"end":{"line":272,"column":null}}},"14":{"name":"(anonymous_21)","decl":{"start":{"line":253,"column":56},"end":{"line":253,"column":69}},"loc":{"start":{"line":253,"column":73},"end":{"line":269,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":8},"end":{"line":89,"column":null}}]},"1":{"loc":{"start":{"line":93,"column":12},"end":{"line":93,"column":68}},"type":"binary-expr","locations":[{"start":{"line":93,"column":12},"end":{"line":93,"column":42}},{"start":{"line":93,"column":46},"end":{"line":93,"column":68}}]},"2":{"loc":{"start":{"line":119,"column":19},"end":{"line":119,"column":107}},"type":"binary-expr","locations":[{"start":{"line":119,"column":19},"end":{"line":119,"column":62}},{"start":{"line":119,"column":66},"end":{"line":119,"column":107}}]},"3":{"loc":{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},"type":"if","locations":[{"start":{"line":212,"column":8},"end":{"line":222,"column":null}},{"start":{"line":222,"column":15},"end":{"line":222,"column":null}}]},"4":{"loc":{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},"type":"if","locations":[{"start":{"line":233,"column":8},"end":{"line":243,"column":null}},{"start":{"line":243,"column":15},"end":{"line":243,"column":null}}]},"5":{"loc":{"start":{"line":256,"column":20},"end":{"line":256,"column":null}},"type":"if","locations":[{"start":{"line":256,"column":20},"end":{"line":256,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":7,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":19,"18":19,"19":7,"20":7,"21":1,"22":1,"23":1,"24":7,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":2,"32":1,"33":7,"34":7,"35":7,"36":5,"37":5,"38":5,"39":3,"40":3,"41":0,"42":2,"43":3,"44":3,"45":2,"46":1,"47":0,"48":8,"49":8,"50":8,"51":8,"52":20,"53":8,"54":2,"55":2,"56":2,"57":8,"58":2,"59":2,"60":2,"61":8,"62":15,"63":15,"64":12,"65":3,"66":0,"67":15,"68":15,"69":27,"70":3,"71":0,"72":15,"73":63,"74":27,"75":12,"76":0,"77":15,"78":1},"f":{"0":7,"1":7,"2":1,"3":1,"4":2,"5":5,"6":8,"7":2,"8":2,"9":15,"10":15,"11":15,"12":30,"13":15,"14":39},"b":{"0":[5],"1":[5,2],"2":[3,0],"3":[15,0],"4":[15,0],"5":[27]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"2":{"start":{"line":12,"column":24},"end":{"line":12,"column":40}},"3":{"start":{"line":12,"column":50},"end":{"line":12,"column":73}},"4":{"start":{"line":12,"column":73},"end":{"line":12,"column":80}},"5":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"6":{"start":{"line":19,"column":48},"end":{"line":19,"column":null}},"7":{"start":{"line":22,"column":35},"end":{"line":28,"column":44}},"8":{"start":{"line":30,"column":48},"end":{"line":30,"column":50}},"9":{"start":{"line":31,"column":36},"end":{"line":31,"column":73}},"10":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"11":{"start":{"line":41,"column":12},"end":{"line":42,"column":null}},"12":{"start":{"line":42,"column":14},"end":{"line":42,"column":null}},"13":{"start":{"line":45,"column":29},"end":{"line":45,"column":30}},"14":{"start":{"line":46,"column":37},"end":{"line":46,"column":64}},"15":{"start":{"line":50,"column":66},"end":{"line":50,"column":94}},"16":{"start":{"line":51,"column":24},"end":{"line":51,"column":null}},"17":{"start":{"line":52,"column":24},"end":{"line":52,"column":null}},"18":{"start":{"line":55,"column":56},"end":{"line":55,"column":87}},"19":{"start":{"line":56,"column":66},"end":{"line":56,"column":94}},"20":{"start":{"line":58,"column":28},"end":{"line":58,"column":null}},"21":{"start":{"line":59,"column":49},"end":{"line":62,"column":null}},"22":{"start":{"line":64,"column":28},"end":{"line":65,"column":null}},"23":{"start":{"line":67,"column":28},"end":{"line":68,"column":null}},"24":{"start":{"line":71,"column":28},"end":{"line":71,"column":null}},"25":{"start":{"line":73,"column":24},"end":{"line":73,"column":null}},"26":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"27":{"start":{"line":87,"column":46},"end":{"line":87,"column":48}},"28":{"start":{"line":89,"column":8},"end":{"line":89,"column":null}},"29":{"start":{"line":90,"column":25},"end":{"line":90,"column":40}},"30":{"start":{"line":93,"column":33},"end":{"line":93,"column":47}},"31":{"start":{"line":95,"column":16},"end":{"line":95,"column":null}},"32":{"start":{"line":98,"column":16},"end":{"line":98,"column":null}},"33":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"34":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":24}},"loc":{"start":{"line":12,"column":77},"end":{"line":12,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":17}},"loc":{"start":{"line":17,"column":39},"end":{"line":79,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":55,"column":47},"end":{"line":55,"column":51}},"loc":{"start":{"line":55,"column":56},"end":{"line":55,"column":87}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":12},"end":{"line":86,"column":21}},"loc":{"start":{"line":86,"column":34},"end":{"line":102,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":null}}]},"1":{"loc":{"start":{"line":41,"column":12},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":12},"end":{"line":42,"column":null}}]},"2":{"loc":{"start":{"line":41,"column":15},"end":{"line":41,"column":90}},"type":"binary-expr","locations":[{"start":{"line":41,"column":15},"end":{"line":41,"column":35}},{"start":{"line":41,"column":39},"end":{"line":41,"column":90}}]},"3":{"loc":{"start":{"line":44,"column":16},"end":{"line":44,"column":83}},"type":"binary-expr","locations":[{"start":{"line":44,"column":16},"end":{"line":44,"column":40}},{"start":{"line":44,"column":44},"end":{"line":44,"column":83}}]},"4":{"loc":{"start":{"line":48,"column":24},"end":{"line":48,"column":95}},"type":"binary-expr","locations":[{"start":{"line":48,"column":24},"end":{"line":48,"column":43}},{"start":{"line":48,"column":47},"end":{"line":48,"column":95}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":0,"11":12,"12":0,"13":10,"14":4,"15":0,"16":0,"17":0,"18":2,"19":2,"20":0,"21":0,"22":0,"23":2,"24":0,"25":2,"26":2,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":2},"f":{"0":2,"1":2,"2":2,"3":0},"b":{"0":[2],"1":[0],"2":[12,0],"3":[12,10],"4":[4,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":16,"column":16},"end":{"line":16,"column":32}},"6":{"start":{"line":17,"column":16},"end":{"line":17,"column":null}},"7":{"start":{"line":18,"column":16},"end":{"line":18,"column":46}},"8":{"start":{"line":19,"column":16},"end":{"line":19,"column":47}},"9":{"start":{"line":20,"column":16},"end":{"line":20,"column":54}},"10":{"start":{"line":13,"column":12},"end":{"line":13,"column":null}},"11":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"13":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"14":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"15":{"start":{"line":45,"column":29},"end":{"line":45,"column":30}},"16":{"start":{"line":46,"column":37},"end":{"line":46,"column":69}},"17":{"start":{"line":49,"column":24},"end":{"line":49,"column":null}},"18":{"start":{"line":52,"column":43},"end":{"line":52,"column":169}},"19":{"start":{"line":56,"column":24},"end":{"line":56,"column":null}},"20":{"start":{"line":61,"column":24},"end":{"line":61,"column":null}},"21":{"start":{"line":63,"column":60},"end":{"line":63,"column":62}},"22":{"start":{"line":65,"column":24},"end":{"line":65,"column":null}},"23":{"start":{"line":66,"column":24},"end":{"line":71,"column":null}},"24":{"start":{"line":72,"column":24},"end":{"line":76,"column":null}},"25":{"start":{"line":78,"column":51},"end":{"line":83,"column":75}},"26":{"start":{"line":84,"column":24},"end":{"line":84,"column":null}},"27":{"start":{"line":85,"column":24},"end":{"line":85,"column":null}},"28":{"start":{"line":86,"column":24},"end":{"line":86,"column":null}},"29":{"start":{"line":87,"column":24},"end":{"line":87,"column":null}},"30":{"start":{"line":88,"column":24},"end":{"line":88,"column":null}},"31":{"start":{"line":91,"column":24},"end":{"line":95,"column":null}},"32":{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},"33":{"start":{"line":100,"column":24},"end":{"line":100,"column":null}},"34":{"start":{"line":101,"column":24},"end":{"line":101,"column":null}},"35":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"36":{"start":{"line":107,"column":8},"end":{"line":107,"column":null}},"37":{"start":{"line":124,"column":64},"end":{"line":124,"column":98}},"38":{"start":{"line":125,"column":12},"end":{"line":125,"column":null}},"39":{"start":{"line":125,"column":51},"end":{"line":125,"column":null}},"40":{"start":{"line":130,"column":36},"end":{"line":130,"column":60}},"41":{"start":{"line":131,"column":29},"end":{"line":131,"column":53}},"42":{"start":{"line":133,"column":12},"end":{"line":133,"column":null}},"43":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"44":{"start":{"line":143,"column":43},"end":{"line":143,"column":75}},"45":{"start":{"line":146,"column":16},"end":{"line":150,"column":null}},"46":{"start":{"line":152,"column":16},"end":{"line":156,"column":null}},"47":{"start":{"line":159,"column":12},"end":{"line":163,"column":null}},"48":{"start":{"line":164,"column":12},"end":{"line":167,"column":null}},"49":{"start":{"line":171,"column":12},"end":{"line":173,"column":null}},"50":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}},"51":{"start":{"line":177,"column":12},"end":{"line":177,"column":null}},"52":{"start":{"line":180,"column":12},"end":{"line":180,"column":null}},"53":{"start":{"line":182,"column":8},"end":{"line":182,"column":null}},"54":{"start":{"line":197,"column":20},"end":{"line":197,"column":44}},"55":{"start":{"line":198,"column":24},"end":{"line":198,"column":60}},"56":{"start":{"line":199,"column":21},"end":{"line":199,"column":53}},"57":{"start":{"line":202,"column":28},"end":{"line":202,"column":156}},"58":{"start":{"line":205,"column":20},"end":{"line":205,"column":null}},"59":{"start":{"line":206,"column":20},"end":{"line":206,"column":null}},"60":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"61":{"start":{"line":209,"column":48},"end":{"line":209,"column":null}},"62":{"start":{"line":213,"column":12},"end":{"line":215,"column":null}},"63":{"start":{"line":218,"column":8},"end":{"line":218,"column":null}},"64":{"start":{"line":222,"column":49},"end":{"line":222,"column":54}},"65":{"start":{"line":223,"column":8},"end":{"line":223,"column":null}},"66":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"67":{"start":{"line":228,"column":12},"end":{"line":228,"column":null}},"68":{"start":{"line":237,"column":20},"end":{"line":237,"column":51}},"69":{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},"70":{"start":{"line":238,"column":29},"end":{"line":238,"column":41}},"71":{"start":{"line":239,"column":13},"end":{"line":239,"column":null}},"72":{"start":{"line":254,"column":20},"end":{"line":254,"column":51}},"73":{"start":{"line":255,"column":8},"end":{"line":255,"column":null}},"74":{"start":{"line":256,"column":8},"end":{"line":256,"column":null}},"75":{"start":{"line":266,"column":20},"end":{"line":266,"column":51}},"76":{"start":{"line":267,"column":8},"end":{"line":267,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"loc":{"start":{"line":20,"column":54},"end":{"line":24,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":31,"column":11},"end":{"line":31,"column":17}},"loc":{"start":{"line":31,"column":49},"end":{"line":108,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":116,"column":12},"end":{"line":116,"column":18}},"loc":{"start":{"line":120,"column":23},"end":{"line":183,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":124,"column":56},"end":{"line":124,"column":59}},"loc":{"start":{"line":124,"column":64},"end":{"line":124,"column":98}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":176,"column":56},"end":{"line":176,"column":59}},"loc":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":191,"column":12},"end":{"line":191,"column":18}},"loc":{"start":{"line":193,"column":62},"end":{"line":219,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":221,"column":12},"end":{"line":221,"column":40}},"loc":{"start":{"line":221,"column":61},"end":{"line":224,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"loc":{"start":{"line":227,"column":0},"end":{"line":269,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":236,"column":4},"end":{"line":236,"column":7}},"loc":{"start":{"line":236,"column":48},"end":{"line":240,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":249,"column":4},"end":{"line":249,"column":7}},"loc":{"start":{"line":252,"column":43},"end":{"line":257,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":265,"column":4},"end":{"line":265,"column":7}},"loc":{"start":{"line":265,"column":48},"end":{"line":268,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":16},"end":{"line":33,"column":93}},"type":"binary-expr","locations":[{"start":{"line":33,"column":16},"end":{"line":33,"column":53}},{"start":{"line":33,"column":57},"end":{"line":33,"column":93}}]},"1":{"loc":{"start":{"line":37,"column":16},"end":{"line":37,"column":104}},"type":"binary-expr","locations":[{"start":{"line":37,"column":16},"end":{"line":37,"column":40}},{"start":{"line":37,"column":44},"end":{"line":37,"column":104}}]},"2":{"loc":{"start":{"line":41,"column":16},"end":{"line":41,"column":106}},"type":"binary-expr","locations":[{"start":{"line":41,"column":16},"end":{"line":41,"column":41}},{"start":{"line":41,"column":45},"end":{"line":41,"column":106}}]},"3":{"loc":{"start":{"line":44,"column":16},"end":{"line":44,"column":93}},"type":"binary-expr","locations":[{"start":{"line":44,"column":16},"end":{"line":44,"column":45}},{"start":{"line":44,"column":49},"end":{"line":44,"column":93}}]},"4":{"loc":{"start":{"line":47,"column":24},"end":{"line":47,"column":149}},"type":"binary-expr","locations":[{"start":{"line":47,"column":24},"end":{"line":47,"column":91}},{"start":{"line":47,"column":95},"end":{"line":47,"column":149}}]},"5":{"loc":{"start":{"line":52,"column":43},"end":{"line":52,"column":169}},"type":"cond-expr","locations":[{"start":{"line":52,"column":97},"end":{"line":52,"column":115}},{"start":{"line":52,"column":116},"end":{"line":52,"column":169}}]},"6":{"loc":{"start":{"line":59,"column":24},"end":{"line":59,"column":127}},"type":"binary-expr","locations":[{"start":{"line":59,"column":24},"end":{"line":59,"column":48}},{"start":{"line":59,"column":52},"end":{"line":59,"column":105}},{"start":{"line":59,"column":109},"end":{"line":59,"column":127}}]},"7":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":70}},"type":"binary-expr","locations":[{"start":{"line":64,"column":25},"end":{"line":64,"column":42}},{"start":{"line":64,"column":46},"end":{"line":64,"column":70}}]},"8":{"loc":{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":20},"end":{"line":103,"column":null}},{"start":{"line":103,"column":24},"end":{"line":103,"column":null}}]},"9":{"loc":{"start":{"line":125,"column":12},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":12},"end":{"line":125,"column":null}}]},"10":{"loc":{"start":{"line":132,"column":12},"end":{"line":132,"column":53}},"type":"binary-expr","locations":[{"start":{"line":132,"column":12},"end":{"line":132,"column":29}},{"start":{"line":132,"column":33},"end":{"line":132,"column":53}}]},"11":{"loc":{"start":{"line":176,"column":64},"end":{"line":176,"column":109}},"type":"binary-expr","locations":[{"start":{"line":176,"column":64},"end":{"line":176,"column":98}},{"start":{"line":176,"column":102},"end":{"line":176,"column":109}}]},"12":{"loc":{"start":{"line":209,"column":12},"end":{"line":209,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":12},"end":{"line":209,"column":null}}]},"13":{"loc":{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},"type":"if","locations":[{"start":{"line":238,"column":8},"end":{"line":239,"column":null}},{"start":{"line":239,"column":13},"end":{"line":239,"column":null}}]}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":10,"6":10,"7":10,"8":10,"9":10,"10":10,"11":10,"12":0,"13":24,"14":0,"15":19,"16":28,"17":1,"18":27,"19":9,"20":2,"21":16,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":15,"32":13,"33":10,"34":10,"35":3,"36":7,"37":38,"38":16,"39":10,"40":6,"41":6,"42":6,"43":1,"44":5,"45":1,"46":4,"47":5,"48":5,"49":1,"50":13,"51":4,"52":1,"53":4,"54":4,"55":4,"56":4,"57":9,"58":3,"59":3,"60":9,"61":3,"62":1,"63":3,"64":55,"65":55,"66":3,"67":10,"68":6,"69":6,"70":1,"71":5,"72":5,"73":5,"74":5,"75":6,"76":6},"f":{"0":10,"1":10,"2":16,"3":38,"4":13,"5":4,"6":55,"7":10,"8":6,"9":5,"10":6},"b":{"0":[47,0],"1":[47,35],"2":[23,0],"3":[23,19],"4":[28,1],"5":[0,27],"6":[18,8,2],"7":[16,1],"8":[10,3],"9":[10],"10":[6,6],"11":[13,5],"12":[3],"13":[1,5]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"7":{"start":{"line":11,"column":24},"end":{"line":11,"column":46}},"8":{"start":{"line":11,"column":56},"end":{"line":11,"column":71}},"9":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"10":{"start":{"line":16,"column":34},"end":{"line":16,"column":75}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"12":{"start":{"line":18,"column":34},"end":{"line":18,"column":101}},"13":{"start":{"line":19,"column":8},"end":{"line":22,"column":null}},"14":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"15":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"16":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"17":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"18":{"start":{"line":43,"column":19},"end":{"line":43,"column":51}},"19":{"start":{"line":45,"column":12},"end":{"line":49,"column":null}},"20":{"start":{"line":50,"column":80},"end":{"line":50,"column":82}},"21":{"start":{"line":54,"column":20},"end":{"line":54,"column":null}},"22":{"start":{"line":55,"column":20},"end":{"line":61,"column":null}},"23":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"24":{"start":{"line":67,"column":37},"end":{"line":69,"column":55}},"25":{"start":{"line":68,"column":59},"end":{"line":68,"column":82}},"26":{"start":{"line":69,"column":33},"end":{"line":69,"column":54}},"27":{"start":{"line":70,"column":25},"end":{"line":70,"column":26}},"28":{"start":{"line":72,"column":34},"end":{"line":72,"column":102}},"29":{"start":{"line":74,"column":33},"end":{"line":74,"column":38}},"30":{"start":{"line":76,"column":51},"end":{"line":76,"column":119}},"31":{"start":{"line":79,"column":31},"end":{"line":79,"column":null}},"32":{"start":{"line":82,"column":32},"end":{"line":82,"column":null}},"33":{"start":{"line":83,"column":32},"end":{"line":83,"column":null}},"34":{"start":{"line":89,"column":16},"end":{"line":91,"column":null}},"35":{"start":{"line":90,"column":67},"end":{"line":90,"column":90}},"36":{"start":{"line":91,"column":37},"end":{"line":91,"column":58}},"37":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"38":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"39":{"start":{"line":100,"column":10},"end":{"line":100,"column":null}},"40":{"start":{"line":103,"column":21},"end":{"line":103,"column":29}},"41":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"42":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"43":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":24}},"loc":{"start":{"line":11,"column":71},"end":{"line":11,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":13,"column":11},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":46},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":12},"end":{"line":28,"column":56}},"loc":{"start":{"line":30,"column":34},"end":{"line":38,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":32}},"loc":{"start":{"line":41,"column":81},"end":{"line":96,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":68,"column":47},"end":{"line":68,"column":54}},"loc":{"start":{"line":68,"column":59},"end":{"line":68,"column":82}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":69,"column":19},"end":{"line":69,"column":28}},"loc":{"start":{"line":69,"column":33},"end":{"line":69,"column":54}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":90,"column":55},"end":{"line":90,"column":62}},"loc":{"start":{"line":90,"column":67},"end":{"line":90,"column":90}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":91,"column":23},"end":{"line":91,"column":32}},"loc":{"start":{"line":91,"column":37},"end":{"line":91,"column":58}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":98,"column":12},"end":{"line":98,"column":35}},"loc":{"start":{"line":98,"column":69},"end":{"line":106,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":64}},"type":"binary-expr","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":17}},{"start":{"line":99,"column":21},"end":{"line":99,"column":36}},{"start":{"line":99,"column":40},"end":{"line":99,"column":45}},{"start":{"line":99,"column":49},"end":{"line":99,"column":64}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":42,"20":42,"21":65,"22":65,"23":87,"24":42,"25":221,"26":152,"27":42,"28":96,"29":96,"30":7,"31":0,"32":7,"33":7,"34":145,"35":727,"36":727,"37":42,"38":7,"39":0,"40":0,"41":0,"42":0,"43":2},"f":{"0":7,"1":7,"2":7,"3":7,"4":221,"5":152,"6":727,"7":727,"8":0},"b":{"0":[0,0,0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":23},"end":{"line":9,"column":49}},"7":{"start":{"line":11,"column":35},"end":{"line":11,"column":131}},"8":{"start":{"line":12,"column":49},"end":{"line":12,"column":88}},"9":{"start":{"line":18,"column":31},"end":{"line":18,"column":75}},"10":{"start":{"line":19,"column":42},"end":{"line":19,"column":47}},"11":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"12":{"start":{"line":23,"column":16},"end":{"line":23,"column":null}},"13":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"14":{"start":{"line":26,"column":33},"end":{"line":26,"column":null}},"15":{"start":{"line":29,"column":38},"end":{"line":29,"column":111}},"16":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"17":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"18":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"19":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"20":{"start":{"line":40,"column":12},"end":{"line":40,"column":null}},"21":{"start":{"line":42,"column":36},"end":{"line":42,"column":106}},"22":{"start":{"line":43,"column":39},"end":{"line":43,"column":57}},"23":{"start":{"line":48,"column":42},"end":{"line":48,"column":72}},"24":{"start":{"line":50,"column":62},"end":{"line":51,"column":null}},"25":{"start":{"line":51,"column":49},"end":{"line":51,"column":110}},"26":{"start":{"line":61,"column":24},"end":{"line":61,"column":null}},"27":{"start":{"line":62,"column":38},"end":{"line":66,"column":26}},"28":{"start":{"line":67,"column":41},"end":{"line":67,"column":71}},"29":{"start":{"line":68,"column":24},"end":{"line":68,"column":null}},"30":{"start":{"line":69,"column":24},"end":{"line":69,"column":null}},"31":{"start":{"line":71,"column":24},"end":{"line":75,"column":null}},"32":{"start":{"line":78,"column":24},"end":{"line":78,"column":null}},"33":{"start":{"line":81,"column":20},"end":{"line":81,"column":null}},"34":{"start":{"line":85,"column":12},"end":{"line":85,"column":null}},"35":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}},"36":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"37":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"38":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"39":{"start":{"line":94,"column":47},"end":{"line":94,"column":null}},"40":{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},"41":{"start":{"line":96,"column":67},"end":{"line":96,"column":80}},"42":{"start":{"line":97,"column":13},"end":{"line":97,"column":null}},"43":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":78},"end":{"line":91,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":51,"column":25},"end":{"line":51,"column":44}},"loc":{"start":{"line":51,"column":49},"end":{"line":51,"column":110}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":93,"column":11},"end":{"line":93,"column":20}},"loc":{"start":{"line":93,"column":60},"end":{"line":98,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":null}}]},"1":{"loc":{"start":{"line":55,"column":24},"end":{"line":57,"column":118}},"type":"binary-expr","locations":[{"start":{"line":55,"column":24},"end":{"line":55,"column":47}},{"start":{"line":56,"column":24},"end":{"line":56,"column":71}},{"start":{"line":57,"column":24},"end":{"line":57,"column":118}}]},"2":{"loc":{"start":{"line":94,"column":8},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":94,"column":8},"end":{"line":94,"column":null}}]},"3":{"loc":{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":8},"end":{"line":97,"column":null}},{"start":{"line":97,"column":13},"end":{"line":97,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":5,"10":5,"11":5,"12":5,"13":5,"14":0,"15":5,"16":3,"17":3,"18":1,"19":1,"20":4,"21":4,"22":4,"23":8,"24":8,"25":7,"26":1,"27":1,"28":1,"29":1,"30":1,"31":3,"32":4,"33":0,"34":4,"35":4,"36":1,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":1},"f":{"0":5,"1":7,"2":0},"b":{"0":[0],"1":[8,4,4],"2":[0],"3":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"12":{"start":{"line":14,"column":27},"end":{"line":14,"column":41}},"13":{"start":{"line":15,"column":12},"end":{"line":15,"column":23}},"14":{"start":{"line":31,"column":16},"end":{"line":31,"column":30}},"15":{"start":{"line":32,"column":16},"end":{"line":32,"column":35}},"16":{"start":{"line":33,"column":16},"end":{"line":33,"column":37}},"17":{"start":{"line":34,"column":16},"end":{"line":34,"column":35}},"18":{"start":{"line":35,"column":16},"end":{"line":35,"column":39}},"19":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"20":{"start":{"line":41,"column":12},"end":{"line":41,"column":null}},"21":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"22":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"23":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"24":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"25":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"26":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"27":{"start":{"line":54,"column":25},"end":{"line":54,"column":32}},"28":{"start":{"line":55,"column":19},"end":{"line":55,"column":21}},"29":{"start":{"line":58,"column":27},"end":{"line":58,"column":84}},"30":{"start":{"line":59,"column":25},"end":{"line":59,"column":80}},"31":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"32":{"start":{"line":64,"column":8},"end":{"line":70,"column":null}},"33":{"start":{"line":72,"column":22},"end":{"line":72,"column":42}},"34":{"start":{"line":73,"column":33},"end":{"line":73,"column":65}},"35":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"36":{"start":{"line":76,"column":26},"end":{"line":76,"column":46}},"37":{"start":{"line":77,"column":27},"end":{"line":77,"column":43}},"38":{"start":{"line":79,"column":8},"end":{"line":90,"column":null}},"39":{"start":{"line":80,"column":24},"end":{"line":80,"column":29}},"40":{"start":{"line":81,"column":34},"end":{"line":81,"column":89}},"41":{"start":{"line":82,"column":25},"end":{"line":82,"column":26}},"42":{"start":{"line":83,"column":36},"end":{"line":83,"column":98}},"43":{"start":{"line":85,"column":20},"end":{"line":85,"column":null}},"44":{"start":{"line":86,"column":20},"end":{"line":86,"column":null}},"45":{"start":{"line":89,"column":12},"end":{"line":89,"column":null}},"46":{"start":{"line":93,"column":12},"end":{"line":93,"column":null}},"47":{"start":{"line":96,"column":25},"end":{"line":96,"column":47}},"48":{"start":{"line":99,"column":25},"end":{"line":99,"column":26}},"49":{"start":{"line":102,"column":35},"end":{"line":102,"column":54}},"50":{"start":{"line":104,"column":43},"end":{"line":104,"column":83}},"51":{"start":{"line":107,"column":28},"end":{"line":107,"column":null}},"52":{"start":{"line":108,"column":28},"end":{"line":108,"column":null}},"53":{"start":{"line":110,"column":28},"end":{"line":110,"column":null}},"54":{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},"55":{"start":{"line":112,"column":30},"end":{"line":112,"column":115}},"56":{"start":{"line":114,"column":30},"end":{"line":114,"column":null}},"57":{"start":{"line":116,"column":28},"end":{"line":116,"column":null}},"58":{"start":{"line":118,"column":28},"end":{"line":118,"column":null}},"59":{"start":{"line":120,"column":28},"end":{"line":120,"column":null}},"60":{"start":{"line":125,"column":19},"end":{"line":126,"column":null}},"61":{"start":{"line":126,"column":20},"end":{"line":126,"column":null}},"62":{"start":{"line":130,"column":20},"end":{"line":134,"column":null}},"63":{"start":{"line":140,"column":12},"end":{"line":140,"column":null}},"64":{"start":{"line":141,"column":12},"end":{"line":141,"column":null}},"65":{"start":{"line":146,"column":12},"end":{"line":146,"column":null}},"66":{"start":{"line":147,"column":12},"end":{"line":147,"column":null}},"67":{"start":{"line":150,"column":8},"end":{"line":150,"column":null}},"68":{"start":{"line":152,"column":8},"end":{"line":152,"column":null}},"69":{"start":{"line":157,"column":8},"end":{"line":157,"column":null}},"70":{"start":{"line":159,"column":12},"end":{"line":159,"column":null}},"71":{"start":{"line":162,"column":24},"end":{"line":162,"column":28}},"72":{"start":{"line":163,"column":8},"end":{"line":170,"column":null}},"73":{"start":{"line":168,"column":16},"end":{"line":168,"column":null}},"74":{"start":{"line":171,"column":8},"end":{"line":171,"column":null}},"75":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"76":{"start":{"line":178,"column":12},"end":{"line":180,"column":null}},"77":{"start":{"line":179,"column":16},"end":{"line":179,"column":null}},"78":{"start":{"line":182,"column":8},"end":{"line":182,"column":null}},"79":{"start":{"line":184,"column":21},"end":{"line":184,"column":22}},"80":{"start":{"line":185,"column":27},"end":{"line":185,"column":44}},"81":{"start":{"line":187,"column":30},"end":{"line":187,"column":68}},"82":{"start":{"line":188,"column":32},"end":{"line":188,"column":34}},"83":{"start":{"line":190,"column":20},"end":{"line":190,"column":null}},"84":{"start":{"line":192,"column":20},"end":{"line":192,"column":null}},"85":{"start":{"line":195,"column":27},"end":{"line":195,"column":65}},"86":{"start":{"line":202,"column":24},"end":{"line":208,"column":null}},"87":{"start":{"line":210,"column":24},"end":{"line":210,"column":null}},"88":{"start":{"line":212,"column":33},"end":{"line":212,"column":88}},"89":{"start":{"line":214,"column":41},"end":{"line":214,"column":113}},"90":{"start":{"line":216,"column":28},"end":{"line":220,"column":null}},"91":{"start":{"line":222,"column":28},"end":{"line":226,"column":null}},"92":{"start":{"line":228,"column":28},"end":{"line":234,"column":null}},"93":{"start":{"line":236,"column":28},"end":{"line":240,"column":null}},"94":{"start":{"line":242,"column":24},"end":{"line":246,"column":null}},"95":{"start":{"line":248,"column":24},"end":{"line":254,"column":null}},"96":{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},"97":{"start":{"line":257,"column":28},"end":{"line":261,"column":null}},"98":{"start":{"line":262,"column":28},"end":{"line":268,"column":null}},"99":{"start":{"line":276,"column":16},"end":{"line":282,"column":null}},"100":{"start":{"line":286,"column":8},"end":{"line":286,"column":null}},"101":{"start":{"line":291,"column":21},"end":{"line":291,"column":22}},"102":{"start":{"line":292,"column":12},"end":{"line":292,"column":null}},"103":{"start":{"line":294,"column":8},"end":{"line":296,"column":null}},"104":{"start":{"line":295,"column":12},"end":{"line":295,"column":null}},"105":{"start":{"line":299,"column":23},"end":{"line":306,"column":null}},"106":{"start":{"line":308,"column":41},"end":{"line":308,"column":49}},"107":{"start":{"line":309,"column":27},"end":{"line":309,"column":74}},"108":{"start":{"line":310,"column":26},"end":{"line":310,"column":46}},"109":{"start":{"line":311,"column":22},"end":{"line":311,"column":47}},"110":{"start":{"line":312,"column":12},"end":{"line":312,"column":null}},"111":{"start":{"line":317,"column":28},"end":{"line":317,"column":33}},"112":{"start":{"line":318,"column":21},"end":{"line":318,"column":22}},"113":{"start":{"line":320,"column":16},"end":{"line":320,"column":null}},"114":{"start":{"line":321,"column":16},"end":{"line":321,"column":null}},"115":{"start":{"line":322,"column":16},"end":{"line":322,"column":null}},"116":{"start":{"line":327,"column":12},"end":{"line":330,"column":null}},"117":{"start":{"line":331,"column":12},"end":{"line":331,"column":null}},"118":{"start":{"line":333,"column":8},"end":{"line":333,"column":null}},"119":{"start":{"line":337,"column":28},"end":{"line":337,"column":47}},"120":{"start":{"line":338,"column":29},"end":{"line":338,"column":58}},"121":{"start":{"line":339,"column":25},"end":{"line":339,"column":29}},"122":{"start":{"line":340,"column":33},"end":{"line":340,"column":52}},"123":{"start":{"line":341,"column":31},"end":{"line":341,"column":46}},"124":{"start":{"line":343,"column":28},"end":{"line":343,"column":47}},"125":{"start":{"line":345,"column":33},"end":{"line":348,"column":null}},"126":{"start":{"line":350,"column":21},"end":{"line":350,"column":22}},"127":{"start":{"line":352,"column":32},"end":{"line":352,"column":66}},"128":{"start":{"line":354,"column":32},"end":{"line":354,"column":88}},"129":{"start":{"line":355,"column":16},"end":{"line":355,"column":null}},"130":{"start":{"line":356,"column":16},"end":{"line":356,"column":null}},"131":{"start":{"line":359,"column":20},"end":{"line":359,"column":null}},"132":{"start":{"line":363,"column":20},"end":{"line":363,"column":null}},"133":{"start":{"line":366,"column":35},"end":{"line":366,"column":62}},"134":{"start":{"line":370,"column":20},"end":{"line":374,"column":null}},"135":{"start":{"line":377,"column":20},"end":{"line":381,"column":null}},"136":{"start":{"line":384,"column":32},"end":{"line":384,"column":67}},"137":{"start":{"line":386,"column":28},"end":{"line":386,"column":63}},"138":{"start":{"line":388,"column":32},"end":{"line":388,"column":63}},"139":{"start":{"line":389,"column":16},"end":{"line":389,"column":null}},"140":{"start":{"line":390,"column":35},"end":{"line":390,"column":62}},"141":{"start":{"line":393,"column":20},"end":{"line":393,"column":null}},"142":{"start":{"line":397,"column":20},"end":{"line":397,"column":null}},"143":{"start":{"line":400,"column":16},"end":{"line":405,"column":null}},"144":{"start":{"line":408,"column":16},"end":{"line":412,"column":null}},"145":{"start":{"line":415,"column":8},"end":{"line":415,"column":null}},"146":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"147":{"start":{"line":418,"column":0},"end":{"line":418,"column":null}},"148":{"start":{"line":419,"column":4},"end":{"line":419,"column":null}},"149":{"start":{"line":420,"column":4},"end":{"line":420,"column":null}},"150":{"start":{"line":421,"column":4},"end":{"line":421,"column":null}},"151":{"start":{"line":422,"column":4},"end":{"line":422,"column":null}},"152":{"start":{"line":423,"column":4},"end":{"line":423,"column":null}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"loc":{"start":{"line":35,"column":39},"end":{"line":49,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":51,"column":11},"end":{"line":51,"column":17}},"loc":{"start":{"line":51,"column":43},"end":{"line":153,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":79,"column":44},"end":{"line":79,"column":51}},"loc":{"start":{"line":79,"column":55},"end":{"line":90,"column":9}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":156,"column":12},"end":{"line":156,"column":26}},"loc":{"start":{"line":156,"column":64},"end":{"line":172,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":163,"column":30},"end":{"line":163,"column":36}},"loc":{"start":{"line":163,"column":40},"end":{"line":170,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":174,"column":12},"end":{"line":174,"column":18}},"loc":{"start":{"line":174,"column":92},"end":{"line":287,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":178,"column":84},"end":{"line":178,"column":92}},"loc":{"start":{"line":178,"column":96},"end":{"line":180,"column":13}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":289,"column":12},"end":{"line":289,"column":35}},"loc":{"start":{"line":289,"column":98},"end":{"line":314,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":294,"column":40},"end":{"line":294,"column":48}},"loc":{"start":{"line":294,"column":52},"end":{"line":296,"column":9}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":316,"column":12},"end":{"line":316,"column":35}},"loc":{"start":{"line":316,"column":64},"end":{"line":334,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":336,"column":12},"end":{"line":336,"column":18}},"loc":{"start":{"line":336,"column":43},"end":{"line":416,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":418,"column":0},"end":{"line":418,"column":5}},"loc":{"start":{"line":418,"column":14},"end":{"line":424,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":68}},"type":"binary-expr","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":35}},{"start":{"line":37,"column":39},"end":{"line":37,"column":68}}]},"1":{"loc":{"start":{"line":98,"column":12},"end":{"line":98,"column":49}},"type":"binary-expr","locations":[{"start":{"line":98,"column":12},"end":{"line":98,"column":23}},{"start":{"line":98,"column":27},"end":{"line":98,"column":49}}]},"2":{"loc":{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":111,"column":28},"end":{"line":114,"column":null}},{"start":{"line":114,"column":30},"end":{"line":114,"column":null}}]},"3":{"loc":{"start":{"line":125,"column":19},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":19},"end":{"line":126,"column":null}}]},"4":{"loc":{"start":{"line":157,"column":23},"end":{"line":157,"column":41}},"type":"binary-expr","locations":[{"start":{"line":157,"column":23},"end":{"line":157,"column":35}},{"start":{"line":157,"column":39},"end":{"line":157,"column":41}}]},"5":{"loc":{"start":{"line":165,"column":16},"end":{"line":166,"column":69}},"type":"binary-expr","locations":[{"start":{"line":165,"column":16},"end":{"line":165,"column":63}},{"start":{"line":166,"column":16},"end":{"line":166,"column":69}}]},"6":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":80}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":49}},{"start":{"line":179,"column":53},"end":{"line":179,"column":80}}]},"7":{"loc":{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},"type":"if","locations":[{"start":{"line":256,"column":24},"end":{"line":271,"column":null}},{"start":{"line":269,"column":31},"end":{"line":271,"column":null}}]},"8":{"loc":{"start":{"line":295,"column":19},"end":{"line":295,"column":66}},"type":"binary-expr","locations":[{"start":{"line":295,"column":19},"end":{"line":295,"column":35}},{"start":{"line":295,"column":39},"end":{"line":295,"column":66}}]},"9":{"loc":{"start":{"line":418,"column":5},"end":{"line":418,"column":null}},"type":"binary-expr","locations":[{"start":{"line":418,"column":5},"end":{"line":418,"column":14}},{"start":{"line":418,"column":5},"end":{"line":418,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[1,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"10":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"11":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"12":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"13":{"start":{"line":22,"column":16},"end":{"line":22,"column":30}},"14":{"start":{"line":23,"column":16},"end":{"line":23,"column":36}},"15":{"start":{"line":24,"column":16},"end":{"line":24,"column":46}},"16":{"start":{"line":25,"column":16},"end":{"line":25,"column":48}},"17":{"start":{"line":29,"column":23},"end":{"line":29,"column":81}},"18":{"start":{"line":31,"column":28},"end":{"line":31,"column":86}},"19":{"start":{"line":32,"column":28},"end":{"line":32,"column":106}},"20":{"start":{"line":34,"column":8},"end":{"line":40,"column":null}},"21":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"22":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"23":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"24":{"start":{"line":55,"column":16},"end":{"line":55,"column":null}},"25":{"start":{"line":57,"column":16},"end":{"line":57,"column":null}},"26":{"start":{"line":58,"column":16},"end":{"line":58,"column":null}},"27":{"start":{"line":59,"column":16},"end":{"line":59,"column":null}},"28":{"start":{"line":60,"column":16},"end":{"line":60,"column":null}},"29":{"start":{"line":61,"column":16},"end":{"line":61,"column":null}},"30":{"start":{"line":64,"column":38},"end":{"line":64,"column":100}},"31":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"32":{"start":{"line":66,"column":50},"end":{"line":66,"column":null}},"33":{"start":{"line":68,"column":12},"end":{"line":72,"column":null}},"34":{"start":{"line":77,"column":40},"end":{"line":77,"column":74}},"35":{"start":{"line":78,"column":41},"end":{"line":78,"column":65}},"36":{"start":{"line":80,"column":35},"end":{"line":80,"column":87}},"37":{"start":{"line":83,"column":20},"end":{"line":83,"column":null}},"38":{"start":{"line":84,"column":20},"end":{"line":84,"column":null}},"39":{"start":{"line":88,"column":12},"end":{"line":92,"column":null}},"40":{"start":{"line":93,"column":45},"end":{"line":93,"column":107}},"41":{"start":{"line":95,"column":16},"end":{"line":95,"column":null}},"42":{"start":{"line":98,"column":12},"end":{"line":98,"column":null}},"43":{"start":{"line":100,"column":12},"end":{"line":104,"column":null}},"44":{"start":{"line":105,"column":12},"end":{"line":105,"column":null}},"45":{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},"46":{"start":{"line":111,"column":60},"end":{"line":111,"column":125}},"47":{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},"48":{"start":{"line":112,"column":49},"end":{"line":112,"column":117}},"49":{"start":{"line":113,"column":13},"end":{"line":113,"column":null}},"50":{"start":{"line":115,"column":39},"end":{"line":115,"column":99}},"51":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"52":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"53":{"start":{"line":124,"column":33},"end":{"line":124,"column":63}},"54":{"start":{"line":125,"column":29},"end":{"line":125,"column":61}},"55":{"start":{"line":127,"column":8},"end":{"line":127,"column":null}},"56":{"start":{"line":129,"column":12},"end":{"line":129,"column":null}},"57":{"start":{"line":131,"column":12},"end":{"line":131,"column":null}},"58":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"59":{"start":{"line":138,"column":40},"end":{"line":138,"column":90}},"60":{"start":{"line":139,"column":28},"end":{"line":139,"column":57}},"61":{"start":{"line":144,"column":16},"end":{"line":144,"column":null}},"62":{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},"63":{"start":{"line":149,"column":12},"end":{"line":149,"column":null}},"64":{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},"65":{"start":{"line":153,"column":16},"end":{"line":153,"column":null}},"66":{"start":{"line":154,"column":16},"end":{"line":154,"column":null}},"67":{"start":{"line":155,"column":19},"end":{"line":155,"column":null}},"68":{"start":{"line":156,"column":15},"end":{"line":156,"column":null}},"69":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"70":{"start":{"line":163,"column":12},"end":{"line":163,"column":null}},"71":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"loc":{"start":{"line":12,"column":0},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"loc":{"start":{"line":25,"column":48},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":21},"end":{"line":107,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":109,"column":12},"end":{"line":109,"column":43}},"loc":{"start":{"line":109,"column":68},"end":{"line":121,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":123,"column":12},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":68},"end":{"line":135,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":137,"column":12},"end":{"line":137,"column":18}},"loc":{"start":{"line":137,"column":96},"end":{"line":157,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":159,"column":12},"end":{"line":159,"column":34}},"loc":{"start":{"line":159,"column":99},"end":{"line":165,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":110}},"type":"binary-expr","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":47}},{"start":{"line":43,"column":51},"end":{"line":43,"column":110}}]},"1":{"loc":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":12},"end":{"line":66,"column":null}}]},"2":{"loc":{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":111,"column":8},"end":{"line":113,"column":null}},{"start":{"line":112,"column":13},"end":{"line":113,"column":null}}]},"3":{"loc":{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":13},"end":{"line":113,"column":null}},{"start":{"line":113,"column":13},"end":{"line":113,"column":null}}]},"4":{"loc":{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":8},"end":{"line":156,"column":null}},{"start":{"line":156,"column":15},"end":{"line":156,"column":null}}]},"5":{"loc":{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":152,"column":12},"end":{"line":155,"column":null}},{"start":{"line":155,"column":19},"end":{"line":155,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":9,"14":9,"15":9,"16":9,"17":9,"18":9,"19":9,"20":8,"21":0,"22":8,"23":6,"24":6,"25":0,"26":0,"27":0,"28":0,"29":0,"30":6,"31":6,"32":6,"33":6,"34":7,"35":7,"36":7,"37":1,"38":1,"39":5,"40":5,"41":1,"42":4,"43":2,"44":2,"45":6,"46":0,"47":6,"48":0,"49":6,"50":6,"51":6,"52":6,"53":8,"54":8,"55":8,"56":0,"57":8,"58":8,"59":5,"60":5,"61":5,"62":5,"63":2,"64":2,"65":1,"66":1,"67":1,"68":3,"69":0,"70":0,"71":1},"f":{"0":1,"1":9,"2":9,"3":6,"4":8,"5":5,"6":0},"b":{"0":[8,7],"1":[6],"2":[0,6],"3":[0,6],"4":[2,3],"5":[1,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":8,"column":21},"end":{"line":8,"column":34}},"6":{"start":{"line":9,"column":23},"end":{"line":9,"column":47}},"7":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"8":{"start":{"line":13,"column":18},"end":{"line":13,"column":42}},"9":{"start":{"line":14,"column":18},"end":{"line":14,"column":40}},"10":{"start":{"line":15,"column":18},"end":{"line":15,"column":62}},"11":{"start":{"line":16,"column":18},"end":{"line":16,"column":33}},"12":{"start":{"line":17,"column":18},"end":{"line":17,"column":43}},"13":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"14":{"start":{"line":27,"column":30},"end":{"line":27,"column":104}},"15":{"start":{"line":29,"column":28},"end":{"line":29,"column":87}},"16":{"start":{"line":29,"column":49},"end":{"line":29,"column":86}},"17":{"start":{"line":31,"column":25},"end":{"line":31,"column":76}},"18":{"start":{"line":31,"column":46},"end":{"line":31,"column":75}},"19":{"start":{"line":33,"column":26},"end":{"line":33,"column":78}},"20":{"start":{"line":33,"column":47},"end":{"line":33,"column":77}},"21":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"22":{"start":{"line":35,"column":24},"end":{"line":35,"column":null}},"23":{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},"24":{"start":{"line":37,"column":43},"end":{"line":37,"column":55}},"25":{"start":{"line":38,"column":13},"end":{"line":38,"column":null}},"26":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"27":{"start":{"line":55,"column":22},"end":{"line":55,"column":67}},"28":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"29":{"start":{"line":60,"column":54},"end":{"line":60,"column":null}},"30":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"31":{"start":{"line":61,"column":56},"end":{"line":61,"column":null}},"32":{"start":{"line":65,"column":12},"end":{"line":67,"column":null}},"33":{"start":{"line":69,"column":12},"end":{"line":73,"column":null}},"34":{"start":{"line":75,"column":12},"end":{"line":79,"column":null}},"35":{"start":{"line":81,"column":12},"end":{"line":83,"column":null}},"36":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"loc":{"start":{"line":17,"column":43},"end":{"line":20,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":20}},"loc":{"start":{"line":22,"column":20},"end":{"line":24,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":18}},"loc":{"start":{"line":26,"column":69},"end":{"line":39,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":29,"column":40},"end":{"line":29,"column":44}},"loc":{"start":{"line":29,"column":49},"end":{"line":29,"column":86}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":31,"column":37},"end":{"line":31,"column":41}},"loc":{"start":{"line":31,"column":46},"end":{"line":31,"column":75}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":33,"column":38},"end":{"line":33,"column":42}},"loc":{"start":{"line":33,"column":47},"end":{"line":33,"column":77}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":20}},"loc":{"start":{"line":41,"column":31},"end":{"line":43,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":17}},"loc":{"start":{"line":45,"column":40},"end":{"line":46,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":21}},"loc":{"start":{"line":49,"column":44},"end":{"line":49,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":41}},"loc":{"start":{"line":51,"column":41},"end":{"line":51,"column":null}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":31}},"loc":{"start":{"line":54,"column":56},"end":{"line":85,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":8},"end":{"line":35,"column":null}}]},"1":{"loc":{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":8},"end":{"line":38,"column":null}},{"start":{"line":38,"column":13},"end":{"line":38,"column":null}}]},"2":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":41}},"type":"binary-expr","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":26}},{"start":{"line":37,"column":30},"end":{"line":37,"column":41}}]},"3":{"loc":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":60,"column":null}}]},"4":{"loc":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":12},"end":{"line":61,"column":null}}]},"5":{"loc":{"start":{"line":64,"column":12},"end":{"line":64,"column":32}},"type":"binary-expr","locations":[{"start":{"line":64,"column":12},"end":{"line":64,"column":19}},{"start":{"line":64,"column":23},"end":{"line":64,"column":32}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"14":{"start":{"line":18,"column":0},"end":{"line":18,"column":null}},"15":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"16":{"start":{"line":22,"column":18},"end":{"line":22,"column":42}},"17":{"start":{"line":23,"column":18},"end":{"line":23,"column":40}},"18":{"start":{"line":24,"column":18},"end":{"line":24,"column":62}},"19":{"start":{"line":25,"column":18},"end":{"line":25,"column":33}},"20":{"start":{"line":26,"column":18},"end":{"line":26,"column":43}},"21":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"22":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"23":{"start":{"line":42,"column":26},"end":{"line":42,"column":101}},"24":{"start":{"line":45,"column":49},"end":{"line":45,"column":108}},"25":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"26":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"27":{"start":{"line":52,"column":12},"end":{"line":52,"column":null}},"28":{"start":{"line":56,"column":12},"end":{"line":56,"column":null}},"29":{"start":{"line":58,"column":12},"end":{"line":58,"column":null}},"30":{"start":{"line":63,"column":33},"end":{"line":63,"column":79}},"31":{"start":{"line":64,"column":52},"end":{"line":64,"column":119}},"32":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"33":{"start":{"line":72,"column":67},"end":{"line":77,"column":null}},"34":{"start":{"line":79,"column":16},"end":{"line":79,"column":null}},"35":{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},"36":{"start":{"line":83,"column":20},"end":{"line":87,"column":null}},"37":{"start":{"line":89,"column":39},"end":{"line":89,"column":116}},"38":{"start":{"line":90,"column":20},"end":{"line":90,"column":null}},"39":{"start":{"line":91,"column":23},"end":{"line":91,"column":null}},"40":{"start":{"line":94,"column":12},"end":{"line":94,"column":null}},"41":{"start":{"line":96,"column":12},"end":{"line":100,"column":null}},"42":{"start":{"line":102,"column":12},"end":{"line":105,"column":null}},"43":{"start":{"line":116,"column":23},"end":{"line":116,"column":68}},"44":{"start":{"line":117,"column":27},"end":{"line":117,"column":76}},"45":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"46":{"start":{"line":120,"column":39},"end":{"line":120,"column":null}},"47":{"start":{"line":123,"column":43},"end":{"line":123,"column":77}},"48":{"start":{"line":126,"column":12},"end":{"line":126,"column":null}},"49":{"start":{"line":127,"column":12},"end":{"line":127,"column":null}},"50":{"start":{"line":131,"column":39},"end":{"line":131,"column":100}},"51":{"start":{"line":134,"column":12},"end":{"line":134,"column":null}},"52":{"start":{"line":137,"column":8},"end":{"line":138,"column":null}},"53":{"start":{"line":138,"column":12},"end":{"line":138,"column":null}},"54":{"start":{"line":142,"column":73},"end":{"line":142,"column":75}},"55":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"56":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"57":{"start":{"line":148,"column":63},"end":{"line":148,"column":65}},"58":{"start":{"line":149,"column":32},"end":{"line":149,"column":34}},"59":{"start":{"line":154,"column":33},"end":{"line":154,"column":87}},"60":{"start":{"line":155,"column":16},"end":{"line":155,"column":null}},"61":{"start":{"line":157,"column":16},"end":{"line":157,"column":null}},"62":{"start":{"line":162,"column":16},"end":{"line":164,"column":null}},"63":{"start":{"line":163,"column":20},"end":{"line":163,"column":null}},"64":{"start":{"line":168,"column":12},"end":{"line":172,"column":null}},"65":{"start":{"line":170,"column":20},"end":{"line":170,"column":null}},"66":{"start":{"line":174,"column":12},"end":{"line":174,"column":null}},"67":{"start":{"line":174,"column":49},"end":{"line":174,"column":null}},"68":{"start":{"line":176,"column":12},"end":{"line":176,"column":null}},"69":{"start":{"line":185,"column":31},"end":{"line":185,"column":77}},"70":{"start":{"line":187,"column":36},"end":{"line":190,"column":34}},"71":{"start":{"line":192,"column":77},"end":{"line":195,"column":null}},"72":{"start":{"line":197,"column":38},"end":{"line":197,"column":97}},"73":{"start":{"line":200,"column":41},"end":{"line":204,"column":null}},"74":{"start":{"line":207,"column":31},"end":{"line":207,"column":83}},"75":{"start":{"line":209,"column":53},"end":{"line":209,"column":95}},"76":{"start":{"line":211,"column":12},"end":{"line":211,"column":null}},"77":{"start":{"line":212,"column":12},"end":{"line":212,"column":null}},"78":{"start":{"line":213,"column":12},"end":{"line":216,"column":null}},"79":{"start":{"line":217,"column":12},"end":{"line":217,"column":null}},"80":{"start":{"line":218,"column":12},"end":{"line":218,"column":null}},"81":{"start":{"line":219,"column":12},"end":{"line":219,"column":null}},"82":{"start":{"line":220,"column":12},"end":{"line":220,"column":null}},"83":{"start":{"line":222,"column":12},"end":{"line":225,"column":null}},"84":{"start":{"line":226,"column":12},"end":{"line":226,"column":null}},"85":{"start":{"line":229,"column":12},"end":{"line":229,"column":null}},"86":{"start":{"line":230,"column":12},"end":{"line":230,"column":null}},"87":{"start":{"line":231,"column":12},"end":{"line":231,"column":null}},"88":{"start":{"line":232,"column":12},"end":{"line":232,"column":null}},"89":{"start":{"line":233,"column":12},"end":{"line":233,"column":null}},"90":{"start":{"line":234,"column":12},"end":{"line":234,"column":null}},"91":{"start":{"line":235,"column":12},"end":{"line":235,"column":null}},"92":{"start":{"line":236,"column":12},"end":{"line":236,"column":null}},"93":{"start":{"line":245,"column":16},"end":{"line":245,"column":null}},"94":{"start":{"line":250,"column":16},"end":{"line":250,"column":null}},"95":{"start":{"line":254,"column":33},"end":{"line":254,"column":86}},"96":{"start":{"line":254,"column":77},"end":{"line":254,"column":85}},"97":{"start":{"line":255,"column":29},"end":{"line":255,"column":86}},"98":{"start":{"line":255,"column":77},"end":{"line":255,"column":85}},"99":{"start":{"line":256,"column":39},"end":{"line":256,"column":96}},"100":{"start":{"line":256,"column":87},"end":{"line":256,"column":95}},"101":{"start":{"line":257,"column":12},"end":{"line":257,"column":null}},"102":{"start":{"line":257,"column":61},"end":{"line":257,"column":95}},"103":{"start":{"line":258,"column":12},"end":{"line":258,"column":null}},"104":{"start":{"line":258,"column":61},"end":{"line":258,"column":87}},"105":{"start":{"line":261,"column":39},"end":{"line":262,"column":null}},"106":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}},"107":{"start":{"line":266,"column":43},"end":{"line":266,"column":100}},"108":{"start":{"line":266,"column":81},"end":{"line":266,"column":99}},"109":{"start":{"line":268,"column":12},"end":{"line":268,"column":null}},"110":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"loc":{"start":{"line":26,"column":43},"end":{"line":29,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":20}},"loc":{"start":{"line":31,"column":20},"end":{"line":33,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":41}},"loc":{"start":{"line":35,"column":41},"end":{"line":35,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":18}},"loc":{"start":{"line":37,"column":69},"end":{"line":39,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":10}},"loc":{"start":{"line":41,"column":49},"end":{"line":60,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":62,"column":12},"end":{"line":62,"column":18}},"loc":{"start":{"line":62,"column":80},"end":{"line":66,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":68,"column":11},"end":{"line":68,"column":17}},"loc":{"start":{"line":68,"column":53},"end":{"line":107,"column":null}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":109,"column":4},"end":{"line":109,"column":21}},"loc":{"start":{"line":109,"column":32},"end":{"line":109,"column":null}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":111,"column":12},"end":{"line":111,"column":18}},"loc":{"start":{"line":114,"column":36},"end":{"line":139,"column":null}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":141,"column":4},"end":{"line":141,"column":10}},"loc":{"start":{"line":141,"column":70},"end":{"line":178,"column":null}}},"10":{"name":"getPackagesToCommits","decl":{"start":{"line":147,"column":23},"end":{"line":147,"column":43}},"loc":{"start":{"line":147,"column":67},"end":{"line":177,"column":null}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":162,"column":44},"end":{"line":162,"column":52}},"loc":{"start":{"line":162,"column":56},"end":{"line":164,"column":17}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":168,"column":48},"end":{"line":168,"column":55}},"loc":{"start":{"line":168,"column":59},"end":{"line":172,"column":13}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":180,"column":12},"end":{"line":180,"column":18}},"loc":{"start":{"line":183,"column":22},"end":{"line":270,"column":null}}},"14":{"name":"getOnlyChangedClassesFromPackage","decl":{"start":{"line":239,"column":17},"end":{"line":239,"column":49}},"loc":{"start":{"line":241,"column":54},"end":{"line":269,"column":null}}},"15":{"name":"(anonymous_22)","decl":{"start":{"line":254,"column":69},"end":{"line":254,"column":72}},"loc":{"start":{"line":254,"column":77},"end":{"line":254,"column":85}}},"16":{"name":"(anonymous_23)","decl":{"start":{"line":255,"column":69},"end":{"line":255,"column":72}},"loc":{"start":{"line":255,"column":77},"end":{"line":255,"column":85}}},"17":{"name":"(anonymous_24)","decl":{"start":{"line":256,"column":79},"end":{"line":256,"column":82}},"loc":{"start":{"line":256,"column":87},"end":{"line":256,"column":95}}},"18":{"name":"(anonymous_25)","decl":{"start":{"line":257,"column":52},"end":{"line":257,"column":56}},"loc":{"start":{"line":257,"column":61},"end":{"line":257,"column":95}}},"19":{"name":"(anonymous_26)","decl":{"start":{"line":258,"column":52},"end":{"line":258,"column":56}},"loc":{"start":{"line":258,"column":61},"end":{"line":258,"column":87}}},"20":{"name":"(anonymous_27)","decl":{"start":{"line":262,"column":17},"end":{"line":262,"column":26}},"loc":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}}},"21":{"name":"(anonymous_28)","decl":{"start":{"line":266,"column":67},"end":{"line":266,"column":76}},"loc":{"start":{"line":266,"column":81},"end":{"line":266,"column":99}}}},"branchMap":{"0":{"loc":{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":16},"end":{"line":91,"column":null}},{"start":{"line":91,"column":23},"end":{"line":91,"column":null}}]},"1":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":null}}]},"2":{"loc":{"start":{"line":137,"column":8},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":138,"column":null}}]},"3":{"loc":{"start":{"line":174,"column":12},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":12},"end":{"line":174,"column":null}}]},"4":{"loc":{"start":{"line":244,"column":16},"end":{"line":244,"column":63}},"type":"binary-expr","locations":[{"start":{"line":244,"column":16},"end":{"line":244,"column":34}},{"start":{"line":244,"column":38},"end":{"line":244,"column":63}}]},"5":{"loc":{"start":{"line":262,"column":31},"end":{"line":262,"column":108}},"type":"binary-expr","locations":[{"start":{"line":262,"column":31},"end":{"line":262,"column":74}},{"start":{"line":262,"column":78},"end":{"line":262,"column":108}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":42}},"4":{"start":{"line":11,"column":18},"end":{"line":11,"column":40}},"5":{"start":{"line":12,"column":18},"end":{"line":12,"column":63}},"6":{"start":{"line":13,"column":18},"end":{"line":13,"column":33}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"8":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"9":{"start":{"line":17,"column":33},"end":{"line":17,"column":null}},"10":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"11":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"12":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"13":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"14":{"start":{"line":31,"column":8},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"16":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"17":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"18":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"19":{"start":{"line":50,"column":26},"end":{"line":50,"column":53}},"20":{"start":{"line":52,"column":8},"end":{"line":55,"column":null}},"21":{"start":{"line":57,"column":8},"end":{"line":61,"column":null}},"22":{"start":{"line":58,"column":12},"end":{"line":61,"column":null}},"23":{"start":{"line":63,"column":8},"end":{"line":67,"column":null}},"24":{"start":{"line":69,"column":8},"end":{"line":73,"column":null}},"25":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"26":{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},"27":{"start":{"line":84,"column":16},"end":{"line":84,"column":108}},"28":{"start":{"line":85,"column":17},"end":{"line":85,"column":null}},"29":{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},"30":{"start":{"line":90,"column":16},"end":{"line":90,"column":110}},"31":{"start":{"line":91,"column":17},"end":{"line":91,"column":null}},"32":{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},"33":{"start":{"line":98,"column":16},"end":{"line":98,"column":82}},"34":{"start":{"line":99,"column":17},"end":{"line":99,"column":null}},"35":{"start":{"line":106,"column":8},"end":{"line":111,"column":null}},"36":{"start":{"line":112,"column":8},"end":{"line":116,"column":null}},"37":{"start":{"line":117,"column":8},"end":{"line":117,"column":null}},"38":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"39":{"start":{"line":122,"column":8},"end":{"line":122,"column":null}},"40":{"start":{"line":123,"column":8},"end":{"line":127,"column":null}},"41":{"start":{"line":128,"column":8},"end":{"line":132,"column":null}},"42":{"start":{"line":134,"column":8},"end":{"line":138,"column":null}},"43":{"start":{"line":140,"column":8},"end":{"line":140,"column":null}},"44":{"start":{"line":142,"column":8},"end":{"line":142,"column":null}},"45":{"start":{"line":6,"column":0},"end":{"line":6,"column":22}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":14,"column":43},"end":{"line":18,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":20,"column":11},"end":{"line":20,"column":17}},"loc":{"start":{"line":20,"column":21},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":46}},"loc":{"start":{"line":49,"column":46},"end":{"line":79,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":12},"end":{"line":81,"column":42}},"loc":{"start":{"line":81,"column":65},"end":{"line":93,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":95,"column":12},"end":{"line":95,"column":18}},"loc":{"start":{"line":95,"column":77},"end":{"line":101,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":105,"column":14},"end":{"line":105,"column":39}},"loc":{"start":{"line":105,"column":39},"end":{"line":119,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":121,"column":12},"end":{"line":121,"column":23}},"loc":{"start":{"line":121,"column":23},"end":{"line":143,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":null}}]},"1":{"loc":{"start":{"line":57,"column":8},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":61,"column":null}}]},"2":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":110}},"type":"binary-expr","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":58}},{"start":{"line":57,"column":62},"end":{"line":57,"column":110}}]},"3":{"loc":{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":12},"end":{"line":85,"column":null}},{"start":{"line":85,"column":17},"end":{"line":85,"column":null}}]},"4":{"loc":{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":12},"end":{"line":91,"column":null}},{"start":{"line":91,"column":17},"end":{"line":91,"column":null}}]},"5":{"loc":{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":97,"column":12},"end":{"line":99,"column":null}},{"start":{"line":99,"column":17},"end":{"line":99,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts","statementMap":{"0":{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},"1":{"start":{"line":9,"column":16},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"3":{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},"4":{"start":{"line":16,"column":16},"end":{"line":17,"column":null}},"5":{"start":{"line":18,"column":19},"end":{"line":18,"column":null}},"6":{"start":{"line":21,"column":8},"end":{"line":21,"column":null}},"7":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":27}},"loc":{"start":{"line":6,"column":79},"end":{"line":22,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":11,"column":null}},{"start":{"line":11,"column":19},"end":{"line":11,"column":null}}]},"1":{"loc":{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":12},"end":{"line":18,"column":null}},{"start":{"line":18,"column":19},"end":{"line":18,"column":null}}]}},"s":{"0":4,"1":4,"2":0,"3":4,"4":4,"5":0,"6":4,"7":2},"f":{"0":4},"b":{"0":[4,0],"1":[4,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"2":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"3":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"4":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"5":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"6":{"start":{"line":25,"column":12},"end":{"line":25,"column":null}},"7":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"8":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":11},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":85},"end":{"line":28,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":12},"end":{"line":11,"column":105}},"type":"binary-expr","locations":[{"start":{"line":11,"column":12},"end":{"line":11,"column":54}},{"start":{"line":11,"column":58},"end":{"line":11,"column":105}}]}},"s":{"0":2,"1":2,"2":0,"3":4,"4":4,"5":4,"6":0,"7":4,"8":2},"f":{"0":4},"b":{"0":[4,4]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts","statementMap":{"0":{"start":{"line":7,"column":12},"end":{"line":7,"column":null}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":20}},"loc":{"start":{"line":5,"column":69},"end":{"line":9,"column":null}}}},"branchMap":{},"s":{"0":2,"1":2},"f":{"0":2},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":16,"column":58},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"6":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":15},"end":{"line":23,"column":null}},"8":{"start":{"line":29,"column":20},"end":{"line":29,"column":null}},"9":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"10":{"start":{"line":32,"column":20},"end":{"line":32,"column":null}},"11":{"start":{"line":33,"column":20},"end":{"line":33,"column":null}},"12":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"13":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"14":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"15":{"start":{"line":41,"column":20},"end":{"line":41,"column":null}},"16":{"start":{"line":42,"column":20},"end":{"line":42,"column":null}},"17":{"start":{"line":44,"column":16},"end":{"line":44,"column":null}},"18":{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},"19":{"start":{"line":47,"column":16},"end":{"line":47,"column":null}},"20":{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},"21":{"start":{"line":51,"column":16},"end":{"line":51,"column":73}},"22":{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},"23":{"start":{"line":53,"column":16},"end":{"line":53,"column":null}},"24":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"25":{"start":{"line":55,"column":16},"end":{"line":55,"column":null}},"26":{"start":{"line":56,"column":19},"end":{"line":56,"column":null}},"27":{"start":{"line":64,"column":12},"end":{"line":64,"column":null}},"28":{"start":{"line":66,"column":12},"end":{"line":66,"column":null}},"29":{"start":{"line":69,"column":30},"end":{"line":69,"column":83}},"30":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"31":{"start":{"line":71,"column":36},"end":{"line":71,"column":68}},"32":{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},"33":{"start":{"line":74,"column":38},"end":{"line":74,"column":100}},"34":{"start":{"line":75,"column":13},"end":{"line":75,"column":null}},"35":{"start":{"line":78,"column":8},"end":{"line":80,"column":null}},"36":{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},"37":{"start":{"line":82,"column":49},"end":{"line":82,"column":61}},"38":{"start":{"line":83,"column":13},"end":{"line":83,"column":null}},"39":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":11},"end":{"line":7,"column":18}},"loc":{"start":{"line":10,"column":38},"end":{"line":58,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":11},"end":{"line":60,"column":18}},"loc":{"start":{"line":60,"column":81},"end":{"line":84,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":71,"column":27},"end":{"line":71,"column":31}},"loc":{"start":{"line":71,"column":36},"end":{"line":71,"column":68}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},{"start":{"line":23,"column":15},"end":{"line":23,"column":null}}]},"1":{"loc":{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":12},"end":{"line":56,"column":null}},{"start":{"line":52,"column":19},"end":{"line":56,"column":null}}]},"2":{"loc":{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":19},"end":{"line":56,"column":null}},{"start":{"line":56,"column":19},"end":{"line":56,"column":null}}]},"3":{"loc":{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":8},"end":{"line":75,"column":null}},{"start":{"line":75,"column":13},"end":{"line":75,"column":null}}]},"4":{"loc":{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":83,"column":null}},{"start":{"line":83,"column":13},"end":{"line":83,"column":null}}]},"5":{"loc":{"start":{"line":82,"column":12},"end":{"line":82,"column":47}},"type":"binary-expr","locations":[{"start":{"line":82,"column":12},"end":{"line":82,"column":25}},{"start":{"line":82,"column":29},"end":{"line":82,"column":47}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":12,"column":24},"end":{"line":12,"column":40}},"3":{"start":{"line":9,"column":21},"end":{"line":10,"column":null}},"4":{"start":{"line":27,"column":20},"end":{"line":27,"column":30}},"5":{"start":{"line":29,"column":34},"end":{"line":29,"column":70}},"6":{"start":{"line":33,"column":29},"end":{"line":33,"column":53}},"7":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"8":{"start":{"line":35,"column":29},"end":{"line":35,"column":null}},"9":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"10":{"start":{"line":36,"column":29},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"12":{"start":{"line":37,"column":29},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"14":{"start":{"line":38,"column":29},"end":{"line":38,"column":null}},"15":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"16":{"start":{"line":41,"column":33},"end":{"line":41,"column":null}},"17":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"18":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"19":{"start":{"line":47,"column":24},"end":{"line":47,"column":88}},"20":{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},"21":{"start":{"line":51,"column":12},"end":{"line":55,"column":null}},"22":{"start":{"line":52,"column":27},"end":{"line":52,"column":99}},"23":{"start":{"line":53,"column":27},"end":{"line":53,"column":99}},"24":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"25":{"start":{"line":56,"column":15},"end":{"line":56,"column":null}},"26":{"start":{"line":60,"column":20},"end":{"line":60,"column":30}},"27":{"start":{"line":62,"column":34},"end":{"line":62,"column":100}},"28":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"29":{"start":{"line":65,"column":24},"end":{"line":65,"column":88}},"30":{"start":{"line":66,"column":8},"end":{"line":66,"column":null}},"31":{"start":{"line":75,"column":20},"end":{"line":75,"column":30}},"32":{"start":{"line":77,"column":34},"end":{"line":77,"column":104}},"33":{"start":{"line":80,"column":29},"end":{"line":80,"column":53}},"34":{"start":{"line":81,"column":12},"end":{"line":81,"column":null}},"35":{"start":{"line":81,"column":29},"end":{"line":81,"column":null}},"36":{"start":{"line":82,"column":12},"end":{"line":82,"column":null}},"37":{"start":{"line":82,"column":29},"end":{"line":82,"column":null}},"38":{"start":{"line":83,"column":12},"end":{"line":83,"column":null}},"39":{"start":{"line":83,"column":29},"end":{"line":83,"column":null}},"40":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"41":{"start":{"line":87,"column":36},"end":{"line":87,"column":63}},"42":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"43":{"start":{"line":90,"column":24},"end":{"line":90,"column":88}},"44":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"45":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":24}},"loc":{"start":{"line":12,"column":40},"end":{"line":12,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":10}},"loc":{"start":{"line":25,"column":37},"end":{"line":57,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":32},"end":{"line":51,"column":33}},"loc":{"start":{"line":51,"column":41},"end":{"line":55,"column":13}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":59,"column":4},"end":{"line":59,"column":10}},"loc":{"start":{"line":59,"column":78},"end":{"line":67,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":69,"column":4},"end":{"line":69,"column":10}},"loc":{"start":{"line":72,"column":30},"end":{"line":93,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":12},"end":{"line":35,"column":null}}]},"1":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":null}}]},"2":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":null}}]},"3":{"loc":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":12},"end":{"line":38,"column":null}}]},"4":{"loc":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":41,"column":null}}]},"5":{"loc":{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":56,"column":null}},{"start":{"line":56,"column":15},"end":{"line":56,"column":null}}]},"6":{"loc":{"start":{"line":81,"column":12},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":12},"end":{"line":81,"column":null}}]},"7":{"loc":{"start":{"line":82,"column":12},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":12},"end":{"line":82,"column":null}}]},"8":{"loc":{"start":{"line":83,"column":12},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":12},"end":{"line":83,"column":null}}]}},"s":{"0":4,"1":4,"2":8,"3":8,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":0,"15":4,"16":4,"17":4,"18":4,"19":4,"20":4,"21":3,"22":6,"23":6,"24":6,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":2,"32":2,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":2,"43":2,"44":2,"45":4},"f":{"0":8,"1":4,"2":6,"3":0,"4":2},"b":{"0":[4],"1":[4],"2":[4],"3":[0],"4":[4],"5":[3,1],"6":[1],"7":[1],"8":[1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts","statementMap":{"0":{"start":{"line":8,"column":12},"end":{"line":8,"column":null}},"1":{"start":{"line":10,"column":27},"end":{"line":10,"column":62}},"2":{"start":{"line":11,"column":37},"end":{"line":11,"column":58}},"3":{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},"4":{"start":{"line":13,"column":43},"end":{"line":13,"column":93}},"5":{"start":{"line":14,"column":17},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"7":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":26}},"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":32}},"loc":{"start":{"line":6,"column":76},"end":{"line":17,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":12},"end":{"line":14,"column":null}},{"start":{"line":14,"column":17},"end":{"line":14,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":1},"f":{"0":0,"1":0},"b":{"0":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":14},"end":{"line":6,"column":34}},"5":{"start":{"line":10,"column":16},"end":{"line":10,"column":32}},"6":{"start":{"line":11,"column":16},"end":{"line":11,"column":34}},"7":{"start":{"line":12,"column":16},"end":{"line":12,"column":41}},"8":{"start":{"line":13,"column":16},"end":{"line":13,"column":37}},"9":{"start":{"line":26,"column":52},"end":{"line":26,"column":112}},"10":{"start":{"line":27,"column":31},"end":{"line":27,"column":80}},"11":{"start":{"line":32,"column":14},"end":{"line":32,"column":16}},"12":{"start":{"line":36,"column":14},"end":{"line":36,"column":16}},"13":{"start":{"line":39,"column":41},"end":{"line":41,"column":14}},"14":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"15":{"start":{"line":45,"column":16},"end":{"line":45,"column":null}},"16":{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},"17":{"start":{"line":50,"column":52},"end":{"line":56,"column":null}},"18":{"start":{"line":59,"column":40},"end":{"line":59,"column":73}},"19":{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},"20":{"start":{"line":61,"column":20},"end":{"line":61,"column":105}},"21":{"start":{"line":62,"column":21},"end":{"line":62,"column":null}},"22":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"23":{"start":{"line":69,"column":12},"end":{"line":69,"column":null}},"24":{"start":{"line":70,"column":12},"end":{"line":70,"column":null}},"25":{"start":{"line":74,"column":12},"end":{"line":74,"column":null}},"26":{"start":{"line":75,"column":12},"end":{"line":75,"column":null}},"27":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"28":{"start":{"line":82,"column":20},"end":{"line":85,"column":10}},"29":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"30":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"31":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"32":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"loc":{"start":{"line":13,"column":37},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":21},"end":{"line":79,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":39,"column":64},"end":{"line":39,"column":70}},"loc":{"start":{"line":39,"column":74},"end":{"line":41,"column":13}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":12},"end":{"line":81,"column":35}},"loc":{"start":{"line":81,"column":88},"end":{"line":92,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":87,"column":29},"end":{"line":87,"column":39}},"loc":{"start":{"line":87,"column":43},"end":{"line":89,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":16},"end":{"line":62,"column":null}},{"start":{"line":62,"column":21},"end":{"line":62,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3,"13":6,"14":12,"15":0,"16":0,"17":6,"18":6,"19":6,"20":3,"21":3,"22":0,"23":2,"24":2,"25":2,"26":2,"27":3,"28":4,"29":4,"30":6,"31":4,"32":1},"f":{"0":3,"1":3,"2":12,"3":4,"4":6},"b":{"0":[3,3]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":8,"column":24},"end":{"line":8,"column":40}},"2":{"start":{"line":8,"column":50},"end":{"line":8,"column":66}},"3":{"start":{"line":11,"column":22},"end":{"line":11,"column":146}},"4":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":24}},"loc":{"start":{"line":8,"column":66},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":11},"end":{"line":10,"column":17}},"loc":{"start":{"line":10,"column":42},"end":{"line":14,"column":null}}}},"branchMap":{},"s":{"0":1,"1":3,"2":3,"3":3,"4":3,"5":1},"f":{"0":3,"1":3},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":6,"column":21},"end":{"line":6,"column":101}},"4":{"start":{"line":9,"column":24},"end":{"line":9,"column":46}},"5":{"start":{"line":9,"column":56},"end":{"line":9,"column":70}},"6":{"start":{"line":9,"column":80},"end":{"line":9,"column":105}},"7":{"start":{"line":12,"column":8},"end":{"line":16,"column":null}},"8":{"start":{"line":19,"column":30},"end":{"line":19,"column":91}},"9":{"start":{"line":21,"column":20},"end":{"line":25,"column":null}},"10":{"start":{"line":26,"column":20},"end":{"line":30,"column":null}},"11":{"start":{"line":31,"column":20},"end":{"line":31,"column":null}},"12":{"start":{"line":33,"column":20},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"14":{"start":{"line":41,"column":16},"end":{"line":41,"column":null}},"15":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"16":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":24}},"loc":{"start":{"line":9,"column":110},"end":{"line":9,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":10}},"loc":{"start":{"line":11,"column":48},"end":{"line":45,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":80},"end":{"line":9,"column":110}},"type":"default-arg","locations":[{"start":{"line":9,"column":105},"end":{"line":9,"column":110}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":1,"13":1,"14":0,"15":0,"16":1},"f":{"0":1,"1":1},"b":{"0":[1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":30}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":11},"end":{"line":5,"column":26}},"4":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"6":{"start":{"line":29,"column":28},"end":{"line":29,"column":80}},"7":{"start":{"line":30,"column":27},"end":{"line":30,"column":29}},"8":{"start":{"line":31,"column":8},"end":{"line":34,"column":null}},"9":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"10":{"start":{"line":33,"column":50},"end":{"line":33,"column":null}},"11":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"12":{"start":{"line":41,"column":100},"end":{"line":41,"column":102}},"13":{"start":{"line":42,"column":41},"end":{"line":42,"column":104}},"14":{"start":{"line":43,"column":31},"end":{"line":43,"column":65}},"15":{"start":{"line":44,"column":8},"end":{"line":55,"column":null}},"16":{"start":{"line":45,"column":12},"end":{"line":54,"column":null}},"17":{"start":{"line":49,"column":24},"end":{"line":49,"column":null}},"18":{"start":{"line":54,"column":16},"end":{"line":54,"column":null}},"19":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"20":{"start":{"line":64,"column":27},"end":{"line":64,"column":29}},"21":{"start":{"line":65,"column":8},"end":{"line":68,"column":null}},"22":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"23":{"start":{"line":67,"column":50},"end":{"line":67,"column":null}},"24":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"25":{"start":{"line":75,"column":34},"end":{"line":75,"column":98}},"26":{"start":{"line":76,"column":23},"end":{"line":76,"column":86}},"27":{"start":{"line":79,"column":16},"end":{"line":79,"column":null}},"28":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"29":{"start":{"line":86,"column":28},"end":{"line":86,"column":80}},"30":{"start":{"line":87,"column":27},"end":{"line":87,"column":29}},"31":{"start":{"line":88,"column":8},"end":{"line":91,"column":null}},"32":{"start":{"line":90,"column":12},"end":{"line":90,"column":null}},"33":{"start":{"line":90,"column":50},"end":{"line":90,"column":null}},"34":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"35":{"start":{"line":96,"column":27},"end":{"line":96,"column":29}},"36":{"start":{"line":97,"column":8},"end":{"line":100,"column":null}},"37":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"38":{"start":{"line":99,"column":50},"end":{"line":99,"column":null}},"39":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"40":{"start":{"line":112,"column":12},"end":{"line":112,"column":null}},"41":{"start":{"line":114,"column":12},"end":{"line":114,"column":null}},"42":{"start":{"line":118,"column":12},"end":{"line":118,"column":null}},"43":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"44":{"start":{"line":133,"column":32},"end":{"line":133,"column":104}},"45":{"start":{"line":136,"column":12},"end":{"line":136,"column":null}},"46":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"47":{"start":{"line":138,"column":76},"end":{"line":138,"column":100}},"48":{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},"49":{"start":{"line":139,"column":80},"end":{"line":139,"column":null}},"50":{"start":{"line":141,"column":13},"end":{"line":141,"column":null}},"51":{"start":{"line":151,"column":28},"end":{"line":151,"column":80}},"52":{"start":{"line":153,"column":36},"end":{"line":153,"column":108}},"53":{"start":{"line":155,"column":8},"end":{"line":155,"column":null}},"54":{"start":{"line":167,"column":12},"end":{"line":171,"column":null}},"55":{"start":{"line":169,"column":20},"end":{"line":169,"column":null}},"56":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"57":{"start":{"line":174,"column":43},"end":{"line":174,"column":null}},"58":{"start":{"line":176,"column":8},"end":{"line":176,"column":null}},"59":{"start":{"line":187,"column":28},"end":{"line":187,"column":71}},"60":{"start":{"line":190,"column":8},"end":{"line":195,"column":null}},"61":{"start":{"line":192,"column":16},"end":{"line":192,"column":null}},"62":{"start":{"line":193,"column":16},"end":{"line":193,"column":null}},"63":{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},"64":{"start":{"line":197,"column":38},"end":{"line":197,"column":96}},"65":{"start":{"line":198,"column":13},"end":{"line":198,"column":null}},"66":{"start":{"line":207,"column":30},"end":{"line":207,"column":73}},"67":{"start":{"line":209,"column":8},"end":{"line":209,"column":null}},"68":{"start":{"line":219,"column":20},"end":{"line":219,"column":62}},"69":{"start":{"line":222,"column":20},"end":{"line":222,"column":null}},"70":{"start":{"line":226,"column":20},"end":{"line":226,"column":62}},"71":{"start":{"line":229,"column":20},"end":{"line":229,"column":null}},"72":{"start":{"line":233,"column":8},"end":{"line":233,"column":65}},"73":{"start":{"line":234,"column":8},"end":{"line":234,"column":null}},"74":{"start":{"line":243,"column":38},"end":{"line":243,"column":40}},"75":{"start":{"line":244,"column":39},"end":{"line":244,"column":74}},"76":{"start":{"line":248,"column":20},"end":{"line":248,"column":null}},"77":{"start":{"line":249,"column":20},"end":{"line":249,"column":null}},"78":{"start":{"line":253,"column":8},"end":{"line":253,"column":65}},"79":{"start":{"line":254,"column":8},"end":{"line":254,"column":null}},"80":{"start":{"line":255,"column":8},"end":{"line":255,"column":null}},"81":{"start":{"line":264,"column":30},"end":{"line":264,"column":73}},"82":{"start":{"line":265,"column":8},"end":{"line":265,"column":null}},"83":{"start":{"line":274,"column":35},"end":{"line":274,"column":67}},"84":{"start":{"line":275,"column":8},"end":{"line":277,"column":null}},"85":{"start":{"line":276,"column":12},"end":{"line":276,"column":null}},"86":{"start":{"line":279,"column":8},"end":{"line":279,"column":null}},"87":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":11},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":70},"end":{"line":22,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":18}},"loc":{"start":{"line":28,"column":57},"end":{"line":36,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":53},"end":{"line":31,"column":56}},"loc":{"start":{"line":31,"column":60},"end":{"line":34,"column":9}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":38,"column":11},"end":{"line":38,"column":18}},"loc":{"start":{"line":39,"column":26},"end":{"line":57,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":44,"column":47},"end":{"line":44,"column":48}},"loc":{"start":{"line":44,"column":64},"end":{"line":55,"column":9}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":48,"column":21},"end":{"line":48,"column":25}},"loc":{"start":{"line":48,"column":29},"end":{"line":50,"column":21}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":18}},"loc":{"start":{"line":63,"column":68},"end":{"line":70,"column":null}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":65,"column":50},"end":{"line":65,"column":53}},"loc":{"start":{"line":65,"column":57},"end":{"line":68,"column":9}}},"8":{"name":"(anonymous_9)","decl":{"start":{"line":72,"column":11},"end":{"line":72,"column":18}},"loc":{"start":{"line":73,"column":26},"end":{"line":83,"column":null}}},"9":{"name":"(anonymous_10)","decl":{"start":{"line":85,"column":11},"end":{"line":85,"column":18}},"loc":{"start":{"line":85,"column":81},"end":{"line":93,"column":null}}},"10":{"name":"(anonymous_11)","decl":{"start":{"line":88,"column":51},"end":{"line":88,"column":54}},"loc":{"start":{"line":88,"column":58},"end":{"line":91,"column":9}}},"11":{"name":"(anonymous_12)","decl":{"start":{"line":95,"column":11},"end":{"line":95,"column":18}},"loc":{"start":{"line":95,"column":71},"end":{"line":102,"column":null}}},"12":{"name":"(anonymous_13)","decl":{"start":{"line":97,"column":51},"end":{"line":97,"column":54}},"loc":{"start":{"line":97,"column":58},"end":{"line":100,"column":9}}},"13":{"name":"(anonymous_14)","decl":{"start":{"line":108,"column":11},"end":{"line":108,"column":18}},"loc":{"start":{"line":108,"column":63},"end":{"line":122,"column":null}}},"14":{"name":"(anonymous_15)","decl":{"start":{"line":129,"column":11},"end":{"line":129,"column":18}},"loc":{"start":{"line":131,"column":27},"end":{"line":143,"column":null}}},"15":{"name":"(anonymous_16)","decl":{"start":{"line":150,"column":11},"end":{"line":150,"column":18}},"loc":{"start":{"line":150,"column":88},"end":{"line":156,"column":null}}},"16":{"name":"(anonymous_17)","decl":{"start":{"line":163,"column":11},"end":{"line":163,"column":18}},"loc":{"start":{"line":163,"column":88},"end":{"line":177,"column":null}}},"17":{"name":"(anonymous_18)","decl":{"start":{"line":167,"column":57},"end":{"line":167,"column":60}},"loc":{"start":{"line":167,"column":64},"end":{"line":171,"column":13}}},"18":{"name":"(anonymous_19)","decl":{"start":{"line":183,"column":11},"end":{"line":183,"column":18}},"loc":{"start":{"line":183,"column":74},"end":{"line":199,"column":null}}},"19":{"name":"(anonymous_20)","decl":{"start":{"line":190,"column":53},"end":{"line":190,"column":56}},"loc":{"start":{"line":190,"column":60},"end":{"line":195,"column":9}}},"20":{"name":"(anonymous_21)","decl":{"start":{"line":206,"column":11},"end":{"line":206,"column":18}},"loc":{"start":{"line":206,"column":94},"end":{"line":210,"column":null}}},"21":{"name":"(anonymous_22)","decl":{"start":{"line":217,"column":11},"end":{"line":217,"column":18}},"loc":{"start":{"line":217,"column":85},"end":{"line":235,"column":null}}},"22":{"name":"(anonymous_23)","decl":{"start":{"line":242,"column":11},"end":{"line":242,"column":18}},"loc":{"start":{"line":242,"column":93},"end":{"line":256,"column":null}}},"23":{"name":"(anonymous_24)","decl":{"start":{"line":263,"column":11},"end":{"line":263,"column":18}},"loc":{"start":{"line":263,"column":102},"end":{"line":266,"column":null}}},"24":{"name":"(anonymous_25)","decl":{"start":{"line":270,"column":11},"end":{"line":270,"column":24}},"loc":{"start":{"line":272,"column":81},"end":{"line":280,"column":null}}},"25":{"name":"(anonymous_26)","decl":{"start":{"line":275,"column":53},"end":{"line":275,"column":56}},"loc":{"start":{"line":275,"column":60},"end":{"line":277,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":12},"end":{"line":33,"column":null}}]},"1":{"loc":{"start":{"line":33,"column":16},"end":{"line":33,"column":48}},"type":"binary-expr","locations":[{"start":{"line":33,"column":16},"end":{"line":33,"column":27}},{"start":{"line":33,"column":31},"end":{"line":33,"column":48}}]},"2":{"loc":{"start":{"line":43,"column":31},"end":{"line":43,"column":65}},"type":"binary-expr","locations":[{"start":{"line":43,"column":31},"end":{"line":43,"column":59}},{"start":{"line":43,"column":63},"end":{"line":43,"column":65}}]},"3":{"loc":{"start":{"line":45,"column":12},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":12},"end":{"line":54,"column":null}}]},"4":{"loc":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":67,"column":null}}]},"5":{"loc":{"start":{"line":67,"column":16},"end":{"line":67,"column":48}},"type":"binary-expr","locations":[{"start":{"line":67,"column":16},"end":{"line":67,"column":27}},{"start":{"line":67,"column":31},"end":{"line":67,"column":48}}]},"6":{"loc":{"start":{"line":90,"column":12},"end":{"line":90,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":12},"end":{"line":90,"column":null}}]},"7":{"loc":{"start":{"line":90,"column":16},"end":{"line":90,"column":48}},"type":"binary-expr","locations":[{"start":{"line":90,"column":16},"end":{"line":90,"column":27}},{"start":{"line":90,"column":31},"end":{"line":90,"column":48}}]},"8":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":null}}]},"9":{"loc":{"start":{"line":99,"column":16},"end":{"line":99,"column":48}},"type":"binary-expr","locations":[{"start":{"line":99,"column":16},"end":{"line":99,"column":27}},{"start":{"line":99,"column":31},"end":{"line":99,"column":48}}]},"10":{"loc":{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":12},"end":{"line":141,"column":null}},{"start":{"line":139,"column":17},"end":{"line":141,"column":null}}]},"11":{"loc":{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":17},"end":{"line":141,"column":null}},{"start":{"line":141,"column":13},"end":{"line":141,"column":null}}]},"12":{"loc":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":8},"end":{"line":174,"column":null}}]},"13":{"loc":{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},"type":"if","locations":[{"start":{"line":197,"column":8},"end":{"line":198,"column":null}},{"start":{"line":198,"column":13},"end":{"line":198,"column":null}}]}},"s":{"0":5,"1":5,"2":5,"3":5,"4":1,"5":1,"6":1,"7":1,"8":1,"9":5,"10":5,"11":1,"12":2,"13":2,"14":2,"15":2,"16":3,"17":15,"18":1,"19":2,"20":1,"21":1,"22":5,"23":5,"24":1,"25":7,"26":7,"27":35,"28":7,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":13,"36":13,"37":60,"38":60,"39":13,"40":0,"41":4,"42":4,"43":0,"44":13,"45":7,"46":6,"47":1,"48":5,"49":0,"50":5,"51":1,"52":1,"53":1,"54":24,"55":23,"56":24,"57":1,"58":23,"59":1,"60":1,"61":1,"62":1,"63":1,"64":0,"65":1,"66":1,"67":1,"68":1,"69":4,"70":0,"71":0,"72":1,"73":1,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":5},"f":{"0":2,"1":1,"2":5,"3":2,"4":3,"5":15,"6":1,"7":5,"8":7,"9":0,"10":0,"11":13,"12":60,"13":4,"14":13,"15":1,"16":24,"17":123,"18":1,"19":5,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0},"b":{"0":[5],"1":[5,5],"2":[2,0],"3":[1],"4":[5],"5":[5,5],"6":[0],"7":[0,0],"8":[60],"9":[60,60],"10":[1,5],"11":[0,5],"12":[1],"13":[0,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},"5":{"start":{"line":15,"column":40},"end":{"line":15,"column":87}},"6":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"8":{"start":{"line":20,"column":9},"end":{"line":20,"column":null}},"9":{"start":{"line":24,"column":35},"end":{"line":24,"column":37}},"10":{"start":{"line":25,"column":35},"end":{"line":25,"column":67}},"11":{"start":{"line":26,"column":38},"end":{"line":26,"column":111}},"12":{"start":{"line":28,"column":36},"end":{"line":28,"column":78}},"13":{"start":{"line":30,"column":32},"end":{"line":30,"column":109}},"14":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"16":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"17":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"18":{"start":{"line":45,"column":35},"end":{"line":45,"column":67}},"19":{"start":{"line":47,"column":42},"end":{"line":47,"column":96}},"20":{"start":{"line":50,"column":20},"end":{"line":50,"column":null}},"21":{"start":{"line":55,"column":20},"end":{"line":55,"column":null}},"22":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"23":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":12},"end":{"line":13,"column":34}},"loc":{"start":{"line":13,"column":53},"end":{"line":21,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":11},"end":{"line":23,"column":17}},"loc":{"start":{"line":23,"column":82},"end":{"line":42,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":11},"end":{"line":44,"column":17}},"loc":{"start":{"line":44,"column":50},"end":{"line":60,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":20,"column":null}},{"start":{"line":20,"column":9},"end":{"line":20,"column":null}}]},"1":{"loc":{"start":{"line":52,"column":20},"end":{"line":53,"column":81}},"type":"binary-expr","locations":[{"start":{"line":52,"column":20},"end":{"line":52,"column":75}},{"start":{"line":53,"column":20},"end":{"line":53,"column":81}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":9,"5":9,"6":9,"7":9,"8":0,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":0,"16":2,"17":2,"18":7,"19":7,"20":0,"21":0,"22":7,"23":2},"f":{"0":9,"1":2,"2":7},"b":{"0":[9,0],"1":[7,7]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts","statementMap":{"0":{"start":{"line":10,"column":29},"end":{"line":10,"column":31}},"1":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"2":{"start":{"line":13,"column":24},"end":{"line":13,"column":26}},"3":{"start":{"line":14,"column":37},"end":{"line":14,"column":38}},"4":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"5":{"start":{"line":20,"column":28},"end":{"line":20,"column":61}},"6":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"8":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"9":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"10":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"11":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"12":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"13":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"14":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"15":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}}},"fnMap":{"0":{"name":"chunkCollection","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":39}},"loc":{"start":{"line":9,"column":109},"end":{"line":38,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":62},"end":{"line":9,"column":86}},"type":"default-arg","locations":[{"start":{"line":9,"column":82},"end":{"line":9,"column":86}}]},"1":{"loc":{"start":{"line":9,"column":88},"end":{"line":9,"column":109}},"type":"default-arg","locations":[{"start":{"line":9,"column":105},"end":{"line":9,"column":109}}]}},"s":{"0":3,"1":3,"2":3,"3":3,"4":1,"5":7,"6":6,"7":6,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2},"f":{"0":3},"b":{"0":[1],"1":[1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts","statementMap":{"0":{"start":{"line":3,"column":14},"end":{"line":3,"column":36}},"1":{"start":{"line":7,"column":8},"end":{"line":16,"column":null}},"2":{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},"3":{"start":{"line":10,"column":31},"end":{"line":10,"column":83}},"4":{"start":{"line":11,"column":21},"end":{"line":11,"column":null}},"5":{"start":{"line":13,"column":16},"end":{"line":13,"column":null}},"6":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":17}},"loc":{"start":{"line":6,"column":77},"end":{"line":17,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":12},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":27},"end":{"line":14,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":16},"end":{"line":11,"column":null}},{"start":{"line":11,"column":21},"end":{"line":11,"column":null}}]}},"s":{"0":11,"1":21,"2":27,"3":7,"4":20,"5":19,"6":11},"f":{"0":21,"1":27},"b":{"0":[7,20]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts","statementMap":{"0":{"start":{"line":4,"column":26},"end":{"line":4,"column":40}},"1":{"start":{"line":14,"column":48},"end":{"line":14,"column":50}},"2":{"start":{"line":16,"column":16},"end":{"line":16,"column":null}},"3":{"start":{"line":18,"column":12},"end":{"line":18,"column":null}},"4":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"5":{"start":{"line":3,"column":0},"end":{"line":3,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":26}},"loc":{"start":{"line":4,"column":40},"end":{"line":4,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":14},"end":{"line":12,"column":40}},"loc":{"start":{"line":12,"column":83},"end":{"line":21,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":48}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":24}},{"start":{"line":13,"column":28},"end":{"line":13,"column":48}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":1},"f":{"0":0,"1":0},"b":{"0":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":16,"column":37},"end":{"line":21,"column":null}},"7":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"8":{"start":{"line":28,"column":16},"end":{"line":28,"column":null}},"9":{"start":{"line":29,"column":16},"end":{"line":29,"column":null}},"10":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"11":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"13":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"14":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"15":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"16":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"17":{"start":{"line":43,"column":16},"end":{"line":43,"column":null}},"18":{"start":{"line":49,"column":12},"end":{"line":49,"column":null}},"19":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"20":{"start":{"line":52,"column":12},"end":{"line":52,"column":null}},"21":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"22":{"start":{"line":57,"column":43},"end":{"line":57,"column":null}},"23":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"24":{"start":{"line":64,"column":22},"end":{"line":70,"column":null}},"25":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"26":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"27":{"start":{"line":75,"column":43},"end":{"line":75,"column":null}},"28":{"start":{"line":79,"column":12},"end":{"line":79,"column":null}},"29":{"start":{"line":82,"column":22},"end":{"line":88,"column":null}},"30":{"start":{"line":89,"column":8},"end":{"line":89,"column":null}},"31":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"32":{"start":{"line":93,"column":43},"end":{"line":93,"column":null}},"33":{"start":{"line":97,"column":12},"end":{"line":97,"column":null}},"34":{"start":{"line":100,"column":22},"end":{"line":105,"column":null}},"35":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"36":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"37":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":11}},"loc":{"start":{"line":15,"column":66},"end":{"line":23,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":25,"column":4},"end":{"line":25,"column":11}},"loc":{"start":{"line":25,"column":97},"end":{"line":45,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":47,"column":4},"end":{"line":47,"column":11}},"loc":{"start":{"line":47,"column":36},"end":{"line":54,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":56,"column":4},"end":{"line":56,"column":11}},"loc":{"start":{"line":56,"column":114},"end":{"line":72,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":74,"column":4},"end":{"line":74,"column":11}},"loc":{"start":{"line":74,"column":94},"end":{"line":90,"column":null}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":92,"column":4},"end":{"line":92,"column":11}},"loc":{"start":{"line":92,"column":79},"end":{"line":107,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":109,"column":4},"end":{"line":109,"column":11}},"loc":{"start":{"line":109,"column":44},"end":{"line":113,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":18},"end":{"line":18,"column":52}},"type":"cond-expr","locations":[{"start":{"line":18,"column":33},"end":{"line":18,"column":37}},{"start":{"line":18,"column":40},"end":{"line":18,"column":52}}]},"1":{"loc":{"start":{"line":19,"column":22},"end":{"line":19,"column":55}},"type":"cond-expr","locations":[{"start":{"line":19,"column":42},"end":{"line":19,"column":47}},{"start":{"line":19,"column":50},"end":{"line":19,"column":55}}]},"2":{"loc":{"start":{"line":27,"column":12},"end":{"line":30,"column":null}},"type":"switch","locations":[{"start":{"line":27,"column":12},"end":{"line":30,"column":null}},{"start":{"line":32,"column":12},"end":{"line":35,"column":null}},{"start":{"line":37,"column":12},"end":{"line":40,"column":null}},{"start":{"line":42,"column":12},"end":{"line":43,"column":null}}]},"3":{"loc":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":8},"end":{"line":57,"column":null}}]},"4":{"loc":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":8},"end":{"line":75,"column":null}}]},"5":{"loc":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":93,"column":8},"end":{"line":93,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0,0,0],"3":[0],"4":[0],"5":[0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"4":{"start":{"line":14,"column":12},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"6":{"start":{"line":27,"column":34},"end":{"line":27,"column":71}},"7":{"start":{"line":28,"column":12},"end":{"line":28,"column":null}},"8":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"9":{"start":{"line":31,"column":12},"end":{"line":35,"column":null}},"10":{"start":{"line":41,"column":34},"end":{"line":41,"column":71}},"11":{"start":{"line":42,"column":12},"end":{"line":42,"column":null}},"12":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"13":{"start":{"line":45,"column":12},"end":{"line":49,"column":null}},"14":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":16}},"loc":{"start":{"line":6,"column":30},"end":{"line":8,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":21}},"loc":{"start":{"line":12,"column":53},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":25,"column":11},"end":{"line":25,"column":26}},"loc":{"start":{"line":25,"column":100},"end":{"line":37,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":39,"column":11},"end":{"line":39,"column":26}},"loc":{"start":{"line":39,"column":85},"end":{"line":51,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"3":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"4":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"5":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"6":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"7":{"start":{"line":29,"column":28},"end":{"line":29,"column":58}},"8":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"9":{"start":{"line":31,"column":22},"end":{"line":31,"column":56}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"11":{"start":{"line":33,"column":8},"end":{"line":43,"column":null}},"12":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"13":{"start":{"line":37,"column":12},"end":{"line":42,"column":null}},"14":{"start":{"line":38,"column":16},"end":{"line":42,"column":null}},"15":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"16":{"start":{"line":48,"column":28},"end":{"line":48,"column":51}},"17":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"18":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"19":{"start":{"line":51,"column":22},"end":{"line":51,"column":56}},"20":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"21":{"start":{"line":54,"column":8},"end":{"line":64,"column":null}},"22":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"23":{"start":{"line":58,"column":12},"end":{"line":63,"column":null}},"24":{"start":{"line":59,"column":16},"end":{"line":63,"column":null}},"25":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":16}},"loc":{"start":{"line":12,"column":30},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":19,"column":11},"end":{"line":19,"column":21}},"loc":{"start":{"line":19,"column":53},"end":{"line":25,"column":null}}},"2":{"name":"(anonymous_8)","decl":{"start":{"line":27,"column":11},"end":{"line":27,"column":26}},"loc":{"start":{"line":27,"column":100},"end":{"line":44,"column":null}}},"3":{"name":"(anonymous_9)","decl":{"start":{"line":33,"column":40},"end":{"line":33,"column":41}},"loc":{"start":{"line":33,"column":66},"end":{"line":43,"column":9}}},"4":{"name":"(anonymous_10)","decl":{"start":{"line":46,"column":11},"end":{"line":46,"column":26}},"loc":{"start":{"line":46,"column":85},"end":{"line":65,"column":null}}},"5":{"name":"(anonymous_11)","decl":{"start":{"line":54,"column":40},"end":{"line":54,"column":41}},"loc":{"start":{"line":54,"column":66},"end":{"line":64,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":12},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":42,"column":null}}]},"1":{"loc":{"start":{"line":58,"column":12},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":12},"end":{"line":63,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0],"1":[0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"4":{"start":{"line":15,"column":10},"end":{"line":18,"column":null}},"5":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":24},"end":{"line":23,"column":176}},"7":{"start":{"line":24,"column":8},"end":{"line":32,"column":null}},"8":{"start":{"line":25,"column":29},"end":{"line":25,"column":126}},"9":{"start":{"line":27,"column":12},"end":{"line":31,"column":null}},"10":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":24},"end":{"line":37,"column":163}},"12":{"start":{"line":38,"column":8},"end":{"line":46,"column":null}},"13":{"start":{"line":39,"column":29},"end":{"line":39,"column":126}},"14":{"start":{"line":41,"column":12},"end":{"line":45,"column":null}},"15":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":16}},"loc":{"start":{"line":8,"column":30},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":21}},"loc":{"start":{"line":14,"column":53},"end":{"line":19,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":21,"column":11},"end":{"line":21,"column":26}},"loc":{"start":{"line":21,"column":100},"end":{"line":33,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":25,"column":15},"end":{"line":25,"column":23}},"loc":{"start":{"line":25,"column":27},"end":{"line":25,"column":126}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":26,"column":16},"end":{"line":26,"column":21}},"loc":{"start":{"line":26,"column":25},"end":{"line":32,"column":9}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":35,"column":11},"end":{"line":35,"column":26}},"loc":{"start":{"line":35,"column":85},"end":{"line":47,"column":null}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":23}},"loc":{"start":{"line":39,"column":27},"end":{"line":39,"column":126}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":40,"column":16},"end":{"line":40,"column":21}},"loc":{"start":{"line":40,"column":25},"end":{"line":46,"column":9}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":5,"column":28},"end":{"line":5,"column":63}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"4":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"5":{"start":{"line":12,"column":28},"end":{"line":12,"column":63}},"6":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}}},"fnMap":{"0":{"name":"convertAliasToUsername","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":44}},"loc":{"start":{"line":4,"column":58},"end":{"line":8,"column":null}}},"1":{"name":"convertUsernameToAlias","decl":{"start":{"line":10,"column":22},"end":{"line":10,"column":44}},"loc":{"start":{"line":10,"column":61},"end":{"line":16,"column":null}}}},"branchMap":{},"s":{"0":4,"1":0,"2":0,"3":0,"4":4,"5":0,"6":0,"7":0,"8":4},"f":{"0":0,"1":0},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":19}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":13}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":29}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"5":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}},"fnMap":{"0":{"name":"chunkArray","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":62},"end":{"line":11,"column":null}}}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":9,"4":2,"5":1},"f":{"0":2},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Delay.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Delay.ts","statementMap":{"0":{"start":{"line":2,"column":4},"end":{"line":2,"column":null}},"1":{"start":{"line":2,"column":36},"end":{"line":2,"column":59}},"2":{"start":{"line":1,"column":0},"end":{"line":1,"column":7}}},"fnMap":{"0":{"name":"delay","decl":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}},"loc":{"start":{"line":1,"column":42},"end":{"line":3,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":2,"column":24},"end":{"line":2,"column":31}},"loc":{"start":{"line":2,"column":36},"end":{"line":2,"column":59}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":42}},"type":"default-arg","locations":[{"start":{"line":1,"column":41},"end":{"line":1,"column":42}}]}},"s":{"0":0,"1":0,"2":1},"f":{"0":0,"1":0},"b":{"0":[0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":16,"column":33},"end":{"line":16,"column":35}},"3":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"4":{"start":{"line":18,"column":58},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":48,"column":null}},"6":{"start":{"line":21,"column":36},"end":{"line":21,"column":61}},"7":{"start":{"line":23,"column":12},"end":{"line":47,"column":null}},"8":{"start":{"line":26,"column":20},"end":{"line":26,"column":null}},"9":{"start":{"line":28,"column":20},"end":{"line":28,"column":null}},"10":{"start":{"line":34,"column":28},"end":{"line":34,"column":null}},"11":{"start":{"line":36,"column":28},"end":{"line":36,"column":null}},"12":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"13":{"start":{"line":42,"column":24},"end":{"line":42,"column":null}},"14":{"start":{"line":44,"column":24},"end":{"line":44,"column":null}},"15":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"16":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":11}},"loc":{"start":{"line":14,"column":35},"end":{"line":51,"column":null}}},"1":{"name":"readdirRecursiveHandler","decl":{"start":{"line":20,"column":18},"end":{"line":20,"column":41}},"loc":{"start":{"line":20,"column":59},"end":{"line":48,"column":9}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":27},"end":{"line":23,"column":31}},"loc":{"start":{"line":23,"column":35},"end":{"line":47,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":43}},"type":"default-arg","locations":[{"start":{"line":13,"column":38},"end":{"line":13,"column":43}}]},"1":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":35}},"type":"default-arg","locations":[{"start":{"line":14,"column":30},"end":{"line":14,"column":35}}]},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]}},"s":{"0":2,"1":2,"2":4,"3":4,"4":0,"5":4,"6":24,"7":24,"8":22,"9":22,"10":5,"11":5,"12":20,"13":12,"14":12,"15":4,"16":2},"f":{"0":4,"1":24,"2":44},"b":{"0":[0],"1":[0],"2":[0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":10},"end":{"line":3,"column":27}},"3":{"start":{"line":4,"column":11},"end":{"line":4,"column":24}},"4":{"start":{"line":6,"column":12},"end":{"line":6,"column":19}},"5":{"start":{"line":8,"column":13},"end":{"line":8,"column":null}},"6":{"start":{"line":16,"column":8},"end":{"line":24,"column":null}},"7":{"start":{"line":19,"column":20},"end":{"line":19,"column":null}},"8":{"start":{"line":21,"column":20},"end":{"line":21,"column":null}},"9":{"start":{"line":32,"column":31},"end":{"line":32,"column":33}},"10":{"start":{"line":33,"column":25},"end":{"line":33,"column":46}},"11":{"start":{"line":34,"column":25},"end":{"line":34,"column":46}},"12":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"13":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"14":{"start":{"line":39,"column":32},"end":{"line":39,"column":54}},"15":{"start":{"line":40,"column":8},"end":{"line":51,"column":null}},"16":{"start":{"line":41,"column":26},"end":{"line":41,"column":49}},"17":{"start":{"line":42,"column":24},"end":{"line":42,"column":44}},"18":{"start":{"line":45,"column":20},"end":{"line":45,"column":null}},"19":{"start":{"line":48,"column":38},"end":{"line":48,"column":78}},"20":{"start":{"line":49,"column":16},"end":{"line":49,"column":null}},"21":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"22":{"start":{"line":56,"column":22},"end":{"line":56,"column":34}},"23":{"start":{"line":57,"column":24},"end":{"line":57,"column":64}},"24":{"start":{"line":59,"column":12},"end":{"line":59,"column":null}},"25":{"start":{"line":60,"column":12},"end":{"line":60,"column":null}},"26":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"27":{"start":{"line":71,"column":22},"end":{"line":71,"column":34}},"28":{"start":{"line":72,"column":24},"end":{"line":72,"column":64}},"29":{"start":{"line":74,"column":12},"end":{"line":74,"column":null}},"30":{"start":{"line":75,"column":12},"end":{"line":75,"column":null}},"31":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"32":{"start":{"line":86,"column":20},"end":{"line":86,"column":28}},"33":{"start":{"line":87,"column":24},"end":{"line":87,"column":61}},"34":{"start":{"line":88,"column":24},"end":{"line":88,"column":60}},"35":{"start":{"line":90,"column":8},"end":{"line":100,"column":null}},"36":{"start":{"line":91,"column":27},"end":{"line":91,"column":69}},"37":{"start":{"line":93,"column":16},"end":{"line":93,"column":null}},"38":{"start":{"line":96,"column":20},"end":{"line":96,"column":null}},"39":{"start":{"line":99,"column":12},"end":{"line":99,"column":null}},"40":{"start":{"line":108,"column":24},"end":{"line":108,"column":43}},"41":{"start":{"line":109,"column":23},"end":{"line":109,"column":54}},"42":{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},"43":{"start":{"line":113,"column":12},"end":{"line":113,"column":null}},"44":{"start":{"line":115,"column":8},"end":{"line":115,"column":null}},"45":{"start":{"line":124,"column":21},"end":{"line":124,"column":39}},"46":{"start":{"line":126,"column":24},"end":{"line":126,"column":40}},"47":{"start":{"line":127,"column":30},"end":{"line":127,"column":49}},"48":{"start":{"line":129,"column":16},"end":{"line":129,"column":null}},"49":{"start":{"line":131,"column":20},"end":{"line":131,"column":null}},"50":{"start":{"line":133,"column":16},"end":{"line":135,"column":null}},"51":{"start":{"line":134,"column":20},"end":{"line":134,"column":null}},"52":{"start":{"line":137,"column":16},"end":{"line":137,"column":null}},"53":{"start":{"line":147,"column":21},"end":{"line":147,"column":39}},"54":{"start":{"line":148,"column":23},"end":{"line":148,"column":25}},"55":{"start":{"line":150,"column":24},"end":{"line":150,"column":40}},"56":{"start":{"line":151,"column":30},"end":{"line":151,"column":49}},"57":{"start":{"line":153,"column":29},"end":{"line":153,"column":48}},"58":{"start":{"line":154,"column":29},"end":{"line":154,"column":30}},"59":{"start":{"line":155,"column":40},"end":{"line":155,"column":49}},"60":{"start":{"line":157,"column":24},"end":{"line":157,"column":null}},"61":{"start":{"line":159,"column":40},"end":{"line":159,"column":82}},"62":{"start":{"line":161,"column":28},"end":{"line":161,"column":null}},"63":{"start":{"line":165,"column":24},"end":{"line":165,"column":null}},"64":{"start":{"line":170,"column":8},"end":{"line":170,"column":null}},"65":{"start":{"line":179,"column":12},"end":{"line":190,"column":null}},"66":{"start":{"line":180,"column":30},"end":{"line":180,"column":53}},"67":{"start":{"line":184,"column":20},"end":{"line":184,"column":null}},"68":{"start":{"line":188,"column":20},"end":{"line":188,"column":null}},"69":{"start":{"line":192,"column":12},"end":{"line":192,"column":null}},"70":{"start":{"line":196,"column":21},"end":{"line":196,"column":23}},"71":{"start":{"line":197,"column":25},"end":{"line":197,"column":89}},"72":{"start":{"line":198,"column":31},"end":{"line":198,"column":48}},"73":{"start":{"line":199,"column":21},"end":{"line":199,"column":22}},"74":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"75":{"start":{"line":202,"column":8},"end":{"line":202,"column":null}},"76":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":62},"end":{"line":25,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":35},"end":{"line":16,"column":44}},"loc":{"start":{"line":16,"column":48},"end":{"line":24,"column":9}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":11},"end":{"line":31,"column":18}},"loc":{"start":{"line":31,"column":76},"end":{"line":53,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":40,"column":25},"end":{"line":40,"column":29}},"loc":{"start":{"line":40,"column":33},"end":{"line":51,"column":9}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":11},"end":{"line":55,"column":18}},"loc":{"start":{"line":55,"column":35},"end":{"line":64,"column":null}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":70,"column":11},"end":{"line":70,"column":18}},"loc":{"start":{"line":70,"column":53},"end":{"line":78,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":85,"column":11},"end":{"line":85,"column":18}},"loc":{"start":{"line":85,"column":88},"end":{"line":101,"column":null}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":90,"column":36},"end":{"line":90,"column":37}},"loc":{"start":{"line":90,"column":60},"end":{"line":100,"column":9}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":107,"column":11},"end":{"line":107,"column":18}},"loc":{"start":{"line":107,"column":82},"end":{"line":116,"column":null}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":123,"column":11},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":45},"end":{"line":140,"column":null}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":133,"column":44},"end":{"line":133,"column":54}},"loc":{"start":{"line":133,"column":67},"end":{"line":135,"column":17}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":146,"column":11},"end":{"line":146,"column":18}},"loc":{"start":{"line":146,"column":47},"end":{"line":171,"column":null}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":177,"column":11},"end":{"line":177,"column":18}},"loc":{"start":{"line":177,"column":46},"end":{"line":194,"column":null}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":179,"column":43},"end":{"line":179,"column":53}},"loc":{"start":{"line":179,"column":64},"end":{"line":190,"column":13}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":195,"column":11},"end":{"line":195,"column":18}},"loc":{"start":{"line":195,"column":37},"end":{"line":203,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":50},"end":{"line":31,"column":76}},"type":"default-arg","locations":[{"start":{"line":31,"column":70},"end":{"line":31,"column":76}}]},"1":{"loc":{"start":{"line":44,"column":20},"end":{"line":44,"column":86}},"type":"binary-expr","locations":[{"start":{"line":44,"column":20},"end":{"line":44,"column":66}},{"start":{"line":44,"column":70},"end":{"line":44,"column":86}}]},"2":{"loc":{"start":{"line":85,"column":53},"end":{"line":85,"column":88}},"type":"default-arg","locations":[{"start":{"line":85,"column":86},"end":{"line":85,"column":88}}]},"3":{"loc":{"start":{"line":85,"column":55},"end":{"line":85,"column":81}},"type":"default-arg","locations":[{"start":{"line":85,"column":76},"end":{"line":85,"column":81}}]},"4":{"loc":{"start":{"line":87,"column":24},"end":{"line":87,"column":61}},"type":"cond-expr","locations":[{"start":{"line":87,"column":53},"end":{"line":87,"column":56}},{"start":{"line":87,"column":59},"end":{"line":87,"column":61}}]},"5":{"loc":{"start":{"line":88,"column":24},"end":{"line":88,"column":60}},"type":"cond-expr","locations":[{"start":{"line":88,"column":45},"end":{"line":88,"column":54}},{"start":{"line":88,"column":57},"end":{"line":88,"column":60}}]},"6":{"loc":{"start":{"line":95,"column":20},"end":{"line":95,"column":90}},"type":"binary-expr","locations":[{"start":{"line":95,"column":20},"end":{"line":95,"column":41}},{"start":{"line":95,"column":45},"end":{"line":95,"column":65}},{"start":{"line":95,"column":69},"end":{"line":95,"column":90}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0],"1":[0,0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"1":{"start":{"line":5,"column":14},"end":{"line":5,"column":36}},"2":{"start":{"line":9,"column":8},"end":{"line":25,"column":null}},"3":{"start":{"line":11,"column":29},"end":{"line":11,"column":63}},"4":{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},"5":{"start":{"line":13,"column":48},"end":{"line":13,"column":52}},"6":{"start":{"line":16,"column":28},"end":{"line":16,"column":null}},"7":{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},"8":{"start":{"line":19,"column":47},"end":{"line":19,"column":76}},"9":{"start":{"line":20,"column":25},"end":{"line":20,"column":null}},"10":{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},"11":{"start":{"line":21,"column":59},"end":{"line":21,"column":92}},"12":{"start":{"line":22,"column":21},"end":{"line":22,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":36,"column":null}},"14":{"start":{"line":31,"column":29},"end":{"line":31,"column":63}},"15":{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},"16":{"start":{"line":32,"column":36},"end":{"line":32,"column":53}},"17":{"start":{"line":33,"column":21},"end":{"line":33,"column":null}},"18":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":79},"end":{"line":26,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":12},"end":{"line":10,"column":19}},"loc":{"start":{"line":10,"column":27},"end":{"line":23,"column":13}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":4},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":79},"end":{"line":37,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":12},"end":{"line":30,"column":19}},"loc":{"start":{"line":30,"column":27},"end":{"line":34,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":16},"end":{"line":22,"column":null}},{"start":{"line":21,"column":23},"end":{"line":22,"column":null}}]},"1":{"loc":{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":20},"end":{"line":20,"column":null}},{"start":{"line":20,"column":25},"end":{"line":20,"column":null}}]},"2":{"loc":{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":23},"end":{"line":22,"column":null}},{"start":{"line":22,"column":21},"end":{"line":22,"column":null}}]},"3":{"loc":{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":16},"end":{"line":33,"column":null}},{"start":{"line":33,"column":21},"end":{"line":33,"column":null}}]}},"s":{"0":4,"1":4,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":3,"14":3,"15":3,"16":2,"17":1,"18":4},"f":{"0":0,"1":0,"2":3,"3":3},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[2,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts","statementMap":{"0":{"start":{"line":7,"column":27},"end":{"line":7,"column":34}},"1":{"start":{"line":9,"column":35},"end":{"line":9,"column":71}},"2":{"start":{"line":11,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"5":{"start":{"line":23,"column":43},"end":{"line":23,"column":44}},"6":{"start":{"line":24,"column":17},"end":{"line":24,"column":18}},"7":{"start":{"line":26,"column":12},"end":{"line":26,"column":null}},"8":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"9":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}}},"fnMap":{"0":{"name":"convertBuildNumDotDelimToHyphen","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":55}},"loc":{"start":{"line":6,"column":71},"end":{"line":15,"column":null}}},"1":{"name":"getIndexOfBuildNumDelimeter","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":36}},"loc":{"start":{"line":22,"column":52},"end":{"line":33,"column":null}}}},"branchMap":{},"s":{"0":103,"1":103,"2":103,"3":103,"4":2,"5":103,"6":103,"7":309,"8":103,"9":0},"f":{"0":103,"1":103},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts","statementMap":{"0":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"1":{"start":{"line":7,"column":14},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":20},"end":{"line":8,"column":69}},"3":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}}},"fnMap":{"0":{"name":"extractDomainFromUrl","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":44}},"loc":{"start":{"line":6,"column":56},"end":{"line":10,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":4},"end":{"line":7,"column":null}}]},"1":{"loc":{"start":{"line":9,"column":11},"end":{"line":9,"column":32}},"type":"binary-expr","locations":[{"start":{"line":9,"column":11},"end":{"line":9,"column":18}},{"start":{"line":9,"column":22},"end":{"line":9,"column":32}}]}},"s":{"0":7,"1":3,"2":4,"3":4,"4":1},"f":{"0":7},"b":{"0":[3],"1":[4,3]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":68}},"1":{"start":{"line":4,"column":4},"end":{"line":9,"column":null}},"2":{"start":{"line":5,"column":8},"end":{"line":8,"column":null}},"3":{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},"4":{"start":{"line":6,"column":21},"end":{"line":6,"column":33}},"5":{"start":{"line":7,"column":17},"end":{"line":7,"column":null}},"6":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}}},"fnMap":{"0":{"name":"xml2json","decl":{"start":{"line":3,"column":24},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":36},"end":{"line":10,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":29}},"loc":{"start":{"line":4,"column":48},"end":{"line":9,"column":5}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":35},"end":{"line":5,"column":45}},"loc":{"start":{"line":5,"column":54},"end":{"line":8,"column":9}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":12},"end":{"line":7,"column":null}},{"start":{"line":7,"column":17},"end":{"line":7,"column":null}}]}},"s":{"0":4,"1":12,"2":12,"3":12,"4":0,"5":12,"6":4},"f":{"0":12,"1":12,"2":12},"b":{"0":[0,12]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts","statementMap":{"0":{"start":{"line":7,"column":16},"end":{"line":7,"column":38}},"1":{"start":{"line":8,"column":16},"end":{"line":8,"column":66}},"2":{"start":{"line":9,"column":16},"end":{"line":9,"column":69}},"3":{"start":{"line":10,"column":16},"end":{"line":10,"column":58}},"4":{"start":{"line":20,"column":53},"end":{"line":21,"column":null}},"5":{"start":{"line":25,"column":12},"end":{"line":25,"column":null}},"6":{"start":{"line":29,"column":16},"end":{"line":31,"column":null}},"7":{"start":{"line":30,"column":32},"end":{"line":30,"column":100}},"8":{"start":{"line":33,"column":20},"end":{"line":37,"column":null}},"9":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"10":{"start":{"line":39,"column":20},"end":{"line":39,"column":null}},"11":{"start":{"line":40,"column":20},"end":{"line":40,"column":null}},"12":{"start":{"line":45,"column":16},"end":{"line":45,"column":null}},"13":{"start":{"line":48,"column":16},"end":{"line":48,"column":null}},"14":{"start":{"line":50,"column":16},"end":{"line":50,"column":null}},"15":{"start":{"line":53,"column":16},"end":{"line":53,"column":null}},"16":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"loc":{"start":{"line":10,"column":58},"end":{"line":11,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":4},"end":{"line":18,"column":10}},"loc":{"start":{"line":18,"column":10},"end":{"line":56,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":21},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":32},"end":{"line":30,"column":100}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":10,"5":10,"6":6,"7":76,"8":2,"9":2,"10":2,"11":2,"12":4,"13":0,"14":0,"15":4,"16":1},"f":{"0":4,"1":4,"2":76},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":50}},"2":{"start":{"line":10,"column":16},"end":{"line":10,"column":38}},"3":{"start":{"line":11,"column":16},"end":{"line":11,"column":27}},"4":{"start":{"line":12,"column":16},"end":{"line":12,"column":50}},"5":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"6":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"7":{"start":{"line":24,"column":26},"end":{"line":24,"column":89}},"8":{"start":{"line":24,"column":67},"end":{"line":24,"column":88}},"9":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}},"10":{"start":{"line":28,"column":20},"end":{"line":28,"column":null}},"11":{"start":{"line":29,"column":20},"end":{"line":29,"column":null}},"12":{"start":{"line":31,"column":20},"end":{"line":36,"column":null}},"13":{"start":{"line":40,"column":16},"end":{"line":47,"column":null}},"14":{"start":{"line":49,"column":12},"end":{"line":55,"column":null}},"15":{"start":{"line":58,"column":22},"end":{"line":58,"column":85}},"16":{"start":{"line":58,"column":63},"end":{"line":58,"column":84}},"17":{"start":{"line":61,"column":42},"end":{"line":62,"column":null}},"18":{"start":{"line":62,"column":36},"end":{"line":62,"column":99}},"19":{"start":{"line":67,"column":24},"end":{"line":67,"column":null}},"20":{"start":{"line":68,"column":24},"end":{"line":68,"column":null}},"21":{"start":{"line":71,"column":24},"end":{"line":71,"column":null}},"22":{"start":{"line":75,"column":20},"end":{"line":75,"column":null}},"23":{"start":{"line":76,"column":20},"end":{"line":76,"column":null}},"24":{"start":{"line":79,"column":24},"end":{"line":79,"column":null}},"25":{"start":{"line":81,"column":24},"end":{"line":81,"column":null}},"26":{"start":{"line":85,"column":20},"end":{"line":85,"column":null}},"27":{"start":{"line":86,"column":20},"end":{"line":86,"column":null}},"28":{"start":{"line":89,"column":16},"end":{"line":95,"column":null}},"29":{"start":{"line":98,"column":16},"end":{"line":103,"column":null}},"30":{"start":{"line":104,"column":16},"end":{"line":109,"column":null}},"31":{"start":{"line":120,"column":27},"end":{"line":120,"column":45}},"32":{"start":{"line":121,"column":8},"end":{"line":125,"column":null}},"33":{"start":{"line":4,"column":0},"end":{"line":4,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"loc":{"start":{"line":12,"column":50},"end":{"line":19,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":10}},"loc":{"start":{"line":21,"column":10},"end":{"line":112,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":59},"end":{"line":24,"column":62}},"loc":{"start":{"line":24,"column":67},"end":{"line":24,"column":88}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":55},"end":{"line":58,"column":58}},"loc":{"start":{"line":58,"column":63},"end":{"line":58,"column":84}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":21},"end":{"line":62,"column":31}},"loc":{"start":{"line":62,"column":36},"end":{"line":62,"column":99}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":119,"column":12},"end":{"line":119,"column":30}},"loc":{"start":{"line":119,"column":47},"end":{"line":126,"column":null}}}},"branchMap":{},"s":{"0":1,"1":4,"2":4,"3":4,"4":4,"5":4,"6":2,"7":2,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":2,"15":2,"16":3,"17":2,"18":2,"19":0,"20":0,"21":1,"22":1,"23":1,"24":1,"25":0,"26":1,"27":1,"28":2,"29":0,"30":0,"31":6,"32":6,"33":1},"f":{"0":4,"1":4,"2":1,"3":3,"4":2,"5":6},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":24},"end":{"line":6,"column":46}},"2":{"start":{"line":6,"column":56},"end":{"line":6,"column":81}},"3":{"start":{"line":6,"column":90},"end":{"line":6,"column":104}},"4":{"start":{"line":14,"column":42},"end":{"line":14,"column":70}},"5":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"6":{"start":{"line":19,"column":44},"end":{"line":19,"column":85}},"7":{"start":{"line":20,"column":50},"end":{"line":20,"column":90}},"8":{"start":{"line":24,"column":28},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":28},"end":{"line":25,"column":null}},"10":{"start":{"line":27,"column":28},"end":{"line":27,"column":null}},"11":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"12":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_6)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":104},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":10}},"loc":{"start":{"line":11,"column":10},"end":{"line":40,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":2,"5":2,"6":24,"7":24,"8":3,"9":3,"10":1,"11":3,"12":1},"f":{"0":1,"1":1},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":6,"column":14},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"6":{"start":{"line":14,"column":24},"end":{"line":14,"column":47}},"7":{"start":{"line":14,"column":57},"end":{"line":14,"column":72}},"8":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"9":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":45},"end":{"line":21,"column":null}},"11":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"12":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"13":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"14":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"15":{"start":{"line":33,"column":19},"end":{"line":33,"column":44}},"16":{"start":{"line":36,"column":12},"end":{"line":40,"column":null}},"17":{"start":{"line":41,"column":33},"end":{"line":41,"column":55}},"18":{"start":{"line":42,"column":38},"end":{"line":42,"column":65}},"19":{"start":{"line":45,"column":20},"end":{"line":51,"column":null}},"20":{"start":{"line":53,"column":37},"end":{"line":53,"column":38}},"21":{"start":{"line":55,"column":32},"end":{"line":55,"column":null}},"22":{"start":{"line":60,"column":20},"end":{"line":64,"column":null}},"23":{"start":{"line":68,"column":12},"end":{"line":68,"column":null}},"24":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"25":{"start":{"line":76,"column":16},"end":{"line":76,"column":null}},"26":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":24}},"loc":{"start":{"line":14,"column":72},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":11},"end":{"line":15,"column":17}},"loc":{"start":{"line":15,"column":58},"end":{"line":30,"column":null}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":32,"column":12},"end":{"line":32,"column":18}},"loc":{"start":{"line":32,"column":65},"end":{"line":71,"column":null}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":73,"column":12},"end":{"line":73,"column":18}},"loc":{"start":{"line":73,"column":81},"end":{"line":79,"column":null}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":74,"column":58},"end":{"line":74,"column":61}},"loc":{"start":{"line":74,"column":65},"end":{"line":78,"column":9}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":12,"17":12,"18":12,"19":22,"20":36,"21":24,"22":18,"23":12,"24":12,"25":10,"26":1},"f":{"0":2,"1":2,"2":2,"3":12,"4":72},"b":{}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"3":{"start":{"line":16,"column":8},"end":{"line":16,"column":null}},"4":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"5":{"start":{"line":26,"column":28},"end":{"line":26,"column":80}},"6":{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},"7":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"8":{"start":{"line":30,"column":65},"end":{"line":30,"column":null}},"9":{"start":{"line":32,"column":20},"end":{"line":45,"column":null}},"10":{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},"11":{"start":{"line":36,"column":80},"end":{"line":36,"column":116}},"12":{"start":{"line":37,"column":32},"end":{"line":37,"column":null}},"13":{"start":{"line":39,"column":32},"end":{"line":41,"column":null}},"14":{"start":{"line":44,"column":24},"end":{"line":44,"column":null}},"15":{"start":{"line":47,"column":20},"end":{"line":49,"column":null}},"16":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"17":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"18":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":40},"end":{"line":13,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":8}},"loc":{"start":{"line":15,"column":13},"end":{"line":17,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":12},"end":{"line":23,"column":41}},"loc":{"start":{"line":23,"column":66},"end":{"line":52,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":49},"end":{"line":32,"column":68}},"loc":{"start":{"line":32,"column":72},"end":{"line":45,"column":21}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":36,"column":71},"end":{"line":36,"column":75}},"loc":{"start":{"line":36,"column":80},"end":{"line":36,"column":116}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":28}},"loc":{"start":{"line":58,"column":40},"end":{"line":60,"column":null}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":62,"column":4},"end":{"line":62,"column":26}},"loc":{"start":{"line":62,"column":38},"end":{"line":64,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":16},"end":{"line":49,"column":null}},{"start":{"line":47,"column":20},"end":{"line":49,"column":null}}]},"1":{"loc":{"start":{"line":30,"column":20},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":20},"end":{"line":30,"column":null}}]},"2":{"loc":{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":28},"end":{"line":41,"column":null}},{"start":{"line":39,"column":32},"end":{"line":41,"column":null}}]},"3":{"loc":{"start":{"line":63,"column":15},"end":{"line":63,"column":60}},"type":"cond-expr","locations":[{"start":{"line":63,"column":48},"end":{"line":63,"column":52}},{"start":{"line":63,"column":55},"end":{"line":63,"column":60}}]}},"s":{"0":1,"1":1,"2":4,"3":2,"4":4,"5":4,"6":7,"7":6,"8":6,"9":6,"10":3,"11":9,"12":2,"13":1,"14":5,"15":1,"16":0,"17":0,"18":1},"f":{"0":4,"1":2,"2":4,"3":6,"4":9,"5":0,"6":0},"b":{"0":[6,1],"1":[6],"2":[2,1],"3":[0,0]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts","statementMap":{"0":{"start":{"line":5,"column":8},"end":{"line":5,"column":null}},"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"2":{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},"3":{"start":{"line":13,"column":40},"end":{"line":13,"column":71}},"4":{"start":{"line":14,"column":13},"end":{"line":14,"column":null}},"5":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"6":{"start":{"line":18,"column":33},"end":{"line":18,"column":null}},"7":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"8":{"start":{"line":19,"column":43},"end":{"line":19,"column":null}},"9":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"10":{"start":{"line":20,"column":43},"end":{"line":20,"column":null}},"11":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"12":{"start":{"line":22,"column":61},"end":{"line":22,"column":null}},"13":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"14":{"start":{"line":23,"column":61},"end":{"line":23,"column":null}},"15":{"start":{"line":31,"column":35},"end":{"line":31,"column":37}},"16":{"start":{"line":32,"column":50},"end":{"line":32,"column":52}},"17":{"start":{"line":33,"column":30},"end":{"line":33,"column":49}},"18":{"start":{"line":35,"column":8},"end":{"line":45,"column":null}},"19":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"20":{"start":{"line":36,"column":25},"end":{"line":36,"column":null}},"21":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"22":{"start":{"line":37,"column":40},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":12},"end":{"line":38,"column":null}},"24":{"start":{"line":39,"column":12},"end":{"line":39,"column":null}},"25":{"start":{"line":40,"column":12},"end":{"line":44,"column":null}},"26":{"start":{"line":42,"column":20},"end":{"line":42,"column":null}},"27":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"28":{"start":{"line":1,"column":0},"end":{"line":1,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":4},"end":{"line":6,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":8}},"loc":{"start":{"line":8,"column":21},"end":{"line":10,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":13}},"loc":{"start":{"line":12,"column":26},"end":{"line":15,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":11}},"loc":{"start":{"line":17,"column":44},"end":{"line":24,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":7}},"loc":{"start":{"line":30,"column":21},"end":{"line":48,"column":null}}},"5":{"name":"dfsHandler","decl":{"start":{"line":35,"column":18},"end":{"line":35,"column":28}},"loc":{"start":{"line":35,"column":35},"end":{"line":45,"column":9}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":40,"column":43},"end":{"line":40,"column":51}},"loc":{"start":{"line":40,"column":55},"end":{"line":44,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":8},"end":{"line":14,"column":null}},{"start":{"line":14,"column":13},"end":{"line":14,"column":null}}]},"1":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}}]},"2":{"loc":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":null}}]},"3":{"loc":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":20,"column":null}}]},"4":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":null}}]},"5":{"loc":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":8},"end":{"line":23,"column":null}}]},"6":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":null}}]},"7":{"loc":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":37,"column":null}}]}},"s":{"0":12,"1":17,"2":22,"3":21,"4":1,"5":17,"6":1,"7":16,"8":2,"9":14,"10":1,"11":13,"12":13,"13":13,"14":13,"15":4,"16":4,"17":4,"18":4,"19":19,"20":0,"21":19,"22":1,"23":18,"24":18,"25":18,"26":15,"27":3,"28":2},"f":{"0":12,"1":17,"2":22,"3":17,"4":4,"5":19,"6":42},"b":{"0":[21,1],"1":[1],"2":[2],"3":[1],"4":[13],"5":[13],"6":[0],"7":[1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":13},"end":{"line":3,"column":31}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"5":{"start":{"line":8,"column":11},"end":{"line":8,"column":30}},"6":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}},"7":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"8":{"start":{"line":16,"column":32},"end":{"line":16,"column":81}},"9":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"10":{"start":{"line":20,"column":8},"end":{"line":21,"column":null}},"11":{"start":{"line":21,"column":12},"end":{"line":21,"column":null}},"12":{"start":{"line":24,"column":12},"end":{"line":24,"column":null}},"13":{"start":{"line":33,"column":26},"end":{"line":33,"column":50}},"14":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"15":{"start":{"line":35,"column":34},"end":{"line":35,"column":75}},"16":{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},"17":{"start":{"line":38,"column":16},"end":{"line":38,"column":null}},"18":{"start":{"line":41,"column":12},"end":{"line":41,"column":null}},"19":{"start":{"line":44,"column":32},"end":{"line":44,"column":78}},"20":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"21":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"22":{"start":{"line":55,"column":21},"end":{"line":57,"column":null}},"23":{"start":{"line":60,"column":24},"end":{"line":60,"column":68}},"24":{"start":{"line":61,"column":31},"end":{"line":61,"column":59}},"25":{"start":{"line":65,"column":16},"end":{"line":66,"column":71}},"26":{"start":{"line":68,"column":12},"end":{"line":74,"column":null}},"27":{"start":{"line":69,"column":16},"end":{"line":73,"column":null}},"28":{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},"29":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":8}},"loc":{"start":{"line":12,"column":25},"end":{"line":15,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":32}},"loc":{"start":{"line":16,"column":81},"end":{"line":26,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":11},"end":{"line":28,"column":24}},"loc":{"start":{"line":28,"column":77},"end":{"line":46,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":12},"end":{"line":48,"column":50}},"loc":{"start":{"line":48,"column":95},"end":{"line":52,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":37}},"loc":{"start":{"line":54,"column":80},"end":{"line":78,"column":null}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":68,"column":37},"end":{"line":68,"column":38}},"loc":{"start":{"line":68,"column":57},"end":{"line":74,"column":13}}}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":21,"column":null}}]},"1":{"loc":{"start":{"line":20,"column":12},"end":{"line":20,"column":110}},"type":"binary-expr","locations":[{"start":{"line":20,"column":12},"end":{"line":20,"column":53}},{"start":{"line":20,"column":57},"end":{"line":20,"column":110}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":5,"9":5,"10":1,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":5,"18":0,"19":5,"20":0,"21":0,"22":5,"23":5,"24":5,"25":4,"26":4,"27":6,"28":4,"29":1},"f":{"0":0,"1":5,"2":5,"3":0,"4":5,"5":6},"b":{"0":[1],"1":[1,1]}} -,"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts": {"path":"/Users/azlam/projects/flxbl-io/sfpowerscripts/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts","statementMap":{"0":{"start":{"line":3,"column":8},"end":{"line":3,"column":null}},"1":{"start":{"line":5,"column":20},"end":{"line":5,"column":22}},"2":{"start":{"line":6,"column":25},"end":{"line":6,"column":26}},"3":{"start":{"line":7,"column":23},"end":{"line":7,"column":24}},"4":{"start":{"line":8,"column":32},"end":{"line":8,"column":33}},"5":{"start":{"line":9,"column":30},"end":{"line":9,"column":67}},"6":{"start":{"line":10,"column":16},"end":{"line":10,"column":null}},"7":{"start":{"line":10,"column":54},"end":{"line":10,"column":null}},"8":{"start":{"line":12,"column":12},"end":{"line":12,"column":null}},"9":{"start":{"line":14,"column":26},"end":{"line":14,"column":42}},"10":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":null}},"12":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}},"fnMap":{"0":{"name":"get18DigitSalesforceId","decl":{"start":{"line":1,"column":24},"end":{"line":1,"column":46}},"loc":{"start":{"line":1,"column":63},"end":{"line":19,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":42}},"type":"binary-expr","locations":[{"start":{"line":2,"column":8},"end":{"line":2,"column":16}},{"start":{"line":2,"column":20},"end":{"line":2,"column":42}}]},"1":{"loc":{"start":{"line":4,"column":15},"end":{"line":4,"column":49}},"type":"binary-expr","locations":[{"start":{"line":4,"column":15},"end":{"line":4,"column":23}},{"start":{"line":4,"column":27},"end":{"line":4,"column":49}}]},"2":{"loc":{"start":{"line":10,"column":16},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":16},"end":{"line":10,"column":null}}]},"3":{"loc":{"start":{"line":10,"column":20},"end":{"line":10,"column":52}},"type":"binary-expr","locations":[{"start":{"line":10,"column":20},"end":{"line":10,"column":34}},{"start":{"line":10,"column":38},"end":{"line":10,"column":52}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":1},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0],"3":[0,0]}} -} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/base.css b/packages/sfpowerscripts-cli/coverage/lcov-report/base.css deleted file mode 100644 index f418035b4..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js b/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js deleted file mode 100644 index cc1213023..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html deleted file mode 100644 index 64189ce82..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/Git.ts.html +++ /dev/null @@ -1,823 +0,0 @@ - - - - - - Code coverage report for core/git/Git.ts - - - - - - - - - -
-
-

All files / core/git Git.ts

-
- -
- 6% - Statements - 6/100 -
- - -
- 0% - Branches - 0/15 -
- - -
- 0% - Functions - 0/26 -
- - -
- 6.38% - Lines - 6/94 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -2471x -1x -1x -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import simplegit, { SimpleGit } from 'simple-git';
-import fs = require('fs-extra');
-import GitIdentity from './GitIdentity';
-const tmp = require('tmp');
- 
-//Git Abstraction
-export default class Git {
-    private _git: SimpleGit;
-    private repositoryLocation: string;
-    private tempRepoLocation: any;
-    private _isATemporaryRepo: boolean = false;
- 
-    private constructor(private projectDir?: string, private logger?: Logger) {
-        if (this.projectDir) {
-            this._git = simplegit(this.projectDir);
-            this.repositoryLocation = this.projectDir;
-        } else {
-            this._git = simplegit();
-            this.repositoryLocation = process.cwd();
-        }
-    }
- 
-    async fetch() {
-        return this._git.fetch('origin');
-    }
- 
-    async getHeadCommit(): Promise<string> {
-        return this._git.revparse(['HEAD']);
-    }
- 
-    async show(options: string[]): Promise<string> {
-        return this._git.show(options);
-    }
- 
-    async tag(options: string[]): Promise<string[]> {
-        let tagResult = await this._git.tag(options);
- 
-        let temp: string[] = tagResult.split('\n');
-        temp.pop();
- 
-        return temp;
-    }
- 
-    async diff(options: string[]): Promise<string[]> {
-        let diffResult = await this._git.diff(options);
- 
-        let temp: string[] = diffResult.split('\n');
-        temp.pop();
- 
-        return temp;
-    }
- 
-    async log(options: string[]): Promise<string[]> {
-        let gitLogResult = await this._git.log(options);
- 
-        return gitLogResult['all'][0]['hash'].split('\n');
-    }
- 
-    public async getRemoteOriginUrl(overrideOriginURL?: string): Promise<string> {
-        let remoteOriginURL;
-        if (!overrideOriginURL) {
-            remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
-            if (!remoteOriginURL) {
-                remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
-            }
-            SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG);
-        } else remoteOriginURL = overrideOriginURL;
- 
-        Iif (!remoteOriginURL) throw new Error('Remote origin must be set in repository');
- 
-        return remoteOriginURL;
-    }
- 
-    public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) {
-        try {
-            await new GitIdentity(this._git).setUsernameAndEmail();
-            await this._git.add(pathToFiles);
-            await this._git.commit(message);
-            SFPLogger.log(`Committed File ${pathToFiles}`);
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to commit file, probably due to no change or something else,Please try manually`,
-                LoggerLevel.ERROR
-            );
-            throw error;
-        }
-    }
- 
-    async pushTags(tags?: string[]) {
-        if (!tags) await this._git.pushTags();
-        else {
-            for (let tag of tags) {
-                await this._git.push('origin', tag);
-            }
-        }
-    }
- 
-    async deleteTags(tags?: string[]) {
-        Iif (tags) await this._git.push('origin', '--delete', tags);
-    }
- 
-    async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) {
-        try {
-            await new GitIdentity(this._git).setUsernameAndEmail();
-            if (!commitId) {
-                await this._git.addAnnotatedTag(tagName, annotation);
-            } else {
-                const commands = ['tag', tagName, commitId, '-m', annotation];
-                await this._git.raw(commands);
-            }
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to commit file, probably due to no change or something else,Please try manually`,
-                LoggerLevel.ERROR
-            );
-            throw error;
-        }
-    }
- 
-    public async isBranchExists(branch: string): Promise<boolean> {
-        const listOfBranches = await this._git.branch(['-la']);
- 
-        return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false;
-    }
- 
-    static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise<Git> {
-        let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true });
- 
-        SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger);
-        let repoDir = locationOfCopiedDirectory.name;
- 
-        // Copy source directory to temp dir
-        fs.copySync(process.cwd(), repoDir);
- 
-        //Initiate git on new repo on using the abstracted object
-        let git = new Git(repoDir, logger);
-        git._isATemporaryRepo = true;
-        git.tempRepoLocation = locationOfCopiedDirectory;
- 
-        await git.addSafeConfig(repoDir);
-        await git.getRemoteOriginUrl();
-        await git.fetch();
-        if (branch) {
-            await git.createBranch(branch);
-        }
-        if (commitRef) {
-            await git.checkout(commitRef, true);
-        }
- 
-        SFPLogger.log(
-            `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`,
-            LoggerLevel.INFO,
-            logger
-        );
-        return git;
-    }
- 
-    static async initiateRepo(logger?: Logger, projectDir?: string) {
-        let git = new Git(projectDir, logger);
-        if (projectDir) await git.addSafeConfig(projectDir);
-        else {
-            await git.addSafeConfig(process.cwd());
-        }
-        await git.getRemoteOriginUrl();
-        return git;
-    }
- 
-    public getRepositoryPath() {
-        return this.repositoryLocation;
-    }
- 
-    async deleteTempoRepoIfAny() {
-        Iif (this.tempRepoLocation) this.tempRepoLocation.removeCallback();
-    }
- 
-    async addSafeConfig(repoDir: string) {
-        try
-        {
-        //add workaround for safe directory (https://github.com/actions/runner/issues/2033)
-        await this._git.addConfig('safe.directory', repoDir, false, 'global');
-        }catch(error)
-        {
-            //ignore error
-            SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE)
-        }
-    }
- 
-    async pushToRemote(branch: string, isForce: boolean) {
-        Iif (!branch) branch = (await this._git.branch()).current;
-        SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger);
-        if (process.env.sfp_OVERRIDE_ORIGIN_URL) {
-            await this._git.removeRemote('origin');
-            await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL);
-        }
- 
-        if (isForce) {
-            await this._git.push('origin', branch, [`--force`]);
-        } else {
-            await this._git.push('origin', branch);
-        }
-    }
- 
-    isATemporaryRepo(): boolean {
-        return this._isATemporaryRepo;
-    }
- 
-    async getCurrentCommitId() {
-        return this._git.revparse(['HEAD']);
-    }
- 
-    async checkout(commitRef: string, isForce?: boolean) {
-        if (isForce) {
-            return this._git.checkout(commitRef, [`--force`]);
-        } else return this._git.checkout(commitRef, {});
-    }
- 
-    async checkoutPath(commitRef: string, path: string, isForce?: boolean) {
-        if (isForce) {
-            return this._git.checkout(commitRef, [path, `--force`]);
-        } else return this._git.checkout(commitRef, [path]);
-    }
- 
-    async stageChangedFiles(path: string): Promise<boolean> {
-        try {
-            await this._git.add(path);
-            return true;
-        } catch (error) {
-            SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger);
-            return false;
-        }
-    }
-    async createBranch(branch: string) {
-        if (await this.isBranchExists(branch)) {
-            await this._git.checkout(branch, ['-f']);
-            try {
-                // For ease-of-use when running locally and local branch exists
-                await this._git.merge([`refs/remotes/origin/${branch}`]);
-            } catch (error) {
-                SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger);
-            }
-        } else {
-            await this._git.checkout(['-b', branch]);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html deleted file mode 100644 index bf6949b0f..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/GitIdentity.ts.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for core/git/GitIdentity.ts - - - - - - - - - -
-
-

All files / core/git GitIdentity.ts

-
- -
- 10% - Statements - 1/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/4 -
- - -
- 10% - Lines - 1/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { SimpleGit } from 'simple-git/promise';
- 
-export default class GitIdentity {
-    constructor(private git: SimpleGit) {}
- 
-    async setUsernameAndEmail(): Promise<void> {
-        await this.setUsername();
-        await this.setEmail();
-    }
- 
-    private async setUsername(): Promise<void> {
-        let username: string;
- 
-        if (process.env.sfp_GIT_USERNAME) {
-            username = process.env.sfp_GIT_USERNAME;
-        } else {
-            username = 'sfp';
-        }
- 
-        await this.git.addConfig('user.name', username);
-    }
- 
-    private async setEmail(): Promise<void> {
-        let email: string;
- 
-        if (process.env.sfp_GIT_EMAIL) {
-            email = process.env.sfp_GIT_EMAIL;
-        } else {
-            email = 'sfp@flxblio.io';
-        }
- 
-        await this.git.addConfig('user.email', email);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html deleted file mode 100644 index c63f4d34a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/core/git/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for core/git - - - - - - - - - -
-
-

All files core/git

-
- -
- 6.36% - Statements - 7/110 -
- - -
- 0% - Branches - 0/15 -
- - -
- 0% - Functions - 0/30 -
- - -
- 6.73% - Lines - 7/104 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
Git.ts -
-
6%6/1000%0/150%0/266.38%6/94
GitIdentity.ts -
-
10%1/10100%0/00%0/410%1/10
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png b/packages/sfpowerscripts-cli/coverage/lcov-report/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for impl/changelog/OrgsUpdater.ts - - - - - - - - - -
-
-

All files / impl/changelog OrgsUpdater.ts

-
- -
- 82.35% - Statements - 28/34 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 6/6 -
- - -
- 81.25% - Lines - 26/32 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128  -1x -  -1x -  -  -  -  -4x -4x -4x -4x -  -4x -  -  -2x -  -  -  -  -  -  -2x -  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -3x -  -  -2x -2x -  -  -  -  -  -  -  -  -1x -  -  -  -1x -1x -  -  -1x -  -  -  -  -  -1x -1x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -6x -  -  -  -  -  -  - 
import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog';
-import lodash = require('lodash');
- 
-export default class OrgsUpdater {
-    private latestReleaseId: ReleaseId;
-    private idOfReleaseWithMatchingHashId: ReleaseId;
- 
-    constructor(
-        private releaseChangelog: ReleaseChangelog,
-        private latestRelease: Release,
-        private org: string,
-        private releaseWithMatchingHashId: Release
-    ) {
-        this.latestReleaseId = this.convertReleaseToId(this.latestRelease);
- 
-        if (this.releaseWithMatchingHashId) {
-            this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId);
-        }
-    }
- 
-    update(): void {
-        if (!this.idOfReleaseWithMatchingHashId) {
-            if (this.releaseChangelog.orgs) {
-                let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
- 
-                if (org) {
-                    org.releases.push(this.latestReleaseId);
-                    org.latestRelease = org.releases[org.releases.length - 1];
-                    org.retryCount = 0;
-                } else {
-                    this.releaseChangelog.orgs.push({
-                        name: this.org,
-                        releases: [this.latestReleaseId],
-                        latestRelease: this.latestReleaseId,
-                        retryCount: 0,
-                    });
-                }
-            } else {
-                // for backwards-compatibility with pre-existing changelogs
-                this.releaseChangelog.orgs = [
-                    {
-                        name: this.org,
-                        releases: [this.latestReleaseId],
-                        latestRelease: this.latestReleaseId,
-                        retryCount: 0,
-                    },
-                ];
-            }
-            console.log(
-                `Updating ${this.org} org with`,
-                this.latestRelease.names[this.latestRelease.names.length - 1] +
-                    '-' +
-                    this.latestRelease.buildNumber +
-                    `(0)`
-            );
-        } else {
-            // Update orgs
-            let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
- 
-            if (org) {
-                let indexOfReleaseToOrg = org.releases.findIndex(
-                    (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId
-                );
-                if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) {
-                    if (indexOfReleaseToOrg >= 0) {
-                        // Update release names in releases to org
-                        org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
-                        org.releases[indexOfReleaseToOrg].date = new Date().toUTCString();
-                    } else {
-                        // Add releaseId in releases to org
-                        org.releases.push(this.idOfReleaseWithMatchingHashId);
-                    }
- 
-                    // Update latest release
-                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
-                    org.retryCount = 0;
-                } else {
-                    if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) {
-                        org.retryCount++;
-                    } else {
-                        org.retryCount = 0;
-                    }
- 
-                    // Update releases names in releases to org & latestRelease
-                    org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
-                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
-                }
- 
-                console.log(
-                    `Updating ${this.org} org with`,
-                    org.latestRelease.names[org.latestRelease.names.length - 1] +
-                        '-' +
-                        org.latestRelease.buildNumber +
-                        `(${org.retryCount})`
-                );
-            } else {
-                // new org
-                this.releaseChangelog.orgs.push({
-                    name: this.org,
-                    releases: [this.idOfReleaseWithMatchingHashId],
-                    latestRelease: this.idOfReleaseWithMatchingHashId,
-                    retryCount: 0,
-                });
-                console.log(
-                    `Updating ${this.org} org with`,
-                    `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${
-                        this.idOfReleaseWithMatchingHashId.buildNumber
-                    }(0)`
-                );
-            }
-        }
-    }
- 
-    /**
-     * Convert Release to Release Id
-     * @param release
-     * @returns
-     */
-    private convertReleaseToId(release: Release): ReleaseId {
-        let releaseNames = [...release.names]; // Shallow copy
-        return {
-            names: releaseNames,
-            buildNumber: release.buildNumber,
-            hashId: release.hashId,
-        };
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html deleted file mode 100644 index e1462a0d6..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/WorkItemUpdater.ts.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for impl/changelog/WorkItemUpdater.ts - - - - - - - - - -
-
-

All files / impl/changelog WorkItemUpdater.ts

-
- -
- 100% - Statements - 13/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 11/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -421x -  -  -  -1x -1x -  -  -  -  -  -  -  -2x -2x -  -  -  -24x -24x -  -  -  -3x -3x -  -1x -  -  -  -  -  -  -  -  -  -  -3x -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { Release } from './ReleaseChangelog';
- 
- 
-export default class WorkItemUpdater {
-    constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {}
- 
-    /**
-     * Generate work items in latest release
-     */
-    update(): void {
-        for (const workItemFilter of this.workItemFilters) {
-     
-        let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi');
-        SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger);
- 
-        for (let artifact of this.latestRelease['artifacts']) {
-            for (let commit of artifact['commits']) {
-                let commitMessage: String = commit['message'] + '\n' + commit['body'];
-                let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex);
-                if (workItems) {
-                    for (let item of workItems) {
-                        if (this.latestRelease['workItems'][item] == null) {
-                            this.latestRelease['workItems'][item] = new Set<string>();
-                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
-                        } else {
-                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
-                        }
-                    }
-                }
-            }
-        }
-       }
- 
-        // Convert each work item Set to Array
-        // Enables JSON stringification of work item
-        for (let key in this.latestRelease['workItems']) {
-            this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html deleted file mode 100644 index 53eaeeb78..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/changelog/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for impl/changelog - - - - - - - - - -
-
-

All files impl/changelog

-
- -
- 87.23% - Statements - 41/47 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 8/8 -
- - -
- 86.04% - Lines - 37/43 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
OrgsUpdater.ts -
-
82.35%28/34100%0/0100%6/681.25%26/32
WorkItemUpdater.ts -
-
100%13/13100%0/0100%2/2100%11/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html deleted file mode 100644 index a1c5f37d3..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/UndirectedGraph.ts.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for impl/parallelBuilder/UndirectedGraph.ts - - - - - - - - - -
-
-

All files / impl/parallelBuilder UndirectedGraph.ts

-
- -
- 96.55% - Statements - 28/29 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 21/21 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -501x -  -  -  -8x -  -  -  -3x -  -  -  -14x -1x -  -  -  -12x -11x -9x -  -8x -8x -  -  -  -  -  -  -  -4x -4x -4x -  -4x -19x -19x -18x -18x -18x -  -15x -  -  -  -  -3x -  -  - 
export default class UndirectedGraph {
-    private _adjacencyList: { [p: string]: string[] };
- 
-    constructor() {
-        this._adjacencyList = {};
-    }
- 
-    get adjacencyList() {
-        return this._adjacencyList;
-    }
- 
-    addVertex(name: string) {
-        if (!this._adjacencyList[name]) this._adjacencyList[name] = [];
-        else throw new Error(`Vertex with name '${name}' already exists`);
-    }
- 
-    addEdge(vertexA: string, vertexB: string): void {
-        if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex');
-        if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`);
-        if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`);
- 
-        if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB);
-        if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA);
-    }
- 
-    /**
-     * Returns vertices in graph, using depth-first search from the starting vertex
-     * @param start
-     */
-    dfs(start: string): string[] {
-        const vertices: string[] = [];
-        const visited: { [p: string]: boolean } = {};
-        const adjacencyList = this._adjacencyList;
- 
-        (function dfsHandler(vertex) {
-            Iif (!vertex) return null;
-            if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`);
-            visited[vertex] = true;
-            vertices.push(vertex);
-            adjacencyList[vertex].forEach((neighbor) => {
-                if (!visited[neighbor]) {
-                    return dfsHandler(neighbor);
-                }
-            });
-        })(start);
- 
-        return vertices;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html deleted file mode 100644 index 8d42389df..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/parallelBuilder/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for impl/parallelBuilder - - - - - - - - - -
-
-

All files impl/parallelBuilder

-
- -
- 96.55% - Statements - 28/29 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 21/21 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
UndirectedGraph.ts -
-
96.55%28/2988.88%8/9100%7/7100%21/21
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html deleted file mode 100644 index 5e969bf1b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/ReleaseDefinition.ts.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - Code coverage report for impl/release/ReleaseDefinition.ts - - - - - - - - - -
-
-

All files / impl/release ReleaseDefinition.ts

-
- -
- 70% - Statements - 21/30 -
- - -
- 100% - Branches - 3/3 -
- - -
- 66.66% - Functions - 4/6 -
- - -
- 70% - Lines - 21/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80  -1x -1x -1x -1x -1x -  -1x -1x -  -1x -  -  -  -  -5x -5x -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -5x -5x -  -  -  -4x -  -  -4x -6x -  -  -  -  -  -  -4x -  -  -  - 
import ReleaseDefinitionSchema from './ReleaseDefinitionSchema';
-import Ajv from 'ajv';
-const yaml = require('js-yaml');
-import lodash = require('lodash');
-import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId';
-import Git from '../../core/git/Git';
-import { ConsoleLogger } from '@flxblio/sfp-logger';
-const fs = require('fs-extra');
-const path = require('path');
- 
-export default class ReleaseDefinition {
-    get releaseDefinition() {
-        // Return clone of releaseDefinition for immutability
-        return lodash.cloneDeep(this._releaseDefinitionSchema);
-    }
-    private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) {
-        this.validateReleaseDefinition(this._releaseDefinitionSchema);
- 
-        // Workaround for jsonschema not supporting validation based on dependency value
-        if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled)
-            throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'");
- 
-        if (this._releaseDefinitionSchema.packageDependencies) {
-            this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies);
-        }
-    }
- 
-    public static async loadReleaseDefinition(pathToReleaseDefinition: string) {
-        //Check whether path contains gitRef
-        let releaseDefinitionSchema: ReleaseDefinitionSchema;
-        try {
-            if (pathToReleaseDefinition.includes(':')) {
-                let git = await Git.initiateRepo();
-                await git.fetch();
-                let releaseFile = await git.show([pathToReleaseDefinition]);
-                releaseDefinitionSchema = yaml.load(releaseFile);
-            } else {
-                releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8'));
-            }
-        } catch (error) {
-            throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`);
-        }
- 
-        let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema);
-        return releaseDefinition;
-    }
- 
-    private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) {
-        for (let pkg in packageDependencies) {
-            packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]);
-        }
-    }
- 
-    private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void {
-        let schema = fs.readJSONSync(
-            path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'),
-            { encoding: 'UTF-8' }
-        );
- 
-        let validator = new Ajv({ allErrors: true }).compile(schema);
-        let validationResult = validator(releaseDefinition);
- 
-        if (!validationResult) {
-            let errorMsg: string =
-                `Release definition does not meet schema requirements, ` +
-                `found ${validator.errors.length} validation errors:\n`;
- 
-            validator.errors.forEach((error, errorNum) => {
-                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
-                    error.params,
-                    null,
-                    4
-                )}`;
-            });
- 
-            throw new Error(errorMsg);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html deleted file mode 100644 index 1b35ad14b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/impl/release/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for impl/release - - - - - - - - - -
-
-

All files impl/release

-
- -
- 70% - Statements - 21/30 -
- - -
- 100% - Branches - 3/3 -
- - -
- 66.66% - Functions - 4/6 -
- - -
- 70% - Lines - 21/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ReleaseDefinition.ts -
-
70%21/30100%3/366.66%4/670%21/30
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/index.html deleted file mode 100644 index 7f485b199..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/index.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 46.8% - Statements - 1172/2504 -
- - -
- 35.03% - Branches - 144/411 -
- - -
- 45.09% - Functions - 193/428 -
- - -
- 46.95% - Lines - 1117/2379 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
100%26/26100%3/3100%7/7100%26/26
src/core/apex -
-
33.33%8/24100%0/033.33%2/636.36%8/22
src/core/apex/coverage -
-
61.29%19/3160%3/566.66%6/962.06%18/29
src/core/apextest -
-
43.13%22/5120%1/540%2/542.55%20/47
src/core/artifacts -
-
38.46%30/7853.84%7/1338.46%5/1337.33%28/75
src/core/display -
-
100%2/2100%0/0100%0/0100%2/2
src/core/git -
-
14.87%36/2424.87%2/4110.52%6/5714.09%32/227
src/core/metadata -
-
21.66%52/2400%0/4521.05%4/1921.75%52/239
src/core/org -
-
34.61%27/7841.17%7/1731.25%5/1637.5%27/72
src/core/org/packageQuery -
-
50%2/4100%0/00%0/150%2/4
src/core/package -
-
26.92%35/1309.52%2/2128.57%4/1428%35/125
src/core/package/analyser -
-
67.46%56/8360%6/1050%6/1266.66%52/78
src/core/package/components -
-
74.02%57/7750%2/482.35%14/1774.66%56/75
src/core/package/coverage -
-
93.67%74/7970%7/10100%15/1593.58%73/78
src/core/package/dependencies -
-
85.25%133/15674.35%29/3991.66%22/2484.56%126/149
src/core/package/deploymentFilters -
-
84.09%37/4442.85%3/766.66%2/390.24%37/41
src/core/package/diff -
-
36.44%82/22536.66%11/3036.84%7/1936.48%81/222
src/core/package/packageCreators -
-
14.43%28/1940%0/280%0/4015.73%28/178
src/core/package/propertyFetchers -
-
78.94%15/1966.66%4/6100%3/378.94%15/19
src/core/package/validators -
-
12.5%5/400%0/120%0/313.51%5/37
src/core/package/version -
-
75.92%41/5475%9/1257.14%4/775.55%34/45
src/core/permsets -
-
85.71%48/56100%3/3100%9/984.9%45/53
src/core/project -
-
74.1%83/11273.07%19/2679.31%23/2975%78/104
src/core/queryHelper -
-
100%23/23100%4/4100%3/3100%22/22
src/core/stats -
-
18.18%8/440%0/130%0/919.51%8/41
src/core/stats/nativeMetricSenderImpl -
-
21.05%12/570%0/20%0/1821.05%12/57
src/core/utils -
-
39.86%61/15320.68%6/2936.36%12/3340.41%59/146
src/impl/changelog -
-
87.5%56/64100%0/0100%11/1186.66%52/60
src/impl/dependency -
-
100%27/27100%0/0100%5/5100%26/26
src/impl/parallelBuilder -
-
93.75%45/4881.25%13/1685.71%12/1494.73%36/38
src/impl/release -
-
70%21/30100%3/366.66%4/670%21/30
src/utils -
-
7.69%1/130%0/70%0/18.33%1/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js b/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png b/packages/sfpowerscripts-cli/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js b/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js deleted file mode 100644 index 2bb296a8c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,196 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if ( - row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()) - ) { - row.style.display = ''; - } else { - row.style.display = 'none'; - } - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html deleted file mode 100644 index d677368f2..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/ProjectValidation.ts.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - Code coverage report for src/ProjectValidation.ts - - - - - - - - - -
-
-

All files / src ProjectValidation.ts

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -881x -1x -1x -1x -1x -1x -  -1x -  -  -  -  -  -8x -8x -8x -  -  -  -4x -4x -4x -  -1x -  -1x -7x -  -  -  -  -  -  -  -1x -1x -  -  -  -  -2x -4x -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -2x -4x -  -4x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import ProjectConfig from './core/project/ProjectConfig';
-import Ajv from 'ajv';
-import path = require('path');
-import * as fs from 'fs-extra';
-import { PackageType } from './core//package/SfpPackage';
-import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
- 
-export default class ProjectValidation {
-    private readonly projectConfig;
-    private ajv: Ajv;
-    resourcesDir: string;
- 
-    constructor() {
-        this.projectConfig = ProjectConfig.getSFDXProjectConfig(null);
-        this.ajv = new Ajv({ allErrors: true });
-        this.resourcesDir = path.join(__dirname, '..', 'resources', 'schemas');
-    }
- 
-    public validateSFDXProjectJSON() {
-        let schema = fs.readJSONSync(path.join(this.resourcesDir, `sfdx-project.schema.json`), { encoding: 'UTF-8' });
-        let validator = this.ajv.compile(schema);
-        let isSchemaValid = validator(this.projectConfig);
-        if (!isSchemaValid) {
-            let errorMsg: string = `The sfdx-project.json is invalid, Please fix the following errors\n`;
- 
-            validator.errors.forEach((error, errorNum) => {
-                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
-                    error.params,
-                    null,
-                    4
-                )}`;
-            });
- 
- 
-          SFPLogger.log(`The following attributes are not recognized by sfp, You might need to remove them`,LoggerLevel.WARN)
-          SFPLogger.log(errorMsg, LoggerLevel.WARN);
-        }
-    }
- 
-    public validatePackageNames() {
-        ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
-            let name = pkg.package;
-            if ( name.length > 38) {
-                throw new Error(
-                    'sfdx-project.json validation failed for package "' +
-                    pkg['package'] +
-                        '".' +
-                    `Package name exceed maximum length of 38 characters.`
-                )
-            }else if( name.match(/^[a-zA-Z0-9-._~]+$/) === null ){
-                throw new Error(
-                    'sfdx-project.json validation failed for package "' +
-                    pkg['package'] +
-                        '".' +
-                    `Package names can only contain alphanumeric characters and the symbols - . _ ~.`
-                )
-            }
-        });
-    }
- 
- 
-    public validatePackageBuildNumbers() {
-        ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
-            let packageType = ProjectConfig.getPackageType(this.projectConfig, pkg.package);
- 
-            let pattern: RegExp = /NEXT$|LATEST$/i;
-            if (
-                pkg.versionNumber.match(pattern) &&
-                (packageType === PackageType.Source || packageType === PackageType.Data)
-            ) {
-                throw new Error(
-                    'sfdx-project.json validation failed for package "' +
-                        pkg['package'] +
-                        '".' +
-                        ' Build-number keywords "NEXT" & "LATEST" are not supported for ' +
-                        packageType +
-                        ' packages.' +
-                        '\nTry the following:' +
-                        '\n - If package should be built as a ' +
-                        packageType +
-                        ' package, use 0 instead of NEXT/LATEST' +
-                        '\n - If package should be built as an Unlocked package, ensure the package has been created in the Devhub and the ID included in packageAliases of sfdx-project.json'
-                );
-            }
-        });
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html deleted file mode 100644 index c2fe836af..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexClassFetcher.ts.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - Code coverage report for src/core/apex/ApexClassFetcher.ts - - - - - - - - - -
-
-

All files / src/core/apex ApexClassFetcher.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 33.33% - Functions - 1/3 -
- - -
- 36.36% - Lines - 4/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28  -1x -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import chunkCollection from "../queryHelper/ChunkCollection";
-import QueryHelper from '../queryHelper/QueryHelper';
- 
-export default class ApexClassFetcher {
-    constructor(private conn: Connection) {}
- 
-    /**
-     * Query Apex Classes by Name
-     *
-     * @param classNames
-     * @returns
-     */
-    public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> {
-        let result: {Id: string; Name: string}[] = [];
- 
-        const chunks = chunkCollection(classNames);
-        for (const chunk of chunks) {
-            const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query
-            const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`;
- 
-            const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false);
-            result = result.concat(records);
-        }
- 
-        return result;
-    }
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html deleted file mode 100644 index 0e93a90bc..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/ApexTriggerFetcher.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/core/apex/ApexTriggerFetcher.ts - - - - - - - - - -
-
-

All files / src/core/apex ApexTriggerFetcher.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 33.33% - Functions - 1/3 -
- - -
- 36.36% - Lines - 4/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29  -1x -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import chunkCollection from '../queryHelper/ChunkCollection';
-import QueryHelper from '../queryHelper/QueryHelper';
- 
-export default class ApexTriggerFetcher {
-    constructor(private conn: Connection) {}
- 
-    /**
-     * Query Triggers by Name
-     *
-     * @param triggerNames
-     * @returns
-     */
-    public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> {
-        let result: {Id: string, Name: string}[] = [];
- 
-        const chunks = chunkCollection(triggerNames);
-        for (const chunk of chunks) {
-            const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query
-            const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`;
- 
-            const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false);
-            result = result.concat(records);
-        }
- 
-        return result;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html deleted file mode 100644 index 7365d4376..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts - - - - - - - - - -
-
-

All files / src/core/apex/coverage ApexCodeCoverageAggregateFetcher.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 33.33% - Functions - 1/3 -
- - -
- 36.36% - Lines - 4/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43  -1x -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import chunkCollection from '../../queryHelper/ChunkCollection';
-import QueryHelper from '../../queryHelper/QueryHelper';
- 
-export default class ApexCodeCoverageAggregateFetcher {
-    constructor(private conn: Connection) {}
- 
-    /**
-     * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId
-     * @param listOfApexClassOrTriggerId
-     * @returns
-     */
-    public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{
-        ApexClassOrTriggerId: string;
-        NumLinesCovered: number;
-        NumLinesUncovered: number;
-        Coverage: any;
-    }[]> {
-        let result: {
-            ApexClassOrTriggerId: string;
-            NumLinesCovered: number;
-            NumLinesUncovered: number;
-            Coverage: any;
-        }[] = [];
- 
-        const chunks = chunkCollection(listOfApexClassOrTriggerId);
-        for (const chunk of chunks) {
-            const formattedChunk = chunk.map(elem => `'${elem}'`).toString();
-            let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`;
- 
-            const records = await QueryHelper.query<{
-                ApexClassOrTriggerId: string;
-                NumLinesCovered: number;
-                NumLinesUncovered: number;
-                Coverage: any;
-            }>(query, this.conn, true);
-            result = result.concat(records);
-        }
- 
-        return result;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html deleted file mode 100644 index 693cd7836..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/IndividualClassCoverage.ts.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - Code coverage report for src/core/apex/coverage/IndividualClassCoverage.ts - - - - - - - - - -
-
-

All files / src/core/apex/coverage IndividualClassCoverage.ts

-
- -
- 78.94% - Statements - 15/19 -
- - -
- 60% - Branches - 3/5 -
- - -
- 83.33% - Functions - 5/6 -
- - -
- 77.77% - Lines - 14/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -772x -  -2x -9x -  -  -  -  -  -2x -  -  -2x -8x -  -  -  -2x -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -4x -13x -  -  -4x -2x -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from "@flxblio/sfp-logger"
- 
-export default class IndividualClassCoverage {
-    public constructor(private codeCoverage: any, private logger: Logger) {}
- 
-    public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] {
-        let individualClassCoverage: {
-            name: string;
-            coveredPercent: number;
-        }[] = [];
- 
-        // Return every class in coverage json if test level is not RunAllTestsInPackage
-        individualClassCoverage = this.codeCoverage.map((cls) => {
-            return { name: cls.name, coveredPercent: cls.coveredPercent };
-        });
- 
-         // Filter individualClassCoverage based on classesToBeValidated
-        Iif(classesToBeValidated && classesToBeValidated.length > 0)
-        individualClassCoverage = individualClassCoverage.filter((cls) => {
-             return classesToBeValidated.includes(cls.name);
-        });
- 
- 
-        return individualClassCoverage;
-    }
- 
-    public validateIndividualClassCoverage(
-        individualClassCoverage: ClassCoverage[],
-        coverageThreshold?: number
-    ): {
-        result: boolean;
-        message: string;
-        classesCovered?: ClassCoverage[];
-        classesWithInvalidCoverage?: ClassCoverage[];
-    } {
-        if (coverageThreshold < 75) {
-            SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger);
-            coverageThreshold = 75;
-        }
- 
-        SFPLogger.log(
-            `Validating individual classes for code coverage greater than ${coverageThreshold} percent`,
-            LoggerLevel.INFO,
-            this.logger
-        );
-        let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => {
-            return cls.coveredPercent < coverageThreshold;
-        });
- 
-        if (classesWithInvalidCoverage.length > 0) {
-            return {
-                result: false,
-                message: 'There are classes which do not satisfy the individual coverage requirements',
-                classesCovered: individualClassCoverage,
-                classesWithInvalidCoverage: classesWithInvalidCoverage,
-            };
-        } else
-            return {
-                result: true,
-                message: 'All classes in this test run meet the required coverage threshold',
-                classesCovered: individualClassCoverage,
-            };
-    }
-}
- 
-export type CoverageOptions = {
-    isPackageCoverageToBeValidated: boolean;
-    isIndividualClassCoverageToBeValidated: boolean;
-    coverageThreshold: number;
-    classesToBeValidated?: string[];
-};
- 
-export type ClassCoverage = {
-    name: string;
-    coveredPercent: number;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html deleted file mode 100644 index a4c7908d8..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/coverage/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/apex/coverage - - - - - - - - - -
-
-

All files src/core/apex/coverage

-
- -
- 61.29% - Statements - 19/31 -
- - -
- 60% - Branches - 3/5 -
- - -
- 66.66% - Functions - 6/9 -
- - -
- 62.06% - Lines - 18/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ApexCodeCoverageAggregateFetcher.ts -
-
33.33%4/12100%0/033.33%1/336.36%4/11
IndividualClassCoverage.ts -
-
78.94%15/1960%3/583.33%5/677.77%14/18
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html deleted file mode 100644 index 81becdc33..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apex/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/apex - - - - - - - - - -
-
-

All files src/core/apex

-
- -
- 33.33% - Statements - 8/24 -
- - -
- 100% - Branches - 0/0 -
- - -
- 33.33% - Functions - 2/6 -
- - -
- 36.36% - Lines - 8/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ApexClassFetcher.ts -
-
33.33%4/12100%0/033.33%1/336.36%4/11
ApexTriggerFetcher.ts -
-
33.33%4/12100%0/033.33%1/336.36%4/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html deleted file mode 100644 index d626dc9d9..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ApexTestSuite.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/core/apextest/ApexTestSuite.ts - - - - - - - - - -
-
-

All files / src/core/apextest ApexTestSuite.ts

-
- -
- 100% - Statements - 16/16 -
- - -
- 100% - Branches - 1/1 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 14/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -1x -1x -1x -1x -  -1x -3x -  -  -3x -  -  -  -  -3x -  -3x -  -2x -  -  -1x -  -1x -1x -1x -  -  -  - 
 
-const fs = require('fs-extra');
-import path from 'path';
-import xml2json from '../utils/xml2json';
-import { globSync } from 'glob';
- 
-export default class ApexTestSuite {
-    public constructor(private sourceDir: string, private suiteName: string) {}
- 
-    public async getConstituentClasses(): Promise<string[]> {
-        let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, {
-            cwd: this.sourceDir,
-            absolute: true,
-        });
- 
-        console.log('testSuitePaths',testSuitePaths);
- 
-        if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`);
- 
-        let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0])));
- 
-        if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) {
-            return apex_test_suite.ApexTestSuite.testClassName;
-        } else {
-            let testClassess = new Array<string>();
-            testClassess.push(apex_test_suite.ApexTestSuite.testClassName);
-            return testClassess;
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html deleted file mode 100644 index 8f05f1a9a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/ImpactedApexTestClassFetcher.ts.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - Code coverage report for src/core/apextest/ImpactedApexTestClassFetcher.ts - - - - - - - - - -
-
-

All files / src/core/apextest ImpactedApexTestClassFetcher.ts

-
- -
- 17.14% - Statements - 6/35 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/3 -
- - -
- 18.18% - Lines - 6/33 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -911x -1x -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as _ from 'lodash';
-import ApexDepedencyCheckImpl from "@flxblio/apexlink/lib/ApexDepedencyCheckImpl"
-import Component from '../dependency/Component';
-import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import SfpPackage, { PackageType } from '../package/SfpPackage';
-import path from 'path';
- 
-export default class ImpactedApexTestClassFetcher {
-    public constructor(
-        private sfpPackage: SfpPackage,
-        private changedComponents: Component[],
-        private logger: Logger,
-        private loglevel?: LoggerLevel
-    ) {}
- 
-    public async getImpactedTestClasses(): Promise<string[]> {
-    
-        let invalidatedClasses = [];
-        let invalidatedTestClasses = [];
- 
-        try
-        {
-        let validatedChangedComponents = this.changedComponents.filter(
-            (component) => component.package == this.sfpPackage.packageName
-        );
- 
-        SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger);
-        SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger);
- 
-    
-       
-        let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory));
-        let dependencies = (await apexLinkImpl.execute()).dependencies;
- 
-        if(dependencies.length==0)
-        {
-            //go for another attempt
-            SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger);
-            apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory);
-            dependencies = (await apexLinkImpl.execute()).dependencies;
-        }
- 
-        SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger);
- 
-        //compute invalidated apex classes
-        for (const changedComponent of validatedChangedComponents) {
-            //If the component is a permset or profile, add every test class
-            //There is a change in security model, add all test classes as invalidated
-            // Temoorarily disabled this check as it is not working as expected
-            if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) {
-                SFPLogger.log(
-                    COLOR_WARNING(`Change in Security Model, pushing all test classes through`),
-                    LoggerLevel.INFO,
-                    this.logger
-                );
-                invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses);
-                break;
-            }
- 
-            for (const apexClass of dependencies) {
-                // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class
-                Iif (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name);
- 
-                // push any apex class or test class who is dependent on the changed entity
-                for (const dependsOn of apexClass.dependencies) {
-                    Iif (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name);
-                }
-            }
-        }
- 
-        SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger);
-        //Filter all apex classes by means of whats is detected in test classes list
-        invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses);
-        SFPLogger.log(
-            `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`,
-            LoggerLevel.INFO,
-            this.logger
-        );
-        }catch(error)
-        {
-            SFPLogger.log(
-                `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`,
-                LoggerLevel.ERROR,
-                this.logger
-            );
-            invalidatedClasses = this.sfpPackage.apexTestClassses;
-        }
-        return invalidatedTestClasses;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html deleted file mode 100644 index d1dbe87a1..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/apextest/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/apextest - - - - - - - - - -
-
-

All files src/core/apextest

-
- -
- 43.13% - Statements - 22/51 -
- - -
- 20% - Branches - 1/5 -
- - -
- 40% - Functions - 2/5 -
- - -
- 42.55% - Lines - 20/47 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ApexTestSuite.ts -
-
100%16/16100%1/1100%2/2100%14/14
ImpactedApexTestClassFetcher.ts -
-
17.14%6/350%0/40%0/318.18%6/33
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html deleted file mode 100644 index a597a3f7c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/ArtifactFetcher.ts.html +++ /dev/null @@ -1,757 +0,0 @@ - - - - - - Code coverage report for src/core/artifacts/ArtifactFetcher.ts - - - - - - - - - -
-
-

All files / src/core/artifacts ArtifactFetcher.ts

-
- -
- 38.46% - Statements - 30/78 -
- - -
- 53.84% - Branches - 7/13 -
- - -
- 38.46% - Functions - 5/13 -
- - -
- 37.33% - Lines - 28/75 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -2251x -1x -1x -1x -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -1x -  -  -3x -  -  -  -  -3x -1x -1x -1x -1x -2x -  -  -  -  -  -  -  -  -1x -4x -4x -  -  -1x -1x -4x -4x -  -4x -  -  -  -  -1x -1x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import path = require('path');
-import * as fs from 'fs-extra';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { globSync } from 'glob';
-import AdmZip = require('adm-zip');
-import semver = require('semver');
-import tar = require('tar');
- 
-export default class ArtifactFetcher {
-    /**
-     * Decider for which artifact retrieval method to use
-     * Returns empty array if no artifacts are found
-     * @param artifactDirectory
-     * @param sfdx_package
-     */
-    public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] {
-        let result: Artifact[] = [];
- 
-        if (!fs.existsSync(artifactDirectory)) {
-            throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`);
-        }
- 
-        let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package);
- 
-        SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger);
- 
-        for (let artifact of artifacts) {
-            let artifactFilePaths: Artifact;
-            if (path.extname(artifact) === '.zip') {
-                artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact);
-            } else if (path.extname(artifact) === '.tgz') {
-                artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact);
-            } else {
-                throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`);
-            }
-            result.push(artifactFilePaths);
-        }
- 
-        return result;
-    }
- 
-    /**
-     * Helper method for retrieving the ArtifactFilePaths of an artifact folder
-     * @param packageMetadataFilePath
-     */
-    private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact {
-        let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`);
- 
-        let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`);
- 
-        let artifactFilePaths: Artifact = {
-            packageMetadataFilePath: packageMetadataFilePath,
-            sourceDirectoryPath: sourceDirectory,
-            changelogFilePath: changelogFilePath,
-        };
- 
-        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
- 
-        return artifactFilePaths;
-    }
- 
-    /**
-     * Helper method for retrieving ArtifactFilePaths of an artifact zip
-     * @param artifact
-     */
-    private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact {
-        let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`;
- 
-        fs.mkdirpSync(unzippedArtifactsDirectory);
-        let zip = new AdmZip(artifact);
- 
-        // Overwrite existing files
-        zip.extractAllTo(unzippedArtifactsDirectory, true);
- 
-        let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0];
-        if (artifactName == null) {
-            throw new Error(`Failed to fetch artifact file paths for ${artifact}`);
-        }
- 
-        let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json');
- 
-        let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`);
- 
-        let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`);
- 
-        let artifactFilePaths: Artifact = {
-            packageMetadataFilePath: packageMetadataFilePath,
-            sourceDirectoryPath: sourceDirectory,
-            changelogFilePath: changelogFilePath,
-        };
- 
-        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
- 
-        return artifactFilePaths;
-    }
- 
-    /**
-     * Helper method for retrieving ArtifactFilePaths of a tarball
-     * @param artifact
-     */
-    private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact {
-        let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`;
-        fs.mkdirpSync(unzippedArtifactsDirectory);
- 
-        tar.x({
-            file: artifact,
-            cwd: unzippedArtifactsDirectory,
-            sync: true,
-        });
- 
-        let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json');
- 
-        let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`);
- 
-        let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`);
- 
-        let artifactFilePaths: Artifact = {
-            packageMetadataFilePath: packageMetadataFilePath,
-            sourceDirectoryPath: sourceDirectory,
-            changelogFilePath: changelogFilePath,
-        };
- 
-        ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths);
- 
-        return artifactFilePaths;
-    }
- 
-    /**
-     * Find zip and tarball artifacts
-     * Artifact format/s:
-     * sfp_artifact_<version>.zip,
-     * [sfdx_package]_sfp_artifact_[version].zip,
-     * [sfdx_package]_sfp_artifact_[version].tgz
-     */
-    public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] {
-        let pattern: string;
-        if (sfdx_package) {
-            pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`;
-        } else {
-            pattern = `**/*sfp_artifact*.@(zip|tgz)`;
-        }
- 
-        let artifacts: string[] = globSync(pattern, {
-            cwd: artifactDirectory,
-            absolute: true,
-        });
- 
-        if (sfdx_package && artifacts.length > 1) {
-            SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO);
-            let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts);
-            SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO);
-            return [latestArtifact];
-        } else return artifacts;
-    }
- 
-    /**
-     * Get the artifact with the latest semantic version
-     * @param artifacts
-     */
-    private static getLatestArtifact(artifacts: string[]) {
-        // Consider zip & tarball artifacts only
-        artifacts = artifacts.filter((artifact) => {
-            let ext: string = path.extname(artifact);
-            return ext === '.zip' || ext === '.tgz';
-        });
- 
-        let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?<version>.*)(?:\\.zip|\\.tgz)$');
-        let versions: string[] = artifacts.map((artifact) => {
-            let match: RegExpMatchArray = path.basename(artifact).match(pattern);
-            let version = match?.groups.version;
- 
-            if (version) return version;
-            else Ethrow new Error('Corrupted artifact detected with no version number');
-        });
- 
-        // Pick artifact with latest semantic version
-        let sortedVersions: string[] = semver.sort(versions);
-        let latestVersion: string = sortedVersions.pop();
- 
-        return artifacts.find((artifact) => artifact.includes(latestVersion));
-    }
- 
-    /**
-     * Verify that artifact filepaths exist on the file system
-     * @param artifactFilePaths
-     */
-    private static existsArtifactFilepaths(artifactFilePaths: Artifact): void {
-        Object.values(artifactFilePaths).forEach((filepath) => {
-            Iif (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`);
-        });
-    }
- 
-    /**
-     * Decider for task outcome if the artifact cannot be found
-     * @param artifacts_filepaths
-     * @param isToSkipOnMissingArtifact
-     */
-    public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean {
-        if (artifacts.length === 0 && !isToSkipOnMissingArtifact) {
-            throw new Error(`Artifact not found, Please check the inputs`);
-        } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) {
-            SFPLogger.log(
-                `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}`
-            );
-            return true;
-        }
-    }
- 
-    private static makefolderid(length): string {
-        var result = '';
-        var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-        var charactersLength = characters.length;
-        for (var i = 0; i < length; i++) {
-            result += characters.charAt(Math.floor(Math.random() * charactersLength));
-        }
-        return result;
-    }
-}
- 
-export interface Artifact {
-    packageMetadataFilePath: string;
-    sourceDirectoryPath?: string;
-    changelogFilePath?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html deleted file mode 100644 index 291805c44..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/artifacts/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/artifacts - - - - - - - - - -
-
-

All files src/core/artifacts

-
- -
- 38.46% - Statements - 30/78 -
- - -
- 53.84% - Branches - 7/13 -
- - -
- 38.46% - Functions - 5/13 -
- - -
- 37.33% - Lines - 28/75 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ArtifactFetcher.ts -
-
38.46%30/7853.84%7/1338.46%5/1337.33%28/75
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html deleted file mode 100644 index 2924471c4..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/TableConstants.ts.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - Code coverage report for src/core/display/TableConstants.ts - - - - - - - - - -
-
-

All files / src/core/display TableConstants.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 
-export const ZERO_BORDER_TABLE = {
-    top: ' ',
-    'top-mid': ' ',
-    'top-left': ' ',
-    'top-right': ' ',
-    bottom: ' ',
-    'bottom-mid': ' ',
-    'bottom-left': ' ',
-    'bottom-right': ' ',
-    left: '',
-    'left-mid': '',
-    mid: '',
-    'mid-mid': '',
-    right: '',
-    'right-mid': '',
-    middle: ' ',
-};
- 
- 
- 
-export const COLON_MIDDLE_BORDER_TABLE = {
-    top: '',
-    'top-mid': '',
-    'top-left': '',
-    'top-right': '',
-    bottom: '',
-    'bottom-mid': '',
-    'bottom-left': '',
-    'bottom-right': '',
-    left: '',
-    'left-mid': '',
-    mid: '',
-    'mid-mid': '',
-    right: '',
-    'right-mid': '',
-    middle: ':',
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html deleted file mode 100644 index c0e6dc658..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/display/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/display - - - - - - - - - -
-
-

All files src/core/display

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
TableConstants.ts -
-
100%2/2100%0/0100%0/0100%2/2
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html deleted file mode 100644 index 0e2e5312a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/Git.ts.html +++ /dev/null @@ -1,823 +0,0 @@ - - - - - - Code coverage report for src/core/git/Git.ts - - - - - - - - - -
-
-

All files / src/core/git Git.ts

-
- -
- 6% - Statements - 6/100 -
- - -
- 0% - Branches - 0/15 -
- - -
- 0% - Functions - 0/26 -
- - -
- 6.38% - Lines - 6/94 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -2471x -1x -1x -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import simplegit, { SimpleGit } from 'simple-git';
-import fs = require('fs-extra');
-import GitIdentity from './GitIdentity';
-const tmp = require('tmp');
- 
-//Git Abstraction
-export default class Git {
-    private _git: SimpleGit;
-    private repositoryLocation: string;
-    private tempRepoLocation: any;
-    private _isATemporaryRepo: boolean = false;
- 
-    private constructor(private projectDir?: string, private logger?: Logger) {
-        if (this.projectDir) {
-            this._git = simplegit(this.projectDir);
-            this.repositoryLocation = this.projectDir;
-        } else {
-            this._git = simplegit();
-            this.repositoryLocation = process.cwd();
-        }
-    }
- 
-    async fetch() {
-        return this._git.fetch('origin');
-    }
- 
-    async getHeadCommit(): Promise<string> {
-        return this._git.revparse(['HEAD']);
-    }
- 
-    async show(options: string[]): Promise<string> {
-        return this._git.show(options);
-    }
- 
-    async tag(options: string[]): Promise<string[]> {
-        let tagResult = await this._git.tag(options);
- 
-        let temp: string[] = tagResult.split('\n');
-        temp.pop();
- 
-        return temp;
-    }
- 
-    async diff(options: string[]): Promise<string[]> {
-        let diffResult = await this._git.diff(options);
- 
-        let temp: string[] = diffResult.split('\n');
-        temp.pop();
- 
-        return temp;
-    }
- 
-    async log(options: string[]): Promise<string[]> {
-        let gitLogResult = await this._git.log(options);
- 
-        return gitLogResult['all'][0]['hash'].split('\n');
-    }
- 
-    public async getRemoteOriginUrl(overrideOriginURL?: string): Promise<string> {
-        let remoteOriginURL;
-        if (!overrideOriginURL) {
-            remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
-            if (!remoteOriginURL) {
-                remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value;
-            }
-            SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG);
-        } else remoteOriginURL = overrideOriginURL;
- 
-        Iif (!remoteOriginURL) throw new Error('Remote origin must be set in repository');
- 
-        return remoteOriginURL;
-    }
- 
-    public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) {
-        try {
-            await new GitIdentity(this._git).setUsernameAndEmail();
-            await this._git.add(pathToFiles);
-            await this._git.commit(message);
-            SFPLogger.log(`Committed File ${pathToFiles}`);
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to commit file, probably due to no change or something else,Please try manually`,
-                LoggerLevel.ERROR
-            );
-            throw error;
-        }
-    }
- 
-    async pushTags(tags?: string[]) {
-        if (!tags) await this._git.pushTags();
-        else {
-            for (let tag of tags) {
-                await this._git.push('origin', tag);
-            }
-        }
-    }
- 
-    async deleteTags(tags?: string[]) {
-        Iif (tags) await this._git.push('origin', '--delete', tags);
-    }
- 
-    async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) {
-        try {
-            await new GitIdentity(this._git).setUsernameAndEmail();
-            if (!commitId) {
-                await this._git.addAnnotatedTag(tagName, annotation);
-            } else {
-                const commands = ['tag', tagName, commitId, '-m', annotation];
-                await this._git.raw(commands);
-            }
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to commit file, probably due to no change or something else,Please try manually`,
-                LoggerLevel.ERROR
-            );
-            throw error;
-        }
-    }
- 
-    public async isBranchExists(branch: string): Promise<boolean> {
-        const listOfBranches = await this._git.branch(['-la']);
- 
-        return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false;
-    }
- 
-    static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise<Git> {
-        let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true });
- 
-        SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger);
-        let repoDir = locationOfCopiedDirectory.name;
- 
-        // Copy source directory to temp dir
-        fs.copySync(process.cwd(), repoDir);
- 
-        //Initiate git on new repo on using the abstracted object
-        let git = new Git(repoDir, logger);
-        git._isATemporaryRepo = true;
-        git.tempRepoLocation = locationOfCopiedDirectory;
- 
-        await git.addSafeConfig(repoDir);
-        await git.getRemoteOriginUrl();
-        await git.fetch();
-        if (branch) {
-            await git.createBranch(branch);
-        }
-        if (commitRef) {
-            await git.checkout(commitRef, true);
-        }
- 
-        SFPLogger.log(
-            `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`,
-            LoggerLevel.INFO,
-            logger
-        );
-        return git;
-    }
- 
-    static async initiateRepo(logger?: Logger, projectDir?: string) {
-        let git = new Git(projectDir, logger);
-        if (projectDir) await git.addSafeConfig(projectDir);
-        else {
-            await git.addSafeConfig(process.cwd());
-        }
-        await git.getRemoteOriginUrl();
-        return git;
-    }
- 
-    public getRepositoryPath() {
-        return this.repositoryLocation;
-    }
- 
-    async deleteTempoRepoIfAny() {
-        Iif (this.tempRepoLocation) this.tempRepoLocation.removeCallback();
-    }
- 
-    async addSafeConfig(repoDir: string) {
-        try
-        {
-        //add workaround for safe directory (https://github.com/actions/runner/issues/2033)
-        await this._git.addConfig('safe.directory', repoDir, false, 'global');
-        }catch(error)
-        {
-            //ignore error
-            SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE)
-        }
-    }
- 
-    async pushToRemote(branch: string, isForce: boolean) {
-        Iif (!branch) branch = (await this._git.branch()).current;
-        SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger);
-        if (process.env.sfp_OVERRIDE_ORIGIN_URL) {
-            await this._git.removeRemote('origin');
-            await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL);
-        }
- 
-        if (isForce) {
-            await this._git.push('origin', branch, [`--force`]);
-        } else {
-            await this._git.push('origin', branch);
-        }
-    }
- 
-    isATemporaryRepo(): boolean {
-        return this._isATemporaryRepo;
-    }
- 
-    async getCurrentCommitId() {
-        return this._git.revparse(['HEAD']);
-    }
- 
-    async checkout(commitRef: string, isForce?: boolean) {
-        if (isForce) {
-            return this._git.checkout(commitRef, [`--force`]);
-        } else return this._git.checkout(commitRef, {});
-    }
- 
-    async checkoutPath(commitRef: string, path: string, isForce?: boolean) {
-        if (isForce) {
-            return this._git.checkout(commitRef, [path, `--force`]);
-        } else return this._git.checkout(commitRef, [path]);
-    }
- 
-    async stageChangedFiles(path: string): Promise<boolean> {
-        try {
-            await this._git.add(path);
-            return true;
-        } catch (error) {
-            SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger);
-            return false;
-        }
-    }
-    async createBranch(branch: string) {
-        if (await this.isBranchExists(branch)) {
-            await this._git.checkout(branch, ['-f']);
-            try {
-                // For ease-of-use when running locally and local branch exists
-                await this._git.merge([`refs/remotes/origin/${branch}`]);
-            } catch (error) {
-                SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger);
-            }
-        } else {
-            await this._git.checkout(['-b', branch]);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html deleted file mode 100644 index a326847ca..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitDiffUtil.ts.html +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - Code coverage report for src/core/git/GitDiffUtil.ts - - - - - - - - - -
-
-

All files / src/core/git GitDiffUtil.ts

-
- -
- 12.67% - Statements - 9/71 -
- - -
- 0% - Branches - 0/14 -
- - -
- 0% - Functions - 0/9 -
- - -
- 12.85% - Lines - 9/70 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -1761x -1x -1x -  -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as path from 'path';
-import * as fs from 'fs-extra';
-import * as _ from 'lodash';
- 
-import { LoggerLevel } from '@salesforce/core';
-import simplegit, { SimpleGit } from 'simple-git';
-import SFPLogger, { Logger } from '@flxblio/sfp-logger';
-const SEP = /\/|\\/;
- 
-export interface DiffFileStatus {
-    revisionFrom: string;
-    revisionTo: string;
-    path: string;
-    renamedPath?: string;
-}
- 
-export interface DiffFile {
-    deleted: DiffFileStatus[];
-    addedEdited: DiffFileStatus[];
-}
- 
-const git: SimpleGit = simplegit();
- 
-export default class GitDiffUtils {
-    private gitTreeRevisionTo: {
-        revision: string;
-        path: string;
-    }[];
- 
-    public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise<boolean> {
-        let fileAsString = await git.show(['--raw', diffFile.revisionFrom]);
-        let result = fileAsString.includes(content);
-        return result;
-    }
- 
-    public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) {
-        SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger);
-        this.gitTreeRevisionTo = [];
-        let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]);
-        const sepRegex = /\n|\r/;
-        let lines = revisionTree.split(sepRegex);
-        for (let i = 0; i < lines.length; i++) {
-            Iif (lines[i] === '') continue;
-            let fields = lines[i].split(/\t/);
-            let pathStr = fields[1];
-            let revisionSha = fields[0].split(/\s/)[2];
-            let fileMetadata = {
-                revision: revisionSha,
-                path: path.join('.', pathStr),
-            };
-            this.gitTreeRevisionTo.push(fileMetadata);
-        }
-        return this.gitTreeRevisionTo;
-    }
- 
-    public async copyFile(filePath: string, outputFolder: string, logger: Logger) {
-        SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger);
-        if (fs.existsSync(path.join(outputFolder, filePath))) {
-            SFPLogger.log(`File ${filePath}  already in output folder. `, LoggerLevel.TRACE, logger);
-            return;
-        }
- 
-        let gitFiles: {
-            revision: string;
-            path: string;
-        }[] = [];
-        this.gitTreeRevisionTo.forEach((file) => {
-            if (file.path === filePath) {
-                gitFiles.push(file);
-            }
-        });
- 
-        Iif(gitFiles.length==0)
-          throw new Error(`Unable to find the required file  ${filePath} in Git.., Did you really commit the file?`)
- 
-        let copyOutputFolder = outputFolder;
-        for (let i = 0; i < gitFiles.length; i++) {
-            outputFolder = copyOutputFolder;
-            let gitFile = gitFiles[i];
- 
-            SFPLogger.log(
-                `Associated file ${i}: ${gitFile.path}  Revision: ${gitFile.revision}`,
-                LoggerLevel.TRACE,
-                logger
-            );
- 
-            let outputPath = path.join(outputFolder, gitFile.path);
- 
-            let filePathParts = gitFile.path.split(SEP);
- 
-            if (fs.existsSync(outputFolder) == false) {
-                fs.mkdirSync(outputFolder);
-            }
-            // Create folder structure
-            for (let i = 0; i < filePathParts.length - 1; i++) {
-                let folder = filePathParts[i].replace('"', '');
-                outputFolder = path.join(outputFolder, folder);
-                if (fs.existsSync(outputFolder) == false) {
-                    fs.mkdirSync(outputFolder);
-                }
-            }
-            let fileContent = await git.binaryCatFile(['-p', gitFile.revision]);
-            fs.writeFileSync(outputPath, fileContent);
-        }
-    }
- 
-    public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) {
-        SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger);
-        if (fs.existsSync(path.join(outputFolder, folderPath))) {
-            SFPLogger.log(`Folder ${folderPath}  already in output folder. `, LoggerLevel.TRACE, logger);
-            return;
-        }
- 
-        this.gitTreeRevisionTo.forEach((file) => {
-            let fileToCompare = file.path;
-            if (fileToCompare.startsWith(folderPath)) {
-                this.copyFile(fileToCompare, outputFolder, logger);
-            }
-        });
-    }
- 
-    public getChangedOrAdded(list1: any[], list2: any[], key: string) {
-        let result: any = {
-            addedEdited: [],
-            deleted: [],
-        };
- 
-        //Ensure array
-        if (!_.isNil(list1) && !Array.isArray(list1)) {
-            list1 = [list1];
-        }
-        if (!_.isNil(list2) && !Array.isArray(list2)) {
-            list2 = [list2];
-        }
- 
-        if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) {
-            result.addedEdited.push(...list2);
-        }
- 
-        if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) {
-            result.deleted.push(...list1);
-        }
- 
-        if (!_.isNil(list1) && !_.isNil(list2)) {
-            list1.forEach((elem1) => {
-                let found = false;
-                for (let i = 0; i < list2.length; i++) {
-                    let elem2 = list2[i];
-                    if (elem1[key] === elem2[key]) {
-                        //check if edited
-                        if (!_.isEqual(elem1, elem2)) {
-                            result.addedEdited.push(elem2);
-                        }
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    result.deleted.push(elem1);
-                }
-            });
- 
-            //Check for added elements
- 
-            let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) {
-                return element1[key] === element2[key];
-            });
- 
-            if (!_.isNil(addedElement)) {
-                result.addedEdited.push(...addedElement);
-            }
-        }
-        return result;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html deleted file mode 100644 index c6699ec0f..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitIdentity.ts.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for src/core/git/GitIdentity.ts - - - - - - - - - -
-
-

All files / src/core/git GitIdentity.ts

-
- -
- 10% - Statements - 1/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/4 -
- - -
- 10% - Lines - 1/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { SimpleGit } from 'simple-git/promise';
- 
-export default class GitIdentity {
-    constructor(private git: SimpleGit) {}
- 
-    async setUsernameAndEmail(): Promise<void> {
-        await this.setUsername();
-        await this.setEmail();
-    }
- 
-    private async setUsername(): Promise<void> {
-        let username: string;
- 
-        if (process.env.sfp_GIT_USERNAME) {
-            username = process.env.sfp_GIT_USERNAME;
-        } else {
-            username = 'sfp';
-        }
- 
-        await this.git.addConfig('user.name', username);
-    }
- 
-    private async setEmail(): Promise<void> {
-        let email: string;
- 
-        if (process.env.sfp_GIT_EMAIL) {
-            email = process.env.sfp_GIT_EMAIL;
-        } else {
-            email = 'sfp@flxblio.io';
-        }
- 
-        await this.git.addConfig('user.email', email);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html deleted file mode 100644 index a0f830cca..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/GitTags.ts.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - Code coverage report for src/core/git/GitTags.ts - - - - - - - - - -
-
-

All files / src/core/git GitTags.ts

-
- -
- 32.78% - Statements - 20/61 -
- - -
- 16.66% - Branches - 2/12 -
- - -
- 33.33% - Functions - 6/18 -
- - -
- 30.18% - Lines - 16/53 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152  -1x -  -1x -3x -  -  -  -  -  -  -  -  -3x -  -  -  -  -  -  -3x -1x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -  -2x -  -2x -2x -  -  -  -24x -  -  -2x -8x -  -  -  -8x -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import Git from './Git';
-import child_process = require('child_process');
- 
-export default class GitTags {
-    constructor(private git: Git, private sfdx_package: string) {}
- 
-    /***
-     * Returns list of sorted tags, belonging to package, that are reachable from HEAD and
-     * follow the first parent on merge commits.
-     * If there are no tags, returns empty array
-     * @param sfdx_package
-     */
-    async listTagsOnBranch(): Promise<string[]> {
-        let tags: string[] = await this.git.tag([
-            `-l`,
-            `${this.sfdx_package}_v*`,
-            `--sort=creatordate`,
-            `--merged`,
-        ]);
- 
-        if (tags.length > 0) return this.filterTagsAgainstBranch(tags);
-        else return tags;
-    }
- 
-    private async filterTagsAgainstBranch(tags: string[]): Promise<string[]> {
-        // Get full-length commit ID's on the current branch, following the first parent on merge commits
-        let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]);
- 
-        // Get the tags' associated commit ID
-        // Dereference (-d) tags into object IDs
-        //TODO: Remove this direct usage
-        let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, {
-            maxBuffer: 5 * 1024 * 1024,
-            stdio: 'pipe',
-            cwd: this.git.getRepositoryPath()
-        });
- 
-        let gitShowRefTags = gitShowRefTagsBuffer.toString();
- 
-        let refTags: string[] = gitShowRefTags.split('\n');
-        refTags.pop(); // Remove last empty element
- 
-        // Filter ref tags, only including tags that point to the branch
-        // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log
-        let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40)));
- 
-        // Only match the name of the tags pointing to the branch
-        refTagsPointingToBranch = refTagsPointingToBranch.map(
-            (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1]
-        );
- 
-        // Filter the sorted tags - only including tags that point to the branch
-        let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag));
- 
-        return tagsPointingToBranch;
-    }
- 
-    public async getVersionFromLatestTag(): Promise<string> {
-        let version: string;
- 
-        let tags = await this.listTagsOnBranch();
-        let latestTag = tags.pop();
-        if (latestTag) {
-            let match: RegExpMatchArray = latestTag.match(
-                /^.*_v(?<version>[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/
-            );
-            if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version);
-            else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`);
-        } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`);
- 
-        return version;
-    }
- 
-    private substituteBuildNumberWithPreRelease(packageVersionNumber: string) {
-        let segments = packageVersionNumber.split('.');
-        //Strip ALIGN
-        if (segments.length == 4 && segments[3].includes('ALIGN')) {
-            segments[3] = segments[3].substring(0, segments[3].indexOf('-'));
-        }
- 
-        if (segments.length === 4) {
-            packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => {
-                if (segmentsIdx === 3) return version + '-' + segment;
-                else return version + '.' + segment;
-            });
-        }
- 
-        return packageVersionNumber;
-    }
- 
- 
-    public async limitTags(limit: number): Promise<string[]>{
-        let rawTags = await this.listTagsOnBranch();
- 
-        if (rawTags.length <= limit) {
-            return [];
-        }
- 
-        const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1);
-        return tags;
-    }
- 
- 
-    public async filteredOldTags(daysToKeep: number, limit?: number): Promise<string[]> {
-        const currentTimestamp = Math.floor(Date.now() / 1000);
- 
-        let rawTags: string[];
-        if (limit) {
-            rawTags = await this.limitTags(limit);
-        } else {
-            rawTags = await this.listTagsOnBranch();
-        }
- 
-        if (rawTags.length < 0) {
-            return [];
-        }
- 
-        let tags: string[] = await this.getTagsWithTimestamps(rawTags);
- 
-        const filteredTags = tags
-          .map(tagStr => {
-            const [name, timestampStr] = tagStr.split(' ');
-            const timestamp = parseInt(timestampStr, 10);
-            return { name, timestamp };
-          })
-          .filter(tag => {
-            const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400;
-            return tag.name && daysSinceTag > daysToKeep;
-          });
- 
-        return filteredTags.map(tag => tag.name);
-    }
- 
-    private async getTagsWithTimestamps(tags: string[]): Promise<string[]> {
-        const timestampPromises: Promise<number>[] = [];
- 
-        // Create an array of promises that will get the tagger date for each tag
-        tags.forEach((tag: string) => {
-        timestampPromises.push(
-            this.git.log(['--format=%at', `refs/tags/${tag}`])
-            .then((output: string[]) => parseInt(output[0].trim(), 10))
-        );
-        });
- 
-        // Wait for all promises to resolve and format the output
-        const timestamps: number[] = await Promise.all(timestampPromises);
-        const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`);
-        return tagsWithTimestamp
-    }
- 
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html deleted file mode 100644 index d13bfd48b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/git/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/core/git - - - - - - - - - -
-
-

All files src/core/git

-
- -
- 14.87% - Statements - 36/242 -
- - -
- 4.87% - Branches - 2/41 -
- - -
- 10.52% - Functions - 6/57 -
- - -
- 14.09% - Lines - 32/227 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
Git.ts -
-
6%6/1000%0/150%0/266.38%6/94
GitDiffUtil.ts -
-
12.67%9/710%0/140%0/912.85%9/70
GitIdentity.ts -
-
10%1/10100%0/00%0/410%1/10
GitTags.ts -
-
32.78%20/6116.66%2/1233.33%6/1830.18%16/53
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html deleted file mode 100644 index c37923a46..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataFiles.ts.html +++ /dev/null @@ -1,1114 +0,0 @@ - - - - - - Code coverage report for src/core/metadata/MetadataFiles.ts - - - - - - - - - -
-
-

All files / src/core/metadata MetadataFiles.ts

-
- -
- 6.43% - Statements - 11/171 -
- - -
- 0% - Branches - 0/25 -
- - -
- 0% - Functions - 0/13 -
- - -
- 6.47% - Lines - 11/170 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344  -1x -1x -1x -1x -1x -1x -1x -1x -  -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
//TODO: Replace with SDR
-import * as path from 'path';
-import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo';
-import FileUtils from '../utils/Fileutils';
-import * as _ from 'lodash';
-import ignore from 'ignore';
-import * as fs from 'fs-extra';
-import ProjectConfig from '../project/ProjectConfig';
-import { globSync } from 'glob';
- 
-const SEP = /\/|\\/;
- 
-export default class MetadataFiles {
-    public static sourceOnly: boolean = false;
-    forceignore: any;
-    public constructor() {
-        if (fs.existsSync('.forceignore')) {
-            this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString());
-        } else {
-            this.forceignore = ignore();
-        }
-    }
-    static getFullApiName(fileName: string): string {
-        let fullName = '';
-        let metadateType = MetadataInfo.getMetadataName(fileName);
-        let splitFilepath = fileName.split(SEP);
-        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType);
-        if (isObjectChild) {
-            let objectName = splitFilepath[splitFilepath.length - 3];
-            let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0];
-            fullName = objectName.concat('.' + fieldName);
-        } else {
-            fullName = splitFilepath[splitFilepath.length - 1].split('.')[0];
-        }
-        return fullName;
-    }
-    static getFullApiNameWithExtension(fileName: string): string {
-        let fullName = '';
-        let metadateType = MetadataInfo.getMetadataName(fileName);
-        let splitFilepath = fileName.split(SEP);
-        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType);
-        if (isObjectChild) {
-            let objectName = splitFilepath[splitFilepath.length - 3];
-            let fieldName = splitFilepath[splitFilepath.length - 1];
-            fullName = objectName.concat('.' + fieldName);
-        } else {
-            fullName = splitFilepath[splitFilepath.length - 1];
-        }
-        return fullName;
-    }
- 
-    public static isCustomMetadata(filepath: string, name: string): boolean {
-        let result = true;
-        let splitFilepath = filepath.split(SEP);
-        let componentName = splitFilepath[splitFilepath.length - 1];
-        componentName = componentName.substring(0, componentName.indexOf('.'));
-        if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) {
-            //Custom Field or Custom Object
-            result = componentName.endsWith('__c') || componentName.endsWith('__mdt');
-        }
-        return result;
-    }
-    public static getMemberNameFromFilepath(filepath: string, name: string): string {
-        let member: string;
-        let splitFilepath = filepath.split(SEP);
-        let lastIndex = splitFilepath.length - 1;
-        let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name);
-        let metadataDescribe: MetadataDescribe = METADATA_INFO[name];
-        if (isObjectChild) {
-            let objectName = splitFilepath[lastIndex - 2];
-            let fieldName = splitFilepath[lastIndex].split('.')[0];
-            member = objectName.concat('.' + fieldName);
-        } else if (metadataDescribe.inFolder) {
-            let baseName = metadataDescribe.directoryName;
-            let baseIndex = filepath.indexOf(baseName) + baseName.length;
-            let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
-            cmpPath = cmpPath.substring(0, cmpPath.indexOf('.'));
-            member = cmpPath.replace(SEP, '/');
-        } else {
-            if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) {
-                member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, '');
-            } else {
-                const auraRegExp = new RegExp('aura');
-                const lwcRegExp = new RegExp('lwc');
-                const staticResourceRegExp = new RegExp('staticresources');
-                const experienceBundleRegExp = new RegExp('experiences');
-                if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) {
-                    member = splitFilepath[lastIndex - 1];
-                } else if (staticResourceRegExp.test(filepath)) {
-                    //Return the fileName
-                    let baseName = 'staticresources';
-                    let baseIndex = filepath.indexOf(baseName) + baseName.length;
-                    let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
-                    member = cmpPath.split(SEP)[0];
-                    let extension = path.parse(member).ext;
- 
-                    member = member.replace(new RegExp(extension + '$'), '');
-                } else if (experienceBundleRegExp.test(filepath)) {
-                    //Return the fileName
-                    let baseName = 'experiences';
-                    let baseIndex = filepath.indexOf(baseName) + baseName.length;
-                    let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator
-                    member = cmpPath.split(SEP)[0];
-                    let extension = path.parse(member).ext;
- 
-                    member = member.replace(new RegExp(extension + '$'), '');
-                } else {
-                    let extension = path.parse(splitFilepath[lastIndex]).ext;
-                    member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), '');
-                }
-            }
-        }
-        return member;
-    }
- 
-    public loadComponents(srcFolder: string, checkIgnore = true): void {
-        var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder);
-        let keys = Object.keys(METADATA_INFO);
-        if (Array.isArray(metadataFiles) && metadataFiles.length > 0) {
-            metadataFiles.forEach((metadataFile) => {
-                let found = false;
- 
-                for (let i = 0; i < keys.length; i++) {
-                    let match = false;
-                    if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) {
-                        match = true;
-                    } else if (
-                        METADATA_INFO[keys[i]].inFolder &&
-                        metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension)
-                    ) {
-                        match = true;
-                    }
-                    if (match) {
-                        if (_.isNil(METADATA_INFO[keys[i]].files)) {
-                            METADATA_INFO[keys[i]].files = [];
-                            METADATA_INFO[keys[i]].components = [];
-                        }
-                        if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) {
-                            METADATA_INFO[keys[i]].files.push(metadataFile);
- 
-                            let name = FileUtils.getFileNameWithoutExtension(
-                                metadataFile,
-                                METADATA_INFO[keys[i]].sourceExtension
-                            );
- 
-                            if (METADATA_INFO[keys[i]].isChildComponent) {
-                                let fileParts = metadataFile.split(SEP);
-                                let parentName = fileParts[fileParts.length - 3];
-                                name = parentName + '.' + name;
-                            }
- 
-                            METADATA_INFO[keys[i]].components.push(name);
-                        }
-                        found = true;
-                        break;
-                    }
-                }
- 
-                if (!found) {
-                    const auraRegExp = new RegExp('aura');
-                    if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) {
-                        if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) {
-                            METADATA_INFO.AuraDefinitionBundle.files = [];
-                            METADATA_INFO.AuraDefinitionBundle.components = [];
-                        }
-                        if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) {
-                            METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile);
- 
-                            let name = FileUtils.getFileNameWithoutExtension(metadataFile);
-                            METADATA_INFO.AuraDefinitionBundle.components.push(name);
-                        }
-                    }
-                }
-            });
-        } else {
-            keys.forEach((key) => {
-                if (_.isNil(METADATA_INFO[key].files)) {
-                    METADATA_INFO[key].files = [];
-                    METADATA_INFO[key].components = [];
-                }
-            });
-        }
-    }
-    //Check if a component is accepted by forceignore.
-    public accepts(filePath: string) {
-        return !this.forceignore.ignores(path.relative(process.cwd(), filePath));
-    }
- 
-    public async isInModuleFolder(filePath: string) {
-        const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path);
-        if (!packageDirectories || packageDirectories.length == 0) {
-            return false;
-        }
-        const moduleFolder = packageDirectories.find((packageFolder) => {
-            let packageFolderNormalized = path.relative('', packageFolder);
-            return filePath.startsWith(packageFolderNormalized);
-        });
-        return moduleFolder !== undefined;
-    }
- 
-    /**
-     * Copy a file to an outpu directory. If the filePath is a Metadata file Path,
-     * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls.
-     * Enforcing the .forceignore to ignire file ignored in the project.
-     * @param filePath
-     * @param outputFolder
-     */
-    public static copyFile(filePath: string, outputFolder: string) {
-        console.log(`Copying file ${filePath} from file system to ${outputFolder}`);
-        const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json'];
-        const pairStatResources = METADATA_INFO.StaticResource.directoryName;
-        const pairStatResourcesRegExp = new RegExp(pairStatResources);
-        const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName);
- 
-        let copyOutputFolder = outputFolder;
- 
-        if (!fs.existsSync(filePath)) {
-            return;
-        }
- 
-        let exists = fs.existsSync(path.join(outputFolder, filePath));
-        if (exists) {
-            return;
-        }
- 
-        if (filePath.startsWith('.')) {
-            let parts = path.parse(filePath);
-            if (parts.dir === '') {
-                fs.copyFileSync(filePath, path.join(outputFolder, filePath));
-                return;
-            }
-        }
- 
-        let fileName = path.parse(filePath).base;
-        //exclude lwc ignored files
-        if (LWC_IGNORE_FILES.includes(fileName)) {
-            return;
-        }
- 
-        let filePathParts = filePath.split(SEP);
- 
-        if (fs.existsSync(outputFolder) == false) {
-            fs.mkdirSync(outputFolder);
-        }
-        // Create folder structure
-        for (let i = 0; i < filePathParts.length - 1; i++) {
-            let folder = filePathParts[i].replace('"', '');
-            outputFolder = path.join(outputFolder, folder);
-            if (fs.existsSync(outputFolder) == false) {
-                fs.mkdirSync(outputFolder);
-            }
-        }
- 
-        // Copy all file with same base name
-        let associatedFilePattern = '';
-        if (SOURCE_EXTENSION_REGEX.test(filePath)) {
-            associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*');
-        } else {
-            let extension = path.parse(filePath).ext;
-            associatedFilePattern = filePath.replace(extension, '.*');
-        }
-        let files = globSync(associatedFilePattern);
-        for (let i = 0; i < files.length; i++) {
-            if (fs.lstatSync(files[i]).isDirectory() == false) {
-                let oneFilePath = path.join('.', files[i]);
-                let oneFilePathParts = oneFilePath.split(SEP);
-                fileName = oneFilePathParts[oneFilePathParts.length - 1];
-                let outputPath = path.join(outputFolder, fileName);
-                fs.copyFileSync(files[i], outputPath);
-            }
-        }
- 
-        // Hadle ObjectTranslations
-        // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied
-        if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) {
-            let parentFolder = filePathParts[filePathParts.length - 2];
-            let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension;
-            let outputPath = path.join(outputFolder, objectTranslation);
-            let sourceFile = filePath.replace(fileName, objectTranslation);
-            if (fs.existsSync(sourceFile) == true) {
-                fs.copyFileSync(sourceFile, outputPath);
-            }
-        }
- 
-        //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED
-        if (pairStatResourcesRegExp.test(filePath)) {
-            outputFolder = path.join('.', copyOutputFolder);
-            let srcFolder = '.';
-            let staticRecourceRoot = '';
-            let resourceFile = '';
-            for (let i = 0; i < filePathParts.length; i++) {
-                outputFolder = path.join(outputFolder, filePathParts[i]);
-                srcFolder = path.join(srcFolder, filePathParts[i]);
-                if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) {
-                    let fileOrDirname = filePathParts[i + 1];
-                    let fileOrDirnameParts = fileOrDirname.split('.');
-                    srcFolder = path.join(srcFolder, fileOrDirnameParts[0]);
-                    outputFolder = path.join(outputFolder, fileOrDirnameParts[0]);
-                    resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension;
-                    METADATA_INFO.StaticResource.sourceExtension;
-                    staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension;
-                    if (fs.existsSync(srcFolder)) {
-                        if (fs.existsSync(outputFolder) == false) {
-                            fs.mkdirSync(outputFolder);
-                        }
-                    }
-                    break;
-                }
-            }
-            if (fs.existsSync(srcFolder)) {
-                FileUtils.copyRecursiveSync(srcFolder, outputFolder);
-            }
-            if (fs.existsSync(resourceFile)) {
-                fs.copyFileSync(resourceFile, staticRecourceRoot);
-            }
-        }
-        //FOR AURA components and LWC components
-        if (pairAuaraRegExp.test(filePath)) {
-            outputFolder = path.join('.', copyOutputFolder);
-            let srcFolder = '.';
-            for (let i = 0; i < filePathParts.length; i++) {
-                outputFolder = path.join(outputFolder, filePathParts[i]);
-                srcFolder = path.join(srcFolder, filePathParts[i]);
-                if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') {
-                    let fileOrDirname = filePathParts[i + 1];
-                    let fileOrDirnameParts = fileOrDirname.split('.');
-                    srcFolder = path.join(srcFolder, fileOrDirnameParts[0]);
-                    outputFolder = path.join(outputFolder, fileOrDirnameParts[0]);
- 
-                    if (fs.existsSync(srcFolder)) {
-                        if (fs.existsSync(outputFolder) == false) {
-                            fs.mkdirSync(outputFolder);
-                        }
-                    }
-                    break;
-                }
-            }
-            if (fs.existsSync(srcFolder)) {
-                FileUtils.copyRecursiveSync(srcFolder, outputFolder);
-            }
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html deleted file mode 100644 index b4b92d17a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/MetadataInfo.ts.html +++ /dev/null @@ -1,727 +0,0 @@ - - - - - - Code coverage report for src/core/metadata/MetadataInfo.ts - - - - - - - - - -
-
-

All files / src/core/metadata MetadataInfo.ts

-
- -
- 61.4% - Statements - 35/57 -
- - -
- 0% - Branches - 0/20 -
- - -
- 75% - Functions - 3/4 -
- - -
- 61.4% - Lines - 35/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215  -1x -1x -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -1x -1x -1x -1x -149x -  -  -1x -1x -  -1x -1x -  -  -149x -  -4x -  -  -  -4x -  -  -  -  -9x -25x -  -9x -9x -9x -9x -9x -9x -9x -9x -9x -  -  -  -149x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -1x - 
//TODO: Replace with SDR
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as fs from 'fs-extra';
- 
-export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/;
-const SPLITED_TYPES = {
-    CustomField: {
-        suffix: 'field',
-        folder: 'fields',
-    },
-    BusinessProcess: {
-        suffix: 'businessProcess',
-        folder: 'businessProcesses',
-    },
-    CompactLayout: {
-        suffix: 'compactLayout',
-        folder: 'compactLayouts',
-    },
-    FieldSet: {
-        suffix: 'fieldSet',
-        folder: 'fieldSets',
-    },
-    RecordType: {
-        suffix: 'recordType',
-        folder: 'recordTypes',
-    },
-    ListView: {
-        suffix: 'listView',
-        folder: 'listViews',
-    },
-    SharingReason: {
-        suffix: 'sharingReason',
-        folder: 'sharingReasons',
-    },
-    ValidationRule: {
-        suffix: 'validationRule',
-        folder: 'validationRules',
-    },
-    WebLink: {
-        suffix: 'webLink',
-        folder: 'webLinks',
-    },
-};
- 
-export interface MetadataDescribe {
-    directoryName?: string;
-    inFolder?: boolean;
-    metaFile?: boolean;
-    suffix?: string;
-    xmlName?: string;
-    sourceExtension?: string;
-    childXmlNames?: string[];
-    folderExtension?: string;
-    files?: string[];
-    components?: string[];
-    isChildComponent?: boolean;
-}
- 
-export interface MetadataInfo {
-    CustomApplication?: MetadataDescribe;
-    ApexClass?: MetadataDescribe;
-    ApexPage?: MetadataDescribe;
-    CustomField?: MetadataDescribe;
-    CustomObject?: MetadataDescribe;
-    CustomPermission?: MetadataDescribe;
-    ExternalDataSource?: MetadataDescribe;
-    ExperienceBundle?: MetadataDescribe;
-    Flow?: MetadataDescribe;
-    RecordType?: MetadataDescribe;
-    ListView?: MetadataDescribe;
-    WebLink?: MetadataDescribe;
-    ValidationRule?: MetadataDescribe;
-    CompactLayout?: MetadataDescribe;
-    BujsinessProcess?: MetadataDescribe;
-    CustomTab?: MetadataDescribe;
-    Layout?: MetadataDescribe;
-    Profile?: MetadataDescribe;
-    Translations?: MetadataDescribe;
-    CustomLabel?: MetadataDescribe;
-    CustomLabels?: MetadataDescribe;
-    GlobalValueSet?: MetadataDescribe;
-    CustomMetadata?: MetadataDescribe;
-    Document?: MetadataDescribe;
-    Queue?: MetadataDescribe;
-    Group?: MetadataDescribe;
-    Role?: MetadataDescribe;
-    Report?: MetadataDescribe;
-    Dashboard?: MetadataDescribe;
-    EmailTemplate?: MetadataDescribe;
-    CustomSite?: MetadataDescribe;
-    PermissionSet?: MetadataDescribe;
-    StaticResource?: MetadataDescribe;
-    CustomObjectTranslation?: MetadataDescribe;
-    AuraDefinitionBundle?: MetadataDescribe;
-    Workflow?: MetadataDescribe;
-    SharingRules?: MetadataDescribe;
-    LightningComponentBundle?: MetadataDescribe;
-}
- 
-export class MetadataInfo {
-    static loadMetadataInfo(): MetadataInfo {
-        let metadataInfo: MetadataInfo = {};
-        let resourcePath = path.join(__dirname, '..', '..', '..', 'resources', 'metadatainfo.json');
-        const fileData = fs.readFileSync(resourcePath, 'utf8');
-        let metadataInfoJSON = JSON.parse(fileData);
-        metadataInfoJSON.metadataObjects.forEach((metadata) => {
-            let metadataDescribe = metadata as MetadataDescribe;
-            if (_.isNil(metadata.suffix)) {
-                if (metadata.xmlName === 'AuraDefinitionBundle') {
-                    metadata.suffix = 'cmp';
-                    metadataDescribe.suffix = 'cmp';
-                } else if (metadata.xmlName == 'LightningComponentBundle') {
-                    metadata.suffix = 'js';
-                    metadataDescribe.suffix = 'js';
-                }
-            }
-            metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`;
-            if (metadata.inFolder) {
-                let folderExtensionPrefix = metadata.suffix;
-                if (_.isNil(metadata.suffix)) {
-                    folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1);
-                }
-                metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`;
-            }
- 
-            //Generate Describe of cheildItems if exists
-            if (!_.isNil(metadata.childXmlNames)) {
-                metadata.childXmlNames.forEach((element) => {
-                    let splitedElement = SPLITED_TYPES[element];
-                    if (!_.isNil(splitedElement)) {
-                        let childDescribe: MetadataDescribe = {};
-                        childDescribe.directoryName = SPLITED_TYPES[element].folder;
-                        childDescribe.suffix = SPLITED_TYPES[element].suffix;
-                        childDescribe.xmlName = element;
-                        childDescribe.inFolder = false;
-                        childDescribe.metaFile = false;
-                        childDescribe.isChildComponent = true;
-                        childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`;
-                        metadataInfo[childDescribe.xmlName] = childDescribe;
-                    }
-                });
-            }
-            metadataInfo[metadataDescribe.xmlName] = metadataDescribe;
-        });
-        return metadataInfo;
-    }
- 
-    static getMetadataName(metadataFile: string, validateSourceExtension = true): string {
-        let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX);
-        let extension = '';
-        if (matcher) {
-            extension = matcher[0];
-        } else {
-            extension = path.parse(metadataFile).ext;
-        }
-        //SfPowerKit.ux.log(extension);
-        let metadataName = '';
- 
-        const auraRegExp = new RegExp('aura');
-        const lwcRegExp = new RegExp('lwc');
-        const staticResourceRegExp = new RegExp('staticresources');
-        const experienceBundleRegExp = new RegExp('experiences');
-        const documentRegExp = new RegExp('documents');
-        if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) {
-            metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName;
-        } else if (
-            lwcRegExp.test(metadataFile) &&
-            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
-        ) {
-            metadataName = METADATA_INFO.LightningComponentBundle.xmlName;
-        } else if (
-            staticResourceRegExp.test(metadataFile) &&
-            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
-        ) {
-            metadataName = METADATA_INFO.StaticResource.xmlName;
-        } else if (
-            experienceBundleRegExp.test(metadataFile) &&
-            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
-        ) {
-            metadataName = METADATA_INFO.ExperienceBundle.xmlName;
-        } else if (
-            documentRegExp.test(metadataFile) &&
-            (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)
-        ) {
-            metadataName = METADATA_INFO.Document.xmlName;
-        } else {
-            let keys = Object.keys(METADATA_INFO);
-            for (let i = 0; i < keys.length; i++) {
-                let metaDescribe = METADATA_INFO[keys[i]];
-                if (
-                    metaDescribe.sourceExtension === extension ||
-                    ('.' + metaDescribe.suffix === extension && !validateSourceExtension) ||
-                    metaDescribe.folderExtension === extension
-                ) {
-                    metadataName = metaDescribe.xmlName;
-                    break;
-                }
-            }
-        }
-        return metadataName;
-    }
-}
- 
-export const METADATA_INFO = MetadataInfo.loadMetadataInfo();
-export const UNSPLITED_METADATA = [
-    METADATA_INFO.Workflow,
-    METADATA_INFO.SharingRules,
-    METADATA_INFO.CustomLabels,
-    METADATA_INFO.Profile,
-    METADATA_INFO.PermissionSet,
-];
- 
-export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet];
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html deleted file mode 100644 index 8e45990c9..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/SettingsFetcher.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/core/metadata/SettingsFetcher.ts - - - - - - - - - -
-
-

All files / src/core/metadata SettingsFetcher.ts

-
- -
- 50% - Statements - 6/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 1/2 -
- - -
- 50% - Lines - 6/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -  -1x -1x -1x -  -1x -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import SFPOrg from '../org/SFPOrg';
-const fs = require('fs-extra');
-import { XMLParser } from 'fast-xml-parser';
-import MetadataFetcher from './MetadataFetcher';
- 
-export default class SettingsFetcher extends MetadataFetcher {
-    constructor(logger: Logger) {
-        super(logger);
-    }
- 
-    public async getSetttingMetadata(org: SFPOrg, setting: string) {
-        SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger);
-        let retriveLocation = (await this.fetchPackageFromOrg(org, {
-            types: { name: 'Settings', members: setting },
-        })).unzippedLocation;
-        let resultFile = `${retriveLocation}/settings/${setting}.settings`;
-        const parser = new XMLParser();
-        let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`];
-        return parsedSettings;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html deleted file mode 100644 index f33f44008..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/metadata/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/metadata - - - - - - - - - -
-
-

All files src/core/metadata

-
- -
- 21.66% - Statements - 52/240 -
- - -
- 0% - Branches - 0/45 -
- - -
- 21.05% - Functions - 4/19 -
- - -
- 21.75% - Lines - 52/239 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
MetadataFiles.ts -
-
6.43%11/1710%0/250%0/136.47%11/170
MetadataInfo.ts -
-
61.4%35/570%0/2075%3/461.4%35/57
SettingsFetcher.ts -
-
50%6/12100%0/050%1/250%6/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html deleted file mode 100644 index 3554dd9a5..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/SFPOrg.ts.html +++ /dev/null @@ -1,898 +0,0 @@ - - - - - - Code coverage report for src/core/org/SFPOrg.ts - - - - - - - - - -
-
-

All files / src/core/org SFPOrg.ts

-
- -
- 34.61% - Statements - 27/78 -
- - -
- 41.17% - Branches - 7/17 -
- - -
- 31.25% - Functions - 5/16 -
- - -
- 37.5% - Lines - 27/72 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -2724x -4x -  -  -4x -4x -4x -4x -  -4x -  -  -  -  -6x -  -6x -  -  -  -  -5x -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3x -  -3x -  -  -  -  -  -  -  -  -  -3x -  -  -3x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -2x -  -  -  -3x -  -3x -  -  -  -  -  -3x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -2x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Org } from '@salesforce/core';
-import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import Package2Detail from '../package/Package2Detail';
-import SfpPackage from '../package/SfpPackage';
-import QueryHelper from '../queryHelper/QueryHelper';
-import { convertUsernameToAlias } from '../utils/AliasList';
-import ObjectCRUDHelper from '../utils/ObjectCRUDHelper';
-import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor';
- 
-export default class SFPOrg extends Org {
-    /**
-     * Get list of all artifacts in an org
-     */
-    public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) {
-        let records=[]
-        try {
-             records = await QueryHelper.query<sfpArtifact2__c>(
-                `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`,
-                this.getConnection(),
-                false
-            );
-            return records;
-        } catch (error) {
-            SFPLogger.log(
-                'Unable to fetch any sfp artifacts in the org\n' +
-                    '1. sfp package is not installed in the org\n' +
-                    '2. The required prerequisite object is not deployed to this org\n',
-                LoggerLevel.WARN,
-                logger
-            );
-        }
-        return records;
-    }
-    /**
-     * Check whether an artifact is installed in a Org
-     * @param  {Logger} logger
-     * @param  {SfpPackage} sfpPackage
-     */
-    public async isArtifactInstalledInOrg(
-        logger: Logger,
-        sfpPackage: SfpPackage
-    ): Promise<{ isInstalled: boolean; versionNumber?: string }> {
-        let result: { isInstalled: boolean; versionNumber?: string } = {
-            isInstalled: false,
-        };
-        try {
-            SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger);
-            result.isInstalled = false;
-            let installedArtifacts = await this.getInstalledArtifacts();
-            let packageName = sfpPackage.packageName;
-            for (const artifact of installedArtifacts) {
-                if (artifact.Name === packageName) {
-                    result.versionNumber = artifact.Version__c;
-                    if (artifact.Version__c === sfpPackage.package_version_number) {
-                        result.isInstalled = true;
-                        return result;
-                    }
-                }
-            }
-        } catch (error) {
-            SFPLogger.log(
-                'Unable to fetch any sfp artifacts in the org\n' +
-                    '1. sfp package is not installed in the org\n' +
-                    '2. The required prerequisite object is not deployed to this org\n',
-                LoggerLevel.WARN,
-                logger
-            );
-        }
-        return result;
-    }
-    /**
-     * Updates or Create information about an artifact in the org
-     * @param  {Logger} logger
-     * @param  {SfpPackage} sfpPackage
-     */
-    public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise<string> {
-        let artifactId = await this.getArtifactRecordId(sfpPackage);
- 
-        SFPLogger.log(
-            COLOR_KEY_MESSAGE(
-                `Existing artifact record id for ${sfpPackage.packageName} in Org for ${
-                    sfpPackage.package_version_number
-                }: ${artifactId ? artifactId : 'N/A'}`
-            ),
-            LoggerLevel.INFO,
-            logger
-        );
- 
-        let packageName = sfpPackage.package_name;
- 
-        if (artifactId == null) {
-            artifactId = await ObjectCRUDHelper.createRecord(
-                this.getConnection(),
-                'sfpArtifact2__c',
-                {
-                    Name: packageName,
-                    Tag__c: sfpPackage.tag,
-                    Version__c: sfpPackage.package_version_number,
-                    CommitId__c: sfpPackage.sourceVersion,
-                }
-            );
-        } else {
-            artifactId = await ObjectCRUDHelper.updateRecord(
-                this.getConnection(),
-                'sfpArtifact2__c',
-                {
-                    Id: artifactId,
-                    Name: packageName,
-                    Tag__c: sfpPackage.tag,
-                    Version__c: sfpPackage.package_version_number,
-                    CommitId__c: sfpPackage.sourceVersion,
-                }
-            );
-        }
- 
-        SFPLogger.log(
-            COLOR_KEY_MESSAGE(
-                `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${
-                    artifactId ? artifactId : ''
-                }`
-            ),
-            LoggerLevel.INFO,
-            logger
-        );
-        return artifactId;
-    }
- 
-    private async getArtifactRecordId(sfpPackage: SfpPackage): Promise<string> {
-        let installedArtifacts = await this.getInstalledArtifacts();
- 
-        let packageName = sfpPackage.packageName;
-        for (const artifact of installedArtifacts) {
-            if (artifact.Name === packageName) {
-                return artifact.Id;
-            }
-        }
-        return null;
-    }
-    /**
-     * Retrieves all packages(recognized by Salesforce) installed in the org
-     */
-    public async getAllInstalled2GPPackages(): Promise<Package2Detail[]> {
-        const installedPackages: Package2Detail[] = [];
- 
-        let records = await InstalledPackagesQueryExecutor.exec(this.getConnection());
- 
-        records.forEach((record) => {
-            let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`;
- 
-            let packageDetails: Package2Detail = {
-                name: record.SubscriberPackage.Name,
-                package2Id: record.SubscriberPackageId,
-                namespacePrefix: record.SubscriberPackage.NamespacePrefix,
-                subscriberPackageVersionId: record.SubscriberPackageVersion.Id,
-                versionNumber: packageVersionNumber,
-                type: record.SubscriberPackageVersion.Package2ContainerOptions,
-                isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent,
-            };
- 
-            installedPackages.push(packageDetails);
-        });
- 
-        return installedPackages;
-    }
- 
-    /**
-     * Retrives all managed packages in the org
-     */
-    public async getAllInstalledManagedPackages(): Promise<Package2Detail[]> {
-        const installedPackages = await this.getAllInstalled2GPPackages();
-        return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed');
-    }
-    /**
-     *  List all the packages created in DevHub, will throw an error, if its not a DevHub
-     */
-    public async listAllPackages() {
-        if (await this.determineIfDevHubOrg(true)) {
-            let records = await QueryHelper.query<PackageTypeInfo>(packageQuery, this.getConnection(), true);
-            records.forEach((record) => {
-                record.IsOrgDependent =
-                    record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No';
-            });
- 
-            return records;
-        } else Ethrow new Error('Package Type Information can only be fetched from a DevHub');
-    }
- 
-    public async getAlias(): Promise<string> {
-        return await convertUsernameToAlias(this.getUsername());
-    }
- 
-    /**
-     *  Return all artifacts including sfp as well as external unlocked/managed
-     */
-    public async getAllInstalledArtifacts():Promise<InstalledArtifact[]> {
-        let artifacts = await this.getInstalledArtifacts(`Name`);
-        let installedArtifacts: InstalledArtifact[]=[];
-        let installed2GPPackages = await this.getAllInstalled2GPPackages();
- 
-        artifacts.forEach((artifact) => {
-            let installedArtifact: InstalledArtifact = {
-                name: artifact.Name,
-                version: artifact.Version__c,
-                commitId:artifact.CommitId__c,
-                isInstalledBysfp: true,
-            };
-            let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name);
-            if (packageFound) {
-                installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId;
-                if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`;
-                else installedArtifact.type = `Unlocked`;
-            } else {
-                installedArtifact.subscriberVersion = `N/A`;
-                installedArtifact.type = `Source/Data`;
-            }
-            installedArtifacts.push(installedArtifact);
-        });
- 
-        installed2GPPackages.forEach((installed2GPPackage) => {
-            let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name);
-            if (!packageFound) {
-                let installedArtifact: InstalledArtifact = {
-                    name: installed2GPPackage.name,
-                    version: installed2GPPackage.versionNumber,
-                    commitId: `N/A`,
-                };
-                if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`;
-                else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`;
-                else installedArtifact.type = `Unlocked`;
- 
-                installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId;
-                installedArtifact.isInstalledBysfp = false;
-                installedArtifacts.push(installedArtifact);
-            }
-        });
-        return installedArtifacts;
-    }
-}
- 
-const packageQuery =
-    'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' +
-    'FROM Package2 ' +
-    'WHERE IsDeprecated != true ' +
-    'ORDER BY NamespacePrefix, Name';
- 
- 
-export interface InstalledArtifact {
-    name: string;
-    version: string;
-    commitId?: string;
-    subscriberVersion?: string;
-    type?: string;
-    isInstalledBysfp?: boolean;
-}
- 
-export interface sfpArtifact2__c {
-    Id?: string;
-    Name: string;
-    Tag__c: string;
-    Version__c: string;
-    CommitId__c: string;
-}
- 
-export interface PackageTypeInfo {
-    Id: string;
-    Name: string;
-    Description: string;
-    NamespacePrefix: string;
-    ContainerOptions: string;
-    IsOrgDependent: boolean | string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html deleted file mode 100644 index 28e9e7a85..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/org - - - - - - - - - -
-
-

All files src/core/org

-
- -
- 34.61% - Statements - 27/78 -
- - -
- 41.17% - Branches - 7/17 -
- - -
- 31.25% - Functions - 5/16 -
- - -
- 37.5% - Lines - 27/72 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
SFPOrg.ts -
-
34.61%27/7841.17%7/1731.25%5/1637.5%27/72
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html deleted file mode 100644 index a40d88bea..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - Code coverage report for src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts - - - - - - - - - -
-
-

All files / src/core/org/packageQuery InstalledPackagesQueryExecutor.ts

-
- -
- 50% - Statements - 2/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 50% - Lines - 2/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15  -4x -  -4x -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import QueryHelper from '../../queryHelper/QueryHelper';
- 
-export default class InstalledPackagesQueryExecutor {
-    static async exec(conn: Connection) {
-        const installedPackagesQuery =
-            'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' +
-            'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' +
-            'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' +
-            'ORDER BY SubscriberPackageId';
- 
-        return QueryHelper.query<any>(installedPackagesQuery, conn, true);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html deleted file mode 100644 index bb8791528..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/org/packageQuery/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/org/packageQuery - - - - - - - - - -
-
-

All files src/core/org/packageQuery

-
- -
- 50% - Statements - 2/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 50% - Lines - 2/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
InstalledPackagesQueryExecutor.ts -
-
50%2/4100%0/00%0/150%2/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html deleted file mode 100644 index fc657e941..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackage.ts.html +++ /dev/null @@ -1,514 +0,0 @@ - - - - - - Code coverage report for src/core/package/SfpPackage.ts - - - - - - - - - -
-
-

All files / src/core/package SfpPackage.ts

-
- -
- 47.82% - Statements - 11/23 -
- - -
- 100% - Branches - 2/2 -
- - -
- 50% - Functions - 4/8 -
- - -
- 47.82% - Lines - 11/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -14413x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -13x -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -8x -  -  -  -7x -  -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -13x -13x -13x -13x -13x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import _ from 'lodash';
-import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher';
- 
-export type ApexClasses = Array<string>;
- 
-class PackageInfo {
-    id?: string;
-    package_name: string;
-    package_version_number?: string;
-    package_version_id?: string;
-    package_type?: string;
-    test_coverage?: number;
-    has_passed_coverage_check?: boolean;
-    repository_url?: string;
-    sourceVersion?: string;
-    branch?: string;
-    apextestsuite?: string;
-    isApexFound?: boolean;
-    assignPermSetsPreDeployment?: string[];
-    assignPermSetsPostDeployment?: string[];
-    apexTestClassses?: string[];
-    isPickListsFound?: boolean;
-    isTriggerAllTests?: boolean;
-    isProfilesFound?: boolean;
-    isPermissionSetGroupFound?: boolean;
-    isPromoted?: boolean;
-    tag?: string;
-    isDependencyValidated?: boolean;
-    destructiveChanges?: any;
-    destructiveChangesPath?: string;
-    payload?: any;
-    metadataCount?: number;
-    sourceDir?: string;
-    dependencies?: any;
-    reconcileProfiles?: boolean;
-    isPayLoadContainTypesSupportedByProfiles?: boolean;
-    creation_details?: { creation_time?: number; timestamp?: number };
-    deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[];
-    apiVersion?: string;
-    postDeploymentScript?: string;
-    preDeploymentScript?: string;
-    apexClassWithOutTestClasses?: ApexClasses;
-    triggers?: ApexClasses;
-    configFilePath?: string;
-    packageDescriptor?: any;
-    commitSHAFrom?:string;
-    commitSHATo?:string;
-    packageDirectory?: string;
-    apexClassesSortedByTypes?: ApexSortedByType;
-    projectConfig?: any;
-    changelogFilePath?: string;
-}
- 
-export default class SfpPackage extends PackageInfo {
-    public projectDirectory: string;
-    public workingDirectory: string;
-    public mdapiDir: string;
-    public destructiveChangesPath: string;
-    public resolvedPackageDirectory: string;
- 
-    public version: string = '5';
- 
-    //Just a few helpers to resolve api differene
-    public get packageName(): string {
-        return this.package_name;
-    }
- 
-    public get versionNumber(): string {
-        return this.package_version_number;
-    }
- 
-    public set versionNumber(versionNumber:string)
-    {
-        this.package_version_number = versionNumber;
-    }
- 
-    public get packageType(): string {
-        return this.package_type.toLocaleLowerCase();
-    }
- 
-    public set packageType(packageType: string) {
-        this.package_type = packageType;
-    }
-    /**
-     * Do not use this constructor directly, use SfPPackageBuilder
-     * to build a package
-     *
-     */
-    public constructor() {
-        super();
-    }
- 
-    toJSON(): PackageInfo {
-        let castToPackageMetadata = _.cloneDeep(this);
-        delete castToPackageMetadata.workingDirectory;
-        delete castToPackageMetadata.mdapiDir;
-        delete castToPackageMetadata.projectConfig;
-        delete castToPackageMetadata.packageDescriptor;
-        delete castToPackageMetadata.projectDirectory;
-        delete castToPackageMetadata.resolvedPackageDirectory;
-        delete castToPackageMetadata.isTriggerAllTests;
-        return castToPackageMetadata;
-    }
-}
- 
- 
-export enum PackageType {
-    Unlocked = "unlocked",
-    Source = "source",
-    Data = "data",
-    Diff = "diff"
-}
- 
-export interface DiffPackageMetadata {
- 
- 
-    sourceVersionFrom?: string;
-    sourceVersionTo?: string;
-    isProfilesFound?: boolean;
-    apexTestClassses?: string[];
-    isApexFound?: boolean;
-    isPicklistFound?: boolean;
-    isPermissionSetGroupFound?: boolean;
-    isPermissionSetFound?: boolean;
-    payload?: any;
-    metadataCount?: number;
-    profilesToReconcile?: number;
-    destructiveChanges?: any;
-    sourceDir?: string;
-    invalidatedTestClasses?: ApexClasses;
-    isPayLoadContainTypesSupportedByProfiles?:boolean;
-}
-export interface SfpPackageParams {
-    overridePackageTypeWith?: string;
-    branch?: string;
-    packageVersionNumber?: string;
-    repositoryUrl?: string;
-    sourceVersion?: string;
-    configFilePath?: string;
-    pathToReplacementForceIgnore?: string;
-    revisionFrom?: string;
-    revisionTo?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html deleted file mode 100644 index d95dcd7c0..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/SfpPackageBuilder.ts.html +++ /dev/null @@ -1,919 +0,0 @@ - - - - - - Code coverage report for src/core/package/SfpPackageBuilder.ts - - - - - - - - - -
-
-

All files / src/core/package SfpPackageBuilder.ts

-
- -
- 22.42% - Statements - 24/107 -
- - -
- 0% - Branches - 0/19 -
- - -
- 0% - Functions - 0/6 -
- - -
- 23.52% - Lines - 24/102 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -2791x -1x -1x -1x -1x -1x -1x -1x -1x -  -1x -  -1x -1x -1x -1x -1x -1x -1x -  -1x -1x -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher';
-import ProjectConfig from '../project/ProjectConfig';
-import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator';
-import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor';
-import PackageManifest from './components/PackageManifest';
-import MetadataCount from './components/MetadataCount';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import * as fs from 'fs-extra';
-import path from 'path';
-import { Artifact } from '../artifacts/ArtifactFetcher';
-import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage';
-import PropertyFetcher from './propertyFetchers/PropertyFetcher';
-import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher';
-import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher';
-import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher';
-import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl';
-import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl';
-import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl';
-import lodash = require('lodash');
-import { EOL } from 'os';
-import PackageVersionUpdater from './version/PackageVersionUpdater';
-import { AnalyzerRegistry } from './analyser/AnalyzerRegistry';
-import { ComponentSet } from '@salesforce/source-deploy-retrieve';
-import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl';
-import { COLOR_WARNING } from '@flxblio/sfp-logger';
- 
-export default class SfpPackageBuilder {
-    public static async buildPackageFromProjectDirectory(
-        logger: Logger,
-        projectDirectory: string,
-        sfdx_package: string,
-        params?: SfpPackageParams,
-        packageCreationParams?: PackageCreationParams,
-        projectConfig?: any
-    ) {
-        if (!projectConfig) {
-            projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
-        } else {
-            // Clone the projectConfig to prevent mutation
-            projectConfig = lodash.cloneDeep(projectConfig);
-        }
- 
-        let propertyFetchers: PropertyFetcher[] = [
-            new AssignPermissionSetFetcher(),
-            new DestructiveManifestPathFetcher(),
-            new ReconcilePropertyFetcher(),
-        ];
- 
-        let startTime = Date.now;
-        let sfpPackage: SfpPackage = new SfpPackage();
-        sfpPackage.package_name = sfdx_package;
-        sfpPackage.projectConfig = projectConfig;
-        sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion;
-        sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(
-            sfdx_package,
-            sfpPackage.projectConfig
-        );
-        sfpPackage.projectDirectory = projectDirectory?projectDirectory:'';
-        sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path;
-        //Set Default Version Number
-        sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber;
- 
-        //set additional options
-        sfpPackage.sourceVersion = params?.sourceVersion;
-        sfpPackage.branch = params?.branch;
-        sfpPackage.repository_url = params?.repositoryUrl;
-        if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json';
-        else sfpPackage.configFilePath = params?.configFilePath;
- 
-        for (const propertyFetcher of propertyFetchers) {
-            await propertyFetcher.getsfpProperties(sfpPackage, logger);
-        }
- 
-        //Get Package Type
-        sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package);
- 
-        sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams);
- 
-        // Requires destructiveChangesPath which is set by the property fetcher
-        sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory(
-            logger,
-            sfpPackage.projectDirectory,
-            sfpPackage.projectConfig,
-            sfpPackage.packageName,
-            sfpPackage.packageDescriptor.path,
-            sfpPackage.versionNumber,
-            sfpPackage.destructiveChangesPath,
-            sfpPackage.configFilePath,
-            params?.pathToReplacementForceIgnore
-        );
- 
-        sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path);
- 
-        //Don't proceed further if packageType is Data
-        if (sfpPackage.package_type != PackageType.Data) {
-            let sourceToMdapiConvertor = new SourceToMDAPIConvertor(
-                sfpPackage.workingDirectory,
-                sfpPackage.packageDescriptor.path,
-                ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion,
-                logger
-            );
-            sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath;
-            const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir);
- 
-            sfpPackage.payload = packageManifest.manifestJson;
-            sfpPackage.triggers = packageManifest.fetchTriggers();
-            sfpPackage.isApexFound = packageManifest.isApexInPackage();
-            sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage();
-            sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage();
-            sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles();
- 
-            let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir);
-            sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType();
-            sfpPackage.apexTestClassses = apexFetcher.getTestClasses();
-            sfpPackage.metadataCount = await MetadataCount.getMetadataCount(
-                sfpPackage.workingDirectory,
-                sfpPackage.packageDescriptor.path
-            );
-            sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces();
- 
-            sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger);
- 
-            //Load component Set
-            let componentSet = ComponentSet.fromSource(
-                path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory)
-            );
- 
-            //Run through all analyzers
-            let analyzers = AnalyzerRegistry.getAnalyzers();
-            for (const analyzer of analyzers) {
-                Iif (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger);
-            }
-        }
- 
-        //Create the actual package
-        let createPackage;
- 
-        Iif (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true };
- 
-        let packageType = sfpPackage.package_type;
-        Iif (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase();
- 
-        //Get Implementors
-        switch (packageType) {
-            case PackageType.Unlocked:
-                createPackage = new CreateUnlockedPackageImpl(
-                    sfpPackage.workingDirectory,
-                    sfpPackage,
-                    packageCreationParams,
-                    logger,
-                    params
-                );
-                break;
-            case PackageType.Source:
-                createPackage = new CreateSourcePackageImpl(
-                    sfpPackage.workingDirectory,
-                    sfpPackage,
-                    packageCreationParams,
-                    logger,
-                    params
-                );
-                break;
-            case PackageType.Data:
-                createPackage = new CreateDataPackageImpl(
-                    sfpPackage.workingDirectory,
-                    sfpPackage,
-                    packageCreationParams,
-                    logger,
-                    params
-                );
-                break;
-            case PackageType.Diff:
-                packageCreationParams.revisionFrom = params.revisionFrom;
-                packageCreationParams.revisionTo = params.revisionTo; 
-                createPackage = new CreateDiffPackageImp(
-                    sfpPackage.workingDirectory,
-                    sfpPackage,
-                    packageCreationParams,
-                    logger,
-                    params
-                );
-                break;
-        }
- 
-        return createPackage.exec();
-    }
- 
-    /*
-     *  Handle version Numbers of package
-     *  If VersionNumber is explcitly passed, use that
-     * else allow autosubstitute using buildNumber for Source and Data if available
-     */
-    private static handleVersionNumber(
-        params: SfpPackageParams,
-        sfpPackage: SfpPackage,
-        packageCreationParams: PackageCreationParams
-    ) {
-        if (params?.packageVersionNumber) {
-            sfpPackage.versionNumber = params.packageVersionNumber;
-        } else if (packageCreationParams?.buildNumber) {
-            if (sfpPackage.packageType != PackageType.Unlocked) {
-                let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater();
-                sfpPackage.versionNumber = versionUpdater.substituteBuildNumber(
-                    sfpPackage,
-                    packageCreationParams.buildNumber
-                );
-            }
-        } else {
-            sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber;
-        }
-        return sfpPackage;
-    }
- 
-    public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise<SfpPackage> {
-        //Read artifact metadata
-        let sfpPackage = new SfpPackage();
-        Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' }));
-        sfpPackage.sourceDir = artifact.sourceDirectoryPath;
-        sfpPackage.changelogFilePath = artifact.changelogFilePath;
- 
-        sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath);
-        sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(
-            artifact.sourceDirectoryPath,
-            sfpPackage.package_name
-        );
-        sfpPackage.projectDirectory = artifact.sourceDirectoryPath;
-        sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path;
-        sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger);
- 
-        return sfpPackage;
-    }
- 
-  
- 
-    private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) {
-        if (
-            this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false ||
-            (sfpPackage.packageType == PackageType.Source &&
-                sfpPackage.isApexFound == true &&
-                sfpPackage.apexTestClassses == null)
-        ) {
-            SFPLogger.printHeaderLine('WARNING!  NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger);
-            SFPLogger.log(
-                    `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` +
-                    `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` +
-                    `via triggering all local tests,This definitely is not optimal approach on large orgs` +
-                    `Please consider adding test classes for the classes in the package`,
-                LoggerLevel.INFO,
-                logger
-            );
-            SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger);
-            return true;
-        } else return false;
-    }
- 
-    // Allow individual packages to use non optimized path
-    private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean {
-        if (pkgDescriptor['isOptimizedDeployment'] == null) return true;
-        else return pkgDescriptor['isOptimizedDeployment'];
-    }
-}
- 
-// Options while creating package
-export class PackageCreationParams {
-    breakBuildIfEmpty: boolean = true;
-    devHub?: string;
-    installationkeybypass?: boolean;
-    installationkey?: string;
-    waitTime?: string;
-    isCoverageEnabled?: boolean;
-    isSkipValidation?: boolean;
-    isComputeDiffPackage?: boolean;
-    baseBranch?: string;
-    buildNumber?: string;
-    useSelectiveBuildOnly?: boolean;
-    revisionFrom?:string;
-    revisionTo?:string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html deleted file mode 100644 index d7a4ed43d..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/AnalyzerRegistry.ts.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Code coverage report for src/core/package/analyser/AnalyzerRegistry.ts - - - - - - - - - -
-
-

All files / src/core/package/analyser AnalyzerRegistry.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 33.33% - Lines - 4/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -211x -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import FHTAnalyser from './FHTAnalyzer';
-import FTAnalyser from './FTAnalyzer';
-import { PackageAnalyzer } from './PackageAnalyzer';
-import PicklistAnalyzer from './PicklistAnalyzer';
- 
-export class AnalyzerRegistry {
-    static getAnalyzers(): PackageAnalyzer[] {
-        let packageAnalyzers: PackageAnalyzer[] = [];
- 
-        //TODO: Make dynamic
-        let fhtAnalyzer = new FHTAnalyser();
-        let ftAnalyser = new FTAnalyser();
-        let picklistAnalyzer = new PicklistAnalyzer();
-        packageAnalyzers.push(fhtAnalyzer);
-        packageAnalyzers.push(ftAnalyser);
-        packageAnalyzers.push(picklistAnalyzer);
- 
-        return packageAnalyzers;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html deleted file mode 100644 index 81ab4b224..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FHTAnalyzer.ts.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - Code coverage report for src/core/package/analyser/FHTAnalyzer.ts - - - - - - - - - -
-
-

All files / src/core/package/analyser FHTAnalyzer.ts

-
- -
- 88.88% - Statements - 24/27 -
- - -
- 100% - Branches - 3/3 -
- - -
- 75% - Functions - 3/4 -
- - -
- 88% - Lines - 22/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -772x -2x -2x -2x -2x -  -2x -  -2x -  -  -  -  -  -  -  -  -  -  -4x -  -  -4x -  -  -  -  -  -  -  -  -  -3x -  -  -  -  -4x -  -  -4x -4x -  -  -  -  -  -4x -  -  -  -  -  -  -4x -  -  -  -  -  -  -3x -  -2x -2x -2x -  -  -4x -  -  -  -3x -1x -  -  - 
import path from 'path';
-import * as fs from 'fs-extra';
-import * as yaml from 'js-yaml';
-import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
-import SfpPackage, { PackageType } from '../SfpPackage';
-import { PackageAnalyzer } from './PackageAnalyzer';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
- 
-export default class FHTAnalyser implements PackageAnalyzer {
-   
-   public getName() {
-       return "Field History Tracking Analyzer"
-    }
- 
-    
- 
-    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
-        try {
- 
-            let fhtFields: { [key: string]: Array<string> } = {};
- 
-            //read the yaml
-            let fhtYamlPath = path.join(
-                sfpPackage.workingDirectory,
-                sfpPackage.projectDirectory,
-                sfpPackage.packageDirectory,
-                '/postDeploy/history-tracking.yml'
-            );
- 
-            //read components mentioned in yaml
-            if (fs.existsSync(fhtYamlPath)) {
-                //convert yaml to json
-                fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]};
-            }
- 
- 
-            //filter the components in the package
-            fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet);
- 
-            if (Object.keys(fhtFields).length>0) {
-                sfpPackage['isFHTFieldFound'] = true;
-                sfpPackage['fhtFields'] = fhtFields;
-            }
-        } catch (error) {
-            //Ignore error for now
-            SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger);
-        }
-        return sfpPackage;
-    }
- 
-    private async addFieldsFromComponentSet(
-        fhtFields: { [key: string]: Array<string> },
-        componentSet: ComponentSet
-    ): Promise<Record<string, Array<string>>> {
-        let sourceComponents = componentSet.getSourceComponents().toArray();
- 
-        for (const sourceComponent of sourceComponents) {
-            if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) {
-                continue;
-            }
- 
-            let customField = sourceComponent.parseXmlSync().CustomField;
-            if (customField['trackHistory'] == 'true') {
-                let objName = sourceComponent.parent.fullName;
-                if (!fhtFields[objName]) fhtFields[objName] = [];
-                fhtFields[objName].push(sourceComponent.name);
-            }
-        }
-        return fhtFields;
-    }
- 
-    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
-        if (sfpPackage.packageType != PackageType.Data) return true;
-        else return false;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html deleted file mode 100644 index 3e5afcd7b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/FTAnalyzer.ts.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - Code coverage report for src/core/package/analyser/FTAnalyzer.ts - - - - - - - - - -
-
-

All files / src/core/package/analyser FTAnalyzer.ts

-
- -
- 88.88% - Statements - 24/27 -
- - -
- 100% - Branches - 3/3 -
- - -
- 75% - Functions - 3/4 -
- - -
- 88% - Lines - 22/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -752x -2x -2x -2x -2x -  -2x -  -2x -  -  -  -  -  -  -  -  -4x -  -  -4x -  -  -  -  -  -  -  -  -  -3x -  -  -  -  -4x -  -  -4x -4x -  -  -  -  -  -4x -  -  -  -  -  -  -4x -  -  -  -  -  -  -3x -  -2x -2x -2x -  -  -4x -  -  -  -3x -1x -  -  - 
import path from 'path';
-import * as fs from 'fs-extra';
-import * as yaml from 'js-yaml';
-import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
-import SfpPackage, { PackageType } from '../SfpPackage';
-import { PackageAnalyzer } from './PackageAnalyzer';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
- 
-export default class FTAnalyser implements PackageAnalyzer {
- 
-    public getName(): string {
-        return "Feed Tracking Analyzer";
-    };
- 
-    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
-        try {
- 
-            let ftFields: { [key: string]: Array<string> } = {};
- 
-            //read the yaml
-            let ftYamlPath = path.join(
-                sfpPackage.workingDirectory,
-                sfpPackage.projectDirectory,
-                sfpPackage.packageDirectory,
-                '/postDeploy/feed-tracking.yml'
-            );
- 
-            //read components mentioned in yaml
-            if (fs.existsSync(ftYamlPath)) {
-                //convert yaml to json
-                ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]};
-            }
- 
- 
-            //filter the components in the package
-            ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet);
- 
-            if (Object.keys(ftFields).length>0) {
-                sfpPackage['isFTFieldFound'] = true;
-                sfpPackage['ftFields'] = ftFields;
-            }
-        } catch (error) {
-            //Ignore error for now
-            SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger);
-        }
-        return sfpPackage;
-    }
- 
-    private async addFieldsFromComponentSet(
-        ftFields: { [key: string]: Array<string> },
-        componentSet: ComponentSet
-    ): Promise<Record<string, Array<string>>> {
-        let sourceComponents = componentSet.getSourceComponents().toArray();
- 
-        for (const sourceComponent of sourceComponents) {
-            if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) {
-                continue;
-            }
- 
-            let customField = sourceComponent.parseXmlSync().CustomField;
-            if (customField['trackFeedHistory'] == 'true') {
-                let objName = sourceComponent.parent.fullName;
-                if (!ftFields[objName]) ftFields[objName] = [];
-                ftFields[objName].push(sourceComponent.name);
-            }
-        }
-        return ftFields;
-    }
- 
-    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
-        if (sfpPackage.packageType != PackageType.Data) return true;
-        else return false;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html deleted file mode 100644 index 9cc8a8baf..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/PicklistAnalyzer.ts.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/core/package/analyser/PicklistAnalyzer.ts - - - - - - - - - -
-
-

All files / src/core/package/analyser PicklistAnalyzer.ts

-
- -
- 23.52% - Statements - 4/17 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/3 -
- - -
- 25% - Lines - 4/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -531x -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
-import SfpPackage, { PackageType } from '../SfpPackage';
-import { PackageAnalyzer } from './PackageAnalyzer';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
- 
-export default class PicklistAnalyzer implements PackageAnalyzer {
- 
-    public getName() {
-        return "Picklist Analyzer"
-     }
- 
-     
-     
-    public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise<SfpPackage> {
-        try {
-            let sourceComponents = componentSet.getSourceComponents().toArray();
-            let components = [];
- 
-            for (const sourceComponent of sourceComponents) {
-                if (sourceComponent.type.name == registry.types.customobject.name) {
-                    //issues/1367
-                    //this can add child elements that are not custom fields..
-                    components.push(...sourceComponent.getChildren());
-                }
- 
-                if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) {
-                    components.push(sourceComponent);
-                }
-            }
- 
-            if (components) {
-                for (const fieldComponent of components) {
-                    let customField = fieldComponent.parseXmlSync().CustomField;
-                    //issues/1367
-                    //if the component isn't a field customField will be undefined..so check
-                    if (customField && customField['type'] == 'Picklist') {
-                        sfpPackage.isPickListsFound= true;
-                        break;
-                    }
-                }
-            }
-        } catch (error) {
-            SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger);
-        }
-        return sfpPackage;
-    }
- 
-    public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise<boolean> {
-        if (sfpPackage.packageType != PackageType.Data) return true;
-        else return false;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html deleted file mode 100644 index a5dc40752..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/analyser/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/core/package/analyser - - - - - - - - - -
-
-

All files src/core/package/analyser

-
- -
- 67.46% - Statements - 56/83 -
- - -
- 60% - Branches - 6/10 -
- - -
- 50% - Functions - 6/12 -
- - -
- 66.66% - Lines - 52/78 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
AnalyzerRegistry.ts -
-
33.33%4/12100%0/00%0/133.33%4/12
FHTAnalyzer.ts -
-
88.88%24/27100%3/375%3/488%22/25
FTAnalyzer.ts -
-
88.88%24/27100%3/375%3/488%22/25
PicklistAnalyzer.ts -
-
23.52%4/170%0/40%0/325%4/16
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html deleted file mode 100644 index 32b806077..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageManifest.ts.html +++ /dev/null @@ -1,898 +0,0 @@ - - - - - - Code coverage report for src/core/package/components/PackageManifest.ts - - - - - - - - - -
-
-

All files / src/core/package/components PackageManifest.ts

-
- -
- 82.08% - Statements - 55/67 -
- - -
- 50% - Branches - 2/4 -
- - -
- 93.33% - Functions - 14/15 -
- - -
- 81.81% - Lines - 54/66 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -2722x -2x -  -2x -2x -  -2x -  -  -  -  -  -  -  -3x -  -  -  -  -  -  -3x -  -  -  -  -  -  -  -  -  -  -6x -  -6x -  -6x -6x -  -6x -  -  -  -  -  -  -  -  -  -6x -  -6x -  -  -  -  -  -6x -150x -  -  -6x -  -  -42x -  -  -  -42x -  -  -  -6x -  -  -  -6x -  -  -  -6x -6x -  -6x -  -  -  -  -  -  -  -  -1x -1x -  -1x -  -  -  -1x -  -1x -  -  -  -  -  -  -  -2x -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -1x -1x -  -  -  -  -  -2x -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -2x -  -  -  -1x -  -  -  -  -1x -1x -  -  -  -  -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -1x -  -  -  -  -  -  -1x -  -  - 
import path from 'path';
-import * as fs from 'fs-extra';
-import { ApexClasses } from '../SfpPackage';
-import xml2json from '../../utils/xml2json';
-const xml2js = require('xml2js');
- 
-export default class PackageManifest {
-    private _manifestJson;
-    private _manifestXml: string;
- 
-    /**
-     * Getter for package manifest JSON
-     */
-    get manifestJson() {
-        return this._manifestJson;
-    }
- 
-    /**
-     * Getter for package manifest XML
-     */
-    get manifestXml(): string {
-        return this._manifestXml;
-    }
- 
-    private constructor() {}
- 
-    /**
-     * Factory method
-     * @param mdapiDir directory containing package.xml
-     * @returns instance of PackageManifest
-     */
-    static async create(mdapiDir: string): Promise<PackageManifest> {
-        const packageManifest = new PackageManifest();
- 
-        const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8');
- 
-        packageManifest._manifestXml = packageXml;
-        packageManifest._manifestJson = await xml2json(packageXml);
- 
-        return packageManifest;
-    }
- 
-    /**
-     * Factory method
-     * @param components
-     * @param apiVersion
-     * @returns intance of PackageManifest
-     */
-    static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest {
-        const packageManifest = new PackageManifest();
- 
-        const packageJson = {
-            $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' },
-            types: [],
-            version: apiVersion,
-        };
- 
-        components.forEach((component) => {
-            const type = packageJson.types.find((type) => type.name === component.type);
-            if (type) {
-                // Add member to existing type
-                type.members.push(component.fullName);
-            } else {
-                // create new type
-                const newType = {
-                    name: component.type,
-                    members: [component.fullName],
-                };
-                packageJson.types.push(newType);
-            }
-        });
- 
-        const builder = new xml2js.Builder({
-            xmldec: { version: '1.0', encoding: 'UTF-8' },
-        });
- 
-        let packageObj = {
-            Package: packageJson,
-        };
- 
-        packageManifest._manifestXml = builder.buildObject(packageObj);
-        packageManifest._manifestJson = packageObj;
- 
-        return packageManifest;
-    }
- 
-    /**
-     * Factory method
-     * @param manifest package JSON
-     * @returns instance of PackageManifest
-     */
-    static async createWithJSONManifest(manifest: any): Promise<PackageManifest> {
-        const packageManifest = new PackageManifest();
-        packageManifest._manifestJson = manifest;
- 
-        const builder = new xml2js.Builder({
-            xmldec: { version: '1.0', encoding: 'UTF-8' },
-        });
- 
-        packageManifest._manifestXml = builder.buildObject(manifest);
- 
-        return packageManifest;
-    }
- 
-    /**
-     *
-     * @returns true or false, for whether there are profiles
-     */
-    public isProfilesInPackage(): boolean {
-        let isProfilesFound = false;
- 
-        if (this._manifestJson.Package.types) {
-            if (Array.isArray(this._manifestJson.Package.types)) {
-                for (const type of this._manifestJson.Package.types) {
-                    if (type.name === 'Profile') {
-                        isProfilesFound = true;
-                        break;
-                    }
-                }
-            } else if (this.manifestJson.Package.types.name === 'Profile') {
-                isProfilesFound = true;
-            }
-        }
- 
-        return isProfilesFound;
-    }
- 
-    /**
-     *
-     * @returns true or false, for whether there are profiles
-     */
-     public isPermissionSetsInPackage(): boolean {
-        let isPermissionSetFound = false;
- 
-        if (this._manifestJson.Package.types) {
-            if (Array.isArray(this._manifestJson.Package.types)) {
-                for (const type of this._manifestJson.Package.types) {
-                    if (type.name === 'PermissionSet') {
-                        isPermissionSetFound = true;
-                        break;
-                    }
-                }
-            } else if (this.manifestJson.Package.types.name === 'PermissionSet') {
-                isPermissionSetFound = true;
-            }
-        }
- 
-        return isPermissionSetFound;
-    }
- 
-    public isPermissionSetGroupsFoundInPackage(): boolean {
-        let isPermissionSetGroupFound = false;
-        if (Array.isArray(this._manifestJson?.Package?.types)) {
-            for (let type of this._manifestJson.Package.types) {
-                if (type.name === 'PermissionSetGroup') {
-                    isPermissionSetGroupFound = true;
-                    break;
-                }
-            }
-        } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') {
-            isPermissionSetGroupFound = true;
-        }
-        return isPermissionSetGroupFound;
-    }
- 
-    /**
-     *
-     * @returns true or false, for whether there are Apex classes and/or triggers
-     */
-    public isApexInPackage(): boolean {
-        let isApexFound = false;
- 
-        if (this._manifestJson.Package.types) {
-            if (Array.isArray(this._manifestJson.Package.types)) {
-                for (const type of this._manifestJson.Package.types) {
-                    if (type.name === 'ApexClass' || type.name === 'ApexTrigger') {
-                        isApexFound = true;
-                        break;
-                    }
-                }
-            } else if (
-                this._manifestJson.Package.types.name === 'ApexClass' ||
-                this._manifestJson.Package.types.name === 'ApexTrigger'
-            ) {
-                isApexFound = true;
-            }
-        }
- 
-        return isApexFound;
-    }
- 
-    /**
-     *
-     * @returns Apex triggers if there are any, otherwise returns undefined
-     */
-    public fetchTriggers(): ApexClasses {
-        let triggers: string[];
- 
-        let types;
-        if (this._manifestJson.Package.types) {
-            if (this._manifestJson.Package.types instanceof Array) {
-                types = this._manifestJson.Package.types;
-            } else {
-                // Create array with single type
-                types = [this._manifestJson.Package.types];
-            }
-        }
- 
-        if (types) {
-            for (const type of types) {
-                if (type.name === 'ApexTrigger') {
-                    if (type.members instanceof Array) {
-                        triggers = type.members;
-                    } else {
-                        // Create array with single member
-                        triggers = [type.members];
-                    }
-                    break;
-                }
-            }
-        }
- 
-        return triggers;
-    }
- 
-    public isPayloadContainTypesOtherThan(providedType: string): boolean {
-        let anyOtherType = false;
-        if (this._manifestJson.Package.types) {
-            if (Array.isArray(this._manifestJson.Package.types)) {
-                for (const type of this._manifestJson.Package.types) {
-                    if (type.name !== providedType) {
-                        anyOtherType = true;
-                        break;
-                    }
-                }
-            } else if (this._manifestJson.Package.types.name !== providedType) {
-                anyOtherType = true;
-            }
-        }
-        return anyOtherType;
-    }
- 
-    public isPayLoadContainTypesSupportedByProfiles(): boolean {
-        const profileSupportedMetadataTypes = [
-            'ApexClass',
-            'CustomApplication',
-            'CustomObject',
-            'CustomField',
-            'Layout',
-            'ApexPage',
-            'CustomTab',
-            'RecordType',
-            'SystemPermissions',
-        ];
- 
-        let containsProfileSupportedType = false;
-        if (this._manifestJson.Package.types) {
-            if (Array.isArray(this._manifestJson.Package.types)) {
-                for (const type of this._manifestJson.Package.types) {
-                    if (profileSupportedMetadataTypes.includes(type.name)) {
-                        containsProfileSupportedType = true;
-                        break;
-                    }
-                }
-            } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) {
-                containsProfileSupportedType = true;
-            }
-        }
-        return containsProfileSupportedType;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html deleted file mode 100644 index a163fc21e..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/PackageToComponent.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/core/package/components/PackageToComponent.ts - - - - - - - - - -
-
-

All files / src/core/package/components PackageToComponent.ts

-
- -
- 20% - Statements - 2/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 22.22% - Lines - 2/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -291x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ComponentSet } from '@salesforce/source-deploy-retrieve';
-import Component from '../../dependency/Component';
- 
- 
-export default class PackageToComponent {
-    public constructor(private packageName:string,private packageDirectory:string) {}
- 
-    public generateComponents() {
-        const components: Component[] = [];
- 
-        let componentSet = ComponentSet.fromSource(this.packageDirectory);
- 
-        let componentSetArray = componentSet.getSourceComponents().toArray();
- 
-        for (const individualComponentFromComponentSet of componentSetArray) {
-            const component: Component = {
-                id: undefined,
-                fullName: individualComponentFromComponentSet.fullName,
-                type: individualComponentFromComponentSet.type.name,
-                files: [individualComponentFromComponentSet.xml],
-                package: this.packageName,
-            };
-            components.push(component);
-        }
- 
-       return components;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html deleted file mode 100644 index 641259122..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/components/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/package/components - - - - - - - - - -
-
-

All files src/core/package/components

-
- -
- 74.02% - Statements - 57/77 -
- - -
- 50% - Branches - 2/4 -
- - -
- 82.35% - Functions - 14/17 -
- - -
- 74.66% - Lines - 56/75 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
PackageManifest.ts -
-
82.08%55/6750%2/493.33%14/1581.81%54/66
PackageToComponent.ts -
-
20%2/10100%0/00%0/222.22%2/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html deleted file mode 100644 index d9cf86e4c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/PackageTestCoverage.ts.html +++ /dev/null @@ -1,904 +0,0 @@ - - - - - - Code coverage report for src/core/package/coverage/PackageTestCoverage.ts - - - - - - - - - -
-
-

All files / src/core/package/coverage PackageTestCoverage.ts

-
- -
- 93.67% - Statements - 74/79 -
- - -
- 70% - Branches - 7/10 -
- - -
- 100% - Functions - 15/15 -
- - -
- 93.58% - Lines - 73/78 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -2741x -1x -1x -  -1x -1x -1x -  -1x -  -7x -  -  -7x -7x -7x -7x -  -7x -  -  -  -7x -7x -  -7x -  -  -  -  -  -7x -7x -  -  -19x -19x -  -  -  -7x -  -7x -  -1x -  -1x -1x -  -  -7x -  -1x -  -1x -1x -  -  -  -1x -  -  -  -  -1x -1x -2x -  -1x -  -  -  -7x -7x -7x -  -  -  -  -  -  -  -  -  -  -  -5x -  -5x -  -5x -  -  -3x -3x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -3x -  -3x -  -  -  -  -  -2x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -8x -  -8x -8x -  -8x -  -  -  -  -  -  -  -20x -  -  -  -  -  -  -8x -  -  -  -  -  -  -  -  -2x -2x -  -2x -  -  -  -8x -  -  -  -  -  -2x -2x -  -2x -  -  -8x -  -  -  -  -  -  -  -  -  -  -15x -15x -  -  -  -12x -  -  -3x -  -  -  -  -  -  -  -  -  -  -  -  -15x -15x -  -  -  -27x -  -  -3x -  -  -  -  -  -  -  -  -  -  -  -15x -  -  -63x -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -15x -  -  - 
import SFPLogger, { COLOR_WARNING, Logger } from '@flxblio/sfp-logger';
-import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage';
-import SfpPackage, { PackageType } from '../SfpPackage';
-import { Connection } from '@salesforce/core';
-import ApexClassFetcher from '../../apex/ApexClassFetcher';
-import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher';
-import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher';
- 
-export default class PackageTestCoverage {
-    private individualClassCoverage: IndividualClassCoverage;
-    private packageTestCoverage: number = -1; // Set inital value
- 
-    public constructor(
-        private pkg: SfpPackage,
-        private codeCoverage: any,
-        private logger: Logger,
-        private readonly conn: Connection
-    ) {
-        this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger);
-    }
- 
-    public async getCurrentPackageTestCoverage(): Promise<number> {
-        let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses;
-        let triggers: string[] = this.pkg.triggers;
- 
-        let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers(
-            this.codeCoverage,
-            packageClasses,
-            triggers
-        );
- 
-        let totalLines: number = 0;
-        let totalCovered: number = 0;
-        for (let classCoverage of filteredCodeCoverage) {
-            if (classCoverage.coveredPercent !== null) {
-                totalLines += classCoverage.totalLines;
-                totalCovered += classCoverage.totalCovered;
-            }
-        }
- 
-        let listOfApexClassOrTriggerId: string[] = [];
- 
-        let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage);
-        if (classesNotTouchedByTestClass.length > 0) {
-            let apexClassIds = (
-                await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass)
-            ).map((apexClass) => apexClass.Id);
-            listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds);
-        }
- 
-        let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage);
-        if (triggersNotTouchedByTestClass.length > 0) {
-            let triggerIds = (
-                await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass)
-            ).map((trigger) => trigger.Id);
-            listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds);
-        }
- 
-        if (listOfApexClassOrTriggerId.length > 0) {
-            let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher(
-                this.conn
-            ).fetchACCAById(listOfApexClassOrTriggerId);
- 
-            if (recordsOfApexCodeCoverageAggregate.length > 0) {
-                let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes
-                recordsOfApexCodeCoverageAggregate.forEach((record) => {
-                    numLinesUncovered += record.NumLinesUncovered;
-                });
-                totalLines += numLinesUncovered;
-            }
-        }
- 
-        let testCoverage = Math.floor((totalCovered / totalLines) * 100);
-        this.packageTestCoverage = testCoverage;
-        return testCoverage;
-    }
- 
-    public async validateTestCoverage(
-        coverageThreshold?: number
-    ): Promise<{
-        result: boolean;
-        message?: string;
-        packageTestCoverage: number;
-        classesCovered?: { name: string; coveredPercent: number }[];
-        classesWithInvalidCoverage?: { name: string; coveredPercent: number }[];
-    }> {
-        if (this.packageTestCoverage == -1)
-            //No Value available
-            await this.getCurrentPackageTestCoverage();
- 
-        let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage);
- 
-        if (coverageThreshold == undefined || coverageThreshold < 75) {
-            SFPLogger.log('Setting minimum coverage percentage to 75%.');
-            coverageThreshold = 75;
-        }
- 
-        
-      
-        if (this.pkg.packageType === PackageType.Unlocked) {
-            if (this.packageTestCoverage < coverageThreshold) {
-                // Coverage inadequate, set result to false
-                return {
-                    result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting
-                    packageTestCoverage: this.packageTestCoverage,
-                    classesCovered: classesCovered,
-                    message: `${COLOR_WARNING(
-                        `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%`
-                    )}`,
-                };
-            } else {
-                return {
-                    result: true,
-                    packageTestCoverage: this.packageTestCoverage,
-                    classesCovered: classesCovered,
-                    message: `Package overall coverage is greater than ${coverageThreshold}%`,
-                };
-            }
-        } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) {
-            SFPLogger.log("Package type is Source. Validating individual class coverage");
- 
-            let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage(
-                this.getIndividualClassCoverageByPackage(this.codeCoverage),
-                coverageThreshold
-            );
- 
-            if (individualClassValidationResults.result) {
-                return {
-                    result: true,
-                    packageTestCoverage: this.packageTestCoverage,
-                    classesCovered: classesCovered,
-                    classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage,
-                    message: `Individidual coverage of classes is greater than ${coverageThreshold}%`,
-                };
-            } else {
-                return {
-                    result: false,
-                    packageTestCoverage: this.packageTestCoverage,
-                    classesCovered: classesCovered,
-                    classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage,
-                    message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`,
-                };
-            }
-        } else {
-            throw new Error('Unhandled package type');
-        }
-    }
- 
-    private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] {
-        let individualClassCoverage: {
-            name: string;
-            coveredPercent: number;
-        }[] = [];
- 
-        let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses;
-        let triggers: string[] = this.pkg.triggers;
- 
-        codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers(
-            codeCoverageReport,
-            packageClasses,
-            triggers
-        );
- 
-        for (let classCoverage of codeCoverageReport) {
-            if (classCoverage['coveredPercent'] !== null) {
-                individualClassCoverage.push({
-                    name: classCoverage['name'],
-                    coveredPercent: classCoverage['coveredPercent'],
-                });
-            }
-        }
- 
-        let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass(
-            packageClasses,
-            codeCoverageReport
-        );
- 
-        if (namesOfClassesWithoutTest.length > 0) {
-            let classesWithoutTest: {
-                name: string;
-                coveredPercent: number;
-            }[] = namesOfClassesWithoutTest.map((className) => {
-                return { name: className, coveredPercent: 0 };
-            });
-            individualClassCoverage = individualClassCoverage.concat(classesWithoutTest);
-        }
- 
-        // Check for triggers with no test class
-        let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport);
- 
-        if (namesOfTriggersWithoutTest.length > 0) {
-            let triggersWithoutTest: {
-                name: string;
-                coveredPercent: number;
-            }[] = namesOfTriggersWithoutTest.map((triggerName) => {
-                return { name: triggerName, coveredPercent: 0 };
-            });
-            individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest);
-        }
- 
-        return individualClassCoverage;
-    }
- 
-    /**
-     * Returns names of triggers in the package that are not triggered by the execution of any test classes
-     * Returns empty array if triggers is null or undefined
-     * @param triggers
-     * @param codeCoverageReport
-     * @returns
-     */
-    private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] {
-        if (triggers != null) {
-            return triggers.filter((trigger) => {
-                for (let classCoverage of codeCoverageReport) {
-                    if (classCoverage['name'] === trigger) {
-                        // Filter out triggers if accounted for in coverage json
-                        return false;
-                    }
-                }
-                return true;
-            });
-        } else Ereturn [];
-    }
- 
-    /**
-     * Returns name of classes in the package that are not touched by the execution of any test classes
-     * Returns empty array if packageClasses is null or undefined
-     * @param packageClasses
-     * @param codeCoverageReport
-     * @returns
-     */
-    private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] {
-        if (packageClasses != null) {
-            return packageClasses.filter((packageClass) => {
-                for (let classCoverage of codeCoverageReport) {
-                    if (classCoverage['name'] === packageClass) {
-                        // Filter out package class if accounted for in coverage json
-                        return false;
-                    }
-                }
-                return true;
-            });
-        } else Ereturn [];
-    }
- 
-    /**
-     * Filter code coverage to classes and triggers in the package
-     * @param codeCoverage
-     * @param packageClasses
-     * @param triggers
-     */
-    private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) {
-        let filteredCodeCoverage = codeCoverage.filter((classCoverage) => {
-            if (packageClasses != null) {
-                for (let packageClass of packageClasses) {
-                    if (packageClass === classCoverage['name']) return true;
-                }
-            }
- 
-            if (triggers != null) {
-                for (let trigger of triggers) {
-                    if (trigger === classCoverage['name']) {
-                        return true;
-                    }
-                }
-            }
- 
-            return false;
-        });
- 
-        return filteredCodeCoverage;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html deleted file mode 100644 index 3e23e8d58..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/coverage/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/package/coverage - - - - - - - - - -
-
-

All files src/core/package/coverage

-
- -
- 93.67% - Statements - 74/79 -
- - -
- 70% - Branches - 7/10 -
- - -
- 100% - Functions - 15/15 -
- - -
- 93.58% - Lines - 73/78 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
PackageTestCoverage.ts -
-
93.67%74/7970%7/10100%15/1593.58%73/78
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html deleted file mode 100644 index bb3b45099..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for src/core/package/dependencies/ExternalPackage2DependencyResolver.ts - - - - - - - - - -
-
-

All files / src/core/package/dependencies ExternalPackage2DependencyResolver.ts

-
- -
- 54.28% - Statements - 19/35 -
- - -
- 62.5% - Branches - 5/8 -
- - -
- 75% - Functions - 3/4 -
- - -
- 50% - Lines - 16/32 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104  -2x -  -2x -  -  -  -  -  -2x -  -2x -  -  -  -  -  -  -2x -  -  -2x -  -  -  -  -  -  -  -2x -2x -  -  -  -  -  -  -  -  -  -12x -  -  -  -10x -4x -  -  -  -  -  -  -  -  -2x -2x -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import PackageDependencyResolver from './PackageDependencyResolver';
-import _ from 'lodash';
-import Package2VersionFetcher from '../version/Package2VersionFetcher';
-import Package2Detail from '../Package2Detail';
- 
-/**
- * Resolves external package dependency versions to their subscriber version
- */
-export default class ExternalPackage2DependencyResolver {
-    //TOOD: Finalize Keys
-    constructor(private conn: Connection, private projectConfig, private keys) {}
- 
-    public async resolveExternalPackage2DependenciesToVersions(
-        packagesToBeResolved?: string[],
-        packagesToBeSkipped?: string[],
-        isDependencyValidated?: boolean
-    ): Promise<Package2Detail[]> {
-        if (isDependencyValidated == undefined) isDependencyValidated = true;
-        //Do a dependency resolution first only for external dependencies
-        //Resolve .LATEST to exact version numbers
-        let revisedProjectConfig = await new PackageDependencyResolver(
-            this.conn,
-            this.projectConfig,
-            packagesToBeSkipped,
-            null,
-            isDependencyValidated
-        ).resolvePackageDependencyVersions();
- 
-        let packageVersions: Package2Detail[] = [];
-        let packageVersionFetcher = new Package2VersionFetcher(this.conn);
- 
-        let packagesToKeys: { [p: string]: string };
-        if (this.keys) {
-            packagesToKeys = this.parseKeys(this.keys);
-        }
- 
-        //Resolve provided version Number to SubscriberVersionId
-        for (const sfdxPackage of revisedProjectConfig.packageDirectories) {
-           
-            Iif(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package))
-              continue;
- 
-            if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) {
-                for (let i = 0; i < sfdxPackage.dependencies.length; i++) {
-                    let dependency = sfdxPackage.dependencies[i];
- 
-                    if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) 
-                    {
-                        let dependendentPackage: Package2Detail = { name: dependency.package };
-                        packageVersions.push(dependendentPackage);
-                        continue;
-                    }
- 
-                    if (!packageVersions.find((elem) => elem.name == dependency.package)) {
-                        let dependendentPackage: Package2Detail = { name: dependency.package };
-                        if (dependency.versionNumber) {
-                            dependendentPackage.versionNumber = dependency.versionNumber;
-                            let packageVersion = await packageVersionFetcher.fetchByPackage2Id(
-                                revisedProjectConfig.packageAliases[dependendentPackage.name],
-                                dependendentPackage.versionNumber,
-                                true
-                            );
-                            dependendentPackage.subscriberPackageVersionId =
-                                packageVersion[0].SubscriberPackageVersionId;
-                        } else {
-                            dependendentPackage.subscriberPackageVersionId =
-                                revisedProjectConfig.packageAliases[dependendentPackage.name];
-                        }
-                        if (packagesToKeys?.[dependendentPackage.name]) {
-                            dependendentPackage.key = packagesToKeys[dependency.package];
-                        }
-                        packageVersions.push(dependendentPackage);
-                    }
-                }
-            }
-        }
-        return packageVersions;
-    }
- 
-    /**
-     * Parse keys in string format "packageA:key packageB:key packageC:key"
-     * Returns map of packages to keys
-     * @param keys
-     */
-    private parseKeys(keys: string) {
-        let output: { [p: string]: string } = {};
- 
-        keys = keys.trim();
-        let listOfKeys = keys.split(' ');
- 
-        for (let key of listOfKeys) {
-            let packageKeyPair = key.split(':');
-            if (packageKeyPair.length === 2) {
-                output[packageKeyPair[0]] = packageKeyPair[1];
-            } else {
-                // Format is incorrect, throw an error
-                throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`);
-            }
-        }
-        return output;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html deleted file mode 100644 index 06be92654..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/PackageDependencyResolver.ts.html +++ /dev/null @@ -1,892 +0,0 @@ - - - - - - Code coverage report for src/core/package/dependencies/PackageDependencyResolver.ts - - - - - - - - - -
-
-

All files / src/core/package/dependencies PackageDependencyResolver.ts

-
- -
- 97.4% - Statements - 75/77 -
- - -
- 88.88% - Branches - 24/27 -
- - -
- 100% - Functions - 11/11 -
- - -
- 97.29% - Lines - 72/74 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270  -3x -3x -3x -3x -3x -  -  -  -  -  -3x -10x -  -  -10x -10x -10x -10x -10x -  -  -10x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -24x -  -  -  -  -  -  -19x -28x -  -  -1x -  -  -27x -  -  -  -9x -  -  -  -  -2x -  -16x -  -1x -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -1x -1x -1x -1x -  -  -15x -  -  -  -  -  -  -  -13x -10x -10x -  -3x -  -  -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -38x -16x -  -  -  -  -6x -6x -  -6x -  -  -  -  -1x -  -  -  -  -5x -  -  -1x -  -  -  -  -  -4x -  -  -  -  -  -  -5x -  -  -  -  -5x -  -  -  -  -  -  -1x -  -  -  -  -13x -4x -  -  -1x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -4x -4x -  -  -9x -  -  -3x -3x -  -  -9x -  -  -  -1x -  -  -  -  -3x -  -  -  -55x -55x -  -  -  -  -10x -  -  -  -  -  -  -  -  -6x -6x -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -5x -5x -  -  -  -  -  -  -  -  -  -6x -6x -  -  - 
import { Connection } from '@salesforce/core';
-import lodash = require('lodash');
-import Git from '../../git/Git';
-import GitTags from '../../git/GitTags';
-import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher';
-import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
- 
- 
-/**
- * Resolves package dependency versions to their exact versions
- */
-export default class PackageDependencyResolver {
-    private package2VersionCache: Package2VersionCache = new Package2VersionCache();
- 
-    constructor(
-        private conn: Connection,
-        private projectConfig,
-        private packagesToBeSkipped?: string[],
-        private packagesToBeResolved?: string[],
-        private resolveExternalDepenciesOnly?: boolean
-    ) {
-        // prevent mutation of original config
-        this.projectConfig = lodash.cloneDeep(this.projectConfig);
-    }
- 
-    /**
-     * Resolves package dependency versions in project config
-     * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped)
-     * @returns new project config JSON, does not change original JSON
-     */
-    public async resolvePackageDependencyVersions() {
-        for (const packageDirectory of this.projectConfig.packageDirectories) {
-            if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) {
-                throw Error(`Unsupported path.. Use only one of the options at any given time`);
-            }
- 
-            if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) {
-                continue;
-            }
- 
-            if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) {
-                continue;
-            }
-            if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) {
-                for (let i = 0; i < packageDirectory.dependencies.length; i++) {
-                    let dependency = packageDirectory.dependencies[i];
-                    if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) {
-                        
-                        throw new Error(`Can't find package id for dependency: ` + dependency.package);
-                    }
- 
-                    let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package]
- 
-                    if (this.isSubscriberPackageVersionId(packageVersionId)) {
-                        // Already resolved
-                        continue;
-                    }
- 
-                    if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) {
-                        // Dependency is part of the same build, will be resolved when new version is created
-                        continue;
-                    }
-                    let package2VersionForDependency: any = '';
-                    if ( dependency.branch && dependency.branch !== '' ) {
-                        SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO);
-                        package2VersionForDependency = await this.getPackage2VersionForDependency(
-                            this.conn,
-                            dependency,
-                            packageVersionId,
-                            dependency.branch
-                        );
-                        SFPLogger.log(`Fetched latest branched package of ${dependency.package},`
-                                        +`version: ${package2VersionForDependency.MajorVersion}.`
-                                                 +`${package2VersionForDependency.MinorVersion}.`
-                                                 +`${package2VersionForDependency.PatchVersion}.`
-                                                 +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO);
- 
-                        let branchedPackageAlias = `${dependency.package}@`
-                                                    +`${package2VersionForDependency.MajorVersion}.`
-                                                    +`${package2VersionForDependency.MinorVersion}.`
-                                                    +`${package2VersionForDependency.PatchVersion}.`
-                                                    +`${package2VersionForDependency.BuildNumber}-`
-                                                    +`${dependency.branch}`;
-                        dependency.package = branchedPackageAlias;
-                        this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId;
-                        delete dependency.versionNumber;
-                        delete dependency.branch;
-                        continue;
-                        
-                    }else {
-                        package2VersionForDependency = await this.getPackage2VersionForDependency(
-                            this.conn,
-                            dependency,
-                            packageVersionId
-                        );
-                    }
-                    
- 
-                    if (package2VersionForDependency == null) {
-                        packageDirectory.dependencies.splice(i, 1);
-                        i--;
-                    } else
-                        dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`;
-                }
-            }
-        }
-        return this.projectConfig;
-    }
- 
-    /**
-     * Get last validated Package2 version for package dependency
-     * @param conn
-     * @param dependency
-     * @returns Package2Version
-     */
-    private async getPackage2VersionForDependency(
-        conn: Connection,
-        dependency: { package: string; versionNumber: string },
-        packageVersionId: string,
-        branch?: string,
-    ): Promise<Package2Version> {
- 
-        //Dont hit api's if its only for external dependencies
-        if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) {
-            if (this.resolveExternalDepenciesOnly) return null;
-        }
- 
-        let package2Version: Package2Version;
- 
-        let versionNumber: string = dependency.versionNumber;
-        let vers: string[] = versionNumber.split('.');
-        if (vers.length === 4 && vers[3] === 'LATEST') {
-            versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`;
-        }
- 
-        let package2Versions: Package2Version[];
-        if (this.package2VersionCache.has(packageVersionId, versionNumber)) {
-            package2Versions = this.package2VersionCache.get(
-                packageVersionId,
-                versionNumber
-            );
-        } else {
-            const package2VersionFetcher = new Package2VersionFetcher(conn);
-            let records;
-            if( branch ){
-                records = await package2VersionFetcher.fetchByPackageBranchAndName(
-                    branch,
-                    dependency.package,
-                    versionNumber
-                );
-            }else{
-                records = await package2VersionFetcher.fetchByPackage2Id(
-                    packageVersionId,
-                    versionNumber,
-                    true
-                );
-            }
-            
-            this.package2VersionCache.set(
-                packageVersionId,
-                versionNumber,
-                records
-            );
-            package2Versions = this.package2VersionCache.get(
-                packageVersionId,
-                versionNumber
-            );
-        }
- 
-        if (package2Versions.length === 0) {
-            throw new Error(
-                `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}`
-            );
-        }
- 
-        if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) {
-            package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency);
-        } else {
-            // Take last validated package for external packages
-            package2Version = package2Versions[0];
-        }
-        return package2Version;
-    }
- 
-    /**
-     * Get Package2 version created from the current branch
-     * @param package2Versions
-     * @param dependency
-     * @returns Package2Version
-     */
-    private async getPackage2VersionFromCurrentBranch(
-        package2Versions: Package2Version[],
-        dependency: { package: string; versionNumber: string }
-    ) {
-        let package2VersionOnCurrentBranch: Package2Version;
- 
-        const git = await Git.initiateRepo();
-        const gitTags = new GitTags(git, dependency.package);
-        const tags = await gitTags.listTagsOnBranch();
- 
-        for (const package2Version of package2Versions) {
-            const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`;
-            for (const tag of tags) {
-                if (tag.endsWith(version)) {
-                    package2VersionOnCurrentBranch = package2Version;
-                    break;
-                }
-            }
-            if (package2VersionOnCurrentBranch) break;
-        }
- 
-        if (!package2VersionOnCurrentBranch) {
-            throw new Error(
-                `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch`
-            );
-        }
- 
-        return package2VersionOnCurrentBranch;
-    }
- 
-    private isSubscriberPackageVersionId(packageAlias: string): boolean {
-        const subscriberPackageVersionIdPrefix = '04t';
-        return packageAlias.startsWith(subscriberPackageVersionIdPrefix);
-    }
-}
- 
-class Package2VersionCache {
-    private cache: { [p: string]: Package2Version[] } = {};
- 
-    /**
-     * Checks whether cache contains key for package ID and version number
-     * @param packageId
-     * @param versionNumberstartw
-     * @returns true or false
-     */
-    has(packageId: string, versionNumber: string): boolean {
-        const key = `${packageId}-${versionNumber}`;
-        if (this.cache[key]) return true;
-        else return false;
-    }
- 
-    /**
-     * Set the cache value, Package2 versions, for package ID and version number
-     * @param packageId
-     * @param versionNumber
-     * @param package2Versions
-     * @returns cache
-     */
-    set(
-        packageId: string,
-        versionNumber: string,
-        package2Versions: Package2Version[]
-    ): { [p: string]: Package2Version[] } {
-        const key = `${packageId}-${versionNumber}`;
-        this.cache[key] = package2Versions;
-        return this.cache;
-    }
- 
-    /**
-     *
-     * @param packageId
-     * @param versionNumber
-     * @returns Package2 versions for package ID and version number
-     */
-    get(packageId: string, versionNumber: string): Package2Version[] {
-        const key = `${packageId}-${versionNumber}`;
-        return this.cache[key];
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html deleted file mode 100644 index 7da072f8e..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/TransitiveDependencyResolver.ts.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - Code coverage report for src/core/package/dependencies/TransitiveDependencyResolver.ts - - - - - - - - - -
-
-

All files / src/core/package/dependencies TransitiveDependencyResolver.ts

-
- -
- 88.63% - Statements - 39/44 -
- - -
- 0% - Branches - 0/4 -
- - -
- 88.88% - Functions - 8/9 -
- - -
- 88.37% - Lines - 38/43 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -1102x -2x -2x -2x -2x -2x -  -2x -  -2x -7x -  -  -7x -  -7x -7x -7x -7x -  -  -  -7x -  -7x -  -  -  -  -  -  -  -  -7x -  -  -7x -  -  -  -  -  -7x -  -42x -  -  -  -  -42x -  -  -  -65x -65x -  -  -  -  -  -  -  -  -87x -  -  -42x -221x -152x -42x -  -96x -  -96x -  -7x -  -  -  -  -  -7x -7x -  -  -  -  -  -145x -727x -727x -  -42x -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import ProjectConfig from '../../project/ProjectConfig';
-import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger';
-import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
-import _, { uniq } from 'lodash';
-import semver = require('semver');
-import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter';
-import { Connection } from '@salesforce/core';
-import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency';
- 
-export default class TransitiveDependencyResolver {
-    constructor(private sfdxProjectConfig: any, private logger?: Logger) {}
- 
-    public async resolveTransitiveDependencies(): Promise<Map<string, { package: string; versionNumber?: string }[]>> {
-        SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger);
- 
-        let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig);
-        clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig);
-        let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig);
-        pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap(
-            pkgWithDependencies,
-            new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig)
-        );
-        pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies);
- 
-        return pkgWithDependencies;
-    }
- 
-    private fillDepsWithUserDefinedExternalDependencyMap(
-        pkgWithDependencies: Map<string, { package: string; versionNumber?: string }[]>,
-        externalDependencyMap: any
-    ): Map<string, { package: string; versionNumber?: string }[]> {
-        if (externalDependencyMap) {
-            for (let pkg of Object.keys(externalDependencyMap)) {
-                pkgWithDependencies.set(pkg, externalDependencyMap[pkg]);
-            }
-        }
-        return pkgWithDependencies;
-    }
- 
-    private fillDepsTransitively(
-        dependencyMap: Map<string, { package: string; versionNumber?: string }[]>
-    ): Map<string, { package: string; versionNumber?: string }[]> {
-        let pkgs = Array.from(dependencyMap.keys());
-        for (let pkg of pkgs) {
-            SFPLogger.log(
-                COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg),
-                LoggerLevel.TRACE,
-                this.logger
-            );
-            let dependenencies: { package: string; versionNumber?: string }[] = [];
-            for (let dependency of dependencyMap.get(pkg)) {
-                if (dependencyMap.get(dependency.package)) {
-                    //push parents first
-                    dependenencies = dependenencies.concat(dependencyMap.get(dependency.package));
-                    SFPLogger.log(
-                        `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${
-                            dependency.package
-                        }`,
-                        LoggerLevel.TRACE,
-                        this.logger
-                    );
-                }
-                //push itself
-                dependenencies.push(dependency);
-            }
-            //deduplicate dependency list
-            let uniqueDependencies = [
-                ...new Set(dependenencies.map((objects) => JSON.stringify(objects))),
-            ].map((tmpString) => JSON.parse(tmpString));
-            for (let j = 0; j < uniqueDependencies.length; j++) {
-                if (uniqueDependencies[j].versionNumber) {
-                    let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber);
- 
-                    for (let i = j + 1; i < uniqueDependencies.length; i++) {
-                        if (uniqueDependencies[j].package == uniqueDependencies[i].package) {
-                            let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber);
-                            // replace existing packageInfo if package version number is newer
-                            if (semver.lt(version, versionToCompare)) {
-                               uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i);
-                                
-                            } else {
-                                uniqueDependencies.splice(i, 1);
-                                i--;
-                            }
-                        }
-                    }
-                }
-                //do a dedup again
-                uniqueDependencies = [
-                    ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))),
-                ].map((tmpString) => JSON.parse(tmpString));
-            }
-            dependencyMap.set(pkg, uniqueDependencies);
-        }
-        return dependencyMap;
-    }
- 
-    private swapAndDropArrayElement<T>(arr: T[], i: number, j: number): T[] {
-        if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) {
-          return arr;
-        }
-        
-        let newArr = [...arr];
-        [newArr[i], newArr[j]] = [newArr[j], newArr[i]];
-        return [...newArr.slice(0, j), ...newArr.slice(j + 1)];
-      }
-      
-      
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html deleted file mode 100644 index 4a2f2fffa..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/dependencies/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/package/dependencies - - - - - - - - - -
-
-

All files src/core/package/dependencies

-
- -
- 85.25% - Statements - 133/156 -
- - -
- 74.35% - Branches - 29/39 -
- - -
- 91.66% - Functions - 22/24 -
- - -
- 84.56% - Lines - 126/149 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ExternalPackage2DependencyResolver.ts -
-
54.28%19/3562.5%5/875%3/450%16/32
PackageDependencyResolver.ts -
-
97.4%75/7788.88%24/27100%11/1197.29%72/74
TransitiveDependencyResolver.ts -
-
88.63%39/440%0/488.88%8/988.37%38/43
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html deleted file mode 100644 index 908d418b2..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/EntitlementVersionFilter.ts.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - Code coverage report for src/core/package/deploymentFilters/EntitlementVersionFilter.ts - - - - - - - - - -
-
-

All files / src/core/package/deploymentFilters EntitlementVersionFilter.ts

-
- -
- 84.09% - Statements - 37/44 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 66.66% - Functions - 2/3 -
- - -
- 90.24% - Lines - 37/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -1111x -  -1x -1x -  -1x -1x -1x -1x -  -1x -1x -  -1x -  -  -  -5x -5x -  -  -5x -5x -  -  -5x -  -  -5x -  -  -  -3x -3x -  -1x -1x -  -  -4x -  -4x -4x -  -  -  -  -8x -  -8x -7x -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -1x -1x -1x -  -3x -  -  -  -  -  -  -4x -  -  -  -  -  -  -4x -4x -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve';
-import SFPOrg from '../../org/SFPOrg';
-import QueryHelper from '../../queryHelper/QueryHelper';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { DeploymentFilter } from './DeploymentFilter';
-import * as fs from 'fs-extra';
-import SettingsFetcher from '../../metadata/SettingsFetcher';
-import { PackageType } from '../SfpPackage';
-const { XMLBuilder } = require('fast-xml-parser');
- 
-const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`;
-const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`;
- 
-export default class EntitlementVersionFilter implements DeploymentFilter {
-  
-    public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise<ComponentSet> {
-        //Only do if entitlment exits in the package
-        let sourceComponents = componentSet.getSourceComponents().toArray();
-        let isEntitlementFound: boolean = false;
-        for (const sourceComponent of sourceComponents) {
-            if (sourceComponent.type.name === registry.types.entitlementprocess.name) {
-                isEntitlementFound = true;
-                break;
-            }
-        }
-        Iif (!isEntitlementFound) return componentSet;
- 
-        try {
-            let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`);
- 
-            let query;
-            if (entitlementSettings.enableEntitlementVersioning == true) {
-                SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger);
-                query = EXISTING_SLAPPROCESS_QUERY;
-            } else {
-                SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger);
-                query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING;
-            }
- 
-            SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger);
-            //Fetch Entitlements currently in the org
-            let slaProcessesInOrg = await QueryHelper.query<SlaProcess>(query, org.getConnection(), false);
-            let modifiedComponentSet = new ComponentSet();
-            //Compare version numbers in the org vs version in the component set
-            //Remove if the version numbers match
-            for (const sourceComponent of sourceComponents) {
-                if (sourceComponent.type.name === registry.types.entitlementprocess.name) {
-                    let slaProcessLocal = sourceComponent.parseXmlSync();
- 
-                    let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find(
-                        (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name']
-                    );
- 
-                    if (
-                        slaProcessMatchedByName &&
-                        entitlementSettings.enableEntitlementVersioning &&
-                        slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber
-                    ) {
-                        //This is a deployment candidate
-                        //Modify versionMaster tag to match in the org
-                        slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster;
-                        let builder = new XMLBuilder({
-                            format: true,
-                            ignoreAttributes: false,
-                            attributeNamePrefix: '@_',
-                        });
-                        let xmlContent = builder.build(slaProcessLocal);
-                        fs.writeFileSync(sourceComponent.xml, xmlContent);
-                        modifiedComponentSet.add(sourceComponent);
-                    } else if (slaProcessMatchedByName) {
-                        SFPLogger.log(
-                            `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`,
-                            LoggerLevel.INFO,
-                            logger
-                        );
-                    } else {
-                        //Doesnt exist, deploy
-                        modifiedComponentSet.add(sourceComponent);
-                    }
-                } else {
-                    modifiedComponentSet.add(sourceComponent);
-                }
-            }
- 
-            SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger);
-            return modifiedComponentSet;
-        } catch (error) {
-            SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger);
-            return componentSet;
-        }
-    }
- 
-    public isToApply(projectConfig: any, packageType: string): boolean {
-        Iif (packageType != PackageType.Source) return false;
- 
-        if (projectConfig?.plugins?.sfp?.disableEntitlementFilter) return false;
-        else return true;
-    }
- 
-    
- 
-   
-}
- 
-interface SlaProcess {
-    Name: string;
-    NameNorm: string;
-    VersionNumber: string;
-    VersionMaster: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html deleted file mode 100644 index 365701931..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/deploymentFilters/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/package/deploymentFilters - - - - - - - - - -
-
-

All files src/core/package/deploymentFilters

-
- -
- 84.09% - Statements - 37/44 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 66.66% - Functions - 2/3 -
- - -
- 90.24% - Lines - 37/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
EntitlementVersionFilter.ts -
-
84.09%37/4442.85%3/766.66%2/390.24%37/41
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html deleted file mode 100644 index 97c3d3034..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageComponentDiff.ts.html +++ /dev/null @@ -1,1357 +0,0 @@ - - - - - - Code coverage report for src/core/package/diff/PackageComponentDiff.ts - - - - - - - - - -
-
-

All files / src/core/package/diff PackageComponentDiff.ts

-
- -
- 13.72% - Statements - 21/153 -
- - -
- 10.52% - Branches - 2/19 -
- - -
- 8.33% - Functions - 1/12 -
- - -
- 13.72% - Lines - 21/153 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -4251x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -  - 
import * as xml2js from 'xml2js';
-import * as path from 'path';
-import * as fs from 'fs-extra';
-import * as rimraf from 'rimraf';
-import * as _ from 'lodash';
-import simplegit from 'simple-git';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import ProjectConfig from '../../project/ProjectConfig';
-import MetadataFiles from '../../metadata/MetadataFiles';
-import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo';
-import { MetadataResolver } from '@salesforce/source-deploy-retrieve';
-import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil';
- 
-const deleteNotSupported = ['RecordType'];
-const git = simplegit();
-let sfdxManifest;
- 
-export default class PackageComponentDiff {
-    private gitDiffUtils: GitDiffUtils;
- 
-    destructivePackageObjPre: any[];
-    destructivePackageObjPost: any[];
-    resultOutput: {
-        action: string;
-        metadataType: string;
-        componentName: string;
-        message: string;
-        path: string;
-    }[];
-    public constructor(
-        private logger: Logger,
-        private sfdxPackage: string,
-        private revisionFrom?: string,
-        private revisionTo?: string,
-        private isDestructive?: boolean
-    ) {
-        if (this.revisionTo == null || this.revisionTo.trim() === '') {
-            this.revisionTo = 'HEAD';
-        }
-        if (this.revisionFrom == null) {
-            this.revisionFrom = '';
-        }
-        this.destructivePackageObjPost = [];
-        this.destructivePackageObjPre = [];
-        this.resultOutput = [];
- 
-        sfdxManifest = ProjectConfig.getSFDXProjectConfig(null);
-        this.gitDiffUtils = new GitDiffUtils();
-    }
- 
-    public async build(outputFolder: string) {
-        rimraf.sync(outputFolder);
- 
-        const sepRegex = /\n|\r/;
-        let data = '';
- 
-        //check if same commit
-        const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]);
-        const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]);
-        if (commitFrom === commitTo) {
-            throw new Error(`Unable to compute diff, as both commits are same`);
-        }
-        //Make it relative to make the command works from a project created as a subfolder in a repository
-        data = await git.diff([
-            '--raw',
-            this.revisionFrom,
-            this.revisionTo,
-            '--relative',
-            ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path,
-        ]);
- 
-        let content = data.split(sepRegex);
-        let diffFile: DiffFile = await this.parseContent(content);
-        await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger);
- 
-        let filesToCopy = diffFile.addedEdited;
-        let deletedFiles = diffFile.deleted;
- 
-        deletedFiles = deletedFiles.filter((deleted) => {
-            let found = false;
-            let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path);
-            for (let i = 0; i < filesToCopy.length; i++) {
-                let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path);
-                if (deletedMetadata === addedOrEdited) {
-                    found = true;
-                    break;
-                }
-            }
-            return !found;
-        });
- 
-        if (fs.existsSync(outputFolder) == false) {
-            fs.mkdirSync(outputFolder);
-        }
- 
-        const resolver = new MetadataResolver();
- 
-        if (filesToCopy && filesToCopy.length > 0) {
-            for (let i = 0; i < filesToCopy.length; i++) {
- 
-                try {
-                    let filePath = filesToCopy[i].path;
- 
-                    let sourceComponents = resolver.getComponentsFromPath(filePath);
-                    for (const sourceComponent of sourceComponents) {
-                        if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) {
-                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
-                            await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger);
-                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) {
-                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
-                            if(path.extname(sourceComponent.content))
-                              await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger);
-                            else
-                              await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger);
-                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) {
-                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
-                        } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) {
-                            await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger);
-                        } else {
-                            await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger);
-                        }
-                    }
-                } catch (error) {
-                    
-                   Iif(error.message.includes(`Unable to find the required file`))
-                    throw error;
- 
-                    //Metadata resolver is not respecting forceignores at this stage
-                    // So it fails on diff packages with post deploy, so lets ignore and move on
-                    SFPLogger.log(
-                        `Error while inferencing type of  ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`,
-                        LoggerLevel.TRACE,
-                        this.logger
-                    );
-                }
-            }
-        }
- 
-        if (this.isDestructive) {
-            SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger);
-            await this.createDestructiveChanges(deletedFiles, outputFolder);
-        }
- 
-        //Folder is empty after all this operations, return without copying additional files
-        if (fs.readdirSync(outputFolder).length === 0) {
-            rimraf.sync(outputFolder);
-            return null;
-        }
- 
-        SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger);
- 
-        return this.resultOutput;
-    }
- 
-    //TODO: Refactor using proper ignore
-    private checkForIngore(pathToIgnore: any[], filePath: string) {
-        pathToIgnore = pathToIgnore || [];
-        if (pathToIgnore.length === 0) {
-            return true;
-        }
- 
-        let returnVal = true;
-        pathToIgnore.forEach((ignore) => {
-            if (
-                path.resolve(ignore) === path.resolve(filePath) ||
-                path.resolve(filePath).includes(path.resolve(ignore))
-            ) {
-                returnVal = false;
-            }
-        });
-        return returnVal;
-    }
- 
-    private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) {
-        if (_.isNil(this.destructivePackageObjPost)) {
-            this.destructivePackageObjPost = [];
-        } else {
-            this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => {
-                return !_.isNil(metaType.members) && metaType.members.length > 0;
-            });
-        }
-        this.destructivePackageObjPre = [];
-        //returns root, dir, base and name
-        for (let i = 0; i < filePaths.length; i++) {
-            let filePath = filePaths[i].path;
-            try {
-                let matcher = filePath.match(SOURCE_EXTENSION_REGEX);
-                let extension = '';
-                if (matcher) {
-                    extension = matcher[0];
-                } else {
-                    extension = path.parse(filePath).ext;
-                }
- 
-                let name = MetadataInfo.getMetadataName(filePath);
- 
-                if (name) {
-                    if (!MetadataFiles.isCustomMetadata(filePath, name)) {
-                        // avoid to generate destructive for Standard Components
-                        //Support on Custom Fields and Custom Objects for now
- 
-                        this.resultOutput.push({
-                            action: 'Skip',
-                            componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name),
-                            metadataType: 'StandardField/CustomMetadata',
-                            message: '',
-                            path: '--',
-                        });
- 
-                        continue;
-                    }
-                    let member = MetadataFiles.getMemberNameFromFilepath(filePath, name);
-                    if (name === METADATA_INFO.CustomField.xmlName) {
-                        let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], '<formula>');
-                        if (isFormular) {
-                            this.destructivePackageObjPre = this.buildDestructiveTypeObj(
-                                this.destructivePackageObjPre,
-                                name,
-                                member
-                            );
- 
-                            SFPLogger.log(
-                                `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`,
-                                LoggerLevel.DEBUG,
-                                this.logger
-                            );
- 
-                            this.resultOutput.push({
-                                action: 'Delete',
-                                componentName: member,
-                                metadataType: name,
-                                message: '',
-                                path: 'Manual Intervention Required',
-                            });
-                        } else {
-                            this.destructivePackageObjPost = this.buildDestructiveTypeObj(
-                                this.destructivePackageObjPost,
-                                name,
-                                member
-                            );
-                        }
-                        SFPLogger.log(
-                            `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`,
-                            LoggerLevel.DEBUG,
-                            this.logger
-                        );
- 
-                        this.resultOutput.push({
-                            action: 'Delete',
-                            componentName: member,
-                            metadataType: name,
-                            message: '',
-                            path: 'destructiveChanges.xml',
-                        });
-                    } else {
-                        if (!deleteNotSupported.includes(name)) {
-                            this.destructivePackageObjPost = this.buildDestructiveTypeObj(
-                                this.destructivePackageObjPost,
-                                name,
-                                member
-                            );
-                            this.resultOutput.push({
-                                action: 'Delete',
-                                componentName: member,
-                                metadataType: name,
-                                message: '',
-                                path: 'destructiveChanges.xml',
-                            });
-                        } else {
-                            //add the component in the manual action list
-                            // TODO
-                        }
-                    }
-                }
-            } catch (ex) {
-                this.resultOutput.push({
-                    action: 'ERROR',
-                    componentName: '',
-                    metadataType: '',
-                    message: ex.message,
-                    path: filePath,
-                });
-            }
-        }
- 
-        this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml');
-    }
- 
-    private writeDestructivechanges(destrucObj: Array<any>, outputFolder: string, fileName: string) {
-        //ensure unique component per type
-        for (let i = 0; i < destrucObj.length; i++) {
-            destrucObj[i].members = _.uniq(destrucObj[i].members);
-        }
-        destrucObj = destrucObj.filter((metaType) => {
-            return metaType.members && metaType.members.length > 0;
-        });
- 
-        if (destrucObj.length > 0) {
-            let dest = {
-                Package: {
-                    $: {
-                        xmlns: 'http://soap.sforce.com/2006/04/metadata',
-                    },
-                    types: destrucObj,
-                },
-            };
- 
-            let destructivePackageName = fileName;
-            let filepath = path.join(outputFolder, destructivePackageName);
-            let builder = new xml2js.Builder();
-            let xml = builder.buildObject(dest);
-            fs.writeFileSync(filepath, xml);
-        }
-    }
- 
-    private buildDestructiveTypeObj(destructiveObj, name, member) {
-        let typeIsPresent = false;
-        for (let i = 0; i < destructiveObj.length; i++) {
-            if (destructiveObj[i].name === name) {
-                typeIsPresent = true;
-                destructiveObj[i].members.push(member);
-                break;
-            }
-        }
-        let typeNode: any;
-        if (typeIsPresent === false) {
-            typeNode = {
-                name: name,
-                members: [member],
-            };
-            destructiveObj.push(typeNode);
-        }
-        return destructiveObj;
-    }
- 
-    private async parseContent(fileContents): Promise<DiffFile> {
-        const statusRegEx = /\sA\t|\sM\t|\sD\t/;
-        const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/;
-        const tabRegEx = /\t/;
-        const deletedFileRegEx = new RegExp(/\sD\t/);
-        const lineBreakRegEx = /\r?\n|\r|( $)/;
- 
-        let metadataFiles = new MetadataFiles();
- 
-        let diffFile: DiffFile = {
-            deleted: [],
-            addedEdited: [],
-        };
- 
-        for (let i = 0; i < fileContents.length; i++) {
-            if (statusRegEx.test(fileContents[i])) {
-                let lineParts = fileContents[i].split(statusRegEx);
- 
-                let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, ''));
-                finalPath = finalPath.trim();
-                finalPath = finalPath.replace('\\303\\251', 'é');
- 
-                if (!(await metadataFiles.isInModuleFolder(finalPath))) {
-                    continue;
-                }
- 
-                if (!metadataFiles.accepts(finalPath)) {
-                    continue;
-                }
- 
-                let revisionPart = lineParts[0].split(/\t|\s/);
- 
-                if (deletedFileRegEx.test(fileContents[i])) {
-                    //Deleted
-                    diffFile.deleted.push({
-                        revisionFrom: revisionPart[2].substring(0, 9),
-                        revisionTo: revisionPart[3].substring(0, 9),
-                        path: finalPath,
-                    });
-                } else {
-                    // Added or edited
-                    diffFile.addedEdited.push({
-                        revisionFrom: revisionPart[2].substring(0, 9),
-                        revisionTo: revisionPart[3].substring(0, 9),
-                        path: finalPath,
-                    });
-                }
-            } else if (renamedRegEx.test(fileContents[i])) {
-                let lineParts = fileContents[i].split(renamedRegEx);
- 
-                let paths = lineParts[1].trim().split(tabRegEx);
- 
-                let finalPath = path.join('.', paths[1].trim());
-                finalPath = finalPath.replace('\\303\\251', 'é');
-                let revisionPart = lineParts[0].split(/\t|\s/);
- 
-                if (!(await metadataFiles.isInModuleFolder(finalPath))) {
-                    continue;
-                }
- 
-                if (!metadataFiles.accepts(paths[0].trim())) {
-                    continue;
-                }
- 
-                diffFile.addedEdited.push({
-                    revisionFrom: '0000000',
-                    revisionTo: revisionPart[3],
-                    renamedPath: path.join('.', paths[0].trim()),
-                    path: finalPath,
-                });
- 
-                //allow deletion of renamed components
-                diffFile.deleted.push({
-                    revisionFrom: revisionPart[2],
-                    revisionTo: '0000000',
-                    path: paths[0].trim(),
-                });
-            }
-        }
-        return diffFile;
-    }
-}
-enum AdapterId {
-    Bundle = 'bundle',
-    Decomposed = 'decomposed',
-    Default = 'default',
-    MatchingContentFile = 'matchingContentFile',
-    MixedContent = 'mixedContent',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html deleted file mode 100644 index e99b30d1f..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/PackageDiffImpl.ts.html +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - Code coverage report for src/core/package/diff/PackageDiffImpl.ts - - - - - - - - - -
-
-

All files / src/core/package/diff PackageDiffImpl.ts

-
- -
- 84.72% - Statements - 61/72 -
- - -
- 81.81% - Branches - 9/11 -
- - -
- 85.71% - Functions - 6/7 -
- - -
- 86.95% - Lines - 60/69 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -1671x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -1x -1x -  -1x -  -  -  -  -1x -  -9x -9x -9x -9x -  -  -  -9x -  -9x -9x -  -8x -  -  -  -  -  -  -  -  -  -  -  -8x -  -  -  -6x -  -  -  -  -6x -  -  -  -  -  -  -  -  -6x -  -6x -  -6x -  -  -  -  -  -  -  -  -7x -7x -  -7x -  -  -1x -1x -  -  -  -5x -  -  -  -  -5x -  -1x -  -  -4x -  -2x -  -  -  -  -2x -  -  -  -  -  -6x -6x -6x -  -6x -  -  -6x -  -6x -  -  -  -8x -8x -  -8x -  -  -  -8x -  -  -8x -  -  -  -5x -5x -  -  -  -  -5x -  -  -  -5x -2x -  -  -2x -1x -1x -1x -3x -  -  -  -  -  -  -  -  -  -  - 
const fs = require('fs');
-const path = require('path');
-import Git from '../../git/Git';
-import IgnoreFiles from '../../ignore/IgnoreFiles';
-import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import ProjectConfig from '../../project/ProjectConfig';
-import GitTags from '../../git/GitTags';
-import lodash = require('lodash');
-import { EOL } from 'os';
-import { PackageType } from '../SfpPackage';
- 
-export class PackageDiffOptions {
-    skipPackageDescriptorChange?: boolean = false;
-    //If not set, utlize latest git tags
-    useLatestGitTags?:boolean=true;
-    packagesMappedToLastKnownCommitId?: { [p: string]: string };
-    pathToReplacementForceIgnore?: string;
-}
- 
-export default class PackageDiffImpl {
-    public constructor(
-        private logger: Logger,
-        private sfdx_package: string,
-        private project_directory: string|null,
-        private diffOptions?: PackageDiffOptions
-    ) {}
- 
-    public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> {
-        let git: Git = await Git.initiateRepo(this.logger,this.project_directory);
- 
-        let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory);
-        let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig);
- 
-        SFPLogger.log(
-            COLOR_KEY_MESSAGE(
-                `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`,
-            ),
-            LoggerLevel.TRACE,
-            this.logger
-        );
- 
-        let tag: string;
-        if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) {
-            tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId);
-        } else {
-            tag = await this.getLatestTagFromGit(git, this.sfdx_package);
-        }
- 
-        if (tag) {
-            SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger);
- 
-            // Get the list of modified files between the tag and HEAD refs
-            let modified_files: string[];
-            try {
-                modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]);
-            } catch (error) {
-                SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`));
-                SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`));
-                SFPLogger.log(COLOR_ERROR(`Actual error received:`));
-                SFPLogger.log(COLOR_ERROR(error));
-                throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`)
-            }
- 
-            let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package);
- 
-            if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files);
- 
-            SFPLogger.log(
-                `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`,
-                LoggerLevel.TRACE,
-                this.logger
-            );
- 
-            // Check whether the package has been modified
-            for (let filename of modified_files) {
-                
-                let normalizedPkgPath = path.normalize(pkgDescriptor.path);
-                let normalizedFilename = path.normalize(filename);
-            
-                let relativePath = path.relative(normalizedPkgPath, normalizedFilename);
-            
-                if (!relativePath.startsWith('..')) {
-                    SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger);
-                    return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag };
-                }
-            }
- 
-            SFPLogger.log(
-                `Checking for changes to package descriptor in sfdx-project.json`,
-                LoggerLevel.TRACE,
-                this.logger
-            );
-            let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor);
-            if (isPackageDescriptorChanged) {
-                return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag };
-            }
- 
-            return { isToBeBuilt: false, reason: `No changes found`, tag: tag };
-        } else {
-            SFPLogger.log(
-                `Tag missing for ${this.sfdx_package}...marking package for build anyways`,
-                LoggerLevel.TRACE,
-                this.logger
-            );
-            return { isToBeBuilt: true, reason: `Previous version not found` };
-        }
-    }
- 
-    private applyForceIgnoreToModifiedFiles(modified_files: string[]) {
-        let forceignorePath: string;
-        Iif (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore;
-        else Iif (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore');
-        else forceignorePath = '.forceignore';
- 
-        let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString());
- 
-        // Filter the list of modified files with .forceignore
-        modified_files = ignoreFiles.filter(modified_files);
- 
-        return modified_files;
-    }
- 
-    private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise<string> {
-        const gitTags: GitTags = new GitTags(git, sfdx_package);
-        let tags: string[] = await gitTags.listTagsOnBranch();
- 
-        SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG);
-        if (tags.length > 10) {
-            SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger);
-        } else {
-            SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger);
-        }
- 
-        return tags.pop();
-    }
- 
-    private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise<boolean> {
-        let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]);
-        let projectConfig = JSON.parse(projectConfigJson);
- 
-        let packageDescriptorFromLatestTag: string;
-        for (let dir of projectConfig['packageDirectories']) {
-            if (this.sfdx_package === dir.package) {
-                packageDescriptorFromLatestTag = dir;
-            }
-        }
- 
-        if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) {
-            SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger);
- 
-            //skip check and ignore
-            if (this.diffOptions?.skipPackageDescriptorChange) {
-                SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger);
-                return false;
-            } else return true;
-        } else return false;
-    }
- 
-    private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string {
-        if (packagesToCommits[sfdx_package] != null) {
-            return packagesToCommits[sfdx_package];
-        } else {
-            return null;
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html deleted file mode 100644 index 945749465..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/diff/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/package/diff - - - - - - - - - -
-
-

All files src/core/package/diff

-
- -
- 36.44% - Statements - 82/225 -
- - -
- 36.66% - Branches - 11/30 -
- - -
- 36.84% - Functions - 7/19 -
- - -
- 36.48% - Lines - 81/222 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
PackageComponentDiff.ts -
-
13.72%21/15310.52%2/198.33%1/1213.72%21/153
PackageDiffImpl.ts -
-
84.72%61/7281.81%9/1185.71%6/786.95%60/69
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html deleted file mode 100644 index c9f65a9df..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/package - - - - - - - - - -
-
-

All files src/core/package

-
- -
- 26.92% - Statements - 35/130 -
- - -
- 9.52% - Branches - 2/21 -
- - -
- 28.57% - Functions - 4/14 -
- - -
- 28% - Lines - 35/125 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
SfpPackage.ts -
-
47.82%11/23100%2/250%4/847.82%11/23
SfpPackageBuilder.ts -
-
22.42%24/1070%0/190%0/623.52%24/102
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html deleted file mode 100644 index 333cd62d0..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDataPackageImpl.ts.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - Code coverage report for src/core/package/packageCreators/CreateDataPackageImpl.ts - - - - - - - - - -
-
-

All files / src/core/package/packageCreators CreateDataPackageImpl.ts

-
- -
- 21.62% - Statements - 8/37 -
- - -
- 0% - Branches - 0/9 -
- - -
- 0% - Functions - 0/11 -
- - -
- 26.66% - Lines - 8/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -871x -1x -1x -1x -1x -  -  -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
-import path from 'path';
-import FileSystem from '../../utils/FileSystem';
-import { CreatePackage } from './CreatePackage';
-import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage';
-import { PackageCreationParams } from '../SfpPackageBuilder';
- 
-const SFDMU_CONFIG = 'export.json';
-const VLOCITY_CONFIG = 'VlocityComponents.yaml';
- 
-export default class CreateDataPackageImpl extends CreatePackage {
-    public constructor(
-        protected projectDirectory: string,
-        protected sfpPackage: SfpPackage,
-        protected packageCreationParams: PackageCreationParams,
-        protected logger?: Logger,
-        protected params?: SfpPackageParams
-    ) {
-        super(projectDirectory, sfpPackage, packageCreationParams, logger, params);
-    }
- 
-    getTypeOfPackage() {
-        return PackageType.Data;
-    }
- 
-    isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean {
-        let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory));
- 
-        let hasExportJson = files.find((file) => path.basename(file) === 'export.json');
- 
-        let hasCsvFile = files.find((file) => path.extname(file) === '.csv');
- 
-        let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config
- 
-        Iif(hasYAMLFile) return false;
- 
-        if (!hasExportJson || !hasCsvFile) return true;
-        else return false;
-    }
- 
-    preCreatePackage(sfpPackage) {
-        this.validateDataPackage(sfpPackage.resolvedPackageDirectory);
-    }
- 
-    createPackage(sfpPackage: SfpPackage) {
-        //Do Nothing, as no external calls or processing is required
-    }
- 
-    postCreatePackage(sfpPackage: SfpPackage) {}
- 
-    printAdditionalPackageSpecificHeaders() {}
- 
-    // Validate type of data package and existence of the correct configuration files
-    private validateDataPackage(packageDirectory: string) {
-        const files = FileSystem.readdirRecursive(packageDirectory);
-        let isSfdmu: boolean;
-        let isVlocity: boolean;
- 
-        for (const file of files) {
-            Iif (path.basename(file) === SFDMU_CONFIG) isSfdmu = true;
-            Iif (path.basename(file) === VLOCITY_CONFIG) isVlocity = true;
-        }
- 
-        if (isSfdmu && isVlocity) {
-            throw new Error(
-                `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration`
-            );
-        } else if (isSfdmu) {
-            SFPLogger.log(
-                `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`,
-                LoggerLevel.INFO,
-                this.logger
-            );
-        } else if (isVlocity) {
-            SFPLogger.log(
-                `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`,
-                LoggerLevel.INFO,
-                this.logger
-            );
-        } else {
-            throw new Error(
-                `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages`
-            );
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html deleted file mode 100644 index 8da0a4057..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreateDiffPackageImpl.ts.html +++ /dev/null @@ -1,898 +0,0 @@ - - - - - - Code coverage report for src/core/package/packageCreators/CreateDiffPackageImpl.ts - - - - - - - - - -
-
-

All files / src/core/package/packageCreators CreateDiffPackageImpl.ts

-
- -
- 14.41% - Statements - 16/111 -
- - -
- 0% - Branches - 0/9 -
- - -
- 0% - Functions - 0/22 -
- - -
- 15.53% - Lines - 16/103 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -2721x -  -1x -1x -1x -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
-import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher';
-import SFPStatsSender from '../../stats/SFPStatsSender';
-import PackageEmptyChecker from '../validators/PackageEmptyChecker';
-import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage';
-import { PackageCreationParams } from '../SfpPackageBuilder';
-import SFPOrg from '../../org/SFPOrg';
-import CreateSourcePackageImpl from './CreateSourcePackageImpl';
-import PackageToComponent from '../components/PackageToComponent';
-import path from 'path';
-import * as fs from 'fs-extra';
-import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher';
-import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor';
-import PackageManifest from '../components/PackageManifest';
-import MetadataCount from '../components/MetadataCount';
-import * as rimraf from 'rimraf';
-import Component from '../../dependency/Component';
-import PackageComponentDiff from '../diff/PackageComponentDiff';
- 
-export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
-    public constructor(
-        protected projectDirectory: string,
-        protected sfpPackage: SfpPackage,
-        protected packageCreationParams: PackageCreationParams,
-        protected logger?: Logger,
-        protected params?: SfpPackageParams
-    ) {
-        super(projectDirectory, sfpPackage, packageCreationParams, logger, params);
-    }
- 
-    getTypeOfPackage() {
-        return PackageType.Diff;
-    }
- 
-    printAdditionalPackageSpecificHeaders() {}
- 
-    isEmptyPackage(projectDirectory: string, packageDirectory: string) {
-        return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory);
-    }
- 
-    async preCreatePackage(sfpPackage: SfpPackage) {
-        const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub });
- 
-        //Fetch Baseline commit from DevHub
-        let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg);
- 
-        if (this.packageCreationParams.revisionFrom) {
-            this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom;
-        } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) {
-            this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName];
-        } else {
-            this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion;
-        }
- 
-        if (this.packageCreationParams.revisionTo) {
-            this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo;
-        } else {
-            this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion;
-        }
-    }
- 
-    private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) {
-        let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts();
-        let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts);
-        return packagesInstalledInOrgMappedToCommits;
-    }
- 
-    public async createPackage(sfpPackage: SfpPackage) {
-        //Unresolved SHAs can be same if the package is not installed in the org or is the same
-        if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) {
-            try {
-                let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff(
-                    this.logger,
-                    this.sfpPackage.packageName,
-                    this.sfpPackage.commitSHAFrom,
-                    this.sfpPackage.commitSHATo,
-                    true
-                );
-                await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff'));
-            } catch (error) {
-                //if both are same after git resolution.. just do nothing, treat is a normal source package
-                if (error.message.includes('Unable to compute diff, as both commits are same')) {
-                    SFPLogger.log(
-                        `Both commits are same, treating it as an empty package`,
-                        LoggerLevel.WARN,
-                        this.logger
-                    );
-                    //Create an empty diff directory to force skip of packages
-                    const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`);
-                    fs.mkdirpSync(diffSrcDir);
-                } else throw error;
-            }
- 
-            await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger);
- 
-            await this.replaceSourceWithDiff(
-                sfpPackage.workingDirectory,
-                sfpPackage.packageDirectory,
-                `diff/${sfpPackage.packageDirectory}`
-            );
- 
-            SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, {
-                package: sfpPackage.packageName,
-                type: sfpPackage.packageType,
-            });
-        }
-    }
- 
-    postCreatePackage(sfpPackage) {}
- 
-    private async replaceSourceWithDiff(
-        workingDirectory: string,
-        packageDirectory: string,
-        diffPackageDirectory: string
-    ) {
-        const srcDir = path.join(workingDirectory, packageDirectory);
-        const diffSrcDir = path.join(workingDirectory, diffPackageDirectory);
- 
-        // Check if src directories exist, if so remove them
-        Iif (fs.pathExistsSync(srcDir)) await fs.remove(srcDir);
- 
-        // Rename diff/src directory to src
-        if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir);
-        else {
-            // Ensure package directory exists
-            await fs.mkdirpSync(diffSrcDir);
-            await fs.move(diffSrcDir, srcDir);
-        }
- 
-        //check if destructiveChanges.xml exist in diff directory
-        const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml');
-        if (fs.existsSync(destructiveChangesPath)) {
-            //Move destructiveChanges.xml to diff directory
-            await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml'));
-        }
-        //remove diffSrcDir
-        Iif (fs.pathExistsSync(path.join(workingDirectory, 'diff')))
-            fs.removeSync(path.join(workingDirectory, 'diff'));
-    }
- 
-    async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) {
-        let packagesMappedToLastKnownCommitId: { [p: string]: string } = {};
-        packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts);
- 
-        return packagesMappedToLastKnownCommitId;
- 
-        async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> {
-            const packagesToCommits: { [p: string]: string } = {};
-            let jsonOverrides = {};
- 
-            // Add an option to override diff package from during debugging
-            // Also useful for when the record is yet to be baselined
-            try {
-                const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8');
-                jsonOverrides = JSON.parse(jsonData);
-            } catch (error) {
-                console.log('No JSON override file found or there is an error reading it');
-            }
- 
-            // Merge the installedArtifacts data with the JSON overrides
-            if (installedArtifacts) {
-                installedArtifacts.forEach((artifact) => {
-                    packagesToCommits[artifact.Name] = artifact.CommitId__c;
-                });
-            }
- 
-            // Add additional packages from the JSON overrides that are not in installedArtifacts
-            Object.keys(jsonOverrides).forEach((pkgName) => {
-                if (!packagesToCommits.hasOwnProperty(pkgName)) {
-                    packagesToCommits[pkgName] = jsonOverrides[pkgName];
-                }
-            });
- 
-            Iif (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG];
- 
-            return packagesToCommits;
-        }
-    }
- 
-    private async introspectDiffPackageCreated(
-        sfpPackage: SfpPackage,
-        packageParams: SfpPackageParams,
-        logger: Logger
-    ): Promise<void> {
-        let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff');
-        if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) {
-            let changedComponents = new PackageToComponent(
-                sfpPackage.packageName,
-                path.join(workingDirectory, sfpPackage.packageDirectory)
-            ).generateComponents();
- 
-            let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher(
-                sfpPackage,
-                changedComponents,
-                logger
-            );
-            let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses();
- 
-            //Convert again for finding the values in the diff package
-            let sourceToMdapiConvertor = new SourceToMDAPIConvertor(
-                workingDirectory,
-                sfpPackage.packageDescriptor.path,
-                sfpPackage.apiVersion,
-                logger
-            );
- 
-            let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath;
- 
-            const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath);
- 
-            sfpPackage.payload = packageManifest.manifestJson;
-            sfpPackage.apexTestClassses = impactedTestClasses;
-            sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage(
-                changedComponents,
-                sfpPackage.apexClassesSortedByTypes
-            );
-            sfpPackage.isApexFound = packageManifest.isApexInPackage();
-            sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage();
-            sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage();
-            sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles();
- 
-            sfpPackage.metadataCount = await MetadataCount.getMetadataCount(
-                workingDirectory,
-                sfpPackage.packageDescriptor.path
-            );
-            rimraf.sync(mdapiDirPath);
-        } else {
-            //Souce Diff Directory is empty
-            sfpPackage.payload = {};
-            sfpPackage.apexTestClassses = [];
-            sfpPackage.apexClassWithOutTestClasses = [];
-            sfpPackage.isApexFound = false;
-            sfpPackage.isProfilesFound = false;
-            sfpPackage.isPermissionSetGroupFound = false;
-            sfpPackage.isPayLoadContainTypesSupportedByProfiles = false;
-            sfpPackage.metadataCount = 0;
-        }
- 
-        function getOnlyChangedClassesFromPackage(
-            changedComponents: Component[],
-            apexClassesSortedByTypes: ApexSortedByType
-        ): string[] {
-            // Check if the parameters are not empty or undefined
-            if (!changedComponents || !apexClassesSortedByTypes) {
-                return undefined;
-            }
- 
-            // Check if the 'class' property exists in apexClassesSortedByTypes
-            if (!apexClassesSortedByTypes.class) {
-                return undefined;
-            }
- 
-            // Get the names of all classes in the ApexSortedByType
-            let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name);
-            let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name);
-            const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name);
-            apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name));
-            apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name));
- 
-            // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass'
-            const filteredComponents = changedComponents.filter(
-                (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass'
-            );
- 
-            // Extract the fullName property from the filtered components
-            const filteredChangedClasses = filteredComponents.map((component) => component.fullName);
- 
-            return filteredChangedClasses;
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html deleted file mode 100644 index a1194a353..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/CreatePackage.ts.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - Code coverage report for src/core/package/packageCreators/CreatePackage.ts - - - - - - - - - -
-
-

All files / src/core/package/packageCreators CreatePackage.ts

-
- -
- 8.69% - Statements - 4/46 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/7 -
- - -
- 8.88% - Lines - 4/45 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -1471x -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import SFPStatsSender from '../../stats/SFPStatsSender';
-import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage';
-import { PackageCreationParams } from '../SfpPackageBuilder';
- 
-export abstract class CreatePackage {
-    private startTime: number;
- 
-    constructor(
-        protected projectDirectory: string,
-        protected sfpPackage: SfpPackage,
-        protected packageCreationParams?: PackageCreationParams,
-        protected logger?: Logger,
-        protected params?: SfpPackageParams
-    ) {
-        //Initialize Params
-        Iif (this.params == null) this.params = {};
-    }
- 
-    public async exec(): Promise<SfpPackage> {
-        //Capture Start TimegetSFDXProjectConfig
-        this.startTime = Date.now();
- 
-        //Print Header
-        this.printHeader();
- 
-        //Check if the package is empty
-        await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path);
-        //Call lifecycle commands
-        await this.preCreatePackage(this.sfpPackage);
-        await this.createPackage(this.sfpPackage);
-        await this.postCreatePackage(this.sfpPackage);
- 
-        //Add addtional descriptors available
-        this.writeDeploymentStepsToArtifact(this.sfpPackage);
- 
-        //Send Metrics to Logging system
-        this.sendMetricsWhenSuccessfullyCreated();
- 
-        return this.sfpPackage;
-    }
- 
-    abstract getTypeOfPackage();
- 
-    abstract preCreatePackage(sfpPackage: SfpPackage);
-    abstract createPackage(sfpPackage: SfpPackage);
-    abstract postCreatePackage(sfpPackage: SfpPackage);
- 
-    private sendMetricsWhenSuccessfullyCreated() {
-        let elapsedTime = Date.now() - this.startTime;
- 
-        this.sfpPackage.creation_details = {
-            creation_time: elapsedTime,
-            timestamp: Date.now(),
-        };
- 
-        Iif (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked)
-            SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, {
-                package: this.sfpPackage.package_name,
-                type: this.sfpPackage.package_type,
-            });
- 
-        SFPStatsSender.logCount('package.created', {
-            package: this.sfpPackage.package_name,
-            type: this.sfpPackage.package_type,
-            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
-        });
- 
-        SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, {
-            package: this.sfpPackage.package_name,
-            type: this.sfpPackage.package_type,
-            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
-        });
-        SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, {
-            package: this.sfpPackage.package_name,
-            type: this.sfpPackage.package_type,
-            is_dependency_validated: String(this.sfpPackage.isDependencyValidated),
-        });
-    }
- 
-    private writeDeploymentStepsToArtifact(packageDescriptor: any) {
-        if (packageDescriptor.assignPermSetsPreDeployment) {
-            if (packageDescriptor.assignPermSetsPreDeployment instanceof Array)
-                this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment;
-            else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array");
-        }
- 
-        if (packageDescriptor.assignPermSetsPostDeployment) {
-            if (packageDescriptor.assignPermSetsPostDeployment instanceof Array)
-                this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment;
-            else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array");
-        }
-    }
- 
-    private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) {
-        if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) {
-            if (this.packageCreationParams.breakBuildIfEmpty)
-                throw new Error(`Package directory ${packageDirectory} is empty`);
-            else this.printEmptyArtifactWarning();
-        }
-    }
- 
-    abstract isEmptyPackage(projectDirectory: string, packageDirectory: string);
- 
-    protected printEmptyArtifactWarning() {
-        SFPLogger.printHeaderLine(
-           `WARNING! Empty aritfact encountered`,
-            COLOR_WARNING,
-            LoggerLevel.INFO,
-            this.logger
-        );
-        SFPLogger.log(
-            'Either this folder is empty or the application of .forceignore results in an empty folder',
-            LoggerLevel.INFO,
-            this.logger
-        );
-        SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger);
-        SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger);
-    }
- 
-    private printHeader() {
-        SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create  package`)}`), LoggerLevel.INFO, this.logger);
-        SFPLogger.log(
-            COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`),
-            LoggerLevel.INFO,
-            this.logger
-        );
-        SFPLogger.log(
-            COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`),
-            LoggerLevel.INFO,
-            this.logger
-        );
- 
-        SFPLogger.log(
-            COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`),
-            LoggerLevel.INFO,
-            this.logger
-        );
- 
-        this.printAdditionalPackageSpecificHeaders();
- 
-        SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger);
-    }
- 
-    abstract printAdditionalPackageSpecificHeaders();
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html deleted file mode 100644 index f997c332d..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/packageCreators/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/package/packageCreators - - - - - - - - - -
-
-

All files src/core/package/packageCreators

-
- -
- 14.43% - Statements - 28/194 -
- - -
- 0% - Branches - 0/28 -
- - -
- 0% - Functions - 0/40 -
- - -
- 15.73% - Lines - 28/178 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
CreateDataPackageImpl.ts -
-
21.62%8/370%0/90%0/1126.66%8/30
CreateDiffPackageImpl.ts -
-
14.41%16/1110%0/90%0/2215.53%16/103
CreatePackage.ts -
-
8.69%4/460%0/100%0/78.88%4/45
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html deleted file mode 100644 index e2b29b295..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Code coverage report for src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts - - - - - - - - - -
-
-

All files / src/core/package/propertyFetchers AssignPermissionSetFetcher.ts

-
- -
- 75% - Statements - 6/8 -
- - -
- 50% - Branches - 2/4 -
- - -
- 100% - Functions - 1/1 -
- - -
- 75% - Lines - 6/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24  -  -  -  -2x -  -  -4x -4x -  -  -  -  -  -4x -4x -  -  -  -  -4x -  -  - 
import { Logger } from '@flxblio/sfp-logger';
-import SfpPackage from '../SfpPackage';
-import PropertyFetcher from './PropertyFetcher';
- 
-export default class AssignPermissionSetFetcher implements PropertyFetcher {
-    public getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) {
-        if (packageContents.packageDescriptor.assignPermSetsPreDeployment) {
-            if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) {
-                packageContents.assignPermSetsPreDeployment =
-                    packageContents.packageDescriptor.assignPermSetsPreDeployment;
-            } else Ethrow new Error("Property 'assignPermSetsPreDeployment' must be of type array");
-        }
- 
-        if (packageContents.packageDescriptor.assignPermSetsPostDeployment) {
-            if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) {
-                packageContents.assignPermSetsPostDeployment =
-                    packageContents.packageDescriptor.assignPermSetsPostDeployment;
-            } else Ethrow new Error("Property 'assignPermSetsPostDeployment' must be of type array");
-        }
- 
-        return packageContents;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html deleted file mode 100644 index 40f04ae24..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts - - - - - - - - - -
-
-

All files / src/core/package/propertyFetchers DestructiveManifestPathFetcher.ts

-
- -
- 77.77% - Statements - 7/9 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 1/1 -
- - -
- 77.77% - Lines - 7/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -302x -  -  -2x -  -  -2x -  -  -  -  -  -  -  -  -4x -4x -  -  -  -  -4x -  -  -  -  -4x -  -  - 
import * as fs from 'fs-extra';
-import SfpPackage from '../SfpPackage';
-import PropertyFetcher from './PropertyFetcher';
-import xml2json from '../../utils/xml2json';
-import { Logger } from '@flxblio/sfp-logger';
- 
-export default class DestructiveManifestPathFetcher implements PropertyFetcher {
-    public async getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) {
-        let destructiveChangesPath: string;
- 
-        if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) {
-            throw new Error('Project Config (sfdx-project.json) is null');
-        }
- 
-        if (packageContents.packageDescriptor['destructiveChangePath']) {
-            destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath'];
-            packageContents.destructiveChangesPath = destructiveChangesPath;
-        }
- 
-        try {
-            if (destructiveChangesPath != null) {
-                packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8'));
-            }
-        } catch (error) {
-            throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest');
-        }
-        return packageContents;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html deleted file mode 100644 index 945a5a918..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts - - - - - - - - - -
-
-

All files / src/core/package/propertyFetchers ReconcileProfilePropertyFetcher.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -2x -  -  -2x -  -  -  - 
import SfpPackage from '../SfpPackage';
-import PropertyFetcher from './PropertyFetcher';
- 
-export default class ReconcilePropertyFetcher implements PropertyFetcher {
-    getsfpProperties(packageContents: SfpPackage, packageLogger?: any) {
-        if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) {
-            packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles;
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html deleted file mode 100644 index 1742aac17..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/propertyFetchers/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/package/propertyFetchers - - - - - - - - - -
-
-

All files src/core/package/propertyFetchers

-
- -
- 78.94% - Statements - 15/19 -
- - -
- 66.66% - Branches - 4/6 -
- - -
- 100% - Functions - 3/3 -
- - -
- 78.94% - Lines - 15/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
AssignPermissionSetFetcher.ts -
-
75%6/850%2/4100%1/175%6/8
DestructiveManifestPathFetcher.ts -
-
77.77%7/9100%2/2100%1/177.77%7/9
ReconcileProfilePropertyFetcher.ts -
-
100%2/2100%0/0100%1/1100%2/2
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html deleted file mode 100644 index 681b92b0c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/PackageEmptyChecker.ts.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - Code coverage report for src/core/package/validators/PackageEmptyChecker.ts - - - - - - - - - -
-
-

All files / src/core/package/validators PackageEmptyChecker.ts

-
- -
- 12.5% - Statements - 5/40 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/3 -
- - -
- 13.51% - Lines - 5/37 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -861x -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import path from 'path';
-import { readFileSync, existsSync } from 'fs';
-import FileSystem from '../../utils/FileSystem';
-import ignore from 'ignore';
- 
-export default class PackageEmptyChecker {
-    public static isToBreakBuildForEmptyDirectory(
-        projectDir: string,
-        sourceDirectory: string,
-        isToBreakBuildIfEmpty: boolean
-    ): {
-        message: string;
-        result: string;
-    } {
-        let directoryToCheck;
-        let status: { message: string; result: string } = {
-            message: '',
-            result: '',
-        };
- 
-        if (projectDir != null) {
-            directoryToCheck = path.join(projectDir, sourceDirectory);
-        } else directoryToCheck = sourceDirectory;
- 
-        try {
-            if (!existsSync(directoryToCheck)) {
-                //Folder do not exists, break build
-                if (isToBreakBuildIfEmpty) {
-                    status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
-                    status.result = 'break';
-                } else {
-                    status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
-                    status.result = 'skip';
-                }
-                return status;
-            } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) {
-                if (isToBreakBuildIfEmpty) {
-                    status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
-                    status.result = 'break';
-                } else {
-                    status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`;
-                    status.result = 'skip';
-                }
-                return status;
-            } else {
-                status.result = 'continue';
-                return status;
-            }
-        } catch (err) {
-            if (err.code === 'ENOENT') {
-                throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist
-            } else if (!isToBreakBuildIfEmpty) {
-                status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`;
-                status.result = 'skip';
-                return status;
-            } else throw err;
-        }
-    }
- 
-    public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean {
-        let dirToCheck;
- 
-        if (projectDirectory != null) {
-            dirToCheck = path.join(projectDirectory, sourceDirectory);
-        } else {
-            dirToCheck = sourceDirectory;
-        }
- 
-        let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false);
-        // Include source directory in filepaths, as it can be a pattern in forceignore
-        files = files.map((file) => path.join(sourceDirectory, file));
- 
-        let forceignorePath;
-        if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore');
-        else forceignorePath = path.join(process.cwd(), '.forceignore');
- 
-        // Ignore files that are listed in .forceignore
-        files = ignore()
-            .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'.
-            .filter(files);
- 
-        if (files == null || files.length === 0) return true;
-        else return false;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html deleted file mode 100644 index 6418d85ad..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/validators/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/core/package/validators - - - - - - - - - -
-
-

All files src/core/package/validators

-
- -
- 12.5% - Statements - 5/40 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/3 -
- - -
- 13.51% - Lines - 5/37 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
PackageEmptyChecker.ts -
-
12.5%5/400%0/120%0/313.51%5/37
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html deleted file mode 100644 index 4c3703af1..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/Package2VersionFetcher.ts.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - Code coverage report for src/core/package/version/Package2VersionFetcher.ts - - - - - - - - - -
-
-

All files / src/core/package/version Package2VersionFetcher.ts

-
- -
- 86.95% - Statements - 40/46 -
- - -
- 90% - Branches - 9/10 -
- - -
- 80% - Functions - 4/5 -
- - -
- 86.84% - Lines - 33/38 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110  -4x -4x -  -  -  -  -4x -8x -  -  -8x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -4x -  -  -  -4x -  -4x -4x -4x -4x -  -  -4x -  -4x -4x -  -  -4x -  -  -4x -3x -6x -6x -6x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -2x -  -  -1x -1x -1x -1x -  -2x -  -2x -2x -  -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import QueryHelper from '../../queryHelper/QueryHelper';
-import semver from 'semver';
- 
-/**
- * Fetcher for second-generation package version in Dev Hub
- */
-export default class Package2VersionFetcher {
-    private readonly query: string =
-        'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version ';
- 
-    constructor(private conn: Connection) {}
- 
-    /**
-     * Fetch Package2 versions by Package2 Id
-     * Sorts by semantic version, in descending order
-     * @param package2Id
-     * @param versionNumber
-     * @param isValidatedPackages
-     * @returns
-     */
-    async fetchByPackage2Id(
-        package2Id: string,
-        versionNumber?: string,
-        isValidatedPackages?: boolean
-    ): Promise<Package2Version[]> {
-        let query = this.query;
- 
-        let whereClause: string = `where Package2Id='${package2Id}'  `;
- 
-        if (versionNumber) {
-            // TODO: validate version number
-            const versions = versionNumber.split('.');
- 
-            if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `;
-            if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `;
-            if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `;
-            Iif (versions[3]) whereClause += `and BuildNumber=${versions[3]} `;
-        }
- 
-        if (isValidatedPackages) whereClause += `and ValidationSkipped = false `;
- 
-        whereClause += `and IsDeprecated = false `;
-        query += whereClause;
- 
- 
-        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
- 
-       
-        if (records.length > 1) {
-            return records.sort((a, b) => {
-                const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`;
-                const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`;
-                return semver.rcompare(v1, v2);
-            });
-        } else return records;
-    }
- 
-    async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise<Package2Version> {
-        let query = this.query;
- 
-        let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`;
-        query += whereClause;
- 
-        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
-        return records[0];
-    }
- 
-    async fetchByPackageBranchAndName(
-        packageBranch: string, 
-        packageName: string, 
-        versionNumber?: string,
-        ): Promise<Package2Version[]> {
-            
-        let query = this.query;
- 
-        let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `;
-        if (versionNumber) {
-            // TODO: validate version number
-            const versions = versionNumber.split('.');
-            if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `;
-            if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `;
-            if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `;
-        }
-        query += whereClause;
- 
-        let orderByClause: string = `order by CreatedDate desc`;
-        query += orderByClause;
- 
-        const records = await QueryHelper.query<Package2Version>(query, this.conn, true);
-        return records;
- 
-    }        
-}
- 
-export interface Package2Version {
-    SubscriberPackageVersionId: string;
-    Package2Id: string;
-    Package2: { Name: string };
-    IsPasswordProtected: boolean;
-    IsReleased: boolean;
-    MajorVersion: number;
-    MinorVersion: number;
-    PatchVersion: number;
-    BuildNumber: number;
-    CodeCoverage: { apexCodeCoveragePercentage: number };
-    HasPassedCodeCoverageCheck: boolean;
-    Branch: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html deleted file mode 100644 index 6e1bc289c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/PackageVersionUpdater.ts.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - Code coverage report for src/core/package/version/PackageVersionUpdater.ts - - - - - - - - - -
-
-

All files / src/core/package/version PackageVersionUpdater.ts

-
- -
- 12.5% - Statements - 1/8 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 14.28% - Lines - 1/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SfpPackage from '../SfpPackage';
- 
-export default class PackageVersionUpdater {
-    public constructor() {}
- 
-    public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string {
-        if (!sfpPackage.versionNumber) {
-            throw new Error('The package doesnt have a version attribute, Please check your definition');
-        } else {
-            let segments = sfpPackage.versionNumber.split('.');
-            let numberToBeAppended = parseInt(buildNumber);
- 
-            if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number');
-            else segments[3] = buildNumber;
-            return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`;
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html deleted file mode 100644 index 212c33df9..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/package/version/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/package/version - - - - - - - - - -
-
-

All files src/core/package/version

-
- -
- 75.92% - Statements - 41/54 -
- - -
- 75% - Branches - 9/12 -
- - -
- 57.14% - Functions - 4/7 -
- - -
- 75.55% - Lines - 34/45 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
Package2VersionFetcher.ts -
-
86.95%40/4690%9/1080%4/586.84%33/38
PackageVersionUpdater.ts -
-
12.5%1/80%0/20%0/214.28%1/7
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html deleted file mode 100644 index 548091816..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/AssignPermissionSetsImpl.ts.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - Code coverage report for src/core/permsets/AssignPermissionSetsImpl.ts - - - - - - - - - -
-
-

All files / src/core/permsets AssignPermissionSetsImpl.ts

-
- -
- 90.9% - Statements - 30/33 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 5/5 -
- - -
- 90.9% - Lines - 30/33 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94  -1x -1x -1x -1x -1x -  -1x -  -3x -3x -3x -3x -  -  -  -  -  -  -  -  -  -  -  -  -3x -3x -  -  -  -  -3x -  -  -  -3x -  -  -6x -12x -  -  -  -  -  -  -  -  -  -6x -  -  -  -  -  -  -  -  -6x -6x -3x -3x -  -  -  -  -  -  -2x -2x -  -  -  -2x -2x -  -  -3x -  -  -  -4x -  -  -  -  -4x -6x -  -  -4x -  -  - 
import { Connection } from '@salesforce/core';
-import child_process = require('child_process');
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import PermissionSetFetcher from './PermissionSetFetcher';
-import { ZERO_BORDER_TABLE } from '../display/TableConstants';
-const Table = require('cli-table');
- 
-export default class AssignPermissionSetsImpl {
-    constructor(
-        private conn: Connection,
-        private permSets: string[],
-        private project_directory: string,
-        private packageLogger: Logger
-    ) {}
- 
-    public async exec(): Promise<{
-        successfullAssignments: {
-            username: string;
-            permset: string;
-        }[];
-        failedAssignments: {
-            username: string;
-            permset: string;
-        }[];
-    }> {
-        let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn);
-        let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment();
- 
-        let failedAssignments: {
-            username: string;
-            permset: string;
-        }[] = [];
-        let successfullAssignments: {
-            username: string;
-            permset: string;
-        }[] = [];
- 
-        for (let permSet of this.permSets) {
-            let permSetAssignmentMatch = assignedPermSets.find((record) => {
-                return record.PermissionSet.Name === permSet;
-            });
- 
-            if (permSetAssignmentMatch !== undefined) {
-                // Treat permsets that have already been assigned as successes
-                successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet });
-                continue;
-            }
- 
-            try {
-                let permsetAssignmentJson: string = child_process.execSync(
-                    `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`,
-                    {
-                        cwd: this.project_directory,
-                        encoding: 'utf8',
-                        stdio: ['pipe', 'pipe', 'inherit'],
-                    }
-                );
- 
-                let permsetAssignment = JSON.parse(permsetAssignmentJson);
-                if (permsetAssignment.status === 0)
-                    successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet });
-                else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet });
-            } catch (err) {
-                failedAssignments.push({ username: this.conn.getUsername(), permset: permSet });
-            }
-        }
- 
-        if (successfullAssignments.length > 0) {
-            SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger);
-            this.printPermsetAssignments(successfullAssignments);
-        }
- 
-        if (failedAssignments.length > 0) {
-            SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger);
-            this.printPermsetAssignments(failedAssignments);
-        }
- 
-        return { successfullAssignments, failedAssignments };
-    }
- 
-    private printPermsetAssignments(assignments: { username: string; permset: string }[]) {
-        let table = new Table({
-            head: ['Username', 'Permission Set Assignment'],
-            chars: ZERO_BORDER_TABLE
-        });
- 
-        assignments.forEach((assignment) => {
-            table.push([assignment.username, assignment.permset]);
-        });
- 
-        SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html deleted file mode 100644 index b70f990bf..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetFetcher.ts.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for src/core/permsets/PermissionSetFetcher.ts - - - - - - - - - -
-
-

All files / src/core/permsets PermissionSetFetcher.ts

-
- -
- 100% - Statements - 6/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16  -1x -  -  -  -  -1x -3x -  -  -3x -  -3x -  -  - 
import { Connection } from '@salesforce/core';
-import QueryHelper from '../queryHelper/QueryHelper';
- 
-/*
- * Retrieve Permsets for a user from a target org
- */
-export default class PermissionSetFetcher {
-    constructor(private username: string, private conn: Connection) {}
- 
-    public async fetchAllPermsetAssignment() {
-        const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`;
- 
-        return QueryHelper.query<any>(query, this.conn, false);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html deleted file mode 100644 index 017d0ff90..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/core/permsets/PermissionSetGroupUpdateAwaiter.ts - - - - - - - - - -
-
-

All files / src/core/permsets PermissionSetGroupUpdateAwaiter.ts

-
- -
- 70.58% - Statements - 12/17 -
- - -
- 100% - Branches - 1/1 -
- - -
- 100% - Functions - 2/2 -
- - -
- 66.66% - Lines - 10/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47  -1x -1x -1x -  -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import QueryHelper from '../queryHelper/QueryHelper';
-import { delay } from '../utils/Delay';
- 
-const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`;
- 
-export default class PermissionSetGroupUpdateAwaiter {
-    constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {}
- 
-    async waitTillAllPermissionSetGroupIsUpdated() {
-        SFPLogger.log(
-            `Checking status of permission sets group..`,
-            LoggerLevel.INFO,
-            this.logger
-        );
-        while (true) {
-            try {
-                let records = await QueryHelper.query(psGroupQuery, this.connection, false);
-                if (records.length > 0) {
-                    SFPLogger.log(
-                        `Pausing deployment as ${records.length} PermissionSetGroups are being updated`,
-                        LoggerLevel.INFO,
-                        this.logger
-                    );
-                    SFPLogger.log(
-                        `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`,
-                        LoggerLevel.INFO,
-                        this.logger
-                    );
-                    await delay(this.intervalBetweenRepeats);
-                } else {
-                    SFPLogger.log(
-                        `Proceeding with deployment, as no PermissionSetGroups are being updated`,
-                        LoggerLevel.INFO,
-                        this.logger
-                    );
-                    break;
-                }
-            } catch (error) {
-                SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger);
-                throw error;
-            }
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html deleted file mode 100644 index e48b0995f..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/permsets/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/permsets - - - - - - - - - -
-
-

All files src/core/permsets

-
- -
- 85.71% - Statements - 48/56 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 9/9 -
- - -
- 84.9% - Lines - 45/53 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
AssignPermissionSetsImpl.ts -
-
90.9%30/33100%2/2100%5/590.9%30/33
PermissionSetFetcher.ts -
-
100%6/6100%0/0100%2/2100%5/5
PermissionSetGroupUpdateAwaiter.ts -
-
70.58%12/17100%1/1100%2/266.66%10/15
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html deleted file mode 100644 index 1f9e646ef..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/ProjectConfig.ts.html +++ /dev/null @@ -1,928 +0,0 @@ - - - - - - Code coverage report for src/core/project/ProjectConfig.ts - - - - - - - - - -
-
-

All files / src/core/project ProjectConfig.ts

-
- -
- 71.59% - Statements - 63/88 -
- - -
- 72.72% - Branches - 16/22 -
- - -
- 76.92% - Functions - 20/26 -
- - -
- 72.5% - Lines - 58/80 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -2825x -  -5x -5x -5x -  -  -  -  -5x -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -1x -1x -1x -  -5x -  -1x -  -  -  -  -  -2x -2x -2x -2x -3x -  -  -  -15x -  -  -  -  -1x -  -2x -  -  -  -  -  -  -  -1x -1x -  -5x -  -1x -  -  -  -  -  -7x -7x -  -  -35x -  -  -7x -  -  -  -  -  -  -  -  -  -  -  -  -  -13x -13x -  -60x -  -13x -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -13x -  -  -7x -  -6x -5x -  -5x -  -  -  -  -  -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -24x -  -23x -  -  -  -  -24x -  -23x -  -  -  -  -  -  -  -  -  -  -1x -  -  -1x -  -1x -1x -  -  -  -1x -1x -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -4x -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const fs = require('fs-extra');
-import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger';
-import _ from 'lodash';
-import { PackageType } from '../package/SfpPackage';
-let path = require('path');
- 
-/**
- * Helper functions for retrieving info from project config
- */
-export default class ProjectConfig {
-    /**
-     * Returns 0H Id of package from project config
-     * @param projectConfig
-     * @param sfdxPackage
-     */
-    public static getPackageId(projectConfig: any, sfdxPackage: string) {
-        if (projectConfig['packageAliases']?.[sfdxPackage]) {
-            return projectConfig['packageAliases'][sfdxPackage];
-        } else {
-            throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added');
-        }
-    }
- 
-    /**
-     * Returns package names, as an array of strings
-     * @param projectDirectory
-     */
-    public static getAllPackages(projectDirectory: string): string[] {
-        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
-        let sfdxpackages = [];
-        projectConfig['packageDirectories'].forEach((pkg) => {
-            //Only push packages that have package and versionNumber, ignore everything else
-            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package);
-        });
-        return sfdxpackages;
-    }
- 
-    public static getAllExternalPackages(
-        projectConfig: any
-    ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] {
-        let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = [];
-        let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
-        const packageAliases = projectConfig.packageAliases || {};
-        Object.entries(packageAliases).forEach(([key, value]) => {
-            if (
-                !_.find(
-                    packagesInCurrentDirectory,
-                    (elem) => {
-                        return elem.package == key;
-                    },
-                    0
-                )
-            )
-                externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string });
-        });
-        return externalPackages;
-    }
- 
-    /**
-     * Returns package names from projectConfig, as an array of strings
-     * @param projectDirectory
-     */
-    public static getAllPackagesFromProjectConfig(projectConfig: any): string[] {
-        let sfdxpackages = [];
-        projectConfig.packageDirectories.forEach((pkg) => {
-            //Only push packages that have package and versionNumber, ignore everything else
-            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package);
-        });
-        return sfdxpackages;
-    }
- 
-    public static getAllPackagesAndItsDependencies(
-        projectConfig: any
-    ): Map<string, { package: string; versionNumber?: string }[]> {
-        let pkgWithDependencies = new Map<string, { package: string; versionNumber?: string }[]>();
-        let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
-        for (let pkg of packages) {
-            if (pkg.dependencies) {
-                pkgWithDependencies.set(pkg.package, pkg.dependencies);
-            }
-        }
-        return pkgWithDependencies;
-    }
- 
-    public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] {
-        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
-        let sfdxpackages = [];
-        projectConfig.packageDirectories?.forEach((pkg) => {
-            //Only push packages that have package and versionNumber, ignore everything else
-            Iif (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg);
-        });
-        return sfdxpackages;
-    }
- 
-    public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] {
-        let sfdxpackages = [];
-        projectConfig.packageDirectories?.forEach((pkg) => {
-            //Only push packages that have package and versionNumber, ignore everything else
-            if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg);
-        });
-        return sfdxpackages;
-    }
- 
-    /**
-     * Returns package manifest as JSON object
-     * @param projectDirectory
-     */
-    public static getSFDXProjectConfig(projectDirectory: string): any {
-        let projectConfigJSON: string;
- 
-        if (projectDirectory) {
-            projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json');
-        } else {
-            projectConfigJSON = 'sfdx-project.json';
-        }
- 
-        try {
-            return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8'));
-        } catch (error) {
-            throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`);
-        }
-    }
- 
-    /**
-     * Returns type of package
-     * @param projectConfig
-     * @param sfdxPackage
-     */
-    public static getPackageType(
-        projectConfig: any,
-        sfdxPackage: string
-    ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff {
-        let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
- 
-        if (projectConfig['packageAliases']?.[sfdxPackage]) {
-            return PackageType.Unlocked;
-        } else {
-            if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data;
-            else Iif(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff 
-            else
-             return PackageType.Source;
-        }
-    }
- 
-    /**
-     * Returns package descriptor from package manifest at project directory
-     * @param projectDirectory
-     * @param sfdxPackage
-     */
-    public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any {
-        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
- 
-        let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
- 
-        return sfdxPackageDescriptor;
-    }
- 
-    /**
-     * Returns package descriptor from project config JSON object
-     * @param sfdxPackage
-     * @param projectConfig
-     */
-    public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) {
-        let sfdxPackageDescriptor: any;
- 
-        if (sfdxPackage) {
-            projectConfig['packageDirectories'].forEach((pkg) => {
-                if (sfdxPackage == pkg['package']) {
-                    sfdxPackageDescriptor = pkg;
-                }
-            });
-        }
- 
-        if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`);
- 
-        return sfdxPackageDescriptor;
-    }
- 
-    /**
-     * Returns descriptor of default package
-     * @param projectDirectory
-     */
-    public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any {
-        let packageDirectory: string;
-        let sfdxPackageDescriptor: any;
- 
-        let projectConfig = this.getSFDXProjectConfig(projectDirectory);
- 
-        //Return the default package directory
-        projectConfig['packageDirectories'].forEach((pkg) => {
-            if (pkg['default'] == true) {
-                packageDirectory = pkg['path'];
-                sfdxPackageDescriptor = pkg;
-            }
-        });
- 
-        Iif (packageDirectory == null) throw new Error('Package or package directory not exist');
-        else return sfdxPackageDescriptor;
-    }
- 
-    /**
-     * Returns pruned package manifest, containing sfdxPackage only
-     * @param projectDirectory
-     * @param sfdxPackage
-     */
-    public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any {
-        const projectConfig = this.getSFDXProjectConfig(projectDirectory);
- 
-        return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage);
-    }
- 
-    /**
-     * Returns pruned package manifest, containing sfdxPackage only
-     * @param projectConfig
-     * @param sfdxPackage
-     */
-    public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any {
-        if (sfdxPackage) {
-            let i = projectConfig['packageDirectories'].length;
-            while (i--) {
-                if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) {
-                    projectConfig['packageDirectories'].splice(i, 1);
-                }
-            }
-        } else {
-            let i = projectConfig['packageDirectories'].length;
-            while (i--) {
-                if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) {
-                    projectConfig['packageDirectories'].splice(i, 1);
-                }
-            }
-        }
-        projectConfig['packageDirectories'][0]['default'] = true; //add default = true
-        return projectConfig;
-    }
- 
-    /**
-     * Returns pruned package manifest, containing sfdxPackages only
-     * @param projectConfig
-     * @param sfdxPackages
-     */
-    public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any {
-        let revisedPackageDirectory = [];
-        let originalPackageDirectory = projectConfig['packageDirectories'];
-        for (let pkg of originalPackageDirectory) {
-            for (const sfdxPackage of sfdxPackages) {
-                if (pkg.name == sfdxPackage) {
-                    pkg.default = false;
-                    revisedPackageDirectory.push(pkg);
-                }
-            }
-        }
-        projectConfig['packageDirectories'][0]['default'] = true; //add default = true
-        projectConfig.packageDirectories = revisedPackageDirectory;
-        return projectConfig;
-    }
- 
-    /**
-     * Returns pruned package manifest, containing sfdxPackages only
-     * @param projectConfig
-     * @param sfdxPackages
-     */
-    public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any {
-        const projectConfig = this.getSFDXProjectConfig(projectDirectory);
-        return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages);
-    }
- 
-   
- 
-    public static async updateProjectConfigWithDependencies(
-        projectConfig: any,
-        dependencyMap: Map<string, { package: string; versionNumber?: string }[]>
-    ) {
-        let updatedprojectConfig = await _.cloneDeep(projectConfig);
-        updatedprojectConfig.packageDirectories.map((pkg) => {
-            return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) });
-        });
- 
-        return updatedprojectConfig;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html deleted file mode 100644 index dabdc67c8..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/UserDefinedExternalDependency.ts.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for src/core/project/UserDefinedExternalDependency.ts - - - - - - - - - -
-
-

All files / src/core/project UserDefinedExternalDependency.ts

-
- -
- 83.33% - Statements - 20/24 -
- - -
- 75% - Branches - 3/4 -
- - -
- 100% - Functions - 3/3 -
- - -
- 83.33% - Lines - 20/24 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -622x -2x -2x -2x -  -  -  -  -  -2x -  -  -  -9x -9x -9x -9x -  -  -  -  -  -  -2x -2x -2x -  -2x -  -2x -  -  -2x -  -  -  -  -  -  -2x -2x -  -  -  -7x -  -7x -  -  -  -  -  -  -  -  -  -  -  -7x -  -  - 
import SFPLogger from '@flxblio/sfp-logger';
-import { Connection, LoggerLevel } from '@salesforce/core';
-import _ from 'lodash';
-import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver';
- 
-/**
- * Functions to deal with externalDependencyMap supplied by the user
- * to aid in resolving transitive dependencies
- */
-export default class UserDefinedExternalDependencyMap {
-   
- 
-    public  fetchDependencyEntries(projectConfig: any) {
-        if (projectConfig.plugins?.sfp?.externalDependencyMap) {
-            let externalDependencyMap = projectConfig.plugins.sfp.externalDependencyMap;
-            SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG);
-            return externalDependencyMap;
-        }
-        else
-         Ereturn {};
-    }
- 
-    public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) {
-        let externalDependencies = [];
-        let updatedProjectConfig = await _.cloneDeep(projectConfig);
-        let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null);
- 
-        let externalDependencyMap = this.fetchDependencyEntries(projectConfig);
- 
-        let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions();
- 
-        for (let externalPackage2 of externalPackage2s) {
-            externalDependencies.push(externalPackage2.name);
-        }
-        for (let dependency of externalDependencies) {
-            if (!Object.keys(externalDependencyMap).includes(dependency)) {
-                externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }];
-            }
-        }
-        updatedProjectConfig.plugins.sfp.externalDependencyMap = externalDependencyMap;
-        return updatedProjectConfig;
-    }
- 
-    public async cleanupEntries(projectConfig: any) {
-        let updatedProjectConfig = await _.cloneDeep(projectConfig);
-        if (updatedProjectConfig?.plugins?.sfp?.externalDependencyMap) {
-            const externalDependencyMap = updatedProjectConfig.plugins.sfp.externalDependencyMap;
-            for (let externalPackage of Object.keys(externalDependencyMap)) {
-                if (externalDependencyMap[externalPackage][0].package == '') {
-                    delete externalDependencyMap[externalPackage];
-                } else if (
-                    externalDependencyMap[externalPackage][0].package != '' &&
-                    externalDependencyMap[externalPackage][0].versionNumber == ''
-                ) {
-                    delete externalDependencyMap[externalPackage][0].versionNumber;
-                }
-            }
-        }
-        return updatedProjectConfig;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html deleted file mode 100644 index 36a0329c5..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/project/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/project - - - - - - - - - -
-
-

All files src/core/project

-
- -
- 74.1% - Statements - 83/112 -
- - -
- 73.07% - Branches - 19/26 -
- - -
- 79.31% - Functions - 23/29 -
- - -
- 75% - Lines - 78/104 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ProjectConfig.ts -
-
71.59%63/8872.72%16/2276.92%20/2672.5%58/80
UserDefinedExternalDependency.ts -
-
83.33%20/2475%3/4100%3/383.33%20/24
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html deleted file mode 100644 index 92a33a04a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/ChunkCollection.ts.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - Code coverage report for src/core/queryHelper/ChunkCollection.ts - - - - - - - - - -
-
-

All files / src/core/queryHelper ChunkCollection.ts

-
- -
- 100% - Statements - 16/16 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 16/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38  -  -  -  -  -  -  -  -2x -3x -3x -  -3x -3x -  -  -1x -  -  -7x -  -6x -6x -  -1x -  -  -1x -1x -1x -1x -  -  -  -2x -  -2x - 
 
- 
-/**
- * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars)
- * @param collection values in SOQL WHERE clause
- * @param chunkSize default is 4000
- * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000
- */
-export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] {
-  const result: string[][] = [];
-  chunkSize = chunkSize - offset;
- 
-  let chunk: string[] = [];
-  let numberOfCharsInChunk: number = 0;
-  for (const elem of collection) {
-    if (elem.length + 2 > chunkSize) {
-      throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`);
-    }
- 
-    const commasAndQuotes = 2*(chunk.length+1) + chunk.length;
-    if (numberOfCharsInChunk + elem.length +  commasAndQuotes <= chunkSize) {
-      chunk.push(elem);
-      numberOfCharsInChunk += elem.length;
-    } else {
-      result.push(chunk);
- 
-      // Create new chunk
-      chunk = [];
-      numberOfCharsInChunk = 0;
-      chunk.push(elem);
-      numberOfCharsInChunk += elem.length;
-    }
-  }
- 
-  result.push(chunk);
- 
-  return result;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html deleted file mode 100644 index ba125afc0..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/QueryHelper.ts.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - Code coverage report for src/core/queryHelper/QueryHelper.ts - - - - - - - - - -
-
-

All files / src/core/queryHelper QueryHelper.ts

-
- -
- 100% - Statements - 7/7 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19  -  -11x -  -11x -  -21x -  -  -27x -20x -  -19x -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
- 
-const retry = require('async-retry');
- 
-export default class QueryHelper {
-    static async query<T>(query: string, conn: Connection, isTooling: boolean): Promise<T[]> {
-        return retry(
-            async (bail) => {
-                let records;
-                if (isTooling) records = (await conn.tooling.query(query)).records;
-                else records = (await conn.query(query)).records;
- 
-                return records;
-            },
-            { retries: 3, minTimeout: 2000 }
-        );
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html deleted file mode 100644 index 8d953ebe0..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/queryHelper/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/queryHelper - - - - - - - - - -
-
-

All files src/core/queryHelper

-
- -
- 100% - Statements - 23/23 -
- - -
- 100% - Branches - 4/4 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 22/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ChunkCollection.ts -
-
100%16/16100%2/2100%1/1100%16/16
QueryHelper.ts -
-
100%7/7100%2/2100%2/2100%6/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html deleted file mode 100644 index 87c6f55b8..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/NativeMetricSender.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/core/stats/NativeMetricSender.ts - - - - - - - - - -
-
-

All files / src/core/stats NativeMetricSender.ts

-
- -
- 16.66% - Statements - 1/6 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 16.66% - Lines - 1/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Logger } from '@flxblio/sfp-logger';
- 
-export abstract class NativeMetricSender {
-    constructor(protected logger: Logger) {}
- 
-    abstract initialize(apiHost: string, apiKey: string): void;
- 
-    abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void;
- 
-    abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void;
- 
-    protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] {
-        if (tags != null && !Array.isArray(tags)) {
-            let transformedTagArray: string[] = [];
-            for (const [key, value] of Object.entries(tags)) {
-                transformedTagArray.push(`${key}:${value}`);
-            }
-            return transformedTagArray;
-        }
-        return tags as string[];
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html deleted file mode 100644 index 5f8563238..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/SFPStatsSender.ts.html +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - Code coverage report for src/core/stats/SFPStatsSender.ts - - - - - - - - - -
-
-

All files / src/core/stats SFPStatsSender.ts

-
- -
- 18.42% - Statements - 7/38 -
- - -
- 0% - Branches - 0/11 -
- - -
- 0% - Functions - 0/7 -
- - -
- 20% - Lines - 7/35 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -1151x -1x -1x -  -1x -  -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import StatsDClient, { ClientOptions, StatsD } from 'hot-shots';
-import * as fs from 'fs-extra';
-import { EOL } from 'os';
-import { NativeMetricSender } from './NativeMetricSender';
-import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender';
-import { Logger } from '@flxblio/sfp-logger';
-import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender';
-import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender';
- 
-export default class SFPStatsSender {
-    private static client: StatsD;
-    private static metricsLogger;
-    private static nativeMetricsSender: NativeMetricSender;
- 
-    static initialize(port: string, host: string, protocol: string) {
-        let options: ClientOptions = {
-            host: host,
-            port: port == null ? 8125 : Number(port),
-            protocol: protocol == 'tcp' ? 'tcp' : 'udp',
-            prefix: 'sfp.',
-        };
-        SFPStatsSender.client = new StatsDClient(options);
-    }
- 
-    static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) {
-        switch (type) {
-            case 'DataDog':
-                this.nativeMetricsSender = new DataDogMetricsSender(logger);
-                this.nativeMetricsSender.initialize(apiHost, apiKey);
-                break;
- 
-            case 'NewRelic':
-                this.nativeMetricsSender = new NewRelicMetricSender(logger);
-                this.nativeMetricsSender.initialize(apiHost, apiKey);
-                break;
-                
-            case 'Splunk':
-                this.nativeMetricsSender = new SplunkMetricSender(logger);
-                this.nativeMetricsSender.initialize(apiHost, apiKey);
-                break;
- 
-            default:
-                throw new Error('Invalid Metric Type');
-        }
-    }
- 
-    static initializeLogBasedMetrics() {
-        try {
-            fs.mkdirpSync('.sfp/logs');
-            SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`;
-        } catch (error) {
-            console.log('Unable to initiate Log based metrics', error);
-        }
-    }
- 
-    static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) {
-        Iif (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags);
- 
-        //Native Datadog integration
-        if (SFPStatsSender.nativeMetricsSender != null) {
-            SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags);
-        }
- 
-        let metrics = {
-            metric: `sfp.${metric}`,
-            type: `timers`,
-            value: elapsedMilliSeconds,
-            timestamp: Date.now(),
-            tags: tags,
-        };
-        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
-    }
- 
-    static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) {
-        Iif (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags);
- 
-        //Native Metrics integration
-        if (SFPStatsSender.nativeMetricsSender != null) {
-            SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags);
-        }
- 
-        let metrics = {
-            metric: `sfp.${metric}`,
-            type: `guage`,
-            value: value,
-            timestamp: Date.now(),
-            tags: tags,
-        };
-        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
-    }
- 
-    static logCount(metric: string, tags?: { [key: string]: string } | string[]) {
-        Iif (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags);
- 
-        //Native Metrics integration
-        if (SFPStatsSender.nativeMetricsSender != null) {
-            SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags);
-        }
- 
-        let metrics = {
-            metric: `sfp.${metric}`,
-            type: `count`,
-            timestamp: Date.now(),
-            tags: tags,
-        };
-        SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger);
-    }
- 
-    static logMetrics(key: any, logger?: any) {
-        if (logger) {
-            fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8');
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html deleted file mode 100644 index afbdc9391..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/core/stats - - - - - - - - - -
-
-

All files src/core/stats

-
- -
- 18.18% - Statements - 8/44 -
- - -
- 0% - Branches - 0/13 -
- - -
- 0% - Functions - 0/9 -
- - -
- 19.51% - Lines - 8/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
NativeMetricSender.ts -
-
16.66%1/60%0/20%0/216.66%1/6
SFPStatsSender.ts -
-
18.42%7/380%0/110%0/720%7/35
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html deleted file mode 100644 index a847ecda3..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts - - - - - - - - - -
-
-

All files / src/core/stats/nativeMetricSenderImpl DataDogMetricSender.ts

-
- -
- 26.66% - Statements - 4/15 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/4 -
- - -
- 26.66% - Lines - 4/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -531x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { BufferedMetricsLogger } from 'datadog-metrics';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { NativeMetricSender } from '../NativeMetricSender';
- 
-export class DataDogMetricsSender extends NativeMetricSender {
-    constructor(logger: Logger) {
-        super(logger);
-    }
- 
-    private nativeDataDogMetricsLogger: BufferedMetricsLogger;
- 
-    public initialize(apiHost: string, apiKey: string) {
-        try {
-            this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({
-                apiHost: apiHost,
-                apiKey: apiKey,
-                prefix: 'sfp.',
-                flushIntervalSeconds: 0,
-            });
-        } catch (error) {
-            SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger);
-        }
-    }
- 
-    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
-        try {
-            let transformedTags = this.transformTagsToStringArray(tags);
-            this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags);
-            this.nativeDataDogMetricsLogger.flush();
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to transmit metrics for metric ${metric} due to` + error,
-                LoggerLevel.TRACE,
-                this.logger
-            );
-        }
-    }
- 
-    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
-        try {
-            let transformedTags = this.transformTagsToStringArray(tags);
-            this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags);
-            this.nativeDataDogMetricsLogger.flush();
-        } catch (error) {
-            SFPLogger.log(
-                `Unable to transmit metrics for metric ${metric} due to` + error,
-                LoggerLevel.TRACE,
-                this.logger
-            );
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html deleted file mode 100644 index 1387b7910..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - Code coverage report for src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts - - - - - - - - - -
-
-

All files / src/core/stats/nativeMetricSenderImpl NewRelicMetricSender.ts

-
- -
- 15.38% - Statements - 4/26 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/6 -
- - -
- 15.38% - Lines - 4/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -671x -  -1x -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { NativeMetricSender } from '../NativeMetricSender';
-import { telemetry } from '@newrelic/telemetry-sdk';
-import {
-    CountMetric,
-    GaugeMetric,
-    MetricBatch,
-    MetricClient,
-} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics';
-import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
- 
-export class NewRelicMetricSender extends NativeMetricSender {
-    constructor(logger: Logger) {
-        super(logger);
-    }
- 
-    private nrMetricClient: telemetry.metrics.MetricClient;
- 
-    //Ignore API Host, as newrelic sdk doesnt need it
-    public initialize(apiHost: string, apiKey: string) {
-        try {
-            this.nrMetricClient = new MetricClient({ apiKey: apiKey });
-        } catch (error) {
-            SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger);
-        }
-    }
- 
-    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
-        metric = `sfp.${metric}`;
-        const guageMetric = new GaugeMetric(metric, value);
-        guageMetric.attributes = tags as { [key: string]: string };
-        const batch = new MetricBatch({}, Date.now(), 1);
-        batch.addMetric(guageMetric);
-        this.nrMetricClient.send(batch, (error, response, body) => {
-            if (response) {
-                SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger);
-            }
-            Iif (error)
-                SFPLogger.log(
-                    `Unable to transmit metrics for metric ${metric} due to` + error,
-                    LoggerLevel.WARN,
-                    this.logger
-                );
-        });
-    }
- 
-    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
-        metric = `sfp.${metric}`;
-        const countMetric = new CountMetric(metric);
-        countMetric.record(1);
-        countMetric.attributes = tags as { [key: string]: string };
-        const batch = new MetricBatch({}, Date.now(), 1);
-        batch.addMetric(countMetric);
- 
-        this.nrMetricClient.send(batch, (error, response, body) => {
-            if (response) {
-                SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger);
-            }
-            Iif (error)
-                SFPLogger.log(
-                    `Unable to transmit metrics for metric ${metric} due to` + error,
-                    LoggerLevel.WARN,
-                    this.logger
-                );
-        });
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html deleted file mode 100644 index c6f36719b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts - - - - - - - - - -
-
-

All files / src/core/stats/nativeMetricSenderImpl SplunkMetricSender.ts

-
- -
- 25% - Statements - 4/16 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/8 -
- - -
- 25% - Lines - 4/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -501x -1x -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { NativeMetricSender } from '../NativeMetricSender';
-import axios ,{AxiosInstance} from 'axios';
- 
- 
- 
-export class SplunkMetricSender extends NativeMetricSender {
-    constructor(logger: Logger) {
-        super(logger);
-    }
- 
-    private instance: AxiosInstance;
- 
-    public initialize(apiHost: string, apiKey: string) {
-          this.instance = axios.create({
-            baseURL: apiHost,
-            headers: {'Authorization': apiKey, 'Content-Type': 'application/json'}
-          });
-    }
- 
-    public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) {
-        metric = `sfp.${metric}`;
-        const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}};
-        this.instance.post('', JSON.stringify(payload))
-        .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)})
-        .catch((error) => {
-            SFPLogger.log(
-                `Unable to transmit metrics for metric ${metric} due to` + error,
-                LoggerLevel.WARN,
-                this.logger
-            );
-        });
-    }
- 
-    public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) {
-        metric = `sfp.${metric}`;
-        const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}};
-        this.instance.post('', JSON.stringify(payload))
-        .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)})
-        .catch((error) => {
-            SFPLogger.log(
-                `Unable to transmit metrics for metric ${metric} due to` + error,
-                LoggerLevel.WARN,
-                this.logger
-            );
-        });
-    }
-}
- 
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html deleted file mode 100644 index 810a21c05..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/stats/nativeMetricSenderImpl/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/core/stats/nativeMetricSenderImpl - - - - - - - - - -
-
-

All files src/core/stats/nativeMetricSenderImpl

-
- -
- 21.05% - Statements - 12/57 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/18 -
- - -
- 21.05% - Lines - 12/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
DataDogMetricSender.ts -
-
26.66%4/15100%0/00%0/426.66%4/15
NewRelicMetricSender.ts -
-
15.38%4/260%0/20%0/615.38%4/26
SplunkMetricSender.ts -
-
25%4/16100%0/00%0/825%4/16
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html deleted file mode 100644 index 0f431c7ea..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/AliasList.ts.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for src/core/utils/AliasList.ts - - - - - - - - - -
-
-

All files / src/core/utils AliasList.ts

-
- -
- 33.33% - Statements - 3/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 33.33% - Lines - 3/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -174x -  -  -4x -  -  -  -  -  -4x -  -  -  -  -  -  - 
import { StateAggregator } from '@salesforce/core';
- 
- 
-export async function convertAliasToUsername(alias: string) {
-    const stateAggregator = await StateAggregator.getInstance();
-    await stateAggregator.orgs.readAll();
-    return await stateAggregator.aliases.resolveUsername(alias)
-}
- 
-export async function convertUsernameToAlias(username: string) {
-   
-    const stateAggregator = await StateAggregator.getInstance();
-    await stateAggregator.orgs.readAll();
-    return await stateAggregator.aliases.resolveAlias(username)
-  
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html deleted file mode 100644 index 280a18edc..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ChunkArray.ts.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Code coverage report for src/core/utils/ChunkArray.ts - - - - - - - - - -
-
-

All files / src/core/utils ChunkArray.ts

-
- -
- 100% - Statements - 6/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -121x -2x -2x -2x -  -  -9x -  -  -2x -  - 
export function chunkArray(perChunk: number, inputArray: any[]): Array<any> {
-    let chunks = [],
-        i = 0,
-        n = inputArray.length;
- 
-    while (i < n) {
-        chunks.push(inputArray.slice(i, (i += perChunk)));
-    }
- 
-    return chunks;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html deleted file mode 100644 index 6cd22982a..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Delay.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for src/core/utils/Delay.ts - - - - - - - - - -
-
-

All files / src/core/utils Delay.ts

-
- -
- 33.33% - Statements - 1/3 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/2 -
- - -
- 50% - Lines - 1/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -  - 
export async function delay(ms: number = 0) {
-    return new Promise((resolve) => setTimeout(resolve, ms));
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html deleted file mode 100644 index 1b96d2715..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/FileSystem.ts.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/core/utils/FileSystem.ts - - - - - - - - - -
-
-

All files / src/core/utils FileSystem.ts

-
- -
- 94.11% - Statements - 16/17 -
- - -
- 0% - Branches - 0/3 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 16/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -532x -2x -  -2x -  -  -  -  -  -  -  -  -  -  -  -4x -  -4x -  -4x -24x -  -24x -  -  -22x -  -22x -  -  -  -  -  -5x -  -5x -  -  -20x -  -  -12x -  -12x -  -  -  -  -  -4x -  -  - 
import fs = require('fs-extra');
-import path = require('path');
- 
-export default class FileSystem {
-    /**
-     * List nested files within a directory
-     * @param directory
-     * @param includeDirectories
-     * @returns
-     */
-    static readdirRecursive(
-        searchDirectory: string,
-        includeDirectories: boolean = false,
-        isAbsolute: boolean = false
-    ): string[] {
-        const result: string[] = [];
- 
-        Iif (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`);
- 
-        (function readdirRecursiveHandler(directory: string): void {
-            const files: string[] = fs.readdirSync(directory);
- 
-            files.forEach((file) => {
-                let filepath: string;
-                if (isAbsolute) {
-                    filepath = path.resolve(directory, file);
-                } else {
-                    filepath = path.join(directory, file);
-                }
- 
-                if (fs.lstatSync(filepath).isDirectory()) {
-                    if (includeDirectories) {
-                        if (isAbsolute) {
-                            result.push(path.resolve(filepath));
-                        } else {
-                            result.push(path.relative(searchDirectory, filepath));
-                        }
-                    }
-                    readdirRecursiveHandler(filepath);
-                } else {
-                    if (isAbsolute) {
-                        result.push(path.resolve(filepath));
-                    } else {
-                        result.push(path.relative(searchDirectory, filepath));
-                    }
-                }
-            });
-        })(searchDirectory);
- 
-        return result;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html deleted file mode 100644 index f31d63f49..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/Fileutils.ts.html +++ /dev/null @@ -1,697 +0,0 @@ - - - - - - Code coverage report for src/core/utils/Fileutils.ts - - - - - - - - - -
-
-

All files / src/core/utils Fileutils.ts

-
- -
- 9.09% - Statements - 7/77 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/15 -
- - -
- 9.09% - Lines - 7/77 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -2051x -1x -1x -1x -  -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const fs = require('fs');
-const path = require('path');
-const _ = require('lodash');
-const os = require('os');
- 
-const SEP = /\/|\\/;
- 
-export const PLUGIN_CACHE_FOLDER = 'sfpowerkit';
- 
-export default class FileUtils {
-    /**
-     * Delete file or directories recursively from the project
-     * @param deletedComponents Files or directories to delete
-     */
-    public static deleteComponents(deletedComponents: string[]) {
-        deletedComponents.forEach((component) => {
-            if (fs.existsSync(component)) {
-                if (fs.lstatSync(component).isDirectory()) {
-                    FileUtils.deleteFolderRecursive(component);
-                } else {
-                    fs.unlinkSync(component);
-                }
-            }
-        });
-    }
-    /**
-     * Load all files from the given folder with the given extension
-     * @param folder the folder from which files wille be loaded
-     * @param extension File extension to load.
-     */
-    public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] {
-        let result: string[] = [];
-        let pathExists = fs.existsSync(folder);
-        let folderName = path.basename(folder);
-        if (!pathExists) {
-            console.log('Folder does not exist:', folderName);
-            return result;
-        }
-        let content: string[] = fs.readdirSync(folder);
-        content.forEach((file) => {
-            let curFile = path.join(folder, file);
-            let stats = fs.statSync(curFile);
-            if (stats.isFile()) {
-                if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') {
-                    result.push(curFile);
-                }
-            } else if (stats.isDirectory()) {
-                let files: string[] = this.getAllFilesSync(curFile, extension);
-                result = _.concat(result, files);
-            }
-        });
-        return result;
-    }
- 
-    public static getGlobalCacheDir() {
-        let homedir = os.homedir();
-        let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER;
-        if (!fs.existsSync(configDir)) {
-            console.log('Config folder does not exists, Creating Folder');
-            fs.mkdirSync(configDir);
-        }
- 
-        return configDir;
-    }
- 
-    /**
-     * Get the cache path for the given cache file name
-     * @param fileName
-     */
-    public static getGlobalCachePath(fileName: string) {
-        let homedir = os.homedir();
-        let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER;
-        if (!fs.existsSync(configDir)) {
-            console.log('Config folder does not exists, Creating Folder');
-            fs.mkdirSync(configDir);
-        }
-        return configDir + path.sep + fileName;
-    }
- 
-    /**
-     * Create a folder path recursively
-     * @param targetDir
-     * @param param1
-     */
-    public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) {
-        const sep = path.sep;
-        const initDir = path.isAbsolute(targetDir) ? sep : '';
-        const baseDir = isRelativeToScript ? __dirname : '.';
- 
-        targetDir.split(sep).reduce((parentDir, childDir) => {
-            const curDir = path.resolve(baseDir, parentDir, childDir);
-            try {
-                fs.mkdirSync(curDir);
-            } catch (err) {
-                if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') {
-                    throw err;
-                }
-            }
-            return curDir;
-        }, initDir);
-    }
-    /**
-     * Get the file name withoud extension
-     * @param filePath file path
-     * @param extension extension
-     */
-    public static getFileNameWithoutExtension(filePath: string, extension?: string): string {
-        let fileParts = filePath.split(SEP);
-        let fileName = fileParts[fileParts.length - 1];
-        if (extension) {
-            fileName = fileName.substr(0, fileName.lastIndexOf(extension));
-        } else {
-            fileName = fileName.substr(0, fileName.indexOf('.'));
-        }
-        return fileName;
-    }
- 
-    /**
-     * Copu folder recursively
-     * @param src source folder to copy
-     * @param dest destination folder
-     */
-    public static copyRecursiveSync(src, dest) {
-        let exists = fs.existsSync(src);
-        if (exists) {
-            let stats = fs.statSync(src);
-            let isDirectory = stats.isDirectory();
-            if (isDirectory) {
-                exists = fs.existsSync(dest);
-                if (!exists) {
-                    fs.mkdirSync(dest);
-                }
-                fs.readdirSync(src).forEach(function (childItemName) {
-                    FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
-                });
-            } else {
-                fs.copyFileSync(src, dest);
-            }
-        }
-    }
-    /**
-     * Get path to a given folder base on the parent folder
-     * @param src  Parent folder
-     * @param foldername folder to build the path to
-     */
-    public static getFolderPath(src, foldername) {
-        let exists = fs.existsSync(src);
-        let toReturn = '';
-        if (exists) {
-            let stats = fs.statSync(src);
-            let isDirectory = stats.isDirectory();
-            if (isDirectory) {
-                let childs = fs.readdirSync(src);
-                for (let i = 0; i < childs.length; i++) {
-                    let childItemName = childs[i];
-                    if (childItemName === foldername) {
-                        toReturn = path.join(src, childItemName);
-                    } else {
-                        let childStat = fs.statSync(path.join(src, childItemName));
-                        if (childStat.isDirectory()) {
-                            toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername);
-                        }
-                    }
-                    if (toReturn !== '') {
-                        break;
-                    }
-                }
-            }
-        }
-        return toReturn;
-    }
- 
-    /**
-     * Delete a folder and its content recursively
-     * @param folder folder to delete
-     */
-    public static deleteFolderRecursive(folder) {
-        if (fs.existsSync(folder)) {
-            fs.readdirSync(folder).forEach(function (file, index) {
-                let curPath = path.join(folder, file);
-                if (fs.lstatSync(curPath).isDirectory()) {
-                    // recurse
-                    //console.log("Delete recursively");
-                    FileUtils.deleteFolderRecursive(curPath);
-                } else {
-                    // delete file
-                    //console.log("Delete file "+ curPath);
-                    fs.unlinkSync(curPath);
-                }
-            });
-            //console.log("delete folder "+ folder);
-            fs.rmdirSync(folder);
-        }
-    }
-    public static makefolderid(length): string {
-        var result = '';
-        var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-        var charactersLength = characters.length;
-        for (var i = 0; i < length; i++) {
-            result += characters.charAt(Math.floor(Math.random() * charactersLength));
-        }
-        return result;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html deleted file mode 100644 index 2589703d5..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/ObjectCRUDHelper.ts.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - Code coverage report for src/core/utils/ObjectCRUDHelper.ts - - - - - - - - - -
-
-

All files / src/core/utils ObjectCRUDHelper.ts

-
- -
- 42.1% - Statements - 8/19 -
- - -
- 25% - Branches - 2/8 -
- - -
- 50% - Functions - 2/4 -
- - -
- 43.75% - Lines - 7/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39  -  -4x -  -4x -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3x -  -3x -3x -1x -  -  -  -  -  - 
import { Connection } from '@salesforce/core';
-import { Record, SaveResult } from 'jsforce';
-import { isArray } from 'lodash';
- 
-const retry = require('async-retry');
- 
-export default class ObjectCRUDHelper {
-    static async updateRecord(conn: Connection, sObject: string, record: Record): Promise<string> {
-        return retry(
-            async (bail) => {
-                let result = await conn.update(sObject, record);
-                if (isArray(result)) {
-                    let isAllRecordsSucceeded = true;
-                    for (const individualResult of result as SaveResult[]) {
-                        if (!individualResult.success) {
-                            isAllRecordsSucceeded = false;
-                        }
-                    }
-                    if (isAllRecordsSucceeded) return 'All records updated';
-                    else throw new Error('Some records have been failed to update');
-                } else if ((result as SaveResult).success) return (result as SaveResult).id;
-                else bail();
-            },
-            { retries: 3, minTimeout: 2000 }
-        );
-    }
- 
-    static async createRecord(conn: Connection, sObject: string, record: Record): Promise<string> {
-        return retry(
-            async (bail) => {
-                let result = await conn.create(sObject, record);
-                if (result.success) return result.id;
-                else bail();
-            },
-            { retries: 3, minTimeout: 2000 }
-        );
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html deleted file mode 100644 index 710eb3af9..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/VersionNumberConverter.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for src/core/utils/VersionNumberConverter.ts - - - - - - - - - -
-
-

All files / src/core/utils VersionNumberConverter.ts

-
- -
- 90% - Statements - 9/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 2/2 -
- - -
- 90% - Lines - 9/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -  -  -  -  -2x -103x -  -103x -  -103x -  -  -103x -  -  -  -  -  -  -  -  -103x -103x -  -309x -  -  -103x -  -  -  -  - 
/**
- * Converts build-number dot delimeter to hyphen
- * If dot delimeter does not exist, returns input
- * @param version
- */
-export default function convertBuildNumDotDelimToHyphen(version: string) {
-    let convertedVersion = version;
- 
-    let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version);
-    if (version[indexOfBuildNumDelimiter] === '.') {
-        convertedVersion =
-            version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1);
-    }
-    return convertedVersion;
-}
- 
-/**
- * Get the index of the build-number delimeter
- * Returns null if unable to find index of delimeter
- * @param version
- */
-function getIndexOfBuildNumDelimeter(version: string) {
-    let numOfDelimetersTraversed: number = 0;
-    for (let i = 0; i < version.length; i++) {
-        if (!Number.isInteger(parseInt(version[i], 10))) {
-            numOfDelimetersTraversed++;
-        }
-        if (numOfDelimetersTraversed === 3) {
-            return i;
-        }
-    }
-    return null;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html deleted file mode 100644 index 2d484f6b0..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/extractDomainFromUrl.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/core/utils/extractDomainFromUrl.ts - - - - - - - - - -
-
-

All files / src/core/utils extractDomainFromUrl.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -  -  -1x -7x -4x -4x -  - 
/**
- * Extracts domain name from full URL string
- * @param url
- * @returns
- */
-export default function extractDomainFromUrl(url: string): string {
-    if (!url) return url;
-    const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
-    return matches && matches[1];
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html deleted file mode 100644 index 5f2b9c407..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - Code coverage report for src/core/utils - - - - - - - - - -
-
-

All files src/core/utils

-
- -
- 39.86% - Statements - 61/153 -
- - -
- 20.68% - Branches - 6/29 -
- - -
- 36.36% - Functions - 12/33 -
- - -
- 40.41% - Lines - 59/146 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
AliasList.ts -
-
33.33%3/9100%0/00%0/233.33%3/9
ChunkArray.ts -
-
100%6/6100%0/0100%1/1100%6/6
Delay.ts -
-
33.33%1/30%0/10%0/250%1/2
FileSystem.ts -
-
94.11%16/170%0/3100%3/3100%16/16
Fileutils.ts -
-
9.09%7/770%0/120%0/159.09%7/77
ObjectCRUDHelper.ts -
-
42.1%8/1925%2/850%2/443.75%7/16
VersionNumberConverter.ts -
-
90%9/10100%0/0100%2/290%9/10
extractDomainFromUrl.ts -
-
100%5/5100%3/3100%1/1100%4/4
xml2json.ts -
-
85.71%6/750%1/2100%3/3100%6/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html deleted file mode 100644 index fed7111ec..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/core/utils/xml2json.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/core/utils/xml2json.ts - - - - - - - - - -
-
-

All files / src/core/utils xml2json.ts

-
- -
- 85.71% - Statements - 6/7 -
- - -
- 50% - Branches - 1/2 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -114x -  -4x -12x -12x -12x -12x -  -  -  - 
const xmlParser = require('xml2js').Parser({ explicitArray: false });
- 
-export default function xml2json(xml) {
-    return new Promise<any>((resolve, reject) => {
-        xmlParser.parseString(xml, function (err, json) {
-            Iif (err) reject(err);
-            else resolve(json);
-        });
-    });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html deleted file mode 100644 index 856f28547..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/CommitUpdater.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for src/impl/changelog/CommitUpdater.ts - - - - - - - - - -
-
-

All files / src/impl/changelog CommitUpdater.ts

-
- -
- 88.23% - Statements - 15/17 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 3/3 -
- - -
- 88.23% - Lines - 15/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -  -  -  -1x -  -4x -4x -4x -4x -  -  -  -  -  -  -  -  -  -10x -  -  -  -  -10x -  -  -  -6x -76x -  -  -2x -  -  -  -  -2x -2x -2x -  -  -  -  -4x -  -  -  -  -  -  -  -4x -  -  -  -  - 
import { Release } from './ReleaseChangelog';
-import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces';
-import ReadPackageChangelog from './ReadPackageChangelog';
- 
-export default class CommitUpdater {
-    constructor(
-        private latestRelease: Release,
-        private artifactsToLatestCommitId: { [p: string]: string },
-        private packagesToChangelogFilePaths: { [p: string]: string },
-        private readPackageChangelog: ReadPackageChangelog
-    ) {}
- 
-    /**
-     * Generate commits in latest release, for each artifact
-     * Also sets new latestCommitId for artifacts
-     * @returns
-     */
-    update(): void {
-        for (let artifact of this.latestRelease['artifacts']) {
-            let packageChangelog: PackageChangelog = this.readPackageChangelog(
-                this.packagesToChangelogFilePaths[artifact.name]
-            );
- 
-            // Set new latestCommitId
-            artifact['latestCommitId'] = packageChangelog['commits'][0]['commitId'];
- 
-            let indexOfLatestCommitId;
-            if (this.artifactsToLatestCommitId?.[artifact.name]) {
-                indexOfLatestCommitId = packageChangelog['commits'].findIndex(
-                    (commit) => commit['commitId'] === this.artifactsToLatestCommitId[artifact.name]
-                );
-                if (indexOfLatestCommitId === -1) {
-                    console.log(
-                        `Cannot find commit Id ${this.artifactsToLatestCommitId[artifact.name]} in ${
-                            artifact.name
-                        } changelog`
-                    );
-                    console.log('Assuming that there are no changes...');
-                    artifact['commits'] = [];
-                    continue;
-                }
-            }
- 
-            if (indexOfLatestCommitId > 0) {
-                artifact['commits'] = packageChangelog['commits'].slice(0, indexOfLatestCommitId);
-            } else if (indexOfLatestCommitId === 0) {
-                // Artifact verison has not changed
-                artifact['commits'] = [];
-                // Skip to next artifact
-                continue;
-            } else if (indexOfLatestCommitId === undefined) {
-                // Artifact was not in previous release
-                artifact['commits'] = packageChangelog['commits'];
-            }
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html deleted file mode 100644 index 0608096da..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/OrgsUpdater.ts.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - Code coverage report for src/impl/changelog/OrgsUpdater.ts - - - - - - - - - -
-
-

All files / src/impl/changelog OrgsUpdater.ts

-
- -
- 82.35% - Statements - 28/34 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 6/6 -
- - -
- 81.25% - Lines - 26/32 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128  -1x -  -1x -  -  -  -  -4x -4x -4x -4x -  -4x -  -  -2x -  -  -  -  -  -  -2x -  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -3x -  -  -2x -2x -  -  -  -  -  -  -  -  -1x -  -  -  -1x -1x -  -  -1x -  -  -  -  -  -1x -1x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -6x -  -  -  -  -  -  - 
import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog';
-import lodash = require('lodash');
- 
-export default class OrgsUpdater {
-    private latestReleaseId: ReleaseId;
-    private idOfReleaseWithMatchingHashId: ReleaseId;
- 
-    constructor(
-        private releaseChangelog: ReleaseChangelog,
-        private latestRelease: Release,
-        private org: string,
-        private releaseWithMatchingHashId: Release
-    ) {
-        this.latestReleaseId = this.convertReleaseToId(this.latestRelease);
- 
-        if (this.releaseWithMatchingHashId) {
-            this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId);
-        }
-    }
- 
-    update(): void {
-        if (!this.idOfReleaseWithMatchingHashId) {
-            if (this.releaseChangelog.orgs) {
-                let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
- 
-                if (org) {
-                    org.releases.push(this.latestReleaseId);
-                    org.latestRelease = org.releases[org.releases.length - 1];
-                    org.retryCount = 0;
-                } else {
-                    this.releaseChangelog.orgs.push({
-                        name: this.org,
-                        releases: [this.latestReleaseId],
-                        latestRelease: this.latestReleaseId,
-                        retryCount: 0,
-                    });
-                }
-            } else {
-                // for backwards-compatibility with pre-existing changelogs
-                this.releaseChangelog.orgs = [
-                    {
-                        name: this.org,
-                        releases: [this.latestReleaseId],
-                        latestRelease: this.latestReleaseId,
-                        retryCount: 0,
-                    },
-                ];
-            }
-            console.log(
-                `Updating ${this.org} org with`,
-                this.latestRelease.names[this.latestRelease.names.length - 1] +
-                    '-' +
-                    this.latestRelease.buildNumber +
-                    `(0)`
-            );
-        } else {
-            // Update orgs
-            let org = this.releaseChangelog.orgs.find((org) => org.name === this.org);
- 
-            if (org) {
-                let indexOfReleaseToOrg = org.releases.findIndex(
-                    (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId
-                );
-                if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) {
-                    if (indexOfReleaseToOrg >= 0) {
-                        // Update release names in releases to org
-                        org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
-                        org.releases[indexOfReleaseToOrg].date = new Date().toUTCString();
-                    } else {
-                        // Add releaseId in releases to org
-                        org.releases.push(this.idOfReleaseWithMatchingHashId);
-                    }
- 
-                    // Update latest release
-                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
-                    org.retryCount = 0;
-                } else {
-                    if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) {
-                        org.retryCount++;
-                    } else {
-                        org.retryCount = 0;
-                    }
- 
-                    // Update releases names in releases to org & latestRelease
-                    org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId;
-                    org.latestRelease = this.idOfReleaseWithMatchingHashId;
-                }
- 
-                console.log(
-                    `Updating ${this.org} org with`,
-                    org.latestRelease.names[org.latestRelease.names.length - 1] +
-                        '-' +
-                        org.latestRelease.buildNumber +
-                        `(${org.retryCount})`
-                );
-            } else {
-                // new org
-                this.releaseChangelog.orgs.push({
-                    name: this.org,
-                    releases: [this.idOfReleaseWithMatchingHashId],
-                    latestRelease: this.idOfReleaseWithMatchingHashId,
-                    retryCount: 0,
-                });
-                console.log(
-                    `Updating ${this.org} org with`,
-                    `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${
-                        this.idOfReleaseWithMatchingHashId.buildNumber
-                    }(0)`
-                );
-            }
-        }
-    }
- 
-    /**
-     * Convert Release to Release Id
-     * @param release
-     * @returns
-     */
-    private convertReleaseToId(release: Release): ReleaseId {
-        let releaseNames = [...release.names]; // Shallow copy
-        return {
-            names: releaseNames,
-            buildNumber: release.buildNumber,
-            hashId: release.hashId,
-        };
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html deleted file mode 100644 index 5a2260a30..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/WorkItemUpdater.ts.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for src/impl/changelog/WorkItemUpdater.ts - - - - - - - - - -
-
-

All files / src/impl/changelog WorkItemUpdater.ts

-
- -
- 100% - Statements - 13/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 11/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -421x -  -  -  -1x -1x -  -  -  -  -  -  -  -2x -2x -  -  -  -24x -24x -  -  -  -3x -3x -  -1x -  -  -  -  -  -  -  -  -  -  -3x -  -  -  - 
import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger';
-import { Release } from './ReleaseChangelog';
- 
- 
-export default class WorkItemUpdater {
-    constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {}
- 
-    /**
-     * Generate work items in latest release
-     */
-    update(): void {
-        for (const workItemFilter of this.workItemFilters) {
-     
-        let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi');
-        SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger);
- 
-        for (let artifact of this.latestRelease['artifacts']) {
-            for (let commit of artifact['commits']) {
-                let commitMessage: String = commit['message'] + '\n' + commit['body'];
-                let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex);
-                if (workItems) {
-                    for (let item of workItems) {
-                        if (this.latestRelease['workItems'][item] == null) {
-                            this.latestRelease['workItems'][item] = new Set<string>();
-                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
-                        } else {
-                            this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8));
-                        }
-                    }
-                }
-            }
-        }
-       }
- 
-        // Convert each work item Set to Array
-        // Enables JSON stringification of work item
-        for (let key in this.latestRelease['workItems']) {
-            this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html deleted file mode 100644 index 1d197cc97..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/changelog/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/impl/changelog - - - - - - - - - -
-
-

All files src/impl/changelog

-
- -
- 87.5% - Statements - 56/64 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 11/11 -
- - -
- 86.66% - Lines - 52/60 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
CommitUpdater.ts -
-
88.23%15/17100%0/0100%3/388.23%15/17
OrgsUpdater.ts -
-
82.35%28/34100%0/0100%6/681.25%26/32
WorkItemUpdater.ts -
-
100%13/13100%0/0100%2/2100%11/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html deleted file mode 100644 index 07347a6ee..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/ShrinkImpl.ts.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - Code coverage report for src/impl/dependency/ShrinkImpl.ts - - - - - - - - - -
-
-

All files / src/impl/dependency ShrinkImpl.ts

-
- -
- 100% - Statements - 27/27 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 5/5 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -821x -1x -1x -1x -  -1x -1x -  -1x -  -  -  -  -2x -  -2x -  -2x -  -2x -  -  -  -2x -2x -  -2x -  -2x -  -  -  -2x -  -  -12x -  -  -  -  -12x -12x -  -  -22x -  -  -  -  -  -  -  -36x -  -24x -  -  -  -  -18x -  -  -  -  -  -  -  -12x -  -  -  -  -  -12x -  -10x -  -  -  -  -  - 
import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver';
-import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger';
-import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger';
-import _ from 'lodash';
-import { Connection } from '@salesforce/core';
-const Table = require('cli-table');
-import UserDefinedExternalDependency from '../../core/project/UserDefinedExternalDependency';
- 
-export default class ShrinkImpl {
-    private dependencyMap;
-    private updatedprojectConfig: any;
- 
- 
-    constructor(private connToDevHub:Connection, private logger?: Logger) {}
-    public async shrinkDependencies(sfdxProjectConfig: any): Promise<any> {
-        SFPLogger.log('Shrinking Project Dependencies...', LoggerLevel.INFO, this.logger);
- 
-        this.updatedprojectConfig = _.cloneDeep(sfdxProjectConfig);
- 
-        const transitiveDependencyResolver = new TransitiveDependencyResolver(
-            sfdxProjectConfig
-        );
- 
-        this.dependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies();
-        await this.resolveAndShrinkDependencies(this.dependencyMap);
- 
-        this.updatedprojectConfig = new UserDefinedExternalDependency().addDependencyEntries(  this.updatedprojectConfig, this.connToDevHub);
- 
-        return this.updatedprojectConfig;
-    }
- 
-    private async resolveAndShrinkDependencies(dependencyMap: any) {
-        let pkgs = [...dependencyMap.keys()];
- 
-        for (let pkg of pkgs) {
-            SFPLogger.log(
-                COLOR_HEADER(`cleaning up dependencies for package:`) + COLOR_KEY_MESSAGE(pkg),
-                LoggerLevel.TRACE,
-                this.logger
-            );
-            let dependenencies = dependencyMap.get(pkg);
-            let updatedDependencies = _.cloneDeep(dependenencies);
-            for (let dependency of dependencyMap.get(pkg)) {
-                if (dependencyMap.get(dependency.package)) {
-                    SFPLogger.log(
-                        `Shrinking ${dependencyMap.get(dependency.package).length} dependencies from package ${
-                            dependency.package
-                        }`,
-                        LoggerLevel.TRACE,
-                        this.logger
-                    );
-                    for (let temp of dependencyMap.get(dependency.package)) {
-                        for (let i = 0; i < updatedDependencies.length; i++) {
-                            if (updatedDependencies[i].package == temp.package) {
-                                updatedDependencies.splice(i, 1);
-                            }
-                        }
-                    }
-                } else {
-                    SFPLogger.log(
-                        `no dependency found for ${dependency.package} in the map`,
-                        LoggerLevel.TRACE,
-                        this.logger
-                    );
-                }
-            }
-            //Update project config
-            await this.updateProjectConfig(pkg, updatedDependencies);
-        }
- 
-    }
- 
-    private async updateProjectConfig(packageName: string, fixedDependencies: any) {
-        this.updatedprojectConfig.packageDirectories.map((pkg) => {
-            if (pkg.package == packageName) {
-                return Object.assign(pkg, { dependencies: fixedDependencies });
-            }
-        });
-    }
-}
- 
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html deleted file mode 100644 index 810c9907b..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/dependency/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/impl/dependency - - - - - - - - - -
-
-

All files src/impl/dependency

-
- -
- 100% - Statements - 27/27 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 5/5 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ShrinkImpl.ts -
-
100%27/27100%0/0100%5/5100%26/26
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html deleted file mode 100644 index 2d2dee9d6..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/BuildCollections.ts.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for src/impl/parallelBuilder/BuildCollections.ts - - - - - - - - - -
-
-

All files / src/impl/parallelBuilder BuildCollections.ts

-
- -
- 89.47% - Statements - 17/19 -
- - -
- 71.42% - Branches - 5/7 -
- - -
- 71.42% - Functions - 5/7 -
- - -
- 88.23% - Lines - 15/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -661x -1x -  -  -  -  -1x -  -  -  -  -4x -  -  -  -2x -  -  -  -  -  -  -  -4x -  -4x -  -  -7x -6x -  -6x -  -  -  -9x -2x -  -1x -  -  -  -  -5x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import UndirectedGraph from './UndirectedGraph';
-import ProjectConfig from '../../core/project/ProjectConfig';
- 
-/**
- * Class for the manipulation of package build collections
- */
-export default class BuildCollections {
-    // Disconnected undirected graph is used to represent collections and their packages
-    private _graph: UndirectedGraph;
- 
-    constructor(projectDirectory: string) {
-        this.createGraphOfBuildCollections(projectDirectory);
-    }
- 
-    get graph(): UndirectedGraph {
-        return this._graph;
-    }
- 
-    /**
-     * Constructs graph representation of collections
-     * @param projectDirectory
-     */
-    private createGraphOfBuildCollections(projectDirectory: string) {
-        this._graph = new UndirectedGraph();
- 
-        let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
-        for (let pkg of projectConfig.packageDirectories) {
-            if (pkg.buildCollection) {
-                if (pkg.buildCollection instanceof Array) {
-                    if (!this._graph.adjacencyList[pkg.package]) this._graph.addVertex(pkg.package);
- 
-                    pkg.buildCollection.forEach((packageInCollection) => {
-                        // Create vertex for package in collection if it doesn't exist yet
-                        if (!this._graph.adjacencyList[packageInCollection]) {
-                            // Verify that the package in collection is a valid package, before adding to adj. list
-                            if (projectConfig.packageDirectories.find((elem) => elem.package === packageInCollection)) {
-                                this._graph.addVertex(packageInCollection);
-                            } else
-                                throw new Error(
-                                    `Package '${packageInCollection}' in collection ${pkg.buildCollection} is not a valid package`
-                                );
-                        }
- 
-                        this._graph.addEdge(pkg.package, packageInCollection);
-                    });
-                } else
-                    throw new Error(
-                        `Property 'buildCollection' must be of type Array. Received ${pkg.buildCollection}`
-                    );
-            }
-        }
-    }
- 
-    /**
-     * Returns list of packages contained in the same collection as the package
-     * @param pkg
-     */
-    listPackagesInCollection(pkg: string): string[] {
-        return this._graph.dfs(pkg);
-    }
- 
-    isPackageInACollection(pkg: string): boolean {
-        return this._graph.adjacencyList[pkg] ? true : false;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html deleted file mode 100644 index 4b19b9f40..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/UndirectedGraph.ts.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for src/impl/parallelBuilder/UndirectedGraph.ts - - - - - - - - - -
-
-

All files / src/impl/parallelBuilder UndirectedGraph.ts

-
- -
- 96.55% - Statements - 28/29 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 21/21 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -502x -  -  -  -12x -  -  -  -17x -  -  -  -22x -1x -  -  -  -17x -16x -14x -  -13x -13x -  -  -  -  -  -  -  -4x -4x -4x -  -4x -19x -19x -18x -18x -18x -  -15x -  -  -  -  -3x -  -  - 
export default class UndirectedGraph {
-    private _adjacencyList: { [p: string]: string[] };
- 
-    constructor() {
-        this._adjacencyList = {};
-    }
- 
-    get adjacencyList() {
-        return this._adjacencyList;
-    }
- 
-    addVertex(name: string) {
-        if (!this._adjacencyList[name]) this._adjacencyList[name] = [];
-        else throw new Error(`Vertex with name '${name}' already exists`);
-    }
- 
-    addEdge(vertexA: string, vertexB: string): void {
-        if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex');
-        if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`);
-        if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`);
- 
-        if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB);
-        if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA);
-    }
- 
-    /**
-     * Returns vertices in graph, using depth-first search from the starting vertex
-     * @param start
-     */
-    dfs(start: string): string[] {
-        const vertices: string[] = [];
-        const visited: { [p: string]: boolean } = {};
-        const adjacencyList = this._adjacencyList;
- 
-        (function dfsHandler(vertex) {
-            Iif (!vertex) return null;
-            if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`);
-            visited[vertex] = true;
-            vertices.push(vertex);
-            adjacencyList[vertex].forEach((neighbor) => {
-                if (!visited[neighbor]) {
-                    return dfsHandler(neighbor);
-                }
-            });
-        })(start);
- 
-        return vertices;
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html deleted file mode 100644 index e5f2f31fe..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/parallelBuilder/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/impl/parallelBuilder - - - - - - - - - -
-
-

All files src/impl/parallelBuilder

-
- -
- 93.75% - Statements - 45/48 -
- - -
- 81.25% - Branches - 13/16 -
- - -
- 85.71% - Functions - 12/14 -
- - -
- 94.73% - Lines - 36/38 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
BuildCollections.ts -
-
89.47%17/1971.42%5/771.42%5/788.23%15/17
UndirectedGraph.ts -
-
96.55%28/2988.88%8/9100%7/7100%21/21
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html deleted file mode 100644 index a9eaa72c8..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/ReleaseDefinition.ts.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - Code coverage report for src/impl/release/ReleaseDefinition.ts - - - - - - - - - -
-
-

All files / src/impl/release ReleaseDefinition.ts

-
- -
- 70% - Statements - 21/30 -
- - -
- 100% - Branches - 3/3 -
- - -
- 66.66% - Functions - 4/6 -
- - -
- 70% - Lines - 21/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80  -1x -1x -1x -1x -1x -  -1x -1x -  -1x -  -  -  -  -5x -5x -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -5x -5x -  -  -  -4x -  -  -4x -6x -  -  -  -  -  -  -4x -  -  -  - 
import ReleaseDefinitionSchema from './ReleaseDefinitionSchema';
-import Ajv from 'ajv';
-const yaml = require('js-yaml');
-import lodash = require('lodash');
-import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId';
-import Git from '../../core/git/Git';
-import { ConsoleLogger } from '@flxblio/sfp-logger';
-const fs = require('fs-extra');
-const path = require('path');
- 
-export default class ReleaseDefinition {
-    get releaseDefinition() {
-        // Return clone of releaseDefinition for immutability
-        return lodash.cloneDeep(this._releaseDefinitionSchema);
-    }
-    private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) {
-        this.validateReleaseDefinition(this._releaseDefinitionSchema);
- 
-        // Workaround for jsonschema not supporting validation based on dependency value
-        if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled)
-            throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'");
- 
-        if (this._releaseDefinitionSchema.packageDependencies) {
-            this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies);
-        }
-    }
- 
-    public static async loadReleaseDefinition(pathToReleaseDefinition: string) {
-        //Check whether path contains gitRef
-        let releaseDefinitionSchema: ReleaseDefinitionSchema;
-        try {
-            if (pathToReleaseDefinition.includes(':')) {
-                let git = await Git.initiateRepo();
-                await git.fetch();
-                let releaseFile = await git.show([pathToReleaseDefinition]);
-                releaseDefinitionSchema = yaml.load(releaseFile);
-            } else {
-                releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8'));
-            }
-        } catch (error) {
-            throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`);
-        }
- 
-        let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema);
-        return releaseDefinition;
-    }
- 
-    private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) {
-        for (let pkg in packageDependencies) {
-            packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]);
-        }
-    }
- 
-    private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void {
-        let schema = fs.readJSONSync(
-            path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'),
-            { encoding: 'UTF-8' }
-        );
- 
-        let validator = new Ajv({ allErrors: true }).compile(schema);
-        let validationResult = validator(releaseDefinition);
- 
-        if (!validationResult) {
-            let errorMsg: string =
-                `Release definition does not meet schema requirements, ` +
-                `found ${validator.errors.length} validation errors:\n`;
- 
-            validator.errors.forEach((error, errorNum) => {
-                errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
-                    error.params,
-                    null,
-                    4
-                )}`;
-            });
- 
-            throw new Error(errorMsg);
-        }
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html deleted file mode 100644 index f3bef4d7c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/impl/release/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/impl/release - - - - - - - - - -
-
-

All files src/impl/release

-
- -
- 70% - Statements - 21/30 -
- - -
- 100% - Branches - 3/3 -
- - -
- 66.66% - Functions - 4/6 -
- - -
- 70% - Lines - 21/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ReleaseDefinition.ts -
-
70%21/30100%3/366.66%4/670%21/30
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html deleted file mode 100644 index 06f4f0138..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ProjectValidation.ts -
-
100%26/26100%3/3100%7/7100%26/26
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html deleted file mode 100644 index 65aadb36d..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/Get18DigitSalesforceId.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for src/utils/Get18DigitSalesforceId.ts - - - - - - - - - -
-
-

All files / src/utils Get18DigitSalesforceId.ts

-
- -
- 7.69% - Statements - 1/13 -
- - -
- 0% - Branches - 0/7 -
- - -
- 0% - Functions - 0/1 -
- - -
- 8.33% - Lines - 1/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -201x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export default function get18DigitSalesforceId(recordId: string) {
-    if (recordId && recordId.length === 18) {
-        return recordId;
-    } else if (recordId && recordId.length === 15) {
-        let addon = '';
-        for (let block = 0; block < 3; block++) {
-            let loop = 0;
-            for (let position = 0; position < 5; position++) {
-                let current = recordId.charAt(block * 5 + position);
-                Iif (current >= 'A' && current <= 'Z') loop += 1 << position;
-            }
-            addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop);
-        }
-        let convertedId = recordId + addon;
-        return convertedId;
-    } else {
-        throw new Error(`Invalid Salesforce Id ${recordId}`);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html deleted file mode 100644 index c1385a4ad..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/src/utils/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/utils - - - - - - - - - -
-
-

All files src/utils

-
- -
- 7.69% - Statements - 1/13 -
- - -
- 0% - Branches - 0/7 -
- - -
- 0% - Functions - 0/1 -
- - -
- 8.33% - Lines - 1/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
Get18DigitSalesforceId.ts -
-
7.69%1/130%0/70%0/18.33%1/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html deleted file mode 100644 index 510da83a6..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/Get18DigitSalesforceId.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for utils/Get18DigitSalesforceId.ts - - - - - - - - - -
-
-

All files / utils Get18DigitSalesforceId.ts

-
- -
- 7.69% - Statements - 1/13 -
- - -
- 0% - Branches - 0/7 -
- - -
- 0% - Functions - 0/1 -
- - -
- 8.33% - Lines - 1/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -201x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export default function get18DigitSalesforceId(recordId: string) {
-    if (recordId && recordId.length === 18) {
-        return recordId;
-    } else if (recordId && recordId.length === 15) {
-        let addon = '';
-        for (let block = 0; block < 3; block++) {
-            let loop = 0;
-            for (let position = 0; position < 5; position++) {
-                let current = recordId.charAt(block * 5 + position);
-                Iif (current >= 'A' && current <= 'Z') loop += 1 << position;
-            }
-            addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop);
-        }
-        let convertedId = recordId + addon;
-        return convertedId;
-    } else {
-        throw new Error(`Invalid Salesforce Id ${recordId}`);
-    }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html b/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html deleted file mode 100644 index 88cd8cf7c..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov-report/utils/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for utils - - - - - - - - - -
-
-

All files utils

-
- -
- 7.69% - Statements - 1/13 -
- - -
- 0% - Branches - 0/7 -
- - -
- 0% - Functions - 0/1 -
- - -
- 8.33% - Lines - 1/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
Get18DigitSalesforceId.ts -
-
7.69%1/130%0/70%0/18.33%1/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/coverage/lcov.info b/packages/sfpowerscripts-cli/coverage/lcov.info deleted file mode 100644 index 89a657895..000000000 --- a/packages/sfpowerscripts-cli/coverage/lcov.info +++ /dev/null @@ -1,4285 +0,0 @@ -TN: -SF:src/ProjectValidation.ts -FN:13,(anonymous_7) -FN:19,(anonymous_8) -FN:26,(anonymous_9) -FN:40,(anonymous_10) -FN:41,(anonymous_11) -FN:62,(anonymous_12) -FN:63,(anonymous_13) -FNF:7 -FNH:7 -FNDA:8,(anonymous_7) -FNDA:4,(anonymous_8) -FNDA:7,(anonymous_9) -FNDA:2,(anonymous_10) -FNDA:4,(anonymous_11) -FNDA:2,(anonymous_12) -FNDA:4,(anonymous_13) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:8,1 -DA:14,8 -DA:15,8 -DA:16,8 -DA:20,4 -DA:21,4 -DA:22,4 -DA:24,1 -DA:26,1 -DA:27,7 -DA:35,1 -DA:36,1 -DA:41,2 -DA:42,4 -DA:44,1 -DA:51,1 -DA:63,2 -DA:64,4 -DA:66,4 -DA:71,1 -LF:26 -LH:26 -BRDA:68,0,0,4 -BRDA:68,0,1,2 -BRDA:68,0,2,1 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/core/apex/ApexClassFetcher.ts -FN:6,(anonymous_1) -FN:14,(anonymous_2) -FN:19,(anonymous_3) -FNF:3 -FNH:1 -FNDA:1,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:2,1 -DA:3,1 -DA:5,1 -DA:6,1 -DA:15,0 -DA:17,0 -DA:19,0 -DA:20,0 -DA:22,0 -DA:23,0 -DA:26,0 -LF:11 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/apex/ApexTriggerFetcher.ts -FN:6,(anonymous_1) -FN:14,(anonymous_2) -FN:19,(anonymous_3) -FNF:3 -FNH:1 -FNDA:1,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:2,1 -DA:3,1 -DA:5,1 -DA:6,1 -DA:15,0 -DA:17,0 -DA:19,0 -DA:20,0 -DA:22,0 -DA:23,0 -DA:26,0 -LF:11 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts -FN:6,(anonymous_1) -FN:13,(anonymous_2) -FN:28,(anonymous_3) -FNF:3 -FNH:1 -FNDA:1,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:2,1 -DA:3,1 -DA:5,1 -DA:6,1 -DA:24,0 -DA:26,0 -DA:28,0 -DA:29,0 -DA:31,0 -DA:37,0 -DA:40,0 -LF:11 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/apex/coverage/IndividualClassCoverage.ts -FN:4,(anonymous_6) -FN:6,(anonymous_7) -FN:13,(anonymous_8) -FN:19,(anonymous_9) -FN:27,(anonymous_10) -FN:46,(anonymous_11) -FNF:6 -FNH:5 -FNDA:9,(anonymous_6) -FNDA:2,(anonymous_7) -FNDA:8,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:4,(anonymous_10) -FNDA:13,(anonymous_11) -DA:1,2 -DA:3,2 -DA:4,9 -DA:10,2 -DA:13,2 -DA:14,8 -DA:18,2 -DA:19,0 -DA:20,0 -DA:24,2 -DA:37,0 -DA:38,0 -DA:41,4 -DA:46,4 -DA:47,13 -DA:50,4 -DA:51,2 -DA:58,2 -LF:18 -LH:14 -BRDA:18,0,0,0 -BRDA:18,1,0,2 -BRDA:18,1,1,0 -BRDA:50,2,0,2 -BRDA:50,2,1,2 -BRF:5 -BRH:3 -end_of_record -TN: -SF:src/core/apextest/ApexTestSuite.ts -FN:8,(anonymous_1) -FN:10,(anonymous_2) -FNF:2 -FNH:2 -FNDA:3,(anonymous_1) -FNDA:3,(anonymous_2) -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:7,1 -DA:8,3 -DA:11,3 -DA:16,3 -DA:18,3 -DA:20,2 -DA:23,1 -DA:25,1 -DA:26,1 -DA:27,1 -LF:14 -LH:14 -BRDA:18,0,0,1 -BRF:1 -BRH:1 -end_of_record -TN: -SF:src/core/apextest/ImpactedApexTestClassFetcher.ts -FN:9,(anonymous_7) -FN:16,(anonymous_8) -FN:24,(anonymous_9) -FNF:3 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -DA:1,1 -DA:2,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:8,1 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:18,0 -DA:19,0 -DA:23,0 -DA:24,0 -DA:27,0 -DA:28,0 -DA:32,0 -DA:33,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:43,0 -DA:51,0 -DA:56,0 -DA:57,0 -DA:62,0 -DA:66,0 -DA:71,0 -DA:73,0 -DA:74,0 -DA:81,0 -DA:86,0 -DA:88,0 -LF:33 -LH:6 -BRDA:50,0,0,0 -BRDA:50,0,1,0 -BRDA:62,1,0,0 -BRDA:66,2,0,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src/core/artifacts/ArtifactFetcher.ts -FN:16,(anonymous_6) -FN:46,(anonymous_7) -FN:66,(anonymous_8) -FN:101,(anonymous_9) -FN:135,(anonymous_10) -FN:160,(anonymous_11) -FN:162,(anonymous_12) -FN:168,(anonymous_13) -FN:180,(anonymous_14) -FN:187,(anonymous_15) -FN:188,(anonymous_16) -FN:198,(anonymous_17) -FN:209,(anonymous_18) -FNF:13 -FNH:5 -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:3,(anonymous_10) -FNDA:1,(anonymous_11) -FNDA:4,(anonymous_12) -FNDA:4,(anonymous_13) -FNDA:4,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:9,1 -DA:17,0 -DA:20,0 -DA:23,0 -DA:25,0 -DA:30,0 -DA:32,0 -DA:34,0 -DA:36,0 -DA:39,0 -DA:47,0 -DA:49,0 -DA:51,0 -DA:57,0 -DA:59,0 -DA:67,0 -DA:69,0 -DA:70,0 -DA:73,0 -DA:75,0 -DA:77,0 -DA:80,0 -DA:82,0 -DA:84,0 -DA:86,0 -DA:92,0 -DA:94,0 -DA:102,0 -DA:103,0 -DA:105,0 -DA:111,0 -DA:113,0 -DA:115,0 -DA:117,0 -DA:123,0 -DA:125,0 -DA:138,2 -DA:140,1 -DA:143,3 -DA:148,3 -DA:149,1 -DA:150,1 -DA:151,1 -DA:152,1 -DA:153,2 -DA:162,1 -DA:163,4 -DA:164,4 -DA:167,1 -DA:168,1 -DA:169,4 -DA:170,4 -DA:172,4 -DA:173,0 -DA:177,1 -DA:178,1 -DA:180,4 -DA:188,0 -DA:189,0 -DA:200,0 -DA:202,0 -DA:205,0 -DA:210,0 -DA:211,0 -DA:212,0 -DA:213,0 -DA:214,0 -DA:216,0 -LF:75 -LH:28 -BRDA:148,0,0,1 -BRDA:148,0,1,2 -BRDA:148,1,0,3 -BRDA:148,1,1,2 -BRDA:164,2,0,4 -BRDA:164,2,1,1 -BRDA:172,3,0,4 -BRDA:172,3,1,0 -BRDA:189,4,0,0 -BRDA:199,5,0,0 -BRDA:199,5,1,0 -BRDA:201,6,0,0 -BRDA:201,6,1,0 -BRF:13 -BRH:7 -end_of_record -TN: -SF:src/core/display/TableConstants.ts -FNF:0 -FNH:0 -DA:2,1 -DA:22,1 -LF:2 -LH:2 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/git/Git.ts -FN:14,(anonymous_7) -FN:24,(anonymous_8) -FN:28,(anonymous_9) -FN:32,(anonymous_10) -FN:36,(anonymous_11) -FN:45,(anonymous_12) -FN:54,(anonymous_13) -FN:60,(anonymous_14) -FN:75,(anonymous_15) -FN:90,(anonymous_16) -FN:99,(anonymous_17) -FN:103,(anonymous_18) -FN:121,(anonymous_19) -FN:124,(anonymous_20) -FN:127,(anonymous_21) -FN:159,(anonymous_22) -FN:169,(anonymous_23) -FN:173,(anonymous_24) -FN:177,(anonymous_25) -FN:189,(anonymous_26) -FN:204,(anonymous_27) -FN:208,(anonymous_28) -FN:212,(anonymous_29) -FN:218,(anonymous_30) -FN:224,(anonymous_31) -FN:233,(anonymous_32) -FNF:26 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,(anonymous_21) -FNDA:0,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -FNDA:0,(anonymous_26) -FNDA:0,(anonymous_27) -FNDA:0,(anonymous_28) -FNDA:0,(anonymous_29) -FNDA:0,(anonymous_30) -FNDA:0,(anonymous_31) -FNDA:0,(anonymous_32) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:8,1 -DA:12,0 -DA:14,0 -DA:16,0 -DA:17,0 -DA:19,0 -DA:20,0 -DA:25,0 -DA:29,0 -DA:33,0 -DA:37,0 -DA:39,0 -DA:40,0 -DA:42,0 -DA:46,0 -DA:48,0 -DA:49,0 -DA:51,0 -DA:55,0 -DA:57,0 -DA:62,0 -DA:63,0 -DA:65,0 -DA:67,0 -DA:68,0 -DA:70,0 -DA:72,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:80,0 -DA:82,0 -DA:86,0 -DA:91,0 -DA:94,0 -DA:100,0 -DA:105,0 -DA:107,0 -DA:109,0 -DA:110,0 -DA:113,0 -DA:117,0 -DA:122,0 -DA:124,0 -DA:128,0 -DA:130,0 -DA:131,0 -DA:134,0 -DA:137,0 -DA:138,0 -DA:139,0 -DA:141,0 -DA:142,0 -DA:143,0 -DA:145,0 -DA:148,0 -DA:151,0 -DA:156,0 -DA:160,0 -DA:161,0 -DA:163,0 -DA:165,0 -DA:166,0 -DA:170,0 -DA:174,0 -DA:181,0 -DA:185,0 -DA:190,0 -DA:191,0 -DA:193,0 -DA:194,0 -DA:198,0 -DA:200,0 -DA:205,0 -DA:209,0 -DA:213,0 -DA:214,0 -DA:215,0 -DA:219,0 -DA:220,0 -DA:221,0 -DA:226,0 -DA:227,0 -DA:229,0 -DA:230,0 -DA:235,0 -DA:238,0 -DA:240,0 -DA:243,0 -LF:94 -LH:6 -BRDA:62,0,0,0 -BRDA:62,0,1,0 -BRDA:70,1,0,0 -BRDA:75,2,0,0 -BRDA:100,3,0,0 -BRDA:124,4,0,0 -BRDA:124,4,1,0 -BRDA:152,5,0,0 -BRDA:152,5,1,0 -BRDA:174,6,0,0 -BRDA:190,7,0,0 -BRDA:213,8,0,0 -BRDA:213,8,1,0 -BRDA:219,9,0,0 -BRDA:219,9,1,0 -BRF:15 -BRH:0 -end_of_record -TN: -SF:src/core/git/GitDiffUtil.ts -FN:30,(anonymous_7) -FN:36,(anonymous_8) -FN:56,(anonymous_9) -FN:67,(anonymous_10) -FN:107,(anonymous_11) -FN:114,(anonymous_12) -FN:122,(anonymous_13) -FN:145,(anonymous_14) -FN:165,(anonymous_15) -FNF:9 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -DA:1,1 -DA:2,1 -DA:3,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:22,1 -DA:24,1 -DA:31,0 -DA:32,0 -DA:33,0 -DA:37,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:46,0 -DA:47,0 -DA:51,0 -DA:53,0 -DA:57,0 -DA:59,0 -DA:60,0 -DA:66,0 -DA:67,0 -DA:69,0 -DA:73,0 -DA:74,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:81,0 -DA:87,0 -DA:89,0 -DA:92,0 -DA:95,0 -DA:96,0 -DA:97,0 -DA:99,0 -DA:102,0 -DA:103,0 -DA:108,0 -DA:110,0 -DA:111,0 -DA:114,0 -DA:115,0 -DA:117,0 -DA:123,0 -DA:130,0 -DA:133,0 -DA:137,0 -DA:141,0 -DA:145,0 -DA:146,0 -DA:147,0 -DA:148,0 -DA:152,0 -DA:154,0 -DA:155,0 -DA:159,0 -DA:165,0 -DA:166,0 -DA:170,0 -DA:173,0 -LF:70 -LH:9 -BRDA:43,0,0,0 -BRDA:73,1,0,0 -BRDA:129,2,0,0 -BRDA:129,2,1,0 -BRDA:132,3,0,0 -BRDA:132,3,1,0 -BRDA:136,4,0,0 -BRDA:136,4,1,0 -BRDA:136,4,2,0 -BRDA:140,5,0,0 -BRDA:140,5,1,0 -BRDA:140,5,2,0 -BRDA:144,6,0,0 -BRDA:144,6,1,0 -BRF:14 -BRH:0 -end_of_record -TN: -SF:src/core/git/GitIdentity.ts -FN:4,(anonymous_0) -FN:6,(anonymous_1) -FN:11,(anonymous_2) -FN:23,(anonymous_3) -FNF:4 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:3,1 -DA:4,0 -DA:7,0 -DA:8,0 -DA:15,0 -DA:17,0 -DA:20,0 -DA:27,0 -DA:29,0 -DA:32,0 -LF:10 -LH:1 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/git/GitTags.ts -FN:5,(anonymous_0) -FN:13,(anonymous_1) -FN:25,(anonymous_2) -FN:45,(anonymous_3) -FN:49,(anonymous_4) -FN:53,(anonymous_5) -FN:58,(anonymous_6) -FN:74,(anonymous_7) -FN:82,(anonymous_8) -FN:92,(anonymous_9) -FN:104,(anonymous_10) -FN:121,(anonymous_11) -FN:126,(anonymous_12) -FN:131,(anonymous_13) -FN:134,(anonymous_14) -FN:138,(anonymous_15) -FN:141,(anonymous_16) -FN:147,(anonymous_17) -FNF:18 -FNH:6 -FNDA:3,(anonymous_0) -FNDA:3,(anonymous_1) -FNDA:2,(anonymous_2) -FNDA:24,(anonymous_3) -FNDA:8,(anonymous_4) -FNDA:8,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -DA:2,1 -DA:4,1 -DA:5,3 -DA:14,3 -DA:21,3 -DA:22,1 -DA:27,2 -DA:32,2 -DA:38,2 -DA:40,2 -DA:41,2 -DA:45,24 -DA:48,2 -DA:49,8 -DA:53,8 -DA:55,2 -DA:61,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:67,0 -DA:68,0 -DA:69,0 -DA:71,0 -DA:75,0 -DA:78,0 -DA:82,0 -DA:83,0 -DA:84,0 -DA:88,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:100,0 -DA:105,0 -DA:109,0 -DA:111,0 -DA:115,0 -DA:118,0 -DA:120,0 -DA:122,0 -DA:123,0 -DA:124,0 -DA:127,0 -DA:128,0 -DA:131,0 -DA:135,0 -DA:138,0 -DA:139,0 -DA:141,0 -DA:146,0 -DA:147,0 -DA:148,0 -LF:53 -LH:16 -BRDA:21,0,0,2 -BRDA:21,0,1,1 -BRDA:63,1,0,0 -BRDA:63,1,1,0 -BRDA:67,2,0,0 -BRDA:67,2,1,0 -BRDA:77,3,0,0 -BRDA:77,3,1,0 -BRDA:83,4,0,0 -BRDA:83,4,1,0 -BRDA:128,5,0,0 -BRDA:128,5,1,0 -BRF:12 -BRH:2 -end_of_record -TN: -SF:src/core/metadata/MetadataFiles.ts -FN:16,(anonymous_7) -FN:23,(anonymous_8) -FN:37,(anonymous_9) -FN:52,(anonymous_10) -FN:63,(anonymous_11) -FN:116,(anonymous_12) -FN:120,(anonymous_13) -FN:176,(anonymous_14) -FN:185,(anonymous_15) -FN:189,(anonymous_16) -FN:190,(anonymous_17) -FN:194,(anonymous_18) -FN:208,(anonymous_19) -FNF:13 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:13,1 -DA:14,1 -DA:18,0 -DA:20,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:27,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:33,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:47,0 -DA:49,0 -DA:53,0 -DA:54,0 -DA:55,0 -DA:56,0 -DA:59,0 -DA:61,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:70,0 -DA:71,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:81,0 -DA:83,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:88,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:97,0 -DA:100,0 -DA:101,0 -DA:102,0 -DA:103,0 -DA:104,0 -DA:106,0 -DA:108,0 -DA:109,0 -DA:113,0 -DA:117,0 -DA:118,0 -DA:120,0 -DA:121,0 -DA:123,0 -DA:124,0 -DA:126,0 -DA:131,0 -DA:135,0 -DA:136,0 -DA:139,0 -DA:141,0 -DA:147,0 -DA:148,0 -DA:149,0 -DA:152,0 -DA:154,0 -DA:155,0 -DA:160,0 -DA:163,0 -DA:164,0 -DA:167,0 -DA:169,0 -DA:170,0 -DA:176,0 -DA:178,0 -DA:179,0 -DA:186,0 -DA:190,0 -DA:192,0 -DA:194,0 -DA:195,0 -DA:196,0 -DA:198,0 -DA:209,0 -DA:210,0 -DA:211,0 -DA:212,0 -DA:213,0 -DA:215,0 -DA:218,0 -DA:221,0 -DA:223,0 -DA:227,0 -DA:229,0 -DA:230,0 -DA:234,0 -DA:237,0 -DA:240,0 -DA:243,0 -DA:246,0 -DA:247,0 -DA:248,0 -DA:250,0 -DA:255,0 -DA:257,0 -DA:259,0 -DA:260,0 -DA:262,0 -DA:263,0 -DA:265,0 -DA:266,0 -DA:267,0 -DA:268,0 -DA:269,0 -DA:276,0 -DA:277,0 -DA:278,0 -DA:279,0 -DA:281,0 -DA:287,0 -DA:288,0 -DA:289,0 -DA:290,0 -DA:291,0 -DA:292,0 -DA:293,0 -DA:295,0 -DA:296,0 -DA:297,0 -DA:298,0 -DA:299,0 -DA:300,0 -DA:301,0 -DA:304,0 -DA:307,0 -DA:311,0 -DA:314,0 -DA:319,0 -DA:320,0 -DA:321,0 -DA:322,0 -DA:323,0 -DA:325,0 -DA:326,0 -DA:327,0 -DA:328,0 -DA:332,0 -DA:335,0 -DA:339,0 -LF:170 -LH:11 -BRDA:57,0,0,0 -BRDA:57,0,1,0 -BRDA:59,1,0,0 -BRDA:59,1,1,0 -BRDA:87,2,0,0 -BRDA:87,2,1,0 -BRDA:116,3,0,0 -BRDA:119,4,0,0 -BRDA:119,4,1,0 -BRDA:128,5,0,0 -BRDA:128,5,1,0 -BRDA:138,6,0,0 -BRDA:138,6,1,0 -BRDA:138,6,2,0 -BRDA:161,7,0,0 -BRDA:161,7,1,0 -BRDA:166,8,0,0 -BRDA:166,8,1,0 -BRDA:166,8,2,0 -BRDA:191,9,0,0 -BRDA:191,9,1,0 -BRDA:275,10,0,0 -BRDA:275,10,1,0 -BRDA:324,11,0,0 -BRDA:324,11,1,0 -BRF:25 -BRH:0 -end_of_record -TN: -SF:src/core/metadata/MetadataInfo.ts -FN:102,(anonymous_6) -FN:107,(anonymous_7) -FN:129,(anonymous_8) -FN:149,(anonymous_9) -FNF:4 -FNH:3 -FNDA:1,(anonymous_6) -FNDA:149,(anonymous_7) -FNDA:25,(anonymous_8) -FNDA:0,(anonymous_9) -DA:2,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,1 -DA:101,1 -DA:103,1 -DA:104,1 -DA:105,1 -DA:106,1 -DA:107,1 -DA:108,149 -DA:111,1 -DA:112,1 -DA:114,1 -DA:115,1 -DA:118,149 -DA:120,4 -DA:122,0 -DA:124,4 -DA:129,9 -DA:130,25 -DA:132,9 -DA:133,9 -DA:134,9 -DA:135,9 -DA:136,9 -DA:137,9 -DA:138,9 -DA:139,9 -DA:140,9 -DA:144,149 -DA:146,1 -DA:150,0 -DA:151,0 -DA:153,0 -DA:155,0 -DA:158,0 -DA:160,0 -DA:161,0 -DA:162,0 -DA:163,0 -DA:164,0 -DA:166,0 -DA:171,0 -DA:176,0 -DA:181,0 -DA:186,0 -DA:188,0 -DA:189,0 -DA:190,0 -DA:196,0 -DA:197,0 -DA:201,0 -DA:205,1 -DA:206,1 -DA:214,1 -LF:57 -LH:35 -BRDA:149,0,0,0 -BRDA:165,1,0,0 -BRDA:165,1,1,0 -BRDA:165,1,2,0 -BRDA:168,2,0,0 -BRDA:168,2,1,0 -BRDA:168,2,2,0 -BRDA:173,3,0,0 -BRDA:173,3,1,0 -BRDA:173,3,2,0 -BRDA:178,4,0,0 -BRDA:178,4,1,0 -BRDA:178,4,2,0 -BRDA:183,5,0,0 -BRDA:183,5,1,0 -BRDA:183,5,2,0 -BRDA:192,6,0,0 -BRDA:192,6,1,0 -BRDA:192,6,2,0 -BRDA:192,6,3,0 -BRF:20 -BRH:0 -end_of_record -TN: -SF:src/core/metadata/SettingsFetcher.ts -FN:8,(anonymous_7) -FN:12,(anonymous_8) -FNF:2 -FNH:1 -FNDA:5,(anonymous_7) -FNDA:0,(anonymous_8) -DA:1,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:7,1 -DA:9,5 -DA:13,0 -DA:14,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -LF:12 -LH:6 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/org/SFPOrg.ts -FN:14,(anonymous_7) -FN:39,(anonymous_8) -FN:76,(anonymous_9) -FN:128,(anonymous_10) -FN:142,(anonymous_11) -FN:147,(anonymous_12) -FN:169,(anonymous_13) -FN:171,(anonymous_14) -FN:176,(anonymous_15) -FN:179,(anonymous_16) -FN:188,(anonymous_17) -FN:195,(anonymous_18) -FN:200,(anonymous_19) -FN:207,(anonymous_20) -FN:219,(anonymous_21) -FN:220,(anonymous_22) -FNF:16 -FNH:5 -FNDA:6,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:3,(anonymous_9) -FNDA:3,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:1,(anonymous_15) -FNDA:2,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,(anonymous_21) -FNDA:0,(anonymous_22) -DA:1,4 -DA:2,4 -DA:5,4 -DA:6,4 -DA:7,4 -DA:8,4 -DA:10,4 -DA:15,6 -DA:17,6 -DA:22,5 -DA:24,1 -DA:32,1 -DA:43,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:53,0 -DA:55,0 -DA:56,0 -DA:61,0 -DA:69,0 -DA:77,3 -DA:79,3 -DA:89,3 -DA:92,3 -DA:103,0 -DA:116,2 -DA:125,2 -DA:129,3 -DA:131,3 -DA:134,0 -DA:137,3 -DA:143,0 -DA:145,0 -DA:147,0 -DA:148,0 -DA:150,0 -DA:160,0 -DA:163,0 -DA:170,0 -DA:171,0 -DA:177,1 -DA:178,1 -DA:179,1 -DA:180,2 -DA:184,1 -DA:185,0 -DA:189,0 -DA:196,0 -DA:197,0 -DA:198,0 -DA:200,0 -DA:201,0 -DA:207,0 -DA:209,0 -DA:210,0 -DA:211,0 -DA:213,0 -DA:214,0 -DA:216,0 -DA:219,0 -DA:220,0 -DA:222,0 -DA:227,0 -DA:228,0 -DA:229,0 -DA:231,0 -DA:232,0 -DA:233,0 -DA:236,0 -DA:241,4 -LF:72 -LH:27 -BRDA:14,0,0,6 -BRDA:83,1,0,0 -BRDA:83,1,1,3 -BRDA:119,2,0,2 -BRDA:119,2,1,0 -BRDA:177,3,0,1 -BRDA:177,3,1,0 -BRDA:181,4,0,0 -BRDA:181,4,1,2 -BRDA:181,5,0,1 -BRDA:181,5,1,1 -BRDA:210,6,0,0 -BRDA:210,6,1,0 -BRDA:227,7,0,0 -BRDA:227,7,1,0 -BRDA:228,8,0,0 -BRDA:228,8,1,0 -BRF:17 -BRH:7 -end_of_record -TN: -SF:src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts -FN:5,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:2,4 -DA:4,4 -DA:7,0 -DA:12,0 -LF:4 -LH:2 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/package/SfpPackage.ts -FN:64,(anonymous_1) -FN:68,(anonymous_2) -FN:72,(anonymous_3) -FN:77,(anonymous_4) -FN:81,(anonymous_5) -FN:89,(anonymous_6) -FN:93,(anonymous_7) -FN:107,(anonymous_8) -FNF:8 -FNH:4 -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:8,(anonymous_4) -FNDA:7,(anonymous_5) -FNDA:12,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:13,(anonymous_8) -DA:1,13 -DA:54,13 -DA:61,12 -DA:65,0 -DA:69,0 -DA:74,0 -DA:78,8 -DA:82,7 -DA:90,12 -DA:94,0 -DA:95,0 -DA:96,0 -DA:97,0 -DA:98,0 -DA:99,0 -DA:100,0 -DA:101,0 -DA:102,0 -DA:107,13 -DA:108,13 -DA:109,13 -DA:110,13 -DA:111,13 -LF:23 -LH:11 -BRDA:107,0,0,13 -BRDA:107,0,1,13 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/core/package/SfpPackageBuilder.ts -FN:28,(anonymous_7) -FN:193,(anonymous_8) -FN:214,(anonymous_9) -FN:235,(anonymous_10) -FN:257,(anonymous_11) -FN:264,(anonymous_12) -FNF:6 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:13,1 -DA:14,1 -DA:15,1 -DA:16,1 -DA:17,1 -DA:18,1 -DA:19,1 -DA:21,1 -DA:22,1 -DA:23,1 -DA:24,1 -DA:25,1 -DA:27,1 -DA:37,0 -DA:40,0 -DA:43,0 -DA:49,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:53,0 -DA:54,0 -DA:58,0 -DA:59,0 -DA:61,0 -DA:64,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:71,0 -DA:75,0 -DA:77,0 -DA:80,0 -DA:92,0 -DA:96,0 -DA:102,0 -DA:103,0 -DA:105,0 -DA:106,0 -DA:107,0 -DA:108,0 -DA:109,0 -DA:110,0 -DA:112,0 -DA:113,0 -DA:114,0 -DA:115,0 -DA:119,0 -DA:121,0 -DA:124,0 -DA:129,0 -DA:131,0 -DA:138,0 -DA:140,0 -DA:141,0 -DA:146,0 -DA:153,0 -DA:155,0 -DA:162,0 -DA:164,0 -DA:171,0 -DA:173,0 -DA:174,0 -DA:175,0 -DA:182,0 -DA:185,0 -DA:199,0 -DA:202,0 -DA:203,0 -DA:209,0 -DA:211,0 -DA:216,0 -DA:217,0 -DA:218,0 -DA:219,0 -DA:221,0 -DA:222,0 -DA:226,0 -DA:227,0 -DA:228,0 -DA:230,0 -DA:236,0 -DA:242,0 -DA:243,0 -DA:251,0 -DA:252,0 -DA:253,0 -DA:258,0 -DA:259,0 -DA:264,1 -DA:265,0 -LF:102 -LH:24 -BRDA:58,0,0,0 -BRDA:58,0,1,0 -BRDA:67,1,0,0 -BRDA:67,1,1,0 -BRDA:131,2,0,0 -BRDA:138,3,0,0 -BRDA:141,4,0,0 -BRDA:145,5,0,0 -BRDA:145,5,1,0 -BRDA:145,5,2,0 -BRDA:145,5,3,0 -BRDA:236,6,0,0 -BRDA:236,6,1,0 -BRDA:237,7,0,0 -BRDA:237,7,1,0 -BRDA:237,7,2,0 -BRDA:237,7,3,0 -BRDA:258,8,0,0 -BRDA:258,8,1,0 -BRF:19 -BRH:0 -end_of_record -TN: -SF:src/core/package/analyser/AnalyzerRegistry.ts -FN:7,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,1 -DA:2,1 -DA:4,1 -DA:6,1 -DA:8,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:18,0 -LF:12 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/package/analyser/FHTAnalyzer.ts -FN:11,(anonymous_7) -FN:17,(anonymous_8) -FN:51,(anonymous_9) -FN:72,(anonymous_10) -FNF:4 -FNH:3 -FNDA:0,(anonymous_7) -FNDA:4,(anonymous_8) -FNDA:4,(anonymous_9) -FNDA:3,(anonymous_10) -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:5,2 -DA:7,2 -DA:9,2 -DA:12,0 -DA:20,4 -DA:23,4 -DA:33,3 -DA:38,4 -DA:41,4 -DA:42,4 -DA:46,0 -DA:48,4 -DA:55,4 -DA:59,0 -DA:62,3 -DA:64,2 -DA:65,2 -DA:66,2 -DA:69,4 -DA:73,3 -DA:74,1 -LF:25 -LH:22 -BRDA:65,0,0,2 -BRDA:73,1,0,2 -BRDA:73,1,1,1 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/core/package/analyser/FTAnalyzer.ts -FN:11,(anonymous_7) -FN:15,(anonymous_8) -FN:49,(anonymous_9) -FN:70,(anonymous_10) -FNF:4 -FNH:3 -FNDA:0,(anonymous_7) -FNDA:4,(anonymous_8) -FNDA:4,(anonymous_9) -FNDA:3,(anonymous_10) -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:5,2 -DA:7,2 -DA:9,2 -DA:12,0 -DA:18,4 -DA:21,4 -DA:31,3 -DA:36,4 -DA:39,4 -DA:40,4 -DA:44,0 -DA:46,4 -DA:53,4 -DA:57,0 -DA:60,3 -DA:62,2 -DA:63,2 -DA:64,2 -DA:67,4 -DA:71,3 -DA:72,1 -LF:25 -LH:22 -BRDA:63,0,0,2 -BRDA:71,1,0,2 -BRDA:71,1,1,1 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/core/package/analyser/PicklistAnalyzer.ts -FN:8,(anonymous_6) -FN:14,(anonymous_7) -FN:48,(anonymous_8) -FNF:3 -FNH:0 -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -DA:1,1 -DA:2,1 -DA:4,1 -DA:6,1 -DA:9,0 -DA:16,0 -DA:17,0 -DA:23,0 -DA:27,0 -DA:33,0 -DA:37,0 -DA:38,0 -DA:43,0 -DA:45,0 -DA:49,0 -DA:50,0 -LF:16 -LH:4 -BRDA:36,0,0,0 -BRDA:36,0,1,0 -BRDA:49,1,0,0 -BRDA:49,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src/core/package/components/PackageManifest.ts -FN:14,(anonymous_7) -FN:21,(anonymous_8) -FN:25,(anonymous_9) -FN:32,(anonymous_10) -FN:49,(anonymous_11) -FN:58,(anonymous_12) -FN:59,(anonymous_13) -FN:92,(anonymous_14) -FN:109,(anonymous_15) -FN:132,(anonymous_16) -FN:151,(anonymous_17) -FN:170,(anonymous_18) -FN:196,(anonymous_19) -FN:226,(anonymous_20) -FN:243,(anonymous_21) -FNF:15 -FNH:14 -FNDA:3,(anonymous_7) -FNDA:3,(anonymous_8) -FNDA:13,(anonymous_9) -FNDA:6,(anonymous_10) -FNDA:6,(anonymous_11) -FNDA:48,(anonymous_12) -FNDA:150,(anonymous_13) -FNDA:1,(anonymous_14) -FNDA:2,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:2,(anonymous_17) -FNDA:1,(anonymous_18) -FNDA:2,(anonymous_19) -FNDA:1,(anonymous_20) -FNDA:1,(anonymous_21) -DA:1,2 -DA:2,2 -DA:4,2 -DA:5,2 -DA:7,2 -DA:15,3 -DA:22,3 -DA:33,6 -DA:35,6 -DA:37,6 -DA:38,6 -DA:40,6 -DA:50,6 -DA:52,6 -DA:58,6 -DA:59,150 -DA:62,6 -DA:65,42 -DA:69,42 -DA:73,6 -DA:77,6 -DA:81,6 -DA:82,6 -DA:84,6 -DA:93,1 -DA:94,1 -DA:96,1 -DA:100,1 -DA:102,1 -DA:110,2 -DA:116,1 -DA:117,1 -DA:121,0 -DA:125,2 -DA:133,0 -DA:139,0 -DA:140,0 -DA:144,0 -DA:148,0 -DA:152,2 -DA:156,1 -DA:157,1 -DA:161,0 -DA:163,2 -DA:171,1 -DA:177,1 -DA:178,1 -DA:185,0 -DA:189,1 -DA:202,2 -DA:205,0 -DA:213,1 -DA:216,0 -DA:218,1 -DA:223,2 -DA:227,1 -DA:232,1 -DA:233,1 -DA:237,0 -DA:240,1 -DA:244,1 -DA:256,1 -DA:261,1 -DA:262,1 -DA:266,0 -DA:269,1 -LF:66 -LH:54 -BRDA:176,0,0,2 -BRDA:176,0,1,1 -BRDA:182,1,0,0 -BRDA:182,1,1,0 -BRF:4 -BRH:2 -end_of_record -TN: -SF:src/core/package/components/PackageToComponent.ts -FN:6,(anonymous_0) -FN:8,(anonymous_1) -FNF:2 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -DA:1,1 -DA:5,1 -DA:6,0 -DA:9,0 -DA:11,0 -DA:13,0 -DA:16,0 -DA:23,0 -DA:26,0 -LF:9 -LH:2 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/package/coverage/PackageTestCoverage.ts -FN:13,(anonymous_7) -FN:22,(anonymous_8) -FN:47,(anonymous_9) -FN:55,(anonymous_10) -FN:66,(anonymous_11) -FN:78,(anonymous_12) -FN:149,(anonymous_13) -FN:182,(anonymous_14) -FN:195,(anonymous_15) -FN:211,(anonymous_16) -FN:213,(anonymous_17) -FN:232,(anonymous_18) -FN:234,(anonymous_19) -FN:252,(anonymous_20) -FN:253,(anonymous_21) -FNF:15 -FNH:15 -FNDA:7,(anonymous_7) -FNDA:7,(anonymous_8) -FNDA:1,(anonymous_9) -FNDA:1,(anonymous_10) -FNDA:2,(anonymous_11) -FNDA:5,(anonymous_12) -FNDA:8,(anonymous_13) -FNDA:2,(anonymous_14) -FNDA:2,(anonymous_15) -FNDA:15,(anonymous_16) -FNDA:15,(anonymous_17) -FNDA:15,(anonymous_18) -FNDA:30,(anonymous_19) -FNDA:15,(anonymous_20) -FNDA:39,(anonymous_21) -DA:1,1 -DA:2,1 -DA:3,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:9,1 -DA:11,7 -DA:14,7 -DA:15,7 -DA:16,7 -DA:17,7 -DA:19,7 -DA:23,7 -DA:24,7 -DA:26,7 -DA:32,7 -DA:33,7 -DA:36,19 -DA:37,19 -DA:41,7 -DA:43,7 -DA:45,1 -DA:47,1 -DA:48,1 -DA:51,7 -DA:53,1 -DA:55,1 -DA:56,1 -DA:60,1 -DA:65,1 -DA:66,1 -DA:67,2 -DA:69,1 -DA:73,7 -DA:74,7 -DA:75,7 -DA:87,5 -DA:89,5 -DA:91,5 -DA:94,3 -DA:95,3 -DA:103,0 -DA:112,2 -DA:120,3 -DA:122,3 -DA:128,2 -DA:136,1 -DA:145,0 -DA:153,8 -DA:155,8 -DA:156,8 -DA:158,8 -DA:166,20 -DA:173,8 -DA:182,2 -DA:183,2 -DA:185,2 -DA:189,8 -DA:195,2 -DA:196,2 -DA:198,2 -DA:201,8 -DA:212,15 -DA:213,15 -DA:217,12 -DA:220,3 -DA:222,0 -DA:233,15 -DA:234,15 -DA:238,27 -DA:241,3 -DA:243,0 -DA:253,15 -DA:256,63 -DA:263,12 -DA:268,0 -DA:271,15 -LF:78 -LH:73 -BRDA:87,0,0,5 -BRDA:93,1,0,5 -BRDA:93,1,1,2 -BRDA:119,2,0,3 -BRDA:119,2,1,0 -BRDA:212,3,0,15 -BRDA:212,3,1,0 -BRDA:233,4,0,15 -BRDA:233,4,1,0 -BRDA:256,5,0,27 -BRF:10 -BRH:7 -end_of_record -TN: -SF:src/core/package/dependencies/ExternalPackage2DependencyResolver.ts -FN:12,(anonymous_1) -FN:14,(anonymous_2) -FN:55,(anonymous_3) -FN:86,(anonymous_4) -FNF:4 -FNH:3 -FNDA:2,(anonymous_1) -FNDA:2,(anonymous_2) -FNDA:2,(anonymous_3) -FNDA:0,(anonymous_4) -DA:2,2 -DA:4,2 -DA:10,2 -DA:12,2 -DA:19,2 -DA:22,2 -DA:30,2 -DA:31,2 -DA:35,0 -DA:41,12 -DA:42,0 -DA:45,10 -DA:46,4 -DA:50,0 -DA:51,0 -DA:52,0 -DA:55,2 -DA:56,2 -DA:58,0 -DA:59,0 -DA:64,0 -DA:67,2 -DA:71,0 -DA:73,2 -DA:78,2 -DA:87,0 -DA:89,0 -DA:90,0 -DA:93,0 -DA:95,0 -DA:98,0 -DA:101,0 -LF:32 -LH:16 -BRDA:19,0,0,2 -BRDA:41,1,0,0 -BRDA:41,2,0,12 -BRDA:41,2,1,0 -BRDA:44,3,0,12 -BRDA:44,3,1,10 -BRDA:48,4,0,4 -BRDA:48,4,1,0 -BRF:8 -BRH:5 -end_of_record -TN: -SF:src/core/package/dependencies/PackageDependencyResolver.ts -FN:15,(anonymous_7) -FN:31,(anonymous_8) -FN:116,(anonymous_9) -FN:124,(anonymous_10) -FN:176,(anonymous_11) -FN:191,(anonymous_12) -FN:221,(anonymous_13) -FN:227,(anonymous_14) -FN:236,(anonymous_15) -FN:249,(anonymous_16) -FN:265,(anonymous_17) -FNF:11 -FNH:11 -FNDA:10,(anonymous_7) -FNDA:10,(anonymous_8) -FNDA:16,(anonymous_9) -FNDA:38,(anonymous_10) -FNDA:13,(anonymous_11) -FNDA:4,(anonymous_12) -FNDA:55,(anonymous_13) -FNDA:10,(anonymous_14) -FNDA:6,(anonymous_15) -FNDA:5,(anonymous_16) -FNDA:6,(anonymous_17) -DA:2,3 -DA:3,3 -DA:4,3 -DA:5,3 -DA:6,3 -DA:12,3 -DA:13,10 -DA:16,10 -DA:17,10 -DA:18,10 -DA:19,10 -DA:20,10 -DA:23,10 -DA:34,0 -DA:38,24 -DA:42,0 -DA:45,19 -DA:46,28 -DA:49,1 -DA:52,27 -DA:56,9 -DA:61,2 -DA:63,16 -DA:65,1 -DA:66,1 -DA:72,1 -DA:78,1 -DA:84,1 -DA:85,1 -DA:86,1 -DA:87,1 -DA:88,1 -DA:91,15 -DA:99,13 -DA:100,10 -DA:101,10 -DA:103,3 -DA:107,7 -DA:124,38 -DA:125,16 -DA:130,6 -DA:131,6 -DA:133,6 -DA:138,1 -DA:143,5 -DA:146,1 -DA:152,4 -DA:159,5 -DA:164,5 -DA:171,1 -DA:176,13 -DA:177,4 -DA:180,1 -DA:182,4 -DA:197,4 -DA:198,4 -DA:199,4 -DA:202,9 -DA:205,3 -DA:206,3 -DA:209,9 -DA:213,1 -DA:218,3 -DA:222,55 -DA:223,55 -DA:228,10 -DA:237,6 -DA:238,6 -DA:239,5 -DA:254,5 -DA:255,5 -DA:256,5 -DA:266,6 -DA:267,6 -LF:74 -LH:72 -BRDA:33,0,0,47 -BRDA:33,0,1,0 -BRDA:37,1,0,47 -BRDA:37,1,1,35 -BRDA:41,2,0,23 -BRDA:41,2,1,0 -BRDA:44,3,0,23 -BRDA:44,3,1,19 -BRDA:47,4,0,28 -BRDA:47,4,1,1 -BRDA:52,5,0,0 -BRDA:52,5,1,27 -BRDA:59,6,0,18 -BRDA:59,6,1,8 -BRDA:59,6,2,2 -BRDA:64,7,0,16 -BRDA:64,7,1,1 -BRDA:99,8,0,10 -BRDA:99,8,1,3 -BRDA:125,9,0,10 -BRDA:132,10,0,6 -BRDA:132,10,1,6 -BRDA:176,11,0,13 -BRDA:176,11,1,5 -BRDA:209,12,0,3 -BRDA:238,13,0,1 -BRDA:238,13,1,5 -BRF:27 -BRH:24 -end_of_record -TN: -SF:src/core/package/dependencies/TransitiveDependencyResolver.ts -FN:11,(anonymous_7) -FN:13,(anonymous_8) -FN:28,(anonymous_9) -FN:40,(anonymous_10) -FN:68,(anonymous_11) -FN:69,(anonymous_12) -FN:90,(anonymous_13) -FN:91,(anonymous_14) -FN:98,(anonymous_15) -FNF:9 -FNH:8 -FNDA:7,(anonymous_7) -FNDA:7,(anonymous_8) -FNDA:7,(anonymous_9) -FNDA:7,(anonymous_10) -FNDA:221,(anonymous_11) -FNDA:152,(anonymous_12) -FNDA:727,(anonymous_13) -FNDA:727,(anonymous_14) -FNDA:0,(anonymous_15) -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:5,2 -DA:6,2 -DA:8,2 -DA:10,2 -DA:11,7 -DA:14,7 -DA:16,7 -DA:17,7 -DA:18,7 -DA:19,7 -DA:23,7 -DA:25,7 -DA:34,7 -DA:37,7 -DA:43,7 -DA:45,42 -DA:50,42 -DA:54,65 -DA:55,65 -DA:64,87 -DA:67,42 -DA:68,221 -DA:69,152 -DA:70,42 -DA:72,96 -DA:74,96 -DA:76,7 -DA:79,0 -DA:82,7 -DA:83,7 -DA:89,145 -DA:90,727 -DA:91,727 -DA:93,42 -DA:95,7 -DA:100,0 -DA:103,0 -DA:104,0 -DA:105,0 -LF:43 -LH:38 -BRDA:99,0,0,0 -BRDA:99,0,1,0 -BRDA:99,0,2,0 -BRDA:99,0,3,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src/core/package/deploymentFilters/EntitlementVersionFilter.ts -FN:16,(anonymous_7) -FN:51,(anonymous_8) -FN:93,(anonymous_9) -FNF:3 -FNH:2 -FNDA:5,(anonymous_7) -FNDA:7,(anonymous_8) -FNDA:0,(anonymous_9) -DA:1,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:12,1 -DA:14,1 -DA:18,5 -DA:19,5 -DA:22,5 -DA:23,5 -DA:26,5 -DA:29,5 -DA:33,3 -DA:34,3 -DA:36,1 -DA:37,1 -DA:40,4 -DA:42,4 -DA:43,4 -DA:48,8 -DA:50,8 -DA:51,7 -DA:61,1 -DA:62,1 -DA:67,1 -DA:68,1 -DA:69,1 -DA:71,3 -DA:78,4 -DA:81,0 -DA:85,4 -DA:86,4 -DA:88,1 -DA:89,1 -DA:94,0 -DA:96,0 -DA:97,0 -LF:41 -LH:37 -BRDA:26,0,0,0 -BRDA:55,1,0,8 -BRDA:55,1,1,4 -BRDA:55,1,2,4 -BRDA:94,2,0,0 -BRDA:96,3,0,0 -BRDA:96,3,1,0 -BRF:7 -BRH:3 -end_of_record -TN: -SF:src/core/package/diff/PackageComponentDiff.ts -FN:30,(anonymous_7) -FN:51,(anonymous_8) -FN:79,(anonymous_9) -FN:156,(anonymous_10) -FN:163,(anonymous_11) -FN:174,(anonymous_12) -FN:178,(anonymous_13) -FN:289,(anonymous_14) -FN:294,(anonymous_15) -FN:316,(anonymous_16) -FN:336,(anonymous_17) -FN:418,(anonymous_18) -FNF:12 -FNH:1 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:1,(anonymous_18) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:11,1 -DA:12,1 -DA:14,1 -DA:15,1 -DA:18,1 -DA:31,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:38,0 -DA:41,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:47,0 -DA:48,0 -DA:52,0 -DA:54,0 -DA:55,0 -DA:58,0 -DA:59,0 -DA:61,0 -DA:64,0 -DA:72,0 -DA:73,0 -DA:74,0 -DA:76,0 -DA:77,0 -DA:79,0 -DA:80,0 -DA:81,0 -DA:82,0 -DA:83,0 -DA:85,0 -DA:86,0 -DA:89,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:102,0 -DA:104,0 -DA:107,0 -DA:108,0 -DA:110,0 -DA:111,0 -DA:112,0 -DA:114,0 -DA:116,0 -DA:118,0 -DA:120,0 -DA:125,0 -DA:126,0 -DA:130,0 -DA:140,0 -DA:141,0 -DA:146,0 -DA:147,0 -DA:150,0 -DA:152,0 -DA:157,0 -DA:159,0 -DA:162,0 -DA:163,0 -DA:168,0 -DA:171,0 -DA:176,0 -DA:178,0 -DA:179,0 -DA:182,0 -DA:184,0 -DA:185,0 -DA:187,0 -DA:188,0 -DA:190,0 -DA:192,0 -DA:195,0 -DA:202,0 -DA:210,0 -DA:212,0 -DA:214,0 -DA:216,0 -DA:222,0 -DA:228,0 -DA:236,0 -DA:242,0 -DA:248,0 -DA:256,0 -DA:257,0 -DA:262,0 -DA:276,0 -DA:286,0 -DA:291,0 -DA:292,0 -DA:294,0 -DA:295,0 -DA:299,0 -DA:308,0 -DA:309,0 -DA:310,0 -DA:311,0 -DA:312,0 -DA:317,0 -DA:318,0 -DA:320,0 -DA:321,0 -DA:322,0 -DA:327,0 -DA:331,0 -DA:333,0 -DA:337,0 -DA:338,0 -DA:339,0 -DA:340,0 -DA:341,0 -DA:343,0 -DA:345,0 -DA:350,0 -DA:352,0 -DA:354,0 -DA:355,0 -DA:356,0 -DA:359,0 -DA:363,0 -DA:366,0 -DA:370,0 -DA:377,0 -DA:384,0 -DA:386,0 -DA:388,0 -DA:389,0 -DA:390,0 -DA:393,0 -DA:397,0 -DA:400,0 -DA:408,0 -DA:415,0 -DA:418,1 -DA:419,1 -DA:420,1 -DA:421,1 -DA:422,1 -DA:423,1 -LF:153 -LH:21 -BRDA:37,0,0,0 -BRDA:37,0,1,0 -BRDA:98,1,0,0 -BRDA:98,1,1,0 -BRDA:111,2,0,0 -BRDA:111,2,1,0 -BRDA:125,3,0,0 -BRDA:157,4,0,0 -BRDA:157,4,1,0 -BRDA:165,5,0,0 -BRDA:165,5,1,0 -BRDA:179,6,0,0 -BRDA:179,6,1,0 -BRDA:256,7,0,0 -BRDA:256,7,1,0 -BRDA:295,8,0,0 -BRDA:295,8,1,0 -BRDA:418,9,0,1 -BRDA:418,9,1,1 -BRF:19 -BRH:2 -end_of_record -TN: -SF:src/core/package/diff/PackageDiffImpl.ts -FN:12,(anonymous_7) -FN:21,(anonymous_8) -FN:28,(anonymous_9) -FN:109,(anonymous_10) -FN:123,(anonymous_11) -FN:137,(anonymous_12) -FN:159,(anonymous_13) -FNF:7 -FNH:6 -FNDA:1,(anonymous_7) -FNDA:9,(anonymous_8) -FNDA:9,(anonymous_9) -FNDA:6,(anonymous_10) -FNDA:8,(anonymous_11) -FNDA:5,(anonymous_12) -FNDA:0,(anonymous_13) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:12,1 -DA:13,1 -DA:15,1 -DA:20,1 -DA:22,9 -DA:23,9 -DA:24,9 -DA:25,9 -DA:29,9 -DA:31,9 -DA:32,9 -DA:34,8 -DA:44,0 -DA:46,8 -DA:50,6 -DA:55,6 -DA:57,0 -DA:58,0 -DA:59,0 -DA:60,0 -DA:61,0 -DA:64,6 -DA:66,6 -DA:68,6 -DA:77,7 -DA:78,7 -DA:80,7 -DA:83,1 -DA:84,1 -DA:88,5 -DA:93,5 -DA:95,1 -DA:98,4 -DA:100,2 -DA:105,2 -DA:111,6 -DA:112,6 -DA:113,6 -DA:115,6 -DA:118,6 -DA:120,6 -DA:124,8 -DA:125,8 -DA:127,8 -DA:129,0 -DA:131,8 -DA:134,8 -DA:138,5 -DA:139,5 -DA:144,5 -DA:148,5 -DA:149,2 -DA:152,2 -DA:153,1 -DA:154,1 -DA:155,1 -DA:156,3 -DA:161,0 -DA:163,0 -LF:69 -LH:60 -BRDA:43,0,0,8 -BRDA:43,0,1,7 -BRDA:66,1,0,6 -BRDA:111,2,0,0 -BRDA:111,2,1,6 -BRDA:112,3,0,0 -BRDA:112,3,1,6 -BRDA:148,4,0,2 -BRDA:148,4,1,3 -BRDA:152,5,0,1 -BRDA:152,5,1,1 -BRF:11 -BRH:9 -end_of_record -TN: -SF:src/core/package/packageCreators/CreateDataPackageImpl.ts -FN:12,(anonymous_7) -FN:22,(anonymous_8) -FN:26,(anonymous_9) -FN:29,(anonymous_10) -FN:31,(anonymous_11) -FN:33,(anonymous_12) -FN:41,(anonymous_13) -FN:45,(anonymous_14) -FN:49,(anonymous_15) -FN:51,(anonymous_16) -FN:54,(anonymous_17) -FNF:11 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:19,0 -DA:23,0 -DA:27,0 -DA:29,0 -DA:31,0 -DA:33,0 -DA:35,0 -DA:37,0 -DA:38,0 -DA:42,0 -DA:55,0 -DA:60,0 -DA:61,0 -DA:65,0 -DA:69,0 -DA:75,0 -DA:81,0 -LF:30 -LH:8 -BRDA:35,0,0,0 -BRDA:37,1,0,0 -BRDA:37,1,1,0 -BRDA:37,2,0,0 -BRDA:37,2,1,0 -BRDA:60,3,0,0 -BRDA:61,4,0,0 -BRDA:64,5,0,0 -BRDA:64,5,1,0 -BRF:9 -BRH:0 -end_of_record -TN: -SF:src/core/package/packageCreators/CreateDiffPackageImpl.ts -FN:21,(anonymous_7) -FN:31,(anonymous_8) -FN:35,(anonymous_9) -FN:37,(anonymous_10) -FN:41,(anonymous_11) -FN:62,(anonymous_12) -FN:68,(anonymous_13) -FN:109,(anonymous_14) -FN:111,(anonymous_15) -FN:141,(anonymous_16) -FN:147,getPackagesToCommits -FN:162,(anonymous_18) -FN:168,(anonymous_19) -FN:180,(anonymous_20) -FN:239,getOnlyChangedClassesFromPackage -FN:254,(anonymous_22) -FN:255,(anonymous_23) -FN:256,(anonymous_24) -FN:257,(anonymous_25) -FN:258,(anonymous_26) -FN:262,(anonymous_27) -FN:266,(anonymous_28) -FNF:22 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,getPackagesToCommits -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,getOnlyChangedClassesFromPackage -FNDA:0,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -FNDA:0,(anonymous_26) -FNDA:0,(anonymous_27) -FNDA:0,(anonymous_28) -DA:1,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:7,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:11,1 -DA:12,1 -DA:13,1 -DA:14,1 -DA:15,1 -DA:16,1 -DA:18,1 -DA:20,1 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:28,0 -DA:32,0 -DA:38,0 -DA:42,0 -DA:45,0 -DA:48,0 -DA:50,0 -DA:52,0 -DA:56,0 -DA:58,0 -DA:63,0 -DA:64,0 -DA:65,0 -DA:72,0 -DA:79,0 -DA:82,0 -DA:83,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:94,0 -DA:96,0 -DA:102,0 -DA:116,0 -DA:117,0 -DA:120,0 -DA:123,0 -DA:126,0 -DA:127,0 -DA:131,0 -DA:134,0 -DA:137,0 -DA:138,0 -DA:142,0 -DA:143,0 -DA:145,0 -DA:148,0 -DA:149,0 -DA:154,0 -DA:155,0 -DA:157,0 -DA:162,0 -DA:163,0 -DA:168,0 -DA:170,0 -DA:174,0 -DA:176,0 -DA:185,0 -DA:187,0 -DA:192,0 -DA:197,0 -DA:200,0 -DA:207,0 -DA:209,0 -DA:211,0 -DA:212,0 -DA:213,0 -DA:217,0 -DA:218,0 -DA:219,0 -DA:220,0 -DA:222,0 -DA:226,0 -DA:229,0 -DA:230,0 -DA:231,0 -DA:232,0 -DA:233,0 -DA:234,0 -DA:235,0 -DA:236,0 -DA:245,0 -DA:250,0 -DA:254,0 -DA:255,0 -DA:256,0 -DA:257,0 -DA:258,0 -DA:261,0 -DA:262,0 -DA:266,0 -DA:268,0 -LF:103 -LH:16 -BRDA:82,0,0,0 -BRDA:82,0,1,0 -BRDA:120,1,0,0 -BRDA:137,2,0,0 -BRDA:174,3,0,0 -BRDA:244,4,0,0 -BRDA:244,4,1,0 -BRDA:262,5,0,0 -BRDA:262,5,1,0 -BRF:9 -BRH:0 -end_of_record -TN: -SF:src/core/package/packageCreators/CreatePackage.ts -FN:9,(anonymous_7) -FN:20,(anonymous_8) -FN:49,(anonymous_9) -FN:81,(anonymous_10) -FN:95,(anonymous_11) -FN:105,(anonymous_12) -FN:121,(anonymous_13) -FNF:7 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -DA:1,1 -DA:2,1 -DA:3,1 -DA:6,1 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:17,0 -DA:22,0 -DA:25,0 -DA:28,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:35,0 -DA:38,0 -DA:40,0 -DA:50,0 -DA:52,0 -DA:57,0 -DA:58,0 -DA:63,0 -DA:69,0 -DA:74,0 -DA:83,0 -DA:84,0 -DA:85,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:97,0 -DA:98,0 -DA:99,0 -DA:106,0 -DA:112,0 -DA:117,0 -DA:118,0 -DA:122,0 -DA:123,0 -DA:128,0 -DA:134,0 -DA:140,0 -DA:142,0 -LF:45 -LH:4 -BRDA:17,0,0,0 -BRDA:57,1,0,0 -BRDA:57,2,0,0 -BRDA:57,2,1,0 -BRDA:83,3,0,0 -BRDA:83,3,1,0 -BRDA:89,4,0,0 -BRDA:89,4,1,0 -BRDA:97,5,0,0 -BRDA:97,5,1,0 -BRF:10 -BRH:0 -end_of_record -TN: -SF:src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts -FN:6,(anonymous_0) -FNF:1 -FNH:1 -FNDA:4,(anonymous_0) -DA:5,2 -DA:8,4 -DA:9,4 -DA:11,0 -DA:15,4 -DA:16,4 -DA:18,0 -DA:21,4 -LF:8 -LH:6 -BRDA:8,0,0,4 -BRDA:8,0,1,0 -BRDA:15,1,0,4 -BRDA:15,1,1,0 -BRF:4 -BRH:2 -end_of_record -TN: -SF:src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts -FN:8,(anonymous_7) -FNF:1 -FNH:1 -FNDA:4,(anonymous_7) -DA:1,2 -DA:4,2 -DA:7,2 -DA:12,0 -DA:16,4 -DA:17,4 -DA:22,4 -DA:25,0 -DA:27,4 -LF:9 -LH:7 -BRDA:11,0,0,4 -BRDA:11,0,1,4 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts -FN:5,(anonymous_0) -FNF:1 -FNH:1 -FNDA:2,(anonymous_0) -DA:4,2 -DA:7,2 -LF:2 -LH:2 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/package/validators/PackageEmptyChecker.ts -FN:7,(anonymous_1) -FN:60,(anonymous_2) -FN:71,(anonymous_3) -FNF:3 -FNH:0 -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:16,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:29,0 -DA:30,0 -DA:32,0 -DA:33,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:44,0 -DA:46,0 -DA:47,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:53,0 -DA:54,0 -DA:55,0 -DA:56,0 -DA:64,0 -DA:66,0 -DA:69,0 -DA:71,0 -DA:74,0 -DA:75,0 -DA:78,0 -DA:82,0 -DA:83,0 -LF:37 -LH:5 -BRDA:21,0,0,0 -BRDA:21,0,1,0 -BRDA:50,1,0,0 -BRDA:50,1,1,0 -BRDA:52,2,0,0 -BRDA:52,2,1,0 -BRDA:74,3,0,0 -BRDA:74,3,1,0 -BRDA:82,4,0,0 -BRDA:82,4,1,0 -BRDA:82,5,0,0 -BRDA:82,5,1,0 -BRF:12 -BRH:0 -end_of_record -TN: -SF:src/core/package/version/Package2VersionFetcher.ts -FN:12,(anonymous_1) -FN:22,(anonymous_2) -FN:51,(anonymous_3) -FN:59,(anonymous_4) -FN:69,(anonymous_5) -FNF:5 -FNH:4 -FNDA:8,(anonymous_1) -FNDA:4,(anonymous_2) -FNDA:6,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:2,(anonymous_5) -DA:2,4 -DA:3,4 -DA:8,4 -DA:9,8 -DA:12,8 -DA:27,4 -DA:29,4 -DA:33,4 -DA:35,4 -DA:36,4 -DA:37,4 -DA:38,4 -DA:41,4 -DA:43,4 -DA:44,4 -DA:47,4 -DA:50,4 -DA:51,3 -DA:52,6 -DA:53,6 -DA:54,6 -DA:56,1 -DA:60,0 -DA:62,0 -DA:63,0 -DA:65,0 -DA:66,0 -DA:75,2 -DA:77,2 -DA:80,1 -DA:81,1 -DA:82,1 -DA:83,1 -DA:85,2 -DA:87,2 -DA:88,2 -DA:90,2 -DA:91,2 -LF:38 -LH:33 -BRDA:35,0,0,4 -BRDA:36,1,0,4 -BRDA:37,2,0,4 -BRDA:38,3,0,0 -BRDA:41,4,0,4 -BRDA:50,5,0,3 -BRDA:50,5,1,1 -BRDA:81,6,0,1 -BRDA:82,7,0,1 -BRDA:83,8,0,1 -BRF:10 -BRH:9 -end_of_record -TN: -SF:src/core/package/version/PackageVersionUpdater.ts -FN:4,(anonymous_0) -FN:6,(anonymous_1) -FNF:2 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -DA:3,1 -DA:8,0 -DA:10,0 -DA:11,0 -DA:13,0 -DA:14,0 -DA:15,0 -LF:7 -LH:1 -BRDA:13,0,0,0 -BRDA:13,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src/core/permsets/AssignPermissionSetsImpl.ts -FN:9,(anonymous_7) -FN:16,(anonymous_8) -FN:39,(anonymous_9) -FN:81,(anonymous_10) -FN:87,(anonymous_11) -FNF:5 -FNH:5 -FNDA:3,(anonymous_7) -FNDA:3,(anonymous_8) -FNDA:12,(anonymous_9) -FNDA:4,(anonymous_10) -FNDA:6,(anonymous_11) -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:8,1 -DA:10,3 -DA:11,3 -DA:12,3 -DA:13,3 -DA:26,3 -DA:27,3 -DA:32,3 -DA:36,3 -DA:39,6 -DA:40,12 -DA:45,0 -DA:46,0 -DA:50,6 -DA:59,6 -DA:60,6 -DA:61,3 -DA:62,3 -DA:64,0 -DA:69,2 -DA:70,2 -DA:74,2 -DA:75,2 -DA:78,3 -DA:82,4 -DA:87,4 -DA:88,6 -DA:91,4 -LF:33 -LH:30 -BRDA:60,0,0,3 -BRDA:60,0,1,3 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/core/permsets/PermissionSetFetcher.ts -FN:8,(anonymous_1) -FN:10,(anonymous_2) -FNF:2 -FNH:2 -FNDA:3,(anonymous_1) -FNDA:3,(anonymous_2) -DA:2,1 -DA:7,1 -DA:8,3 -DA:11,3 -DA:13,3 -LF:5 -LH:5 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/permsets/PermissionSetGroupUpdateAwaiter.ts -FN:9,(anonymous_7) -FN:11,(anonymous_8) -FNF:2 -FNH:2 -FNDA:1,(anonymous_7) -FNDA:1,(anonymous_8) -DA:2,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:8,1 -DA:9,1 -DA:12,1 -DA:19,1 -DA:21,0 -DA:26,0 -DA:31,0 -DA:33,1 -DA:38,1 -DA:41,0 -DA:42,0 -LF:15 -LH:10 -BRDA:9,0,0,1 -BRF:1 -BRH:1 -end_of_record -TN: -SF:src/core/project/ProjectConfig.ts -FN:16,(anonymous_1) -FN:28,(anonymous_2) -FN:31,(anonymous_3) -FN:38,(anonymous_4) -FN:44,(anonymous_5) -FN:48,(anonymous_6) -FN:63,(anonymous_7) -FN:65,(anonymous_8) -FN:72,(anonymous_9) -FN:85,(anonymous_10) -FN:88,(anonymous_11) -FN:95,(anonymous_12) -FN:97,(anonymous_13) -FN:108,(anonymous_14) -FN:129,(anonymous_15) -FN:150,(anonymous_16) -FN:163,(anonymous_17) -FN:167,(anonymous_18) -FN:183,(anonymous_19) -FN:190,(anonymous_20) -FN:206,(anonymous_21) -FN:217,(anonymous_22) -FN:242,(anonymous_23) -FN:263,(anonymous_24) -FN:270,(anonymous_25) -FN:275,(anonymous_26) -FNF:26 -FNH:20 -FNDA:2,(anonymous_1) -FNDA:1,(anonymous_2) -FNDA:5,(anonymous_3) -FNDA:2,(anonymous_4) -FNDA:3,(anonymous_5) -FNDA:15,(anonymous_6) -FNDA:1,(anonymous_7) -FNDA:5,(anonymous_8) -FNDA:7,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:13,(anonymous_12) -FNDA:60,(anonymous_13) -FNDA:4,(anonymous_14) -FNDA:13,(anonymous_15) -FNDA:1,(anonymous_16) -FNDA:24,(anonymous_17) -FNDA:123,(anonymous_18) -FNDA:1,(anonymous_19) -FNDA:5,(anonymous_20) -FNDA:1,(anonymous_21) -FNDA:1,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -FNDA:0,(anonymous_26) -DA:1,5 -DA:3,5 -DA:4,5 -DA:5,5 -DA:10,5 -DA:18,1 -DA:20,1 -DA:29,1 -DA:30,1 -DA:31,1 -DA:33,5 -DA:35,1 -DA:41,2 -DA:42,2 -DA:43,2 -DA:44,2 -DA:45,3 -DA:49,15 -DA:54,1 -DA:56,2 -DA:64,1 -DA:65,1 -DA:67,5 -DA:69,1 -DA:75,7 -DA:76,7 -DA:79,35 -DA:82,7 -DA:86,0 -DA:87,0 -DA:88,0 -DA:90,0 -DA:92,0 -DA:96,13 -DA:97,13 -DA:99,60 -DA:101,13 -DA:112,0 -DA:114,4 -DA:118,4 -DA:120,0 -DA:133,13 -DA:136,7 -DA:138,6 -DA:139,5 -DA:141,5 -DA:151,1 -DA:153,1 -DA:155,1 -DA:167,24 -DA:169,23 -DA:174,24 -DA:176,23 -DA:187,1 -DA:190,1 -DA:192,1 -DA:193,1 -DA:197,1 -DA:198,1 -DA:207,1 -DA:209,1 -DA:219,1 -DA:222,4 -DA:226,0 -DA:229,0 -DA:233,1 -DA:234,1 -DA:243,0 -DA:244,0 -DA:248,0 -DA:249,0 -DA:253,0 -DA:254,0 -DA:255,0 -DA:264,0 -DA:265,0 -DA:274,0 -DA:275,0 -DA:276,0 -DA:279,0 -LF:80 -LH:58 -BRDA:33,0,0,5 -BRDA:33,1,0,5 -BRDA:33,1,1,5 -BRDA:43,2,0,2 -BRDA:43,2,1,0 -BRDA:45,3,0,1 -BRDA:67,4,0,5 -BRDA:67,5,0,5 -BRDA:67,5,1,5 -BRDA:90,6,0,0 -BRDA:90,7,0,0 -BRDA:90,7,1,0 -BRDA:99,8,0,60 -BRDA:99,9,0,60 -BRDA:99,9,1,60 -BRDA:138,10,0,1 -BRDA:138,10,1,5 -BRDA:139,11,0,0 -BRDA:139,11,1,5 -BRDA:174,12,0,1 -BRDA:197,13,0,0 -BRDA:197,13,1,1 -BRF:22 -BRH:16 -end_of_record -TN: -SF:src/core/project/UserDefinedExternalDependency.ts -FN:13,(anonymous_1) -FN:23,(anonymous_2) -FN:44,(anonymous_3) -FNF:3 -FNH:3 -FNDA:9,(anonymous_1) -FNDA:2,(anonymous_2) -FNDA:7,(anonymous_3) -DA:1,2 -DA:2,2 -DA:3,2 -DA:4,2 -DA:10,2 -DA:14,9 -DA:15,9 -DA:16,9 -DA:17,9 -DA:20,0 -DA:24,2 -DA:25,2 -DA:26,2 -DA:28,2 -DA:30,2 -DA:33,2 -DA:37,0 -DA:40,2 -DA:41,2 -DA:45,7 -DA:47,7 -DA:50,0 -DA:55,0 -DA:59,7 -LF:24 -LH:20 -BRDA:14,0,0,9 -BRDA:14,0,1,0 -BRDA:52,1,0,7 -BRDA:52,1,1,7 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src/core/queryHelper/ChunkCollection.ts -FN:9,chunkCollection -FNF:1 -FNH:1 -FNDA:3,chunkCollection -DA:9,2 -DA:10,3 -DA:11,3 -DA:13,3 -DA:14,3 -DA:17,1 -DA:20,7 -DA:22,6 -DA:23,6 -DA:25,1 -DA:28,1 -DA:29,1 -DA:30,1 -DA:31,1 -DA:35,2 -DA:37,2 -LF:16 -LH:16 -BRDA:9,0,0,1 -BRDA:9,1,0,1 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/core/queryHelper/QueryHelper.ts -FN:6,(anonymous_0) -FN:8,(anonymous_1) -FNF:2 -FNH:2 -FNDA:21,(anonymous_0) -FNDA:27,(anonymous_1) -DA:3,11 -DA:5,11 -DA:7,21 -DA:10,27 -DA:11,20 -DA:13,19 -LF:6 -LH:6 -BRDA:10,0,0,7 -BRDA:10,0,1,20 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/core/stats/NativeMetricSender.ts -FN:4,(anonymous_0) -FN:12,(anonymous_1) -FNF:2 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -DA:3,1 -DA:4,0 -DA:14,0 -DA:16,0 -DA:18,0 -DA:20,0 -LF:6 -LH:1 -BRDA:13,0,0,0 -BRDA:13,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src/core/stats/SFPStatsSender.ts -FN:15,(anonymous_7) -FN:25,(anonymous_8) -FN:47,(anonymous_9) -FN:56,(anonymous_10) -FN:74,(anonymous_11) -FN:92,(anonymous_12) -FN:109,(anonymous_13) -FNF:7 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -DA:1,1 -DA:2,1 -DA:3,1 -DA:5,1 -DA:7,1 -DA:8,1 -DA:10,1 -DA:16,0 -DA:22,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:43,0 -DA:49,0 -DA:50,0 -DA:52,0 -DA:57,0 -DA:61,0 -DA:64,0 -DA:71,0 -DA:75,0 -DA:79,0 -DA:82,0 -DA:89,0 -DA:93,0 -DA:97,0 -DA:100,0 -DA:106,0 -DA:111,0 -LF:35 -LH:7 -BRDA:18,0,0,0 -BRDA:18,0,1,0 -BRDA:19,1,0,0 -BRDA:19,1,1,0 -BRDA:27,2,0,0 -BRDA:27,2,1,0 -BRDA:27,2,2,0 -BRDA:27,2,3,0 -BRDA:57,3,0,0 -BRDA:75,4,0,0 -BRDA:93,5,0,0 -BRF:11 -BRH:0 -end_of_record -TN: -SF:src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts -FN:6,(anonymous_6) -FN:12,(anonymous_7) -FN:25,(anonymous_8) -FN:39,(anonymous_9) -FNF:4 -FNH:0 -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -DA:1,1 -DA:2,1 -DA:3,1 -DA:5,1 -DA:7,0 -DA:14,0 -DA:21,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:31,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:45,0 -LF:15 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts -FN:12,(anonymous_6) -FN:19,(anonymous_7) -FN:27,(anonymous_8) -FN:33,(anonymous_9) -FN:46,(anonymous_10) -FN:54,(anonymous_11) -FNF:6 -FNH:0 -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -DA:1,1 -DA:3,1 -DA:9,1 -DA:11,1 -DA:13,0 -DA:21,0 -DA:23,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:35,0 -DA:37,0 -DA:38,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:54,0 -DA:56,0 -DA:58,0 -DA:59,0 -LF:26 -LH:4 -BRDA:37,0,0,0 -BRDA:58,1,0,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts -FN:8,(anonymous_7) -FN:14,(anonymous_8) -FN:21,(anonymous_9) -FN:25,(anonymous_10) -FN:26,(anonymous_11) -FN:35,(anonymous_12) -FN:39,(anonymous_13) -FN:40,(anonymous_14) -FNF:8 -FNH:0 -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -DA:1,1 -DA:2,1 -DA:3,1 -DA:7,1 -DA:9,0 -DA:15,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:27,0 -DA:36,0 -DA:37,0 -DA:38,0 -DA:39,0 -DA:41,0 -LF:16 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/utils/AliasList.ts -FN:4,convertAliasToUsername -FN:10,convertUsernameToAlias -FNF:2 -FNH:0 -FNDA:0,convertAliasToUsername -FNDA:0,convertUsernameToAlias -DA:1,4 -DA:4,4 -DA:5,0 -DA:6,0 -DA:7,0 -DA:10,4 -DA:12,0 -DA:13,0 -DA:14,0 -LF:9 -LH:3 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/utils/ChunkArray.ts -FN:1,chunkArray -FNF:1 -FNH:1 -FNDA:2,chunkArray -DA:1,1 -DA:2,2 -DA:3,2 -DA:4,2 -DA:7,9 -DA:10,2 -LF:6 -LH:6 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/utils/Delay.ts -FN:1,delay -FN:2,(anonymous_1) -FNF:2 -FNH:0 -FNDA:0,delay -FNDA:0,(anonymous_1) -DA:1,1 -DA:2,0 -LF:2 -LH:1 -BRDA:1,0,0,0 -BRF:1 -BRH:0 -end_of_record -TN: -SF:src/core/utils/FileSystem.ts -FN:11,(anonymous_0) -FN:20,readdirRecursiveHandler -FN:23,(anonymous_2) -FNF:3 -FNH:3 -FNDA:4,(anonymous_0) -FNDA:24,readdirRecursiveHandler -FNDA:44,(anonymous_2) -DA:1,2 -DA:2,2 -DA:4,2 -DA:16,4 -DA:18,4 -DA:20,4 -DA:21,24 -DA:23,24 -DA:26,22 -DA:28,22 -DA:34,5 -DA:36,5 -DA:39,20 -DA:42,12 -DA:44,12 -DA:50,4 -LF:16 -LH:16 -BRDA:13,0,0,0 -BRDA:14,1,0,0 -BRDA:18,2,0,0 -BRF:3 -BRH:0 -end_of_record -TN: -SF:src/core/utils/Fileutils.ts -FN:15,(anonymous_0) -FN:16,(anonymous_1) -FN:31,(anonymous_2) -FN:40,(anonymous_3) -FN:55,(anonymous_4) -FN:70,(anonymous_5) -FN:85,(anonymous_6) -FN:90,(anonymous_7) -FN:107,(anonymous_8) -FN:123,(anonymous_9) -FN:133,(anonymous_10) -FN:146,(anonymous_11) -FN:177,(anonymous_12) -FN:179,(anonymous_13) -FN:195,(anonymous_14) -FNF:15 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:8,1 -DA:10,1 -DA:16,0 -DA:19,0 -DA:21,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:36,0 -DA:37,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:45,0 -DA:48,0 -DA:49,0 -DA:52,0 -DA:56,0 -DA:57,0 -DA:59,0 -DA:60,0 -DA:63,0 -DA:71,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:77,0 -DA:86,0 -DA:87,0 -DA:88,0 -DA:90,0 -DA:91,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:108,0 -DA:109,0 -DA:111,0 -DA:113,0 -DA:115,0 -DA:124,0 -DA:126,0 -DA:127,0 -DA:129,0 -DA:131,0 -DA:133,0 -DA:134,0 -DA:137,0 -DA:147,0 -DA:148,0 -DA:150,0 -DA:151,0 -DA:153,0 -DA:154,0 -DA:155,0 -DA:157,0 -DA:159,0 -DA:161,0 -DA:165,0 -DA:170,0 -DA:179,0 -DA:180,0 -DA:184,0 -DA:188,0 -DA:192,0 -DA:196,0 -DA:197,0 -DA:198,0 -DA:199,0 -DA:200,0 -DA:202,0 -LF:77 -LH:7 -BRDA:31,0,0,0 -BRDA:44,1,0,0 -BRDA:44,1,1,0 -BRDA:85,2,0,0 -BRDA:85,3,0,0 -BRDA:87,4,0,0 -BRDA:87,4,1,0 -BRDA:88,5,0,0 -BRDA:88,5,1,0 -BRDA:95,6,0,0 -BRDA:95,6,1,0 -BRDA:95,6,2,0 -BRF:12 -BRH:0 -end_of_record -TN: -SF:src/core/utils/ObjectCRUDHelper.ts -FN:8,(anonymous_0) -FN:10,(anonymous_1) -FN:28,(anonymous_2) -FN:30,(anonymous_3) -FNF:4 -FNH:2 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:3,(anonymous_2) -FNDA:3,(anonymous_3) -DA:3,4 -DA:5,4 -DA:7,4 -DA:9,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:16,0 -DA:19,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:29,3 -DA:31,3 -DA:32,3 -DA:33,1 -LF:16 -LH:7 -BRDA:12,0,0,0 -BRDA:12,0,1,0 -BRDA:19,1,0,0 -BRDA:19,1,1,0 -BRDA:21,2,0,0 -BRDA:21,2,1,0 -BRDA:32,3,0,2 -BRDA:32,3,1,1 -BRF:8 -BRH:2 -end_of_record -TN: -SF:src/core/utils/VersionNumberConverter.ts -FN:6,convertBuildNumDotDelimToHyphen -FN:22,getIndexOfBuildNumDelimeter -FNF:2 -FNH:2 -FNDA:103,convertBuildNumDotDelimToHyphen -FNDA:103,getIndexOfBuildNumDelimeter -DA:6,2 -DA:7,103 -DA:9,103 -DA:11,103 -DA:14,103 -DA:23,103 -DA:24,103 -DA:26,309 -DA:29,103 -DA:32,0 -LF:10 -LH:9 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/core/utils/extractDomainFromUrl.ts -FN:6,extractDomainFromUrl -FNF:1 -FNH:1 -FNDA:7,extractDomainFromUrl -DA:6,1 -DA:7,7 -DA:8,4 -DA:9,4 -LF:4 -LH:4 -BRDA:7,0,0,3 -BRDA:9,1,0,4 -BRDA:9,1,1,3 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/core/utils/xml2json.ts -FN:3,xml2json -FN:4,(anonymous_1) -FN:5,(anonymous_2) -FNF:3 -FNH:3 -FNDA:12,xml2json -FNDA:12,(anonymous_1) -FNDA:12,(anonymous_2) -DA:1,4 -DA:3,4 -DA:4,12 -DA:5,12 -DA:6,12 -DA:7,12 -LF:6 -LH:6 -BRDA:6,0,0,0 -BRDA:6,0,1,12 -BRF:2 -BRH:1 -end_of_record -TN: -SF:src/impl/changelog/CommitUpdater.ts -FN:6,(anonymous_0) -FN:18,(anonymous_1) -FN:30,(anonymous_2) -FNF:3 -FNH:3 -FNDA:4,(anonymous_0) -FNDA:4,(anonymous_1) -FNDA:76,(anonymous_2) -DA:5,1 -DA:7,4 -DA:8,4 -DA:9,4 -DA:10,4 -DA:20,10 -DA:25,10 -DA:29,6 -DA:30,76 -DA:33,2 -DA:38,2 -DA:39,2 -DA:40,2 -DA:45,4 -DA:48,0 -DA:50,0 -DA:53,4 -LF:17 -LH:15 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/impl/changelog/OrgsUpdater.ts -FN:8,(anonymous_0) -FN:21,(anonymous_1) -FN:24,(anonymous_2) -FN:58,(anonymous_3) -FN:62,(anonymous_4) -FN:119,(anonymous_5) -FNF:6 -FNH:6 -FNDA:4,(anonymous_0) -FNDA:4,(anonymous_1) -FNDA:1,(anonymous_2) -FNDA:3,(anonymous_3) -FNDA:2,(anonymous_4) -FNDA:6,(anonymous_5) -DA:2,1 -DA:4,1 -DA:9,4 -DA:10,4 -DA:11,4 -DA:12,4 -DA:14,4 -DA:17,2 -DA:24,2 -DA:27,1 -DA:28,1 -DA:29,1 -DA:31,1 -DA:40,0 -DA:49,2 -DA:58,3 -DA:61,2 -DA:62,2 -DA:67,0 -DA:68,0 -DA:71,1 -DA:75,1 -DA:76,1 -DA:79,1 -DA:81,0 -DA:85,1 -DA:86,1 -DA:89,2 -DA:98,0 -DA:104,0 -DA:120,6 -DA:121,6 -LF:32 -LH:26 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/impl/changelog/WorkItemUpdater.ts -FN:6,(anonymous_6) -FN:11,(anonymous_7) -FNF:2 -FNH:2 -FNDA:1,(anonymous_6) -FNDA:1,(anonymous_7) -DA:1,1 -DA:5,1 -DA:6,1 -DA:14,2 -DA:15,2 -DA:19,24 -DA:20,24 -DA:24,3 -DA:25,3 -DA:27,1 -DA:38,3 -LF:11 -LH:11 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/impl/dependency/ShrinkImpl.ts -FN:14,(anonymous_7) -FN:15,(anonymous_8) -FN:32,(anonymous_9) -FN:73,(anonymous_10) -FN:74,(anonymous_11) -FNF:5 -FNH:5 -FNDA:2,(anonymous_7) -FNDA:2,(anonymous_8) -FNDA:2,(anonymous_9) -FNDA:12,(anonymous_10) -FNDA:72,(anonymous_11) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:6,1 -DA:7,1 -DA:9,1 -DA:14,2 -DA:16,2 -DA:18,2 -DA:20,2 -DA:24,2 -DA:25,2 -DA:27,2 -DA:29,2 -DA:33,2 -DA:36,12 -DA:41,12 -DA:42,12 -DA:45,22 -DA:53,36 -DA:55,24 -DA:60,18 -DA:68,12 -DA:74,12 -DA:76,10 -LF:26 -LH:26 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/impl/parallelBuilder/BuildCollections.ts -FN:11,(anonymous_1) -FN:15,(anonymous_2) -FN:23,(anonymous_3) -FN:32,(anonymous_4) -FN:36,(anonymous_5) -FN:58,(anonymous_6) -FN:62,(anonymous_7) -FNF:7 -FNH:5 -FNDA:4,(anonymous_1) -FNDA:2,(anonymous_2) -FNDA:4,(anonymous_3) -FNDA:6,(anonymous_4) -FNDA:9,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -DA:1,1 -DA:2,1 -DA:7,1 -DA:12,4 -DA:16,2 -DA:24,4 -DA:26,4 -DA:29,7 -DA:30,6 -DA:32,6 -DA:36,9 -DA:37,2 -DA:39,1 -DA:44,5 -DA:47,1 -DA:59,0 -DA:63,0 -LF:17 -LH:15 -BRDA:29,0,0,6 -BRDA:29,0,1,1 -BRDA:30,1,0,6 -BRDA:36,2,0,2 -BRDA:36,2,1,1 -BRDA:63,3,0,0 -BRDA:63,3,1,0 -BRF:7 -BRH:5 -end_of_record -TN: -SF:src/impl/parallelBuilder/UndirectedGraph.ts -FN:4,(anonymous_0) -FN:8,(anonymous_1) -FN:12,(anonymous_2) -FN:17,(anonymous_3) -FN:30,(anonymous_4) -FN:35,dfsHandler -FN:40,(anonymous_6) -FNF:7 -FNH:7 -FNDA:12,(anonymous_0) -FNDA:17,(anonymous_1) -FNDA:22,(anonymous_2) -FNDA:17,(anonymous_3) -FNDA:4,(anonymous_4) -FNDA:19,dfsHandler -FNDA:42,(anonymous_6) -DA:1,2 -DA:5,12 -DA:9,17 -DA:13,22 -DA:14,1 -DA:18,17 -DA:19,16 -DA:20,14 -DA:22,13 -DA:23,13 -DA:31,4 -DA:32,4 -DA:33,4 -DA:35,4 -DA:36,19 -DA:37,19 -DA:38,18 -DA:39,18 -DA:40,18 -DA:42,15 -DA:47,3 -LF:21 -LH:21 -BRDA:13,0,0,21 -BRDA:13,0,1,1 -BRDA:18,1,0,1 -BRDA:19,2,0,2 -BRDA:20,3,0,1 -BRDA:22,4,0,13 -BRDA:23,5,0,13 -BRDA:36,6,0,0 -BRDA:37,7,0,1 -BRF:9 -BRH:8 -end_of_record -TN: -SF:src/impl/release/ReleaseDefinition.ts -FN:12,(anonymous_1) -FN:16,(anonymous_2) -FN:28,(anonymous_3) -FN:48,(anonymous_4) -FN:54,(anonymous_5) -FN:68,(anonymous_6) -FNF:6 -FNH:4 -FNDA:0,(anonymous_1) -FNDA:5,(anonymous_2) -FNDA:5,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:5,(anonymous_5) -FNDA:6,(anonymous_6) -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -DA:6,1 -DA:8,1 -DA:9,1 -DA:11,1 -DA:14,0 -DA:16,5 -DA:17,5 -DA:20,1 -DA:21,1 -DA:24,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:36,0 -DA:38,5 -DA:41,0 -DA:44,5 -DA:45,0 -DA:50,0 -DA:55,5 -DA:60,5 -DA:61,5 -DA:65,4 -DA:68,4 -DA:69,6 -DA:76,4 -LF:30 -LH:21 -BRDA:20,0,0,1 -BRDA:20,1,0,1 -BRDA:20,1,1,1 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/utils/Get18DigitSalesforceId.ts -FN:1,get18DigitSalesforceId -FNF:1 -FNH:0 -FNDA:0,get18DigitSalesforceId -DA:1,1 -DA:3,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:12,0 -DA:14,0 -DA:15,0 -DA:17,0 -LF:12 -LH:1 -BRDA:2,0,0,0 -BRDA:2,0,1,0 -BRDA:4,1,0,0 -BRDA:4,1,1,0 -BRDA:10,2,0,0 -BRDA:10,3,0,0 -BRDA:10,3,1,0 -BRF:7 -BRH:0 -end_of_record diff --git a/packages/sfpowerscripts-cli/jest.config.js b/packages/sfpowerscripts-cli/jest.config.js deleted file mode 100644 index a1009b2d2..000000000 --- a/packages/sfpowerscripts-cli/jest.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - preset: 'ts-jest/presets/js-with-babel', - testEnvironment: 'node', - restoreMocks: true, - clearMocks: true, - resetMocks: true, - transform: { - '^.+\\.[t]sx?$': [ - 'ts-jest', - { - tsconfig: 'tsconfig.json', - babelConfig: true, - }, - ] - }, - transformIgnorePatterns: ['/node_modules/(?!@salesforce/source-deploy-retrieve)(.*)'], -}; diff --git a/packages/sfpowerscripts-cli/messages/analyze.json b/packages/sfpowerscripts-cli/messages/analyze.json deleted file mode 100644 index f5e4a1e73..000000000 --- a/packages/sfpowerscripts-cli/messages/analyze.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription": "Runs static analysis on the code/config based on configurable rules", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task" -} diff --git a/packages/sfpowerscripts-cli/messages/analyze_with_PMD.json b/packages/sfpowerscripts-cli/messages/analyze_with_PMD.json deleted file mode 100644 index 898f7f5d3..000000000 --- a/packages/sfpowerscripts-cli/messages/analyze_with_PMD.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commandDescription": "This task is used to run a static analysis of the apex classes and triggers using PMD, Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task", - "sourceDirectoryFlagDescription": "The directory that is to be analzed using PMD, If omitted default project diretory as mentioned in sfdx-project.json will be used", - "rulesetFlagDescription": "Inbuilt is the default ruleset that comes with the task, If you choose custom, please provide the path to the ruleset", - "rulesetPathFlagDescription": "The path to the ruleset if you are utilizing your own ruleset", - "formatFlagDescription": "https://pmd.github.io/latest/pmd_userdocs_cli_reference.html#available-report-formats", - "outputPathFlagDescription": "The file to which the output for static analysis will be written", - "versionFlagDescription": "The version of PMD to be used for static analysis", - "thresholdFlagDescription": "Violations with a priority less than or equal to the threshold will cause the command to fail", - "isToBreakBuildFlagDescription": "Enable this option if the build should be reported as failure if 1 or more critical defects are reported during the analysis", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/artifacts_query.json b/packages/sfpowerscripts-cli/messages/artifacts_query.json deleted file mode 100644 index 6f013b01c..000000000 --- a/packages/sfpowerscripts-cli/messages/artifacts_query.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription": "Fetch details about artifacts installed in a target org", - "branchNameFlagDescription": "Repository branch in which the changelog files are located" -} diff --git a/packages/sfpowerscripts-cli/messages/build.json b/packages/sfpowerscripts-cli/messages/build.json deleted file mode 100644 index fddd4ee44..000000000 --- a/packages/sfpowerscripts-cli/messages/build.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "commandDescription": "Build all packages (unlocked/source/data) in a repo in parallel, respecting the dependency of each packages and generate artifacts to a provided directory", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", - "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "buildNumberFlagDescription": "The build number to be used for source packages, Unlocked Packages will be assigned the buildnumber from Saleforce directly if using .NEXT", - "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the generated artifact is to be written", - "isValidationToBeSkippedFlagDescription": "Skips validation of dependencies, package ancestors, and metadata during package version creation. Skipping validation reduces the time it takes to create a new package version, but package versions created without validation can’t be promoted.", - "waitTimeFlagDescription": "Wait time for command to finish in minutes", - "executorCountFlagDescription": "Number of parallel package task schedulors", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "releaseConfigFileFlagDescription":"Path to the release config file which determines what packages should be built" -} diff --git a/packages/sfpowerscripts-cli/messages/core-messages.md b/packages/sfpowerscripts-cli/messages/core-messages.md deleted file mode 100644 index 7c7aa6971..000000000 --- a/packages/sfpowerscripts-cli/messages/core-messages.md +++ /dev/null @@ -1,118 +0,0 @@ -# error.prefix - -Error%s: - -# warning.security - -This command will expose sensitive information that allows for subsequent activity using your current authenticated session. Sharing this information is equivalent to logging someone in under the current credential, resulting in unintended access and escalation of privilege. For additional information, please review the authorization section of the - -# errors.RequiresProject - -This command is required to run from within a Salesforce project directory. - -# errors.InvalidIdLength - -The id must be %s characters. - -# errors.InvalidIdLength.or - -or - -# errors.InvalidId - -The id is invalid. - -# errors.InvalidPrefix - -The id must begin with %s. - -# errors.NoDefaultEnv - -No default environment found. Use -o or --target-org to specify an environment. - -# errors.NoDefaultDevHub - -No default dev hub found. Use -v or --target-dev-hub to specify an environment. - -# errors.NotADevHub - -The specified org %s is not a Dev Hub. - -# flags.targetOrg.summary - -Username or alias of the target org. - -# flags.targetDevHubOrg.summary - -Username or alias of the Dev Hub org. - -# flags.logsgroupsymbol.summary - -Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol. - -# flags.apiVersion.description - -Override the api version used for api requests made by this command - -# flags.apiVersion.overrideWarning - -org-api-version configuration overridden at %s - -# flags.apiVersion.warning.deprecated - -API versions up to %s are deprecated. See %s for more information. - -# errors.InvalidApiVersion - -%s is not a valid API version. It should end in '.0' like '54.0'. - -# errors.RetiredApiVersion - -The API version must be greater than %s. - -# errors.InvalidDuration - -The value must be an integer. - -# errors.DurationBounds - -The value must be between %s and %s (inclusive). - -# errors.DurationBoundsMin - -The value must be at least %s. - -# errors.DurationBoundsMax - -The value must be no more than %s. - -# warning.prefix - -Warning: - -# warning.loglevel - -The loglevel flag is no longer in use on this command. You may use it without error, but it will be ignored. -Set the log level using the `SFDX_LOG_LEVEL` environment variable. - -# actions.tryThis - -Try this: - -# warning.CommandInBeta - -This command is currently in beta. Any aspect of this command can change without advanced notice. Don't use beta commands in your scripts. - -# error.InvalidArgumentFormat - -Error in the following argument -%s -Set varargs with this format: key=value or key="value with spaces" - -# error.DuplicateArgument - -Found duplicate argument %s. - -# warning.arrayInputFormat - -The input format for array arguments has changed. Use this format: --array-flag value1 --array-flag value2 --array-flag value3 \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/messages/create-package.json b/packages/sfpowerscripts-cli/messages/create-package.json deleted file mode 100644 index 6f42df950..000000000 --- a/packages/sfpowerscripts-cli/messages/create-package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commandDescription": "Creates a versioned artifact from a source directory containing SFDMU-based data (in csv format and export json). The artifact can be consumed by release pipelines, to deploy the data to orgs", - "packageFlagDescription": "The name of the package", - "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "diffCheckFlagDescription": "Only build when the package has changed", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "refNameFlagDescription": "Reference name to be prefixed to output variables", - "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org" -} diff --git a/packages/sfpowerscripts-cli/messages/create_data_package.json b/packages/sfpowerscripts-cli/messages/create_data_package.json deleted file mode 100644 index 6351a9c1c..000000000 --- a/packages/sfpowerscripts-cli/messages/create_data_package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "commandDescription": "Creates a versioned artifact from a source directory containing SFDMU-based data (in csv format and export json). The artifact can be consumed by release pipelines, to deploy the data to orgs", - "packageFlagDescription": "The name of the package", - "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "diffCheckFlagDescription": "Only build when the package has changed", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/create_delta_package.json b/packages/sfpowerscripts-cli/messages/create_delta_package.json deleted file mode 100644 index e7833495f..000000000 --- a/packages/sfpowerscripts-cli/messages/create_delta_package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commandDescription": "This task is used to create a delta package between two commits and bundle the created delta as as a deployable artifact. Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task", - "packageNameFlagDescription": "The name of the package", - "revisionFromFlagDescription": "Provide the full SHA Commit ID, from where the diff should start generating", - "revisionToFlagDescription": "If not set, the head commit ID of the current branch is used", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "versionNameFlagDescription": "Provide a meaningful name such as the default value, so this artifact can be identified in the release", - "generateDestructiveManifestFlagDescription": "Check this option to generate a destructive manifest to be deployed", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/create_source_package.json b/packages/sfpowerscripts-cli/messages/create_source_package.json deleted file mode 100644 index 7d7458fe4..000000000 --- a/packages/sfpowerscripts-cli/messages/create_source_package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commandDescription": "This task simulates a packaging experience similar to unlocked packaging - creating an artifact that consists of the metadata (e.g. commit Id), source code & an optional destructive manifest. The artifact can then be consumed by release pipelines, to deploy the package", - "packageFlagDescription": "The name of the package", - "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "destructiveManiFestFilePathFlagDescription": "Path to a destructiveChanges.xml, mentioning any metadata that need to be deleted before the contents in the source package need to be installed in the org", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "diffCheckFlagDescription": "Only build when the package has changed", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/create_unlocked_package.json b/packages/sfpowerscripts-cli/messages/create_unlocked_package.json deleted file mode 100644 index b8d0db5e3..000000000 --- a/packages/sfpowerscripts-cli/messages/create_unlocked_package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "commandDescription": "Creates a new package version, and generates an artifact that consists of the metadata (e.g. version Id). The artifact can then be consumed by release pipelines, to install the unlocked package. Utilize this task in a package build for DX Unlocked Package", - "packageFlagDescription": "ID (starts with 0Ho) or alias of the package to create a version of", - "buildArtifactEnabledFlagDescription": "Create a build artifact, so that this pipeline can be consumed by a release pipeline", - "installationKeyFlagDescription": "Installation key for this package", - "installationKeyBypassFlagDescription": "Bypass the requirement for having an installation key for this version of the package", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", - "diffCheckFlagDescription": "Only build when the package has changed", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "versionNumberFlagDescription": "The format is major.minor.patch.buildnumber . This will override the build number mentioned in the sfdx-project.json, Try considering the use of Increment Version Number task before this task", - "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "enableCoverageFlagDescription": "Please note this command takes a longer time to compute, activating this on every packaging build might not necessary", - "isValidationToBeSkippedFlagDescription": "Skips validation of dependencies, package ancestors, and metadata during package version creation. Skipping validation reduces the time it takes to create a new package version, but package versions created without validation can’t be promoted.", - "tagFlagDescription": "the package version's tag", - "waitTimeFlagDescription": "wait time for command to finish in minutes", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/dependency_expand.json b/packages/sfpowerscripts-cli/messages/dependency_expand.json deleted file mode 100644 index 2ae6e3f80..000000000 --- a/packages/sfpowerscripts-cli/messages/dependency_expand.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription":"Expand the dependency list in sfdx-project.json file for each package, fix the gap of dependencies from its dependent packages", - "overWriteProjectConfigFlagDescription":"Flag to overwrite existing sfdx-project.json file" -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/messages/dependency_install.json b/packages/sfpowerscripts-cli/messages/dependency_install.json deleted file mode 100644 index 65437b7f3..000000000 --- a/packages/sfpowerscripts-cli/messages/dependency_install.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription":"Install all the external dependencies of a given project", - "installationkeysFlagDescription":"Installation key for key-protected packages (format is packagename:key --> core:key nCino:key vlocity:key to allow some packages without installation key)" -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/messages/dependency_shrink.json b/packages/sfpowerscripts-cli/messages/dependency_shrink.json deleted file mode 100644 index 9c7175036..000000000 --- a/packages/sfpowerscripts-cli/messages/dependency_shrink.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription":"Shrink the dependency list in sfdx-project.json file for each package, remove duplicate dependencies that already exist in its dependent packages", - "overWriteProjectConfigFlagDescription":"Flag to overwrite existing sfdx-project.json file" -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/messages/deploy.json b/packages/sfpowerscripts-cli/messages/deploy.json deleted file mode 100644 index 12e357891..000000000 --- a/packages/sfpowerscripts-cli/messages/deploy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "commandDescription": "Deploy packages from the provided aritfact directory, to a given org, using the order and configurable flags provided in sfdx-project.json", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "artifactDirectoryFlagDescription": "The directory containing artifacts to be deployed", - "waitTimeFlagDescription": "Wait time for command to finish in minutes", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "tagFlagDescription": "Tag the deploy with a label, useful for identification in metrics", - "validateModeFlagDescription": "Enable for validation deployments", - "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org", - "baselineorgFlagDescription": "The org against which the package skip should be baselined", - "allowUnpromotedPackagesFlagDescription": "Allow un-promoted packages to be installed in production", - "retryOnFailureFlagDescription": "Retry on a failed deployment of a package", - "configFileFlagDescription":"Path to the config file which determines how the packages are deployed based on the filters in release config", - "enableSourceTrackingFlagDescription": "Enable source tracking on the packages being deployed to an org" -} diff --git a/packages/sfpowerscripts-cli/messages/fetch.json b/packages/sfpowerscripts-cli/messages/fetch.json deleted file mode 100644 index c86cb016b..000000000 --- a/packages/sfpowerscripts-cli/messages/fetch.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "commandDescription": "Fetch artifacts from an artifact registry that is either NPM compatible or supports universal artifacts", - "releaseDefinitionFlagDescription": "Path to YAML file containing map of packages and package versions to download", - "artifactDirectoryFlagDescription": "Directory to save downloaded artifacts", - "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", - "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", - "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", - "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." -} diff --git a/packages/sfpowerscripts-cli/messages/generate_changelog.json b/packages/sfpowerscripts-cli/messages/generate_changelog.json deleted file mode 100644 index 8844686d9..000000000 --- a/packages/sfpowerscripts-cli/messages/generate_changelog.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "commandDescription": "Generates release changelog, providing a summary of artifact versions, work items and commits introduced in a release. Creates a release definition based on artifacts contained in the artifact directory, and compares it to previous release definition in changelog stored on a source repository", - "limitFlagDescription": "limit the number of releases to display in changelog markdown", - "artifactDirectoryFlagDescription": "Directory containing sfp artifacts", - "releaseNameFlagDescription": "Name of the release for which to generate changelog", - "workItemFilterFlagDescription": "Regular expression used to search for work items (user stories) introduced in release", - "workItemUrlFlagDescription": "Generic URL for work items. Each work item ID will be appended to the URL, providing quick access to work items", - "repoUrlFlagDescription": "Repository in which the changelog files are located. Assumes user is already authenticated.", - "branchNameFlagDescription": "Repository branch in which the changelog files are located", - "noPushFlagDescription":"Do not push the changelog to a repository to the provided branch", - "showAllArtifactsFlagDescription": "Show all artifacts in changelog markdown, including those that have not changed in the release", - "forcePushFlagDescription": "Force push changes to the repository branch", - "directoryFlagDescription": "Relative path to directory to which the release defintion file should be generated, if the directory doesnt exist, it will be created" -} diff --git a/packages/sfpowerscripts-cli/messages/impact_package.json b/packages/sfpowerscripts-cli/messages/impact_package.json deleted file mode 100644 index 991ac7d66..000000000 --- a/packages/sfpowerscripts-cli/messages/impact_package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription": "Figures out impacted packages of a project, due to a change from the last known tags", - "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used" -} diff --git a/packages/sfpowerscripts-cli/messages/impact_release_config.json b/packages/sfpowerscripts-cli/messages/impact_release_config.json deleted file mode 100644 index d96edc890..000000000 --- a/packages/sfpowerscripts-cli/messages/impact_release_config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "commandDescription": "Figures out impacted release configurations of a project, due to a change,from the last known tags", - "releaseConfigFileFlagDescription":"Path to the directory containing release defns", - "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used from", - "filterByFlagDescription": "Filter by a specific release config name", - "explictDependencyCheckFlagDescription": "Activate to consider dependencyOn attribut while handling impact" -} diff --git a/packages/sfpowerscripts-cli/messages/increment_build_number.json b/packages/sfpowerscripts-cli/messages/increment_build_number.json deleted file mode 100644 index 59cf4d79a..000000000 --- a/packages/sfpowerscripts-cli/messages/increment_build_number.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "commandDescription": "Increment the selected version counter by one and optionally commit changes to sfdx-project.json. This command does not push changes to the source repository", - "segmentFlagDescription": "Select the segment of the version", - "appendBuildNumberFlagDescription": "Set the build segment of the version number to the build number rather than incremenenting", - "packageFlagDescription": "The name of the package of which the version need to be incremented,If not specified the default package is utilized", - "projectDirectoryFlagDescription": "The directory should contain a sfdx-project.json for this command to succeed", - "commitChangesFlagDescription": "Mark this if you want to commit the modified sfdx-project json, Please note this will not push to the repo only commits in the local checked out repo, You would need to have a push to the repo at the end of the packaging task if everything is successfull", - "refNameFlagDescription": "Reference name to be prefixed to output variables", - "runNumberFlagDescription": "The build number of the CI pipeline, usually available through an environment variable" -} diff --git a/packages/sfpowerscripts-cli/messages/install_data_package.json b/packages/sfpowerscripts-cli/messages/install_data_package.json deleted file mode 100644 index 5b883e245..000000000 --- a/packages/sfpowerscripts-cli/messages/install_data_package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "commandDescription": "(DEPRECATED) Installs a SFDMU-based data package consisting of csvfiles and export.json to a target org", - "packageFlagDescription": "Name of the package to be installed", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "artifactDirectoryFlagDescription": "The directory where the artifact is located", - "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", - "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org" -} diff --git a/packages/sfpowerscripts-cli/messages/install_package.json b/packages/sfpowerscripts-cli/messages/install_package.json deleted file mode 100644 index 2dfc9c318..000000000 --- a/packages/sfpowerscripts-cli/messages/install_package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "commandDescription": "Installs a sfp artifact to an org", - "packageFlagDescription": "Name of the package to be installed", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "apexCompileOnlyPackageFlagDescription": "(unlocked) package installation triggers a compilation of apex, flag to trigger compilation of package only", - "artifactDirectoryFlagDescription": "The directory where the artifact is located", - "securityTypeFlagDescription": "(unlocked) Select the security access for the package installation", - "optimizedeployment": "(source) Optimize deployment by triggering test classes that are in the package, rather than using the whole tests in the org", - "skiptesting": "(source) Skips running test when deploying to a sandbox", - "upgradeTypeFlagDescription": "(unlocked)the upgrade type for the package installation", - "waitTimeFlagDescription": "wait time for command to finish in minutes", - "publishWaitTimeFlagDescription": "(unlocked) number of minutes to wait for subscriber package version ID to become available in the target org", - "skipIfAlreadyInstalled": "Skip the installation if the package is already installed in the org" -} diff --git a/packages/sfpowerscripts-cli/messages/install_package_command.json b/packages/sfpowerscripts-cli/messages/install_package_command.json deleted file mode 100644 index b0b22e4de..000000000 --- a/packages/sfpowerscripts-cli/messages/install_package_command.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "packageFlagDescription": "Name of the package to be installed", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "artifactDirectoryFlagDescription": "The directory where the artifact is located", - "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages" -} diff --git a/packages/sfpowerscripts-cli/messages/install_source_package.json b/packages/sfpowerscripts-cli/messages/install_source_package.json deleted file mode 100644 index 0d5be458a..000000000 --- a/packages/sfpowerscripts-cli/messages/install_source_package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "commandDescription": "(DEPRECATED) Installs a sfp source package to the target org", - "packageFlagDescription": "Name of the package to be installed", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "artifactDirectoryFlagDescription": "The directory where the artifact is located", - "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", - "waitTimeFlagDescription": "wait time for command to finish in minutes", - "optimizedeployment": "Optimize deployment by triggering test classes that are in the package, rather than using the whole tests in the org", - "skiptesting": "Skips running test when deploying to a sandbox", - "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org", - "refNameFlagDescription": "Reference name to be prefixed to output variables" -} diff --git a/packages/sfpowerscripts-cli/messages/install_unlocked_package.json b/packages/sfpowerscripts-cli/messages/install_unlocked_package.json deleted file mode 100644 index ac93c9e9d..000000000 --- a/packages/sfpowerscripts-cli/messages/install_unlocked_package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "commandDescription": "(DEPRECATED) Installs an unlocked package using sfp metadata", - "packageFlagDescription": "Name of the package to be installed", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "packageInstalledFromFlagDescription": "automatically retrieve the version ID of the package to be installed, from the build artifact", - "packageVersionIdFlagDescription": "manually input package version Id of the package to be installed", - "installationKeyFlagDescription": "installation key for key-protected package", - "apexCompileOnlyPackageFlagDescription": "Each package installation triggers a compilation of apex, flag to trigger compilation of package only", - "artifactDirectoryFlagDescription": "The directory where the artifact is located", - "securityTypeFlagDescription": "Select the security access for the package installation", - "skipOnMissingArtifactFlagDescription": "Skip package installation if the build artifact is missing. Enable this if artifacts are only being created for modified packages", - "upgradeTypeFlagDescription": "the upgrade type for the package installation", - "waitTimeFlagDescription": "wait time for command to finish in minutes", - "publishWaitTimeFlagDescription": "number of minutes to wait for subscriber package version ID to become available in the target org", - "skipIfAlreadyInstalled": "Skip the package installation if the package is already installed in the org" -} diff --git a/packages/sfpowerscripts-cli/messages/metrics_report.json b/packages/sfpowerscripts-cli/messages/metrics_report.json deleted file mode 100644 index 9a2718a83..000000000 --- a/packages/sfpowerscripts-cli/messages/metrics_report.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "commandDescription": "Report a custom metric to any sfp supported metric provider" -} diff --git a/packages/sfpowerscripts-cli/messages/org_profile_diff.json b/packages/sfpowerscripts-cli/messages/org_profile_diff.json deleted file mode 100644 index 2eb640af1..000000000 --- a/packages/sfpowerscripts-cli/messages/org_profile_diff.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "commandDescription": "Compare profiles from project against target org or between two orgs (source and target)", - "profileListFlagDescription": "List of profiles to compare, comma separated profile names. If not provided and no sourceusername is provided, all profiles from the source folder will be processed.", - "sourceUsernameDescription": "Source org. If no profile is provided in the profilelist parameter, all the profile from this org will be fetched", - "outputFolderDescription": "Output folder. Provide the output folder if comparing profiles from source org." -} diff --git a/packages/sfpowerscripts-cli/messages/patch.json b/packages/sfpowerscripts-cli/messages/patch.json deleted file mode 100644 index ff60ea2e1..000000000 --- a/packages/sfpowerscripts-cli/messages/patch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "commandDescription": "[Alpha] Patch a branch in the repository as per the release definition and create a new branch", - "releaseDefinitionFlagDescription": "Path to release definiton yaml", - "sourcebranchNameFlagDescription": "Name of the source branch to be used on which the alignment need to be applied", - "targetbranchNameFlagDescription": "Name of the target branch to be created after the alignment", - "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", - "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", - "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", - "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." -} diff --git a/packages/sfpowerscripts-cli/messages/pool_delete.json b/packages/sfpowerscripts-cli/messages/pool_delete.json deleted file mode 100644 index a1ddb8c53..000000000 --- a/packages/sfpowerscripts-cli/messages/pool_delete.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "commandDescription": "Deletes the pooled scratch orgs from the Scratch Org Pool", - "tagDescription": "tag used to identify the scratch org pool", - "mypoolDescription": "Filter only Scratch orgs created by current user in the pool", - "allscratchorgsDescription": "Deletes all used and unused Scratch orgs from pool by the tag", - "inprogressonlyDescription": "Deletes all In Progress Scratch orgs from pool by the tag", - "recoverOrphanedScratchOrgsDescription": "Recovers scratch orgs that were created by salesforce but were not tagged to sfp due to timeouts etc." -} diff --git a/packages/sfpowerscripts-cli/messages/prepare.json b/packages/sfpowerscripts-cli/messages/prepare.json deleted file mode 100644 index 1d72f9957..000000000 --- a/packages/sfpowerscripts-cli/messages/prepare.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "commandDescription": "Prepare a pool of scratchorgs with all the packages upfront, so that any incoming change can be validated in an optimized manner", - "poolConfigFlagDescription": "The path to the configuration file for creating a pool of scratch orgs", - "keysDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", - "apiversion": "API version to be used", - "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to a npm registry when using npm based artifacts. If left blank, defaults to home directory", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." -} diff --git a/packages/sfpowerscripts-cli/messages/profile_merge.json b/packages/sfpowerscripts-cli/messages/profile_merge.json deleted file mode 100644 index f477a2467..000000000 --- a/packages/sfpowerscripts-cli/messages/profile_merge.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "commandDescription": "This command is used in the lower environments such as ScratchOrgs , Development / System Testing Sandboxes, inorder to apply the changes made in the environment to retrieved profile, so that it can be deployed to the higher environments", - "folderFlagDescription": "comma separated list of folders to scan for profiles. If ommited, the folders in the packageDirectories configuration will be used.", - "profileListFlagDescription": "comma separated list of profiles. If ommited, all the profiles found in the folder(s) will be merged", - "metadataFlagDescription": "comma separated list of metadata for which the permissions will be retrieved.", - "deleteFlagDescription": "set this flag to delete profile files that does not exist in the org." -} diff --git a/packages/sfpowerscripts-cli/messages/profile_reconcile.json b/packages/sfpowerscripts-cli/messages/profile_reconcile.json deleted file mode 100644 index 8248bc9d6..000000000 --- a/packages/sfpowerscripts-cli/messages/profile_reconcile.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "commandDescription": "This command is used in the lower environments such as ScratchOrgs , Development / System Testing Sandboxes, where a retrieved profile from production has to be cleaned up only for the metadata that is contained in the environment or base it only as per the metadata that is contained in the packaging directory.", - "folderFlagDescription": "path to the folder which contains the profiles to be reconciled,if project contain multiple package directories, please provide a comma seperated list, if omitted, all the package directories will be checked for profiles", - "nameFlagDescription": "list of profiles to be reconciled. If ommited, all the profiles components will be reconciled.", - "destFolderFlagDescription": " the destination folder for reconciled profiles, if omitted existing profiles will be reconciled and will be rewritten in the current location", - "sourceonlyFlagDescription": "set this flag to reconcile profiles only against component available in the project only. Configure ignored perissions in sfdx-project.json file in the array plugins->sfpowerkit->ignoredPermissions.", - "targetorgFlagDescription": " org against which profiles will be reconciled. this parameter can be ommited if sourceonly flag is set." -} diff --git a/packages/sfpowerscripts-cli/messages/profile_retrieve.json b/packages/sfpowerscripts-cli/messages/profile_retrieve.json deleted file mode 100644 index e1e31933a..000000000 --- a/packages/sfpowerscripts-cli/messages/profile_retrieve.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "commandDescription": "Retrieve profiles from the salesforce org with all its associated permissions. Common use case for this command is to migrate profile changes from a integration environment to other higher environments [overcomes SFDX CLI Profile retrieve issue where it doesnt fetch the full profile unless the entire metadata is present in source], or retrieving profiles from production to lower environments for testing.", - "folderFlagDescription": "retrieve only updated versions of profiles found in this directory, If ignored, all profiles will be retrieved.", - "profileListFlagDescription": "comma separated list of profiles to be retrieved. Use it for selectively retrieving an existing profile or retrieving a new profile", - "deleteFlagDescription": "set this flag to delete profile files that does not exist in the org, when retrieving in bulk", - "retriveDelayWarning":"Retrieving profiles may take a significant time depending on the number of profiles \nand managed package components installed in your org,Please be patient" -} diff --git a/packages/sfpowerscripts-cli/messages/promote.json b/packages/sfpowerscripts-cli/messages/promote.json deleted file mode 100644 index f231de543..000000000 --- a/packages/sfpowerscripts-cli/messages/promote.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "commandDescription": "Promotes validated unlocked packages with code coverage greater than 75%", - "artifactDirectoryFlagDescription": "The directory where artifacts are located", - "outputDirectoryFlagDescription": "Output directory where promoted artifacts are written", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol." -} diff --git a/packages/sfpowerscripts-cli/messages/publish.json b/packages/sfpowerscripts-cli/messages/publish.json deleted file mode 100644 index 3ef3c9acc..000000000 --- a/packages/sfpowerscripts-cli/messages/publish.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "commandDescription": "Publish packages to an artifact registry, using a user-provided script that is responsible for authenticating & uploading to the registry.", - "artifactDirectoryFlagDescription": "The directory containing artifacts to be published", - "publishPromotedOnlyFlagDescription": "Only publish unlocked packages that have been promoted", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated", - "scriptPathFlagDescription": "Path to script that authenticates and uploaded artifacts to the registry", - "tagFlagDescription": "Tag the publish with a label, useful for identification in metrics", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "gitPushTagFlagDescription": "Pushes the git tags created by this command to the repo, ensure you have access to the repo", - "npmFlagDescription": "Upload artifacts to a pre-authenticated private npm registry", - "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", - "npmTagFlagDescription": "Add an optional distribution tag to NPM packages. If not provided, the 'latest' tag is set to the published version.", - "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "gitTagAgeFlagDescription": "Specifies the number of days,for a tag to be retained,any tags older the provided number will be deleted", - "gitTagLimitFlagDescription": "Specifies the minimum number of tags to be retained for a package" -} diff --git a/packages/sfpowerscripts-cli/messages/quickbuild.json b/packages/sfpowerscripts-cli/messages/quickbuild.json deleted file mode 100644 index 700b8dcbc..000000000 --- a/packages/sfpowerscripts-cli/messages/quickbuild.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "commandDescription": "Build packages (unlocked/source/data) in a repo in parallel, without validating depenencies or coverage in the case of unlocked packages", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg if using the Authenticate Devhub task", - "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", - "gitTagFlagDescription": "Tag the current commit ID with an annotated tag containing the package name and version - does not push tag", - "repoUrlFlagDescription": "Custom source repository URL to use in artifact metadata, overrides origin URL defined in git config", - "buildNumberFlagDescription": "The build number to be used for source packages, Unlocked Packages will be assigned the buildnumber from Saleforce directly if using .NEXT", - "configFilePathFlagDescription": "Path in the current project directory containing config file for the packaging org", - "projectDirectoryFlagDescription": "The project directory should contain a sfdx-project.json for this command to succeed", - "artifactDirectoryFlagDescription": "The directory where the artifact is to be written", - "waitTimeFlagDescription": "Wait time for command to finish in minutes", - "executorCountFlagDescription": "Number of parallel package task schedulors", - "branchFlagDescription": "The git branch that this build is triggered on, Useful for metrics and general identification purposes", - "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "releaseConfigFileFlagDescription":"Path to the release config file which determines what packages should be built" -} diff --git a/packages/sfpowerscripts-cli/messages/release.json b/packages/sfpowerscripts-cli/messages/release.json deleted file mode 100644 index dfe21fdc9..000000000 --- a/packages/sfpowerscripts-cli/messages/release.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "commandDescription": "Release a collection of artifacts as defined in the release definition file", - "releaseDefinitionFlagDescription": "Path to release definiton yaml, Multiple paths can be seperated by commas", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "scriptPathFlagDescription": "(Optional: no-NPM) Path to script that authenticates and downloads artifacts from the registry", - "npmFlagDescription": "Download artifacts from a pre-authenticated private npm registry", - "scopeFlagDescription": "(required for NPM) User or Organisation scope of the NPM package", - "npmrcPathFlagDescription": "Path to .npmrc file used for authentication to registry. If left blank, defaults to home directory", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "tagFlagDescription": "Tag the release with a label, useful for identification in metrics", - "dryRunFlagDescription": "Perform dry-run of release. No artifacts are deployed to the target org.", - "waitTimeFlagDescription": "Wait time for package installation", - "keysFlagDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", - "generateChangelogFlagDescription": "Create a release changelog", - "allowUnpromotedPackagesFlagDescription": "Allow un-promoted packages to be installed in production", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg", - "directoryFlagDescription": "Relative path to directory to which the changelog should be generated, if the directory doesnt exist, it will be created", - "branchNameFlagDescription": "Repository branch in which the changelog files are located" -} diff --git a/packages/sfpowerscripts-cli/messages/releasedefinition_generate.json b/packages/sfpowerscripts-cli/messages/releasedefinition_generate.json deleted file mode 100644 index c8f314871..000000000 --- a/packages/sfpowerscripts-cli/messages/releasedefinition_generate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "commandDescription": "Generates release definition based on the artifacts installed from a commit reference", - "configFileFlagDescription":"Path to the config file which determines how the release definition should be generated", - "releaseNameFlagDescription": "Set a release name on the release definition file created", - "commitFlagDescription": "Utilize the tags on the source branch to generate release definiton", - "directoryFlagDescription": "Relative path to directory to which the release definition file should be generated, if the directory doesnt exist, it will be created", - "branchNameFlagDescription": "Repository branch in which the release definition files are to be written", - "noPushFlagDescription":"Do not push the changelog to a repository to the provided branch", - "forcePushFlagDescription": "Force push changes to the repository branch" -} diff --git a/packages/sfpowerscripts-cli/messages/scratchorg_poolFetch.json b/packages/sfpowerscripts-cli/messages/scratchorg_poolFetch.json deleted file mode 100644 index c147fc7db..000000000 --- a/packages/sfpowerscripts-cli/messages/scratchorg_poolFetch.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "commandDescription": "Gets an active/unused scratch org from the scratch org pool", - "tagDescription": "(required) tag used to identify the scratch org pool", - "mypoolDescription": "Filter the tag for any additions created by the executor of the command", - "sendToUserDescription": "Send the credentials of the fetched scratchorg to another DevHub user, Useful for situations when pool is only limited to certain users", - "aliasDescription": "Fetch and set an alias for the org", - "setdefaultusernameDescription": "set the authenticated org as the default username that all commands run against", - "noSourceTrackingDescription": "Do not set source tracking while fetching the scratch org" -} diff --git a/packages/sfpowerscripts-cli/messages/scratchorg_pool_metrics_publish.json b/packages/sfpowerscripts-cli/messages/scratchorg_pool_metrics_publish.json deleted file mode 100644 index 7d1e92a5a..000000000 --- a/packages/sfpowerscripts-cli/messages/scratchorg_pool_metrics_publish.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "commandDescription": "Publish metrics about scratch org pools to your observability platform, via StatsD or direct APIs for supported platforms" -} diff --git a/packages/sfpowerscripts-cli/messages/scratchorg_pool_org_delete.json b/packages/sfpowerscripts-cli/messages/scratchorg_pool_org_delete.json deleted file mode 100644 index 76473d692..000000000 --- a/packages/sfpowerscripts-cli/messages/scratchorg_pool_org_delete.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "commandDescription": "Deletes a particular scratch org in the pool, This command is to be used in a pipeline with correct permissions to delete any active scratch org record or to be used by an adminsitrator", - "userNameFlagDescription": "Username of the scratchOrg to be deleted, not aliases" -} diff --git a/packages/sfpowerscripts-cli/messages/scratchorg_poollist.json b/packages/sfpowerscripts-cli/messages/scratchorg_poollist.json deleted file mode 100644 index f6ef11702..000000000 --- a/packages/sfpowerscripts-cli/messages/scratchorg_poollist.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "commandDescription": "Retrieves a list of active scratch org and details from any pool. If this command is run with -m|--mypool, the command will retrieve the passwords for the pool created by the user who is executing the command.", - "tagDescription": "tag used to identify the scratch org pool", - "mypoolDescription": "Filter the tag for any additions created by the executor of the command", - "allscratchorgsDescription": "Gets all used and unused Scratch orgs from pool" -} diff --git a/packages/sfpowerscripts-cli/messages/trigger_apex_test.json b/packages/sfpowerscripts-cli/messages/trigger_apex_test.json deleted file mode 100644 index 515045ad7..000000000 --- a/packages/sfpowerscripts-cli/messages/trigger_apex_test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "commandDescription": "Triggers Apex unit test in an org. Supports test level RunAllTestsInPackage, which optionally allows validation of individual class code coverage", - "targetOrgFlagDescription": "username or alias for the target org; overrides default target org", - "testLevelFlagDescription": "The test level of the test that need to be executed when the code is to be deployed", - "packageFlagDescription": "Name of the package to run tests. Required when test level is RunAllTestsInPackage", - "synchronousFlagDescription": "Select an option if the tests are to be run synchronously", - "specifiedTestsFlagDescription": "comma-separated list of Apex test class names or IDs and, if applicable, test methods to run", - "apexTestSuiteFlagDescription": "comma-separated list of Apex test suite names to run", - "validateIndividualClassCoverageFlagDescription": "Validate that individual classes have a coverage greater than the minimum required percentage coverage, only available when test level is RunAllTestsInPackage", - "validatePackageCoverageFlagDescription": "Validate that the package coverage is greater than the minimum required percentage coverage, only available when test level is RunAllTestsInPackage", - "coveragePercentFlagDescription": "Minimum required percentage coverage, when validating code coverage", - "waitTimeFlagDescription": "wait time for command to finish in minutes" -} diff --git a/packages/sfpowerscripts-cli/messages/validate.json b/packages/sfpowerscripts-cli/messages/validate.json deleted file mode 100644 index d39050221..000000000 --- a/packages/sfpowerscripts-cli/messages/validate.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "commandDescription": "Validate the incoming change against an earlier prepared scratchorg", - "devhubUsernameFlagDescription": "Authentication username for Dev Hub", - "poolsFlagDescription": "Fetch scratch-org validation environment from one of listed pools, sequentially", - "configFileFlagDescription":"(Required if the release modes are ff-relese-config or thorough-release-config), Path to the config file which determines how the release defintion should be generated", - "jwtKeyFileFlagDescription": "Path to a file containing the private key", - "clientIdFlagDescription": "OAuth client ID, also known as the consumer key", - "shapeFileFlagDescription": "Path to .zip file of scratch org shape / metadata to deploy", - "coveragePercentFlagDescription": "Minimum required percentage coverage for validating code coverage of packages with Apex classes", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "deleteScratchOrgFlagDescription": "Delete scratch-org validation environment, after the command has finished running", - "keysFlagDescription": "Keys to be used while installing any managed package dependencies. Required format is a string of key-value pairs separated by spaces e.g. packageA:pw123 packageB:pw123 packageC:pw123", - "visualizeChangesAgainstFlagDescription": "Branch to conduct change analysis against. Enables visualization of changes and the components affected", - "baseBranchFlagDescription": "The pull request base branch", - "enableImpactAnalysisFlagDescription": "Visualize components impacted by changes in pull request", - "enableDependencyValidation": "Validate dependencies between packages for changed components", - "tagFlagDescription": "Tag the build with a label, useful to identify in metrics", - "disableDiffCheckFlagDescription": "Disables diff check while validating, this will validate all the packages in the repository", - "disableArtifactUpdateFlagDescription": "Do not update information about deployed artifacts to the org", - "fastfeedbackFlagDescription": "Enable validation in fast feedback mode, In fast feedback mode, validation will only do selective deployment of and selective tests", - "orgInfoFlagDescription": "Display info about the org that is used for validation", - "installDepsFlagDescription":"Install dependencies during fast feedback", - "disableSourcePackageOverride": "Disables overriding unlocked package installation as source package installation during validate", - "disableParallelTestingFlagDescription": "Disable test execution in parallel, this will execute apex tests in serial" - -} diff --git a/packages/sfpowerscripts-cli/messages/validateAgainstOrg.json b/packages/sfpowerscripts-cli/messages/validateAgainstOrg.json deleted file mode 100644 index 395d98d4f..000000000 --- a/packages/sfpowerscripts-cli/messages/validateAgainstOrg.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "commandDescription": "Validate the incoming change against target org", - "targetOrgFlagDescription": "Alias/User Name of the target environment", - "coveragePercentFlagDescription": "Minimum required percentage coverage for validating code coverage of packages with Apex classes", - "logsGroupSymbolFlagDescription": "Symbol used by CICD platform to group/collapse logs in the console. Provide an opening group, and an optional closing group symbol.", - "diffCheckFlagDescription": "Only build the packages which have changed by analyzing previous tags", - "disableArtifactUpdateFlagDescription": "Do not update information about deployed artifacts to the org", - "baseBranchFlagDescription": "The pull request base branch", - "fastfeedbackFlagDescription": "Enable validation in fast feedback mode, In fast feedback mode, validation will only do selective deployment of changed components and selective tests", - "configFileFlagDescription":"(Required if the release modes are ff-relese-config or thorough-release-config), Path to the config file which determines how the release defintion should be generated", - "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, used for installing or updating dependency in individual/thorough modes", - "disableSourcePackageOverride": "Disables overriding unlocked package installation as source package installation during validate", - "disableParallelTestingFlagDescription": "Disable test execution in parallel, this will execute apex tests in serial", - "installDepsFlagDescription":"Install dependencies during fast feedback", - "orgInfoFlagDescription": "Display info about the org that is used for validation" -} diff --git a/packages/sfpowerscripts-cli/messages/validate_apex_coverage.json b/packages/sfpowerscripts-cli/messages/validate_apex_coverage.json deleted file mode 100644 index 3ba698ad0..000000000 --- a/packages/sfpowerscripts-cli/messages/validate_apex_coverage.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "commandDescription": "Validates apex test coverage in the org, Please ensure that the SFDX CLI and sfpowerkit plugin are installed before using this task.", - "targetOrgFlagDescription": "Alias or username of the target org", - "testCoverageFlagDescription": "The percentage of test coverage for apex clasess, that should be as per the last test run status" -} diff --git a/packages/sfpowerscripts-cli/package.json b/packages/sfpowerscripts-cli/package.json deleted file mode 100644 index c65d9f6bb..000000000 --- a/packages/sfpowerscripts-cli/package.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "name": "@flxblio/sfp", - "description": "Flxbl Toolkit", - "version": "1.0.0", - "license": "MIT", - "author": "flxblio", - "release": "January 24", - "bin": { - "sfp": "./bin/run" - }, - "bugs": "https://github.com/flxblio/sfp/issues", - "dependencies": { - "@flxblio/apexlink": "^1.0.2", - "@newrelic/telemetry-sdk": "^0.6.0", - "@salesforce/apex-node": "2.1.0", - "@salesforce/packaging": "2.3.3", - "@salesforce/source-deploy-retrieve": "9.7.24", - "@salesforce/source-tracking": "4.2.16", - "apex-parser": "2.13.0", - "axios": "^1.4.0", - "datadog-metrics": "^0.9.3", - "fast-xml-parser": "4.2.7", - "hot-shots": "^8.5.0", - "ignore": "^5.1.6", - "tar": "^6.1.9", - "tmp": "^0.2.1", - "xml2js": "^0.6.0", - "@flxblio/sfdx-process-wrapper": "^1.0.2", - "@flxblio/sfp-logger": "^2.1.2", - "@flxblio/sfprofiles": "^2.0.8", - "@oclif/core": "2.11.8", - "@oclif/plugin-commands": "^3.0.3", - "@oclif/plugin-help": "5.2.17", - "@salesforce/core": "5.3.9", - "@salesforce/kit": "3.0.13", - "adm-zip": "^0.5.10", - "ajv": "8.11.0", - "async-retry": "^1.3.1", - "bottleneck": "^2.19.5", - "chalk": "^4.1.2", - "cli-table": "0.3.11", - "dotenv": "16.3.1", - "fs-extra": "^11.1.1", - "glob": "^10.3.3", - "handlebars": "^4.7.7", - "js-yaml": "^4.0.0", - "jsforce": "2.0.0-beta.27", - "lodash": "^4.17.21", - "markdown-table": "^2.0.0", - "markdown-table-ts": "^1.0.3", - "marked": "4.0.16", - "marked-terminal": "5.1.1", - "neverthrow": "4.4.2", - "object-hash": "^2.1.1", - "rimraf": "^5.0.1", - "semver": "7.5.2", - "simple-git": "3.19.1" - }, - "devDependencies": { - "@babel/core": "7.18.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-optional-chaining": "7.17.12", - "@jest/globals": "^29.6.1", - "@oclif/plugin-command-snapshot": "^3", - "@oclif/test": "^2", - "@salesforce/dev-config": "3.0.1", - "@salesforce/ts-sinon": "^1.3.21", - "@salesforce/ts-types": "2.0.5", - "@types/adm-zip": "^0.4.33", - "@types/jest": "^29.5.3", - "@types/js-yaml": "^4.0.5", - "@types/marked": "4.0.2", - "jest": "^29.6.1", - "oclif": "^3.10.0", - "ts-jest": "29.1.1", - "ts-node": "10.7.0", - "@types/fs-extra": "11.0.4", - "typescript": "^5" - }, - "engines": { - "node": ">=16.0.0" - }, - "files": [ - "/lib", - "/messages", - "/npm-shrinkwrap.json", - "/scripts", - "/resources", - "/oclif.manifest.json" - ], - "homepage": "https://github.com/flxblio/sfp", - "keywords": [ - "flxblio", - "sfp-cli", - "sfdx", - "salesforce", - "sf", - "orchestrator" - ], - "oclif": { - "commands": "./lib/commands", - "topics": { - "releasedefinition": { - "description": "Commands around release definition" - }, - "orchestrator": { - "description": "Orchestrate packages from a monorepo through its lifecycle, driven by descriptors in your sfdx-project.json" - }, - "pool": { - "description": "Manage the pooled orgs created by the sfp orchestrator in prepare stage" - }, - "changelog": { - "description": "Track your artifacts & user stories as they progress through different environments, with release changelogs" - }, - "package": { - "description": "Work with various types of packages such as unlocked/source/data/delta individually", - "subtopics": { - "data": { - "description": "Commands to create and install data packages (sfdmu)" - }, - "unlocked": { - "description": "Commands to create and install unlocked packages" - }, - "source": { - "description": "Commands to create and install sfp source packages" - } - } - }, - "impact": { - "description": "Figures out the impact of various components of sfp", - "external": true - }, - "analyze": { - "description": "Analyze your projects using static analysis tools such as PMD", - "external": true - }, - "apextests": { - "description": "Trigger Apex Tests and validate apex tests in a package" - }, - "repo": { - "description": "Commands to help with maintaing repository" - }, - "dependency": { - "description": "Commands to help with dependency management of a project", - "subtopics": { - "expand": { - "description": "Expand the dependency list in sfdx-project.json file for each package, fix the gap of dependencies from its dependent packages" - }, - "shrink": { - "description": "Shrink the dependency list in sfdx-project.json file for each package, remove duplicate dependencies that already exist in its dependent packages" - }, - "install": { - "description": "Install all the external dependencies of a given project" - } - } - } - }, - "plugins": [ - "@oclif/plugin-help", - "@oclif/plugin-commands" - ] - }, - "repository": { - "type": "git", - "url": "https://github.com/flxblio/sfp.git", - "directory": "packages/sfp-cli" - }, - "scripts": { - "build": "pnpm run clean && pnpm run compile", - "manifest": "oclif manifest", - "clean": "rimraf ./lib && rimraf tsconfig.tsbuildinfo", - "compile": "tsc -b tsconfig.json", - "snyk-protect": "snyk protect", - "test": "FORCE_COLOR=true jest --silent --verbose --coverage --detectOpenHandles" - }, - "snyk": true -} diff --git a/packages/sfpowerscripts-cli/resources/metadatainfo.json b/packages/sfpowerscripts-cli/resources/metadatainfo.json deleted file mode 100644 index abcbaba65..000000000 --- a/packages/sfpowerscripts-cli/resources/metadatainfo.json +++ /dev/null @@ -1,1075 +0,0 @@ -{ - "metadataObjects": [ - { - "directoryName": "installedPackages", - "inFolder": false, - "metaFile": false, - "suffix": "installedPackage", - "xmlName": "InstalledPackage" - }, - { - "childXmlNames": ["CustomLabel"], - "directoryName": "labels", - "inFolder": false, - "metaFile": false, - "suffix": "labels", - "xmlName": "CustomLabels" - }, - { - "directoryName": "staticresources", - "inFolder": false, - "metaFile": true, - "suffix": "resource", - "xmlName": "StaticResource" - }, - { - "directoryName": "scontrols", - "inFolder": false, - "metaFile": true, - "suffix": "scf", - "xmlName": "Scontrol" - }, - { - "directoryName": "certs", - "inFolder": false, - "metaFile": true, - "suffix": "crt", - "xmlName": "Certificate" - }, - { - "directoryName": "messageChannels", - "inFolder": false, - "metaFile": false, - "suffix": "messageChannel", - "xmlName": "LightningMessageChannel" - }, - { - "directoryName": "aura", - "inFolder": false, - "metaFile": false, - "xmlName": "AuraDefinitionBundle" - }, - { - "directoryName": "lwc", - "inFolder": false, - "metaFile": false, - "xmlName": "LightningComponentBundle" - }, - { - "directoryName": "components", - "inFolder": false, - "metaFile": true, - "suffix": "component", - "xmlName": "ApexComponent" - }, - { - "directoryName": "pages", - "inFolder": false, - "metaFile": true, - "suffix": "page", - "xmlName": "ApexPage" - }, - { - "directoryName": "queues", - "inFolder": false, - "metaFile": false, - "suffix": "queue", - "xmlName": "Queue" - }, - { - "directoryName": "CaseSubjectParticles", - "inFolder": false, - "metaFile": false, - "suffix": "CaseSubjectParticle", - "xmlName": "CaseSubjectParticle" - }, - { - "directoryName": "dataSources", - "inFolder": false, - "metaFile": false, - "suffix": "dataSource", - "xmlName": "ExternalDataSource" - }, - { - "directoryName": "namedCredentials", - "inFolder": false, - "metaFile": false, - "suffix": "namedCredential", - "xmlName": "NamedCredential" - }, - { - "directoryName": "externalServiceRegistrations", - "inFolder": false, - "metaFile": false, - "suffix": "externalServiceRegistration", - "xmlName": "ExternalServiceRegistration" - }, - { - "directoryName": "roles", - "inFolder": false, - "metaFile": false, - "suffix": "role", - "xmlName": "Role" - }, - { - "directoryName": "groups", - "inFolder": false, - "metaFile": false, - "suffix": "group", - "xmlName": "Group" - }, - { - "directoryName": "globalValueSets", - "inFolder": false, - "metaFile": false, - "suffix": "globalValueSet", - "xmlName": "GlobalValueSet" - }, - { - "directoryName": "standardValueSets", - "inFolder": false, - "metaFile": false, - "suffix": "standardValueSet", - "xmlName": "StandardValueSet" - }, - { - "directoryName": "customPermissions", - "inFolder": false, - "metaFile": false, - "suffix": "customPermission", - "xmlName": "CustomPermission" - }, - { - "childXmlNames": [ - "CustomField", - "Index", - "BusinessProcess", - "RecordType", - "CompactLayout", - "WebLink", - "ValidationRule", - "SharingReason", - "ListView", - "FieldSet" - ], - "directoryName": "objects", - "inFolder": false, - "metaFile": false, - "suffix": "object", - "xmlName": "CustomObject" - }, - { - "directoryName": "reportTypes", - "inFolder": false, - "metaFile": false, - "suffix": "reportType", - "xmlName": "ReportType" - }, - { - "directoryName": "reports", - "inFolder": true, - "metaFile": false, - "suffix": "report", - "xmlName": "Report" - }, - { - "directoryName": "dashboards", - "inFolder": true, - "metaFile": false, - "suffix": "dashboard", - "xmlName": "Dashboard" - }, - { - "directoryName": "analyticSnapshots", - "inFolder": false, - "metaFile": false, - "suffix": "snapshot", - "xmlName": "AnalyticSnapshot" - }, - { - "directoryName": "feedFilters", - "inFolder": false, - "metaFile": false, - "suffix": "feedFilter", - "xmlName": "CustomFeedFilter" - }, - { - "directoryName": "layouts", - "inFolder": false, - "metaFile": false, - "suffix": "layout", - "xmlName": "Layout" - }, - { - "directoryName": "documents", - "inFolder": true, - "metaFile": true, - "suffix": "document", - "xmlName": "Document" - }, - { - "directoryName": "weblinks", - "inFolder": false, - "metaFile": false, - "suffix": "weblink", - "xmlName": "CustomPageWebLink" - }, - { - "directoryName": "letterhead", - "inFolder": false, - "metaFile": false, - "suffix": "letter", - "xmlName": "Letterhead" - }, - { - "directoryName": "email", - "inFolder": true, - "metaFile": true, - "suffix": "email", - "xmlName": "EmailTemplate" - }, - { - "directoryName": "quickActions", - "inFolder": false, - "metaFile": false, - "suffix": "quickAction", - "xmlName": "QuickAction" - }, - { - "directoryName": "flexipages", - "inFolder": false, - "metaFile": false, - "suffix": "flexipage", - "xmlName": "FlexiPage" - }, - { - "directoryName": "tabs", - "inFolder": false, - "metaFile": false, - "suffix": "tab", - "xmlName": "CustomTab" - }, - { - "directoryName": "customApplicationComponents", - "inFolder": false, - "metaFile": false, - "suffix": "customApplicationComponent", - "xmlName": "CustomApplicationComponent" - }, - { - "directoryName": "applications", - "inFolder": false, - "metaFile": false, - "suffix": "app", - "xmlName": "CustomApplication" - }, - { - "directoryName": "customMetadata", - "inFolder": false, - "metaFile": false, - "suffix": "md", - "xmlName": "CustomMetadata" - }, - { - "directoryName": "flows", - "inFolder": false, - "metaFile": false, - "suffix": "flow", - "xmlName": "Flow" - }, - { - "directoryName": "flowDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "flowDefinition", - "xmlName": "FlowDefinition" - }, - { - "childXmlNames": [ - "WorkflowFieldUpdate", - "WorkflowKnowledgePublish", - "WorkflowTask", - "WorkflowAlert", - "WorkflowSend", - "WorkflowOutboundMessage", - "WorkflowRule" - ], - "directoryName": "workflows", - "inFolder": false, - "metaFile": false, - "suffix": "workflow", - "xmlName": "Workflow" - }, - { - "childXmlNames": ["AssignmentRule"], - "directoryName": "assignmentRules", - "inFolder": false, - "metaFile": false, - "suffix": "assignmentRules", - "xmlName": "AssignmentRules" - }, - { - "childXmlNames": ["AutoResponseRule"], - "directoryName": "autoResponseRules", - "inFolder": false, - "metaFile": false, - "suffix": "autoResponseRules", - "xmlName": "AutoResponseRules" - }, - { - "childXmlNames": ["EscalationRule"], - "directoryName": "escalationRules", - "inFolder": false, - "metaFile": false, - "suffix": "escalationRules", - "xmlName": "EscalationRules" - }, - { - "directoryName": "postTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "postTemplate", - "xmlName": "PostTemplate" - }, - { - "directoryName": "approvalProcesses", - "inFolder": false, - "metaFile": false, - "suffix": "approvalProcess", - "xmlName": "ApprovalProcess" - }, - { - "directoryName": "homePageComponents", - "inFolder": false, - "metaFile": false, - "suffix": "homePageComponent", - "xmlName": "HomePageComponent" - }, - { - "directoryName": "homePageLayouts", - "inFolder": false, - "metaFile": false, - "suffix": "homePageLayout", - "xmlName": "HomePageLayout" - }, - { - "directoryName": "objectTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "objectTranslation", - "xmlName": "CustomObjectTranslation" - }, - { - "directoryName": "objectTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "fieldTranslation", - "xmlName": "CustomFieldTranslation" - }, - { - "directoryName": "translations", - "inFolder": false, - "metaFile": false, - "suffix": "translation", - "xmlName": "Translations" - }, - { - "directoryName": "globalValueSetTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "globalValueSetTranslation", - "xmlName": "GlobalValueSetTranslation" - }, - { - "directoryName": "standardValueSetTranslations", - "inFolder": false, - "metaFile": false, - "suffix": "standardValueSetTranslation", - "xmlName": "StandardValueSetTranslation" - }, - { - "directoryName": "classes", - "inFolder": false, - "metaFile": true, - "suffix": "cls", - "xmlName": "ApexClass" - }, - { - "directoryName": "triggers", - "inFolder": false, - "metaFile": true, - "suffix": "trigger", - "xmlName": "ApexTrigger" - }, - { - "directoryName": "testSuites", - "inFolder": false, - "metaFile": false, - "suffix": "testSuite", - "xmlName": "ApexTestSuite" - }, - { - "directoryName": "profiles", - "inFolder": false, - "metaFile": false, - "suffix": "profile", - "xmlName": "Profile" - }, - { - "directoryName": "permissionsets", - "inFolder": false, - "metaFile": false, - "suffix": "permissionset", - "xmlName": "PermissionSet" - }, - { - "directoryName": "mutingpermissionsets", - "inFolder": false, - "metaFile": false, - "suffix": "mutingpermissionset", - "xmlName": "MutingPermissionSet" - }, - { - "directoryName": "permissionsetgroups", - "inFolder": false, - "metaFile": false, - "suffix": "permissionsetgroup", - "xmlName": "PermissionSetGroup" - }, - { - "directoryName": "profilePasswordPolicies", - "inFolder": false, - "metaFile": false, - "suffix": "profilePasswordPolicy", - "xmlName": "ProfilePasswordPolicy" - }, - { - "directoryName": "profileSessionSettings", - "inFolder": false, - "metaFile": false, - "suffix": "profileSessionSetting", - "xmlName": "ProfileSessionSetting" - }, - { - "directoryName": "myDomainDiscoverableLogins", - "inFolder": false, - "metaFile": false, - "suffix": "myDomainDiscoverableLogin", - "xmlName": "MyDomainDiscoverableLogin" - }, - { - "directoryName": "oauthcustomscopes", - "inFolder": false, - "metaFile": false, - "suffix": "oauthcustomscope", - "xmlName": "OauthCustomScope" - }, - { - "directoryName": "datacategorygroups", - "inFolder": false, - "metaFile": false, - "suffix": "datacategorygroup", - "xmlName": "DataCategoryGroup" - }, - { - "directoryName": "remoteSiteSettings", - "inFolder": false, - "metaFile": false, - "suffix": "remoteSite", - "xmlName": "RemoteSiteSetting" - }, - { - "directoryName": "cspTrustedSites", - "inFolder": false, - "metaFile": false, - "suffix": "cspTrustedSite", - "xmlName": "CspTrustedSite" - }, - { - "directoryName": "redirectWhitelistUrls", - "inFolder": false, - "metaFile": false, - "suffix": "redirectWhitelistUrl", - "xmlName": "RedirectWhitelistUrl" - }, - { - "childXmlNames": ["MatchingRule"], - "directoryName": "matchingRules", - "inFolder": false, - "metaFile": false, - "suffix": "matchingRule", - "xmlName": "MatchingRules" - }, - { - "directoryName": "duplicateRules", - "inFolder": false, - "metaFile": false, - "suffix": "duplicateRule", - "xmlName": "DuplicateRule" - }, - { - "directoryName": "cleanDataServices", - "inFolder": false, - "metaFile": false, - "suffix": "cleanDataService", - "xmlName": "CleanDataService" - }, - { - "directoryName": "skills", - "inFolder": false, - "metaFile": false, - "suffix": "skill", - "xmlName": "Skill" - }, - { - "directoryName": "serviceChannels", - "inFolder": false, - "metaFile": false, - "suffix": "serviceChannel", - "xmlName": "ServiceChannel" - }, - { - "directoryName": "queueRoutingConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "queueRoutingConfig", - "xmlName": "QueueRoutingConfig" - }, - { - "directoryName": "servicePresenceStatuses", - "inFolder": false, - "metaFile": false, - "suffix": "servicePresenceStatus", - "xmlName": "ServicePresenceStatus" - }, - { - "directoryName": "presenceDeclineReasons", - "inFolder": false, - "metaFile": false, - "suffix": "presenceDeclineReason", - "xmlName": "PresenceDeclineReason" - }, - { - "directoryName": "presenceUserConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "presenceUserConfig", - "xmlName": "PresenceUserConfig" - }, - { - "directoryName": "authproviders", - "inFolder": false, - "metaFile": false, - "suffix": "authprovider", - "xmlName": "AuthProvider" - }, - { - "directoryName": "eclair", - "inFolder": false, - "metaFile": true, - "suffix": "geodata", - "xmlName": "EclairGeoData" - }, - { - "directoryName": "sites", - "inFolder": false, - "metaFile": false, - "suffix": "site", - "xmlName": "CustomSite" - }, - { - "directoryName": "channelLayouts", - "inFolder": false, - "metaFile": false, - "suffix": "channelLayout", - "xmlName": "ChannelLayout" - }, - { - "directoryName": "contentassets", - "inFolder": false, - "metaFile": true, - "suffix": "asset", - "xmlName": "ContentAsset" - }, - { - "directoryName": "sites", - "inFolder": false, - "metaFile": false, - "suffix": "site", - "xmlName": "CustomSite" - }, - { - "childXmlNames": ["SharingOwnerRule", "SharingCriteriaRule"], - "directoryName": "sharingRules", - "inFolder": false, - "metaFile": false, - "suffix": "sharingRules", - "xmlName": "SharingRules" - }, - { - "directoryName": "sharingSets", - "inFolder": false, - "metaFile": false, - "suffix": "sharingSet", - "xmlName": "SharingSet" - }, - { - "directoryName": "communities", - "inFolder": false, - "metaFile": false, - "suffix": "community", - "xmlName": "Community" - }, - { - "directoryName": "ChatterExtensions", - "inFolder": false, - "metaFile": false, - "suffix": "ChatterExtension", - "xmlName": "ChatterExtension" - }, - { - "directoryName": "platformEventChannels", - "inFolder": false, - "metaFile": false, - "suffix": "platformEventChannel", - "xmlName": "PlatformEventChannel" - }, - { - "directoryName": "platformEventChannelMembers", - "inFolder": false, - "metaFile": false, - "suffix": "platformEventChannelMember", - "xmlName": "PlatformEventChannelMember" - }, - { - "directoryName": "callCenters", - "inFolder": false, - "metaFile": false, - "suffix": "callCenter", - "xmlName": "CallCenter" - }, - { - "directoryName": "milestoneTypes", - "inFolder": false, - "metaFile": false, - "suffix": "milestoneType", - "xmlName": "MilestoneType" - }, - { - "directoryName": "entitlementProcesses", - "inFolder": false, - "metaFile": false, - "suffix": "entitlementProcess", - "xmlName": "EntitlementProcess" - }, - { - "directoryName": "entitlementTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "entitlementTemplate", - "xmlName": "EntitlementTemplate" - }, - { - "directoryName": "timeSheetTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "timeSheetTemplate", - "xmlName": "TimeSheetTemplate" - }, - { - "directoryName": "Canvases", - "inFolder": false, - "metaFile": false, - "suffix": "Canvas", - "xmlName": "CanvasMetadata" - }, - { - "directoryName": "MobileApplicationDetails", - "inFolder": false, - "metaFile": false, - "suffix": "MobileApplicationDetail", - "xmlName": "MobileApplicationDetail" - }, - { - "directoryName": "notificationtypes", - "inFolder": false, - "metaFile": false, - "suffix": "notiftype", - "xmlName": "CustomNotificationType" - }, - { - "directoryName": "connectedApps", - "inFolder": false, - "metaFile": false, - "suffix": "connectedApp", - "xmlName": "ConnectedApp" - }, - { - "directoryName": "appMenus", - "inFolder": false, - "metaFile": false, - "suffix": "appMenu", - "xmlName": "AppMenu" - }, - { - "directoryName": "notificationTypeConfig", - "inFolder": false, - "metaFile": false, - "suffix": "config", - "xmlName": "NotificationTypeConfig" - }, - { - "directoryName": "delegateGroups", - "inFolder": false, - "metaFile": false, - "suffix": "delegateGroup", - "xmlName": "DelegateGroup" - }, - { - "directoryName": "siteDotComSites", - "inFolder": false, - "metaFile": true, - "suffix": "site", - "xmlName": "SiteDotCom" - }, - { - "directoryName": "experiences", - "inFolder": false, - "metaFile": false, - "xmlName": "ExperienceBundle" - }, - { - "directoryName": "networks", - "inFolder": false, - "metaFile": false, - "suffix": "network", - "xmlName": "Network" - }, - { - "directoryName": "networkBranding", - "inFolder": false, - "metaFile": true, - "suffix": "networkBranding", - "xmlName": "NetworkBranding" - }, - { - "directoryName": "audience", - "inFolder": false, - "metaFile": false, - "suffix": "audience", - "xmlName": "Audience" - }, - { - "directoryName": "brandingSets", - "inFolder": false, - "metaFile": false, - "suffix": "brandingSet", - "xmlName": "BrandingSet" - }, - { - "directoryName": "communityThemeDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "communityThemeDefinition", - "xmlName": "CommunityThemeDefinition" - }, - { - "directoryName": "communityTemplateDefinitions", - "inFolder": false, - "metaFile": false, - "suffix": "communityTemplateDefinition", - "xmlName": "CommunityTemplateDefinition" - }, - { - "directoryName": "navigationMenus", - "inFolder": false, - "metaFile": false, - "suffix": "navigationMenu", - "xmlName": "NavigationMenu" - }, - { - "directoryName": "flowCategories", - "inFolder": false, - "metaFile": false, - "suffix": "flowCategory", - "xmlName": "FlowCategory" - }, - { - "directoryName": "lightningBolts", - "inFolder": false, - "metaFile": false, - "suffix": "lightningBolt", - "xmlName": "LightningBolt" - }, - { - "directoryName": "lightningExperienceThemes", - "inFolder": false, - "metaFile": false, - "suffix": "lightningExperienceTheme", - "xmlName": "LightningExperienceTheme" - }, - { - "directoryName": "lightningOnboardingConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "lightningOnboardingConfig", - "xmlName": "LightningOnboardingConfig" - }, - { - "directoryName": "customHelpMenuSections", - "inFolder": false, - "metaFile": false, - "suffix": "customHelpMenuSection", - "xmlName": "CustomHelpMenuSection" - }, - { - "directoryName": "prompts", - "inFolder": false, - "metaFile": false, - "suffix": "prompt", - "xmlName": "Prompt" - }, - { - "childXmlNames": ["ManagedTopic"], - "directoryName": "managedTopics", - "inFolder": false, - "metaFile": false, - "suffix": "managedTopics", - "xmlName": "ManagedTopics" - }, - { - "directoryName": "moderation", - "inFolder": false, - "metaFile": false, - "suffix": "keywords", - "xmlName": "KeywordList" - }, - { - "directoryName": "userCriteria", - "inFolder": false, - "metaFile": false, - "suffix": "userCriteria", - "xmlName": "UserCriteria" - }, - { - "directoryName": "moderation", - "inFolder": false, - "metaFile": false, - "suffix": "rule", - "xmlName": "ModerationRule" - }, - { - "directoryName": "cmsConnectSource", - "inFolder": false, - "metaFile": false, - "suffix": "cmsConnectSource", - "xmlName": "CMSConnectSource" - }, - { - "directoryName": "managedContentTypes", - "inFolder": false, - "metaFile": false, - "suffix": "managedContentType", - "xmlName": "ManagedContentType" - }, - { - "directoryName": "samlssoconfigs", - "inFolder": false, - "metaFile": false, - "suffix": "samlssoconfig", - "xmlName": "SamlSsoConfig" - }, - { - "directoryName": "corsWhitelistOrigins", - "inFolder": false, - "metaFile": false, - "suffix": "corsWhitelistOrigin", - "xmlName": "CorsWhitelistOrigin" - }, - { - "directoryName": "actionLinkGroupTemplates", - "inFolder": false, - "metaFile": false, - "suffix": "actionLinkGroupTemplate", - "xmlName": "ActionLinkGroupTemplate" - }, - { - "directoryName": "liveChatDeployments", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatDeployment", - "xmlName": "LiveChatDeployment" - }, - { - "directoryName": "liveChatButtons", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatButton", - "xmlName": "LiveChatButton" - }, - { - "directoryName": "liveChatAgentConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatAgentConfig", - "xmlName": "LiveChatAgentConfig" - }, - { - "directoryName": "liveChatSensitiveDataRule", - "inFolder": false, - "metaFile": false, - "suffix": "liveChatSensitiveDataRule", - "xmlName": "LiveChatSensitiveDataRule" - }, - { - "directoryName": "transactionSecurityPolicies", - "inFolder": false, - "metaFile": false, - "suffix": "transactionSecurityPolicy", - "xmlName": "TransactionSecurityPolicy" - }, - { - "directoryName": "synonymDictionaries", - "inFolder": false, - "metaFile": false, - "suffix": "synonymDictionary", - "xmlName": "SynonymDictionary" - }, - { - "directoryName": "pathAssistants", - "inFolder": false, - "metaFile": false, - "suffix": "pathAssistant", - "xmlName": "PathAssistant" - }, - { - "directoryName": "animationRules", - "inFolder": false, - "metaFile": false, - "suffix": "animationRule", - "xmlName": "AnimationRule" - }, - { - "directoryName": "LeadConvertSettings", - "inFolder": false, - "metaFile": false, - "suffix": "LeadConvertSetting", - "xmlName": "LeadConvertSettings" - }, - { - "directoryName": "cachePartitions", - "inFolder": false, - "metaFile": false, - "suffix": "cachePartition", - "xmlName": "PlatformCachePartition" - }, - { - "directoryName": "topicsForObjects", - "inFolder": false, - "metaFile": false, - "suffix": "topicsForObjects", - "xmlName": "TopicsForObjects" - }, - { - "directoryName": "recommendationStrategies", - "inFolder": false, - "metaFile": false, - "suffix": "recommendationStrategy", - "xmlName": "RecommendationStrategy" - }, - { - "directoryName": "emailservices", - "inFolder": false, - "metaFile": false, - "suffix": "xml", - "xmlName": "EmailServicesFunction" - }, - { - "directoryName": "recordActionDeployments", - "inFolder": false, - "metaFile": false, - "suffix": "deployment", - "xmlName": "RecordActionDeployment" - }, - { - "directoryName": "salesAgreementSettings", - "inFolder": false, - "metaFile": false, - "suffix": "salesAgreementSetting", - "xmlName": "SalesAgreementSettings" - }, - { - "directoryName": "AccountForecastSettings", - "inFolder": false, - "metaFile": false, - "suffix": "accountForecastSetting", - "xmlName": "AccountForecastSettings" - }, - { - "directoryName": "icons", - "inFolder": false, - "metaFile": false, - "suffix": "icon", - "xmlName": "Icon" - }, - { - "directoryName": "EmbeddedServiceLiveAgent", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceLiveAgent", - "xmlName": "EmbeddedServiceLiveAgent" - }, - { - "directoryName": "EmbeddedServiceConfig", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceConfig", - "xmlName": "EmbeddedServiceConfig" - }, - { - "directoryName": "EmbeddedServiceBranding", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceBranding", - "xmlName": "EmbeddedServiceBranding" - }, - { - "directoryName": "EmbeddedServiceFlowConfig", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceFlowConfig", - "xmlName": "EmbeddedServiceFlowConfig" - }, - { - "directoryName": "EmbeddedServiceMenuSettings", - "inFolder": false, - "metaFile": false, - "suffix": "EmbeddedServiceMenuSettings", - "xmlName": "EmbeddedServiceMenuSettings" - }, - { - "directoryName": "uiObjectRelationConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "uiObjectRelationConfig", - "xmlName": "UIObjectRelationConfig" - }, - { - "directoryName": "careProviderSearchConfigs", - "inFolder": false, - "metaFile": false, - "suffix": "careProviderSearchConfig", - "xmlName": "CareProviderSearchConfig" - }, - { - "directoryName": "settings", - "inFolder": false, - "metaFile": false, - "suffix": "settings", - "xmlName": "Settings" - } - ], - "organizationNamespace": "", - "partialSaveAllowed": false, - "testRequired": true -} diff --git a/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json b/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json deleted file mode 100644 index b3102e17d..000000000 --- a/packages/sfpowerscripts-cli/resources/schemas/pooldefinition.schema.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json", - "title": "pool definition", - "description": "The definition for creating a pool of scratch orgs in sfp", - "type": "object", - "required": ["tag", "maxAllocation"], - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Support editors like vscode to help with IntelliSense", - "type": "string", - "default": "https://raw.githubusercontent.com/flxblio/sfp/develop/packages/sfp-cli/resources/schemas/pooldefinition.schema.json" - }, - "tag": { - "title": "Tag of the pool", - "description": "Tag or name to identify the scratch org pool", - "type": "string" - }, - "waitTime": { - "title": "wait time", - "description": "Time to wait for scratch org creation in minutes (default:6 mins)", - "type": "integer", - "default": 6 - }, - "expiry": { - "title": "expiry", - "description": "Duration of the scratch org (in days) (default:2)", - "type": "integer", - "default": 2 - }, - "maxAllocation": { - "title": "Max number of scratch orgs to be allocated", - "description": "Maximum number of scratch orgs to be allocated in the pool", - "type": "integer" - }, - "batchSize": { - "title": "Batch Size", - "description": "Control the parallelism of the pool creation (default:5)", - "type": "integer", - "default": 5 - }, - "configFilePath": { - "title": "Path to config file", - "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition.", - "type": "string", - "default": "config/project-scratch-def.json" - }, - "releaseConfigFile": { - "title": "Path to release config file", - "description": "Path to the config file which determines how a release defintion should be generated, enable this for pools to use this release config to only utilize artifacts described the releae config", - "type": "string" - }, - "succeedOnDeploymentErrors": { - "title": "Succeed on Deployment Errors", - "description": "In case of a deployment error, whether to keep that scratch org in the pool", - "type": "boolean", - "default": true - }, - "installAll": { - "title": "Install all packages", - "description": "Install all package artifacts, in addition to the managed package dependencies", - "type": "boolean", - "default": false - }, - "enableVlocity": { - "title": "Enable vlocity config deployment", - "description": "[alpha] Enable vlocity settings and config deployment. Please note it doesnt install vlocity managed package", - "type": "boolean", - "default": "false" - }, - "enableSourceTracking": { - "title": "Enable source tracking", - "description": "Enable source tracking by deploying packages using source:push , and persisting local source tracking files", - "type": "boolean", - "default": true - }, - "relaxAllIPRanges": { - "title": "Relax all IP Ranges", - "description": "Relax all IP addresses to enable developers to login to scratch orgs", - "type": "boolean", - "default": "false" - }, - "ipRangesToBeRelaxed": { - "title": "IP ranges to be relaxed", - "description": "Relax IP address of developers to allow access to scratch orgs", - "type": "array" - }, - "retryOnFailure": { - "title": "Retry on failure", - "description": "Retry installation of packages on failed deployment", - "type": "boolean", - "default": "false" - }, - "maxRetryCount": { - "title": "Max Retry Count", - "description": "Maximum number of attempts sfp should retry installation of packages on failed deployment", - "type": "number", - "default": "2" - }, - "snapshotPool": { - "title": "Snapshot Pool", - "description": "Use a pre-prepared pool to further add packages on top of it", - "type": "string" - }, - "postDeploymentScriptPath": { - "title": "Post Script", - "description": "Execute a custom script after all the artifacts are deployed into a particular org", - "type": "string" - }, - "preDependencyInstallationScriptPath": { - "title": "Pre Script", - "description": "Execute a custom script before denpendencies install into a particular org", - "type": "string" - }, - "disableSourcePackageOverride": { - "title": "Disable installation of unlocked packages as source package", - "description": "Prepare by default utilizes source package for installing unlocked packages to the scratchorg, disabling this flag will allow to install it ", - "type": "boolean", - "default":false - }, - "fetchArtifacts": { - "title": "Fetch Artifacts using below mechanism", - "description": "Fetch artifacts from artifact registry using below mechanism", - "type": "object", - "oneOf": [{ "required": ["artifactFetchScript"] }, { "required": ["npm"] }], - "properties": { - "artifactFetchScript": { - "title": "Path to the script for fetching artifacts", - "description": "Path to Shell script that handles fetching artifacts from a registry", - "type": "string" - }, - "npm": { - "type": "object", - "required": ["scope"], - "properties": { - "scope": { - "title": "Scope of NPM packages", - "description": "Scope of NPM packages", - "type": "string" - } - } - } - } - } - } -} diff --git a/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json b/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json deleted file mode 100644 index 7a9071925..000000000 --- a/packages/sfpowerscripts-cli/resources/schemas/releasedefinition.schema.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", - "title": "release definition", - "description": "The definition for a release using sfp orchestrator", - "type": "object", - "required": ["release", "artifacts"], - "additionalProperties": false, - "dependencies": { - "baselineOrg": ["skipIfAlreadyInstalled"] - }, - "properties": { - "release": { - "type": "string" - }, - "skipIfAlreadyInstalled": { - "type": "boolean" - }, - "skipArtifactUpdate": { - "type": "boolean" - }, - "baselineOrg": { - "type": "string" - }, - "artifacts": { - "type": "object", - "patternProperties": { - ".+": { - "type": "string" - } - } - }, - "packageDependencies": { - "type": "object", - "patternProperties": { - ".+": { - "type": "string", - "pattern": "^04t([a-zA-Z0-9]{15}|[a-zA-Z0-9]{12})$" - } - } - }, - "promotePackagesBeforeDeploymentToOrg": { - "type": "string" - }, - "changelog": { - "type": "object", - "properties": { - "workItemFilter": { - "type": "string", - "title": "Support legacy workItemFilter which supports only one single regex pattern" - }, - "workItemFilters": { - "type": "array", - "title": "Regex to filter workitems from commit messages", - "items": { - "type": "string" - } - }, - "workItemUrl": { - "type": "string" - }, - "limit": { - "type": "integer" - }, - "showAllArtifacts": { - "type": "boolean" - } - }, - "oneOf": [{ "required": ["workItemFilter"] }, { "required": ["workItemFilters"] }], - "additionalProperties": false - } - } -} diff --git a/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json b/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json deleted file mode 100644 index 9b9c4372d..000000000 --- a/packages/sfpowerscripts-cli/resources/schemas/releasedefinitiongenerator.schema.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", - "title": "release definition generator", - "description": "The definition for generating a release defintion using generator command", - "type": "object", - "additionalProperties": true, - "dependencies": { - "baselineOrg": ["skipIfAlreadyInstalled"] - }, - "properties": { - "excludeArtifacts": { - "type": "array", - "title": "Exclude the below artifacts while creating a release definition", - "items": { - "type": "string" - } - }, - "includeOnlyArtifacts": { - "type": "array", - "title": "Include the below artifacts while creating a release definition", - "items": { - "type": "string" - } - }, - "excludeArtifactsWithTag": { - "type": "array", - "title": "Exclude any artifacts that have the following tags", - "items": { - "type": "string" - } - }, - "excludePackageDependencies": { - "type": "array", - "title": "Exclude the below external package dependencies while creating a release definition", - "items": { - "type": "string" - } - }, - "excludeAllPackageDependencies": { - "type": "boolean", - "title": "Exclude all external package dependencies while creating a release definition" - }, - "includeOnlyPackageDependencies": { - "type": "array", - "title": "Include only the below external package dependencies while creating a release definition", - "items": { - "type": "string" - } - }, - "dependencyOn": { - "type": "array", - "title": "Include the below artifacts as dependencies of this release definition,usefor for validation", - "items": { - "type": "string" - } - }, - "releasedefinitionProperties":{ - "type": "object", - "title": "Properties that need to be set in the generated definition file", - "additionalProperties": true, - "properties": { - "skipIfAlreadyInstalled": { - "type": "boolean" - }, - "skipArtifactUpdate": { - "type": "boolean" - }, - "baselineOrg": { - "type": "string" - }, - "promotePackagesBeforeDeploymentToOrg": { - "type": "string" - }, - "changelog": { - "type": "object", - "properties": { - "workItemFilters": { - "type": "array", - "title": "Regex to filter workitems from commit messages", - "items": { - "type": "string" - } - }, - "workItemUrl": { - "type": "string" - }, - "limit": { - "type": "integer" - }, - "showAllArtifacts": { - "type": "boolean" - } - }, - "required": ["workItemFilters"], - "additionalProperties": false - } - } - } - } -} diff --git a/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json b/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json deleted file mode 100644 index db002e40b..000000000 --- a/packages/sfpowerscripts-cli/resources/schemas/sfdx-project.schema.json +++ /dev/null @@ -1,654 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/sfdx-project.schema.json", - "title": "sfp DX Project File", - "description": "The properties and shape of the SFDX project enhanced for sfp", - "type": "object", - "additionalProperties": true, - "required": [ - "packageDirectories" - ], - "properties": { - "$schema": { - "description": "Support editors like vscode to help with IntelliSense", - "type": "string", - "default": "https://raw.githubusercontent.com/flxblio/sfp/main/packages/sfp-cli/resources/schemas/sfdx-project.schema.json" - }, - "packageDirectories": { - "title": "Package Directories", - "type": "array", - "description": "Package directories indicate which directories to target when syncing source to and from the scratch org. These directories can contain source from your managed package, unmanaged package, or unpackaged source, for example, ant tool or change set.", - "$comment": "The properties ancestorId & ancestorVersion cannot be included together, but this schema optimizes for VS Code code completion rather than pure validation.", - "minItems": 1, - "items": { - "type": "object", - "dependencies": { - "ancestorId": [ - "package", - "versionNumber" - ], - "ancestorVersion": [ - "package", - "versionNumber" - ], - "apexTestAccess": [ - "package", - "versionNumber" - ], - "definitionFile": [ - "package", - "versionNumber" - ], - "dependencies": [ - "package", - "versionNumber" - ], - "package": [ - "versionNumber" - ], - "postInstallUrl": [ - "package", - "versionNumber" - ], - "unpackagedMetadata": [ - "package", - "versionNumber" - ], - "releaseNotesUrl": [ - "package", - "versionNumber" - ], - "seedMetadata": [ - "package", - "versionNumber" - ], - "versionDescription": [ - "package", - "versionNumber" - ], - "versionName": [ - "package", - "versionNumber" - ], - "versionNumber": [ - "package" - ], - "branch": [ - "package" - ] - }, - "required": [ - "path" - ], - "additionalProperties": false, - "properties": { - "ancestorId": { - "$ref": "#/definitions/packageDirectory.ancestorId" - }, - "ancestorVersion": { - "$ref": "#/definitions/packageDirectory.ancestorVersion" - }, - "apexTestAccess": { - "$ref": "#/definitions/packageDirectory.apexTestAccess" - }, - "default": { - "$ref": "#/definitions/packageDirectory.default" - }, - "definitionFile": { - "$ref": "#/definitions/packageDirectory.definitionFile" - }, - "dependencies": { - "$ref": "#/definitions/packageDirectory.dependencies" - }, - "includeProfileUserLicenses": { - "$ref": "#/definitions/packageDirectory.includeProfileUserLicenses" - }, - "package": { - "$ref": "#/definitions/packageDirectory.package" - }, - "path": { - "$ref": "#/definitions/packageDirectory.path" - }, - "postInstallUrl": { - "$ref": "#/definitions/packageDirectory.postInstallUrl" - }, - "unpackagedMetadata": { - "$ref": "#/definitions/packageDirectory.unpackagedMetadata" - }, - "releaseNotesUrl": { - "$ref": "#/definitions/packageDirectory.releaseNotesUrl" - }, - "seedMetadata": { - "$ref": "#/definitions/packageDirectory.seedMetadata" - }, - "versionDescription": { - "$ref": "#/definitions/packageDirectory.versionDescription" - }, - "versionName": { - "$ref": "#/definitions/packageDirectory.versionName" - }, - "versionNumber": { - "$ref": "#/definitions/packageDirectory.versionNumber" - }, - "aliasfy": { - "$ref": "#/definitions/packageDirectory.aliasfy" - }, - "alwaysDeploy": { - "$ref": "#/definitions/packageDirectory.alwaysDeploy" - }, - "assignPermSetsPreDeployment": { - "$ref": "#/definitions/packageDirectory.assignPermSetsPreDeployment" - }, - "assignPermSetsPostDeployment": { - "$ref": "#/definitions/packageDirectory.assignPermSetsPostDeployment" - }, - "buildCollection": { - "$ref": "#/definitions/packageDirectory.buildCollection" - }, - "destructiveChangePath": { - "$ref": "#/definitions/packageDirectory.destructiveChangePath" - }, - "isOptimizedDeployment": { - "$ref": "#/definitions/packageDirectory.isOptimizedDeployment" - }, - "ignoreOnStage": { - "$ref": "#/definitions/packageDirectory.ignoreOnStage" - }, - "postDeploymentScript": { - "$ref": "#/definitions/packageDirectory.postDeploymentScript" - }, - "preDeploymentScript": { - "$ref": "#/definitions/packageDirectory.preDeploymentScript" - }, - "reconcileProfiles": { - "$ref": "#/definitions/packageDirectory.reconcileProfiles" - }, - "type": { - "$ref": "#/definitions/packageDirectory.type" - }, - "skipCoverageValidation": { - "$ref": "#/definitions/packageDirectory.skipCoverageValidation" - }, - "tags": { - "$ref": "#/definitions/packageDirectory.tags" - }, - "testSynchronous": { - "$ref": "#/definitions/packageDirectory.testSynchronous" - }, - "skipDeployOnOrgs": { - "$ref": "#/definitions/packageDirectory.skipDeployOnOrgs" - }, - "skipTesting": { - "$ref": "#/definitions/packageDirectory.skipTesting" - }, - "checkpointForPrepare": { - "$ref": "#/definitions/packageDirectory.checkpointForPrepare" - }, - "enableFHT": { - "$ref": "#/definitions/packageDirectory.enableFHT" - }, - "enablePicklist": { - "$ref": "#/definitions/packageDirectory.enablePicklist" - }, - "branch": { - "$ref": "#/definitions/packageDirectory.branch" - } - } - } - }, - "name": { - "title": "name", - "type": "string", - "description": "The name of your Salesforce project." - }, - "namespace": { - "title": "Namespace", - "type": "string", - "description": "The global namespace that is used with a package. The namespace must be registered with an org that is associated with your Dev Hub org. This namespace is assigned to scratch orgs created with the org:create command. If you’re creating an unlocked package, you have the option to create a package with no namespace." - }, - "sourceApiVersion": { - "title": "Source API Version", - "type": "string", - "description": "The API version that the source is compatible with. The default is the same version as the Salesforce CLI.", - "default": "48.0" - }, - "sfdcLoginUrl": { - "title": "SFDC Login URL", - "type": "string", - "description": "The login URL that the force:auth commands use. If not specified, the default is login.salesforce.com. Override the default value if you want users to authorize to a specific Salesforce instance. For example, if you want to authorize into a sandbox org, set this parameter to test.salesforce.com.", - "default": "https://login.salesforce.com" - }, - "signupTargetLoginUrl": { - "type": "string", - "description": "The url that is used when creating new scratch orgs. This is typically only used for testing prerelease environments." - }, - "oauthLocalPort": { - "type": "number", - "description": "By default, the OAuth port is 1717. However, change this port if this port is already in use, and you plan to create a connected app in your Dev Hub org to support JWT-based authorization." - }, - "pushPackageDirectoriesSequentially": { - "type": "boolean", - "description": "Whether to push package directories sequentially. If true, the package directories are pushed in the order they are listed in the project file. By default, the package directories are pushed in one deployment." - }, - "plugins": { - "title": "CLI Plugins custom settings", - "type": "object", - "description": "Salesforce CLI plugin configurations used with this project.", - "additionalProperties": true, - "properties": { - "sfp": { - "$ref": "#/definitions/plugins.sfp" - } - } - }, - "packageAliases": { - "title": "Aliases for packaging ids", - "type": "object", - "description": "The Salesforce CLI updates this file with the aliases when you create a package or package version. You can also manually update this section for existing packages or package versions. You can use the alias instead of the cryptic package ID when running CLI force:package commands.", - "patternProperties": { - "^[ -~]+$": { - "type": "string", - "pattern": "^(0Ho|033|05i|04t)([a-zA-Z0-9]{15}|[a-zA-Z0-9]{12})$" - } - } - } - }, - "definitions": { - "packageDirectory.path": { - "type": "string", - "description": "If you don’t specify a path, the Salesforce CLI uses a placeholder when you create a package." - }, - "packageDirectory.default": { - "title": "Default", - "type": "boolean", - "description": "If you have specified more than one path, include this parameter for the default path to indicate which is the default package directory.", - "default": true - }, - "packageDirectory.package": { - "title": "Package Identifier", - "type": "string", - "description": "The package name you specified when creating the package." - }, - "packageDirectory.versionName": { - "title": "Version Name", - "type": "string", - "description": "If not specified, the CLI uses versionNumber as the version name." - }, - "packageDirectory.versionDescription": { - "title": "Version Description", - "type": "string", - "description": "Human readable version information, format not specified." - }, - "packageDirectory.versionNumber": { - "title": "Version Number", - "type": "string", - "description": "Version numbers are formatted as major.minor.patch.build. For example, 1.2.1.8." - }, - "packageDirectory.definitionFile": { - "title": "Definition File", - "type": "string", - "description": "Reference an external .json file to specify the features and org preferences required for the metadata of your package, such as the scratch org definition." - }, - "packageDirectory.dependencies": { - "type": "array", - "description": "To specify dependencies for 2GP within the same Dev Hub, use either the package version alias or a combination of the package name and the version number.", - "items": { - "type": "object", - "required": [ - "package" - ], - "properties": { - "package": { - "type": "string" - }, - "versionNumber": { - "type": "string" - }, - "branch": { - "type": "string" - } - } - } - }, - "packageDirectory.ancestorId": { - "title": "Ancestor ID", - "type": "string", - "description": "The ancestor that’s the immediate parent of the version that you’re creating. The package version ID to supply starts with '05i'." - }, - "packageDirectory.ancestorVersion": { - "title": "Ancestor Version", - "type": "string", - "description": "The ancestor that’s the immediate parent of the version that you’re creating. The ancestor version uses the format major.minor.patch.build." - }, - "packageDirectory.releaseNotesUrl": { - "type": "string", - "title": "Release Notes Url", - "description": "The release notes url." - }, - "packageDirectory.postInstallUrl": { - "type": "string", - "title": "Post Install Url", - "description": "The post install url." - }, - "packageDirectory.seedMetadata": { - "type": "object", - "title": "Seed Metadata", - "description": "Metadata not meant to be packaged, but deployed before deploying packaged metadata", - "required": [ - "path" - ], - "properties": { - "path": { - "type": "string", - "title": "Path", - "description": "The path name of the package directory containing the seed metadata" - } - } - }, - "packageDirectory.unpackagedMetadata": { - "type": "object", - "title": "Unpackaged Metadata", - "description": "Metadata not meant to be packaged, but deployed when testing packaged metadata", - "required": [ - "path" - ], - "properties": { - "path": { - "type": "string", - "title": "Path", - "description": "The path name of the package directory containing the unpackaged metadata" - } - } - }, - "packageDirectory.includeProfileUserLicenses": { - "type": "boolean", - "title": "Include Profile User Licenses", - "description": "Whether to include elements in profile metadata " - }, - "packageDirectory.apexTestAccess": { - "type": "object", - "title": "Apex Test Access", - "description": "Additional access that should be granted to the user when running package Apex tests", - "properties": { - "permissionSets": { - "title": "Permission Sets", - "description": "The list of permission sets to enable while running Apex tests", - "oneOf": [ - { - "type": "string", - "title": "Permission Set String", - "description": "The list of permission set to enable while running Apex tests as a string" - }, - { - "type": "array", - "title": "Permission Set Array", - "description": "The list of permission set to enable while running Apex tests as an array", - "items": { - "type": "string", - "title": "Permission Set Name", - "description": "Name of the permission set to enable while running Apex tests" - } - } - ] - }, - "permissionSetLicenses": { - "title": "Permission Set License", - "description": "The list of permission sets licenses to enable while running Apex tests", - "oneOf": [ - { - "type": "string", - "title": "Permission Set Licenses String", - "description": "The list of permission set licenses to enable while running Apex tests as a string" - }, - { - "type": "array", - "title": "Permission Set Licenses Array", - "description": "The list of permission set licenses to enable while running Apex tests as an array", - "items": { - "type": "string", - "title": "Permission Set Licenses Developer Name", - "description": "Name of the permission set to enable while running Apex tests" - } - } - ] - } - } - }, - "packageDirectory.aliasfy": { - "type": "boolean", - "title": "Aliasfy the package", - "description": "Deploy a subfolder in a source package that matches the alias of the org" - }, - "packageDirectory.alwaysDeploy": { - "type": "boolean", - "title": "Always deploy the package", - "description": "Deploys package, even if it's installed already in the org. The artifact has to be present in the artifact directory for this particular option to work" - }, - "packageDirectory.assignPermSetsPreDeployment": { - "type": "array", - "title": "Apply Perm Sets Pre Deployment", - "description": "Apply permsets before deploying a package", - "items": { - "type": "string" - } - }, - "packageDirectory.assignPermSetsPostDeployment": { - "type": "array", - "title": "Apply Perm Sets Post Deployment", - "description": "Apply permsets after deploying a package", - "items": { - "type": "string" - } - }, - "packageDirectory.buildCollection": { - "type": "array", - "title": "Build Packages in a Collection", - "description": "Utilize this to build packages in unison, it will build all packages in the collection, even if only one of them changes", - "items": { - "type": "string" - } - }, - "packageDirectory.destructiveChangePath": { - "type": "string", - "title": "Path to Destructive Changes", - "description": "Apply destructive changes during deployment" - }, - "packageDirectory.isOptimizedDeployment": { - "type": "boolean", - "title": "Use optimized deployment", - "description": "Detects test classes in a source package automatically and utilize it to deploy the provided package" - }, - "packageDirectory.ignoreOnStage": { - "type": "array", - "title": "Ignore this package on a stage", - "description": "Ignore this package on any provided stage", - "items": { - "type": "string", - "enum": [ - "prepare", - "build", - "deploy", - "validate", - "release", - "quickbuild" - ] - } - }, - "packageDirectory.postDeploymentScript": { - "type": "string", - "title": "PostDeployment Script", - "description": "Run an executable script after deploying a package. User need to provide a path to the script file" - }, - "packageDirectory.preDeploymentScript": { - "type": "string", - "title": "PreDeployment Script", - "description": "Run an executable script before deploying a package. User need to provide a path to the script file" - }, - "packageDirectory.reconcileProfiles": { - "type": "boolean", - "title": "Reconcile Profiles", - "description": "Reconcile Profiles during a deployment of source packages" - }, - "packageDirectory.type": { - "type": "string", - "title": "Type of the Package", - "enum": [ - "unlocked", - "source", - "data", - "diff" - ], - "description": "Denotes the type of the package, accepted values are \"source\",\"data\",\"unlocked\" and \"diff\"" - }, - "packageDirectory.skipCoverageValidation": { - "type": "boolean", - "title": "Skip Test Coverage Validation", - "description": "Skip the coverage validation of a package (unlocked/source)" - }, - "packageDirectory.tags": { - "type": "array", - "title": "Annotate a package with tags", - "description": "Utilize this to annotate a package with tags", - "items": { - "type": "string" - } - }, - "packageDirectory.testSynchronous": { - "type": "boolean", - "title": "Trigger tests synchronously", - "description": "This will disable parallel testing in the org and tests packages", - "default": false - }, - "packageDirectory.skipDeployOnOrgs": { - "type": "array", - "title": "Skip Deployment of the Package", - "description": "Skip deployment on a particular org or org(s). Take an array of aliases as the input", - "items": { - "type": "string" - } - }, - "packageDirectory.skipTesting": { - "type": "boolean", - "title": "Skip Unit testing", - "description": "Skip unit testing during validate or deployment (source packages)" - }, - "packageDirectory.checkpointForPrepare": { - "type": "boolean", - "title": "Is an Checkpoint Package?", - "description": "Fail the scratch org,if the any of the checkpoint package fails to deploy on prepare" - }, - "packageDirectory.enableFHT": { - "type": "boolean", - "default": true, - "title": "Enable Field History Tracking support?", - "description": "Enable automated update of field history tracking in the target org upon deployment" - }, - "packageDirectory.enableFT": { - "type": "boolean", - "default": true, - "title": "Enable Feed Tracking support?", - "description": "Enable automated update of feed tracking in the target org upon deployment" - }, - "packageDirectory.enablePicklist": { - "type": "boolean", - "default": true, - "title": "Enable Picklist patching for Unlocked Packages", - "description": "Enable automated patching of picklist for unlocked packages as unlocked packages ignore changes" - }, - "packageDirectory.branch": { - "type": "string", - "title": "Package branch", - "description": "branched package for the specific dev team" - }, - "plugins.sfp": { - "type": "object", - "title": "sfp plugin configuration", - "description": "Configuration for sfp plugin", - "additionalProperties": false, - "properties": { - "ignoreFiles": { - "type": "object", - "title": "Ignore Files", - "description": "Map of stages to forceignore filepaths", - "additionalProperties": false, - "properties": { - "prepare": { - "type": "string", - "title": "Prepare stage", - "description": "Path to forceignore for prepare stage" - }, - "validate": { - "type": "string", - "title": "Validate stage", - "description": "Path to forceignore for validate stage" - }, - "quickbuild": { - "type": "string", - "title": "Quickbuild stage", - "description": "Path to forceignore for quickbuild stage" - }, - "build": { - "type": "string", - "title": "Build stage", - "description": "Path to forceignore for build stage" - } - } - }, - "scratchOrgDefFilePaths": { - "type": "object", - "title": "Scratch Org Definition Files", - "description": "Map of packages to scratch org definition files filepaths", - "properties": { - "enableMultiDefinitionFiles": { - "type": "boolean", - "title": "Enable Multi Definition Files", - "description": "Enable multi definition files for different packages" - }, - "packages": { - "type": "object", - "title": "Packages with filepaths", - "description": "Path to scratch org definition for packages" - } - } - }, - "disableEntitlementFilter": { - "title": "Disable Entitlment filter", - "type": "boolean", - "description": "Disable Entitlement filtering in source package,which skips entitlements that are already in the target org", - "default": false - }, - "disableTransitiveDependencyResolver": { - "title": "Disable Transitive Dependency Resolver", - "type": "boolean", - "description": "Enable transitive dependency resolver to fix the missing dependencies through transitive relationship", - "default": false - }, - "externalDependencyMap": { - "title": "Map of external package and its dependencies", - "type": "object", - "description": "Use this map to define dependencies of unlocked packages built elsewhere, This information will be used by sfp while expanding package dependencies", - "patternProperties": { - ".*": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "required": [ - "package" - ], - "properties": { - "package": { - "type": "string" - }, - "versionNumber": { - "type": "string" - } - } - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/BuildBase.ts b/packages/sfpowerscripts-cli/src/BuildBase.ts deleted file mode 100644 index 9f6e40201..000000000 --- a/packages/sfpowerscripts-cli/src/BuildBase.ts +++ /dev/null @@ -1,273 +0,0 @@ -import ArtifactGenerator from './core//artifacts/generators/ArtifactGenerator'; - -import { EOL } from 'os'; -import sfpCommand from './SfpCommand'; -import { Messages } from '@salesforce/core'; -import fs = require('fs'); -import SFPStatsSender from './core/stats/SFPStatsSender'; -import BuildImpl, { BuildProps } from './impl/parallelBuilder/BuildImpl'; -import ProjectConfig from './core/project/ProjectConfig'; -import { Stage } from './impl/Stage'; -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_INFO, - COLOR_TIME, - COLOR_SUCCESS, - COLOR_KEY_MESSAGE, - Logger, - ConsoleLogger, - LoggerLevel, - COLOR_KEY_VALUE, -} from '@flxblio/sfp-logger'; -import getFormattedTime from './core//utils/GetFormattedTime'; -import SfpPackage from './core//package/SfpPackage'; -import ReleaseConfig from './impl/release/ReleaseConfig'; -import { Flags } from '@oclif/core'; -import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from './flags/sfdxflags'; - - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'build'); - -export default abstract class BuildBase extends sfpCommand { - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - protected static requiresProject = true; - - public static flags = { - loglevel, - 'apiversion': orgApiVersionFlagSfdxStyle, - 'devhubalias': targetdevhubusername, - diffcheck: Flags.boolean({ - description: messages.getMessage('diffCheckFlagDescription'), - default: false, - }), - gittag: Flags.boolean({ - description: messages.getMessage('gitTagFlagDescription'), - hidden: true, - deprecated: { - message:'--gittag is deprecated, Please utilize git tags on publish stage', - }, - }), - repourl: Flags.string({ - char: 'r', - description: messages.getMessage('repoUrlFlagDescription'), - }), - configfilepath: Flags.file({ - char: 'f', - description: messages.getMessage('configFilePathFlagDescription'), - default: 'config/project-scratch-def.json', - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - waittime: Flags.integer({ - description: messages.getMessage('waitTimeFlagDescription'), - default: 120, - }), - buildnumber: Flags.integer({ - description: messages.getMessage('buildNumberFlagDescription'), - default: 1, - }), - executorcount: Flags.integer({ - description: messages.getMessage('executorCountFlagDescription'), - default: 5, - }), - branch: Flags.string({ - description: messages.getMessage('branchFlagDescription'), - required: true, - }), - tag: Flags.string({ - description: messages.getMessage('tagFlagDescription'), - }), - releaseconfig: Flags.string({ - description: messages.getMessage('releaseConfigFileFlagDescription'), - }) - }; - - public async execute() { - const {flags} = await this.parse(); - let buildExecResult: { - generatedPackages: SfpPackage[]; - failedPackages: string[]; - }; - let totalElapsedTime: number; - let artifactCreationErrors: string[] = []; - - let tags = { - is_diffcheck_enabled: String(flags.diffcheck), - stage: this.getStage(), - branch: flags.branch, - }; - - try { - const artifactDirectory: string = flags.artifactdir; - const diffcheck: boolean = flags.diffcheck; - const branch: string = flags.branch; - // Read Manifest - let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(this.getStage())}`)); - SFPLogger.log(COLOR_HEADER(`Build Packages Only Changed: ${flags.diffcheck}`)); - if(projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles){ - SFPLogger.log(COLOR_HEADER(`Multiple Config Files Mode: enabled`)); - }else{ - SFPLogger.log(COLOR_HEADER(`Config File Path: ${flags.configfilepath}`)); - } - SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${flags.artifactdir}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - let executionStartTime = Date.now(); - - - if (!(flags.tag == null || flags.tag == undefined)) { - tags['tag'] = flags.tag; - } - - - - SFPStatsSender.logCount('build.scheduled', tags); - - let buildProps = this.getBuildProps(); - - //Filter Build Props by ReleaseConfig - buildProps = this.includeOnlyPackagesAsPerReleaseConfig(flags.releaseconfig, buildProps, new ConsoleLogger()); - buildExecResult = await this.getBuildImplementer(buildProps).exec(); - - if ( - diffcheck && - buildExecResult.generatedPackages.length === 0 && - buildExecResult.failedPackages.length === 0 - ) { - SFPLogger.log(`${EOL}${EOL}`); - SFPLogger.log(COLOR_INFO('No packages found to be built.. Exiting.. ')); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - return; - } - - SFPLogger.log(`${EOL}${EOL}`); - SFPLogger.log('Generating Artifacts and Tags....'); - - for (let generatedPackage of buildExecResult.generatedPackages) { - try { - await ArtifactGenerator.generateArtifact(generatedPackage, process.cwd(), artifactDirectory); - } catch (error) { - SFPLogger.log(error.message); - artifactCreationErrors.push(generatedPackage.packageName); - } - } - - totalElapsedTime = Date.now() - executionStartTime; - - if (artifactCreationErrors.length > 0 || buildExecResult.failedPackages.length > 0) - throw new Error('Build Failed'); - - SFPStatsSender.logGauge('build.duration', Date.now() - executionStartTime, tags); - - SFPStatsSender.logCount('build.succeeded', tags); - } catch (error) { - SFPStatsSender.logCount('build.failed', tags); - SFPLogger.log(COLOR_ERROR(error)); - process.exitCode = 1; - } finally { - if (buildExecResult?.generatedPackages?.length > 0 || buildExecResult?.failedPackages?.length > 0) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `${buildExecResult.generatedPackages.length} packages created in ${COLOR_TIME( - getFormattedTime(totalElapsedTime) - )} minutes with ${COLOR_ERROR(buildExecResult.failedPackages.length)} errors` - ) - ); - - if (buildExecResult.failedPackages.length > 0) - SFPLogger.log(COLOR_ERROR(`Packages Failed To Build`, buildExecResult.failedPackages)); - - if (artifactCreationErrors.length > 0) - SFPLogger.log(COLOR_ERROR(`Failed To Create Artifacts`, artifactCreationErrors)); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - const buildResult: BuildResult = { - packages: [], - summary: { - scheduled_packages: null, - elapsed_time: null, - succeeded: null, - failed: null, - }, - }; - - for (let generatedPackage of buildExecResult.generatedPackages) { - buildResult['packages'].push({ - name: generatedPackage['packageName'], - version: generatedPackage['package_version_number'], - elapsed_time: generatedPackage['creation_details']?.creation_time, - status: 'succeeded', - }); - } - - for (let failedPackage of buildExecResult.failedPackages) { - buildResult['packages'].push({ - name: failedPackage, - version: null, - elapsed_time: null, - status: 'failed', - }); - } - - buildResult['summary'].scheduled_packages = - buildExecResult.generatedPackages.length + buildExecResult.failedPackages.length; - buildResult['summary'].elapsed_time = totalElapsedTime; - buildResult['summary'].succeeded = buildExecResult.generatedPackages.length; - buildResult['summary'].failed = buildExecResult.failedPackages.length; - - fs.writeFileSync(`buildResult.json`, JSON.stringify(buildResult, null, 4)); - } - } - } - - private includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { - if (releaseConfigFilePath) { - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); - buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); - printIncludeOnlyPackages(buildProps.includeOnlyPackages); - } - return buildProps; - - - function printIncludeOnlyPackages(includeOnlyPackages: string[]) { - SFPLogger.log( - COLOR_KEY_MESSAGE(`Build will include the below packages as per inclusive filter`), - LoggerLevel.INFO - ); - SFPLogger.log(COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), LoggerLevel.INFO); - } - } - - abstract getBuildProps(): BuildProps; - - abstract getStage(): Stage; - - abstract getBuildImplementer(buildProps:BuildProps): BuildImpl; -} - -interface BuildResult { - packages: { - name: string; - version: string; - elapsed_time: number; - status: string; - }[]; - summary: { - scheduled_packages: number; - elapsed_time: number; - succeeded: number; - failed: number; - }; -} diff --git a/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts b/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts deleted file mode 100644 index 51c4fc53b..000000000 --- a/packages/sfpowerscripts-cli/src/InstallPackageCommand.ts +++ /dev/null @@ -1,91 +0,0 @@ -import sfpCommand from './SfpCommand'; -import { Messages } from '@salesforce/core'; -import ArtifactFetcher, { Artifact } from './core//artifacts/ArtifactFetcher'; -import * as rimraf from 'rimraf'; -import SfpPackage from './core//package/SfpPackage'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import SfpPackageBuilder from './core//package/SfpPackageBuilder'; -import SFPOrg from './core//org/SFPOrg'; -import { Flags } from '@oclif/core'; -import { requiredUserNameFlag } from './flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'install_package_command'); - -/** - * Base class providing common functionality for package installation - * - * @extends sfpCommand - */ -export default abstract class InstallPackageCommand extends sfpCommand { - protected sfpPackage: SfpPackage; - protected sfpOrg: SFPOrg; - /** - * Flags that are common/required on all package installation commands - */ - public static flags = { - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - required: true, - }), - targetorg: requiredUserNameFlag, - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - }; - - protected artifact: Artifact; - - /** - * Procedures unique to the type of package installation - */ - abstract install(): Promise; - - /** - * Entry point for package installation commands - * - */ - async execute(): Promise { - await this.preInstall(); - - await this.install(); - - this.postInstall(); - } - - /** - * Procedures common to all install commands, and to be run BEFORE - * the primary install - */ - private async preInstall(): Promise { - let artifacts = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir, this.flags.package, null); - if (artifacts.length === 0) { - if (!this.flags.skiponmissingartifact) { - throw new Error( - `${this.flags.package} artifact not found at ${this.flags.artifactdir}...Please check the inputs` - ); - } else if (this.flags.skiponmissingartifact) { - console.log( - `Skipping task as artifact is missing, and 'SkipOnMissingArtifact' ${this.flags.skiponmissingartifact}` - ); - process.exit(0); - } - } else this.artifact = artifacts[0]; - - this.sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(this.artifact, new ConsoleLogger()); - - //Create SfP Org - this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); - } - - /** - * Procedures common to all install commands, and to be run AFTER - * the primary install - */ - private postInstall(): void { - // Delete temp directory containing unzipped artifacts - rimraf.sync('.sfp/unzippedArtifacts'); - } -} diff --git a/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts b/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts deleted file mode 100644 index f46a182f1..000000000 --- a/packages/sfpowerscripts-cli/src/PackageCreateCommand.ts +++ /dev/null @@ -1,198 +0,0 @@ -import ArtifactGenerator from './core//artifacts/generators/ArtifactGenerator'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; -import PackageDiffImpl from './core//package/diff/PackageDiffImpl'; -import { Messages } from '@salesforce/core'; -import { EOL } from 'os'; -import sfpCommand from './SfpCommand'; -import SfpPackage, { PackageType } from './core//package/SfpPackage'; -import getFormattedTime from './core//utils/GetFormattedTime'; -const fs = require('fs-extra'); -import Git from './core//git/Git'; -import { Flags } from '@oclif/core'; -import { loglevel } from './flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'create-package'); - -export default abstract class PackageCreateCommand extends sfpCommand { - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - protected static requiresProject = true; - - public static flags = { - package: Flags.string({ - required: true, - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - diffcheck: Flags.boolean({ - description: messages.getMessage('diffCheckFlagDescription'), - }), - gittag: Flags.boolean({ - description: messages.getMessage('gitTagFlagDescription'), - }), - repourl: Flags.string({ - char: 'r', - description: messages.getMessage('repoUrlFlagDescription'), - }), - versionnumber: Flags.string({ - description: messages.getMessage('versionNumberFlagDescription'), - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - branch: Flags.string({ - description: messages.getMessage('branchFlagDescription'), - }), - refname: Flags.string({ - description: messages.getMessage('refNameFlagDescription'), - }), - loglevel - }; - - protected sfdxPackage: string; - protected versionNumber: string; - protected artifactDirectory: string; - protected refname: string; - protected branch: string; - protected commitId: string; - protected repositoryURL: string; - - /** - * Entry point for package installation commands - * - */ - async execute(): Promise { - let isToCreatePackage = await this.preCreate(); - if (isToCreatePackage) { - try { - let packageMetadata = await this.create(); - await this.postCreate(packageMetadata); - } catch (err) { - console.log(err); - process.exit(1); - } - } - } - - private async preCreate(): Promise { - this.sfdxPackage = this.flags.package; - this.versionNumber = this.flags.versionnumber; - this.artifactDirectory = this.flags.artifactdir; - this.refname = this.flags.refname; - this.branch = this.flags.branch; - - if (this.hubOrg) await this.hubOrg.refreshAuth(); - - let isToRunBuild; - - if (this.flags.diffcheck) { - let packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), this.sfdxPackage, null); - - let isToRunBuild = (await packageDiffImpl.exec()).isToBeBuilt; - - if (isToRunBuild) console.log(`Detected changes to ${this.sfdxPackage} package...proceeding\n`); - else console.log(`No changes detected for ${this.sfdxPackage} package...skipping\n`); - } else isToRunBuild = true; - - if (isToRunBuild) { - let git = await Git.initiateRepo(new ConsoleLogger()); - this.repositoryURL = await git.getRemoteOriginUrl(this.flags.repourl); - this.commitId = await git.getHeadCommit(); - } - return isToRunBuild; - } - - protected abstract getConfigFilePath(): string; - - protected abstract create(): Promise; - - private async postCreate(sfpPackage: SfpPackage) { - this.printPackageDetails(sfpPackage); - - if (this.flags.gittag) { - - let git = await Git.initiateRepo(new ConsoleLogger()); - let tagname = `${this.sfdxPackage}_v${sfpPackage.package_version_number}`; - await git.addAnnotatedTag(tagname, `${sfpPackage.packageName} sfp package ${sfpPackage.package_version_number}`) - - sfpPackage.tag = tagname; - } - - //Generate Artifact - let artifactFilepath: string = await ArtifactGenerator.generateArtifact( - sfpPackage, - process.cwd(), - this.artifactDirectory - ); - - this.generateEnvironmentVariables(artifactFilepath, sfpPackage); - } - - private generateEnvironmentVariables(artifactFilepath: string, sfpPackage: SfpPackage) { - let prefix = 'sfp'; - if (this.refname != null) prefix = `${this.refname}_${prefix}`; - - console.log('\nOutput variables:'); - - fs.writeFileSync('.env', `${prefix}_artifact_directory=${artifactFilepath}\n`, { flag: 'a' }); - console.log(`${prefix}_artifact_directory=${artifactFilepath}`); - fs.writeFileSync('.env', `${prefix}_package_version_number=${sfpPackage.package_version_number}\n`, { - flag: 'a', - }); - console.log(`${prefix}_package_version_number=${sfpPackage.package_version_number}`); - - if (sfpPackage.package_version_id) { - fs.writeFileSync('.env', `${prefix}_package_version_id=${sfpPackage.package_version_id}\n`, { - flag: 'a', - }); - console.log(`${prefix}_package_version_id=${sfpPackage.package_version_id}`); - } - } - - protected printPackageDetails(sfpPackage: SfpPackage) { - console.log( - COLOR_HEADER( - `${EOL}${sfpPackage.packageName} package created in ${getFormattedTime( - sfpPackage.creation_details.creation_time - )}` - ) - ); - console.log(COLOR_HEADER(`-- Package Details:--`)); - console.log( - COLOR_HEADER(`-- Package Version Number: `), - COLOR_KEY_MESSAGE(sfpPackage.package_version_number) - ); - - if (sfpPackage.package_type !== PackageType.Data) { - if (sfpPackage.package_type == PackageType.Unlocked) { - if (sfpPackage.package_version_id) - console.log( - COLOR_HEADER(`-- Package Version Id: `), - COLOR_KEY_MESSAGE(sfpPackage.package_version_id) - ); - if (sfpPackage.test_coverage) - console.log( - COLOR_HEADER(`-- Package Test Coverage: `), - COLOR_KEY_MESSAGE(sfpPackage.test_coverage) - ); - if (sfpPackage.has_passed_coverage_check) - console.log( - COLOR_HEADER(`-- Package Coverage Check Passed: `), - COLOR_KEY_MESSAGE(sfpPackage.has_passed_coverage_check) - ); - } - - console.log( - COLOR_HEADER(`-- Apex In Package: `), - COLOR_KEY_MESSAGE(sfpPackage.isApexFound ? 'Yes' : 'No') - ); - console.log( - COLOR_HEADER(`-- Profiles In Package: `), - COLOR_KEY_MESSAGE(sfpPackage.isProfilesFound ? 'Yes' : 'No') - ); - console.log(COLOR_HEADER(`-- Metadata Count: `), COLOR_KEY_MESSAGE(sfpPackage.metadataCount)); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/ProjectValidation.ts b/packages/sfpowerscripts-cli/src/ProjectValidation.ts deleted file mode 100644 index 3ba631ec2..000000000 --- a/packages/sfpowerscripts-cli/src/ProjectValidation.ts +++ /dev/null @@ -1,87 +0,0 @@ -import ProjectConfig from './core/project/ProjectConfig'; -import Ajv from 'ajv'; -import path = require('path'); -import * as fs from 'fs-extra'; -import { PackageType } from './core//package/SfpPackage'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; - -export default class ProjectValidation { - private readonly projectConfig; - private ajv: Ajv; - resourcesDir: string; - - constructor() { - this.projectConfig = ProjectConfig.getSFDXProjectConfig(null); - this.ajv = new Ajv({ allErrors: true }); - this.resourcesDir = path.join(__dirname, '..', 'resources', 'schemas'); - } - - public validateSFDXProjectJSON() { - let schema = fs.readJSONSync(path.join(this.resourcesDir, `sfdx-project.schema.json`), { encoding: 'UTF-8' }); - let validator = this.ajv.compile(schema); - let isSchemaValid = validator(this.projectConfig); - if (!isSchemaValid) { - let errorMsg: string = `The sfdx-project.json is invalid, Please fix the following errors\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - - SFPLogger.log(`The following attributes are not recognized by sfp, You might need to remove them`,LoggerLevel.WARN) - SFPLogger.log(errorMsg, LoggerLevel.WARN); - } - } - - public validatePackageNames() { - ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => { - let name = pkg.package; - if ( name.length > 38) { - throw new Error( - 'sfdx-project.json validation failed for package "' + - pkg['package'] + - '".' + - `Package name exceed maximum length of 38 characters.` - ) - }else if( name.match(/^[a-zA-Z0-9-._~]+$/) === null ){ - throw new Error( - 'sfdx-project.json validation failed for package "' + - pkg['package'] + - '".' + - `Package names can only contain alphanumeric characters and the symbols - . _ ~.` - ) - } - }); - } - - - public validatePackageBuildNumbers() { - ProjectConfig.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => { - let packageType = ProjectConfig.getPackageType(this.projectConfig, pkg.package); - - let pattern: RegExp = /NEXT$|LATEST$/i; - if ( - pkg.versionNumber.match(pattern) && - (packageType === PackageType.Source || packageType === PackageType.Data) - ) { - throw new Error( - 'sfdx-project.json validation failed for package "' + - pkg['package'] + - '".' + - ' Build-number keywords "NEXT" & "LATEST" are not supported for ' + - packageType + - ' packages.' + - '\nTry the following:' + - '\n - If package should be built as a ' + - packageType + - ' package, use 0 instead of NEXT/LATEST' + - '\n - If package should be built as an Unlocked package, ensure the package has been created in the Devhub and the ID included in packageAliases of sfdx-project.json' - ); - } - }); - } -} diff --git a/packages/sfpowerscripts-cli/src/SfpCommand.ts b/packages/sfpowerscripts-cli/src/SfpCommand.ts deleted file mode 100644 index cff888a9a..000000000 --- a/packages/sfpowerscripts-cli/src/SfpCommand.ts +++ /dev/null @@ -1,177 +0,0 @@ -import SFPStatsSender from './core/stats/SFPStatsSender'; -import * as rimraf from 'rimraf'; -import ProjectValidation from './ProjectValidation'; -import SFPLogger, { COLOR_HEADER, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import GroupConsoleLogs from './ui/GroupConsoleLogs'; -import { Command, Flags, ux } from '@oclif/core'; -import { FlagOutput } from '@oclif/core/lib/interfaces/parser'; -import { Org } from '@salesforce/core'; - - -/** - * A base class that provides common funtionality for sfp commands - * - * @extends SfdxCommand - */ -export default abstract class sfpCommand extends Command { - - protected static requiresProject: boolean; - - protected hubOrg:Org; - protected org:Org; - public flags: FlagOutput & { json: boolean; }; - - - private isSfpowerkitFound: boolean; - private sfpConfig; - private isSfdmuFound: boolean; - protected static requiresUsername: boolean=false; - protected static requiresDevhubUsername: boolean=false; - - - /** - * Command run code goes here - */ - abstract execute(): Promise; - - /** - * Entry point of all commands - */ - async run(): Promise { - //Always enable color by default - if (process.env.sfp_NOCOLOR) SFPLogger.disableColor(); - else SFPLogger.enableColor(); - - - - this.flags = (await this.parse()).flags; - - if(this.statics.flags.targetusername && this.statics.requiresUsername) - { - this.org = await Org.create({aliasOrUsername:this.flags.targetusername}); - } - - - if(this.statics.flags.targetdevhubusername && this.statics.requiresDevhubUsername) - { - this.hubOrg = await Org.create({aliasOrUsername:this.flags.targetdevhubusername}); - } - - - this.setLogLevel(this.flags); - if (this.statics.flags.logsgroupsymbol) { - GroupConsoleLogs.setLogGroupsSymbol(this.flags.logsgroupsymbol); - } - - - // Setting the environment variable for disabling sfpowerkit header - - if (SFPLogger.logLevel > LoggerLevel.DEBUG) process.env.SFPOWERKIT_NOHEADER = 'true'; - - //Set Query Limit to max - process.env.SF_ORG_MAX_QUERY_LIMIT = '50000'; - - - this.validateFlags(); - - - - //Clear temp directory before every run - rimraf.sync('.sfp'); - - - //Initialise StatsD - this.initializeStatsD(); - - - if (!this.jsonEnabled()) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_HEADER( - `sfp -- The DX@Scale CLI -Version:${this.config.version} -Release:${this.config.pjson.release}` - ) - ); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - else - { - //Disable pretty printing in json mode - const chalk = require('chalk') - chalk.level = 0; - } - - if (this.statics.requiresProject) { - let projectValidation = new ProjectValidation(); - projectValidation.validateSFDXProjectJSON(); - projectValidation.validatePackageNames(); - } - - - // Execute command run code - return await this.execute(); - } - - /** - * Optional method for programmatically validating flags. - * Useful for complex flag behaviours that cannot be adequately defined using flag props - * e.g. making a flag required only if another flag that it depends on is passed - */ - protected validateFlags(): void { } - - - private initializeStatsD() { - if (process.env.sfp_STATSD) { - SFPStatsSender.initialize( - process.env.sfp_STATSD_PORT, - process.env.sfp_STATSD_HOST, - process.env.sfp_STATSD_PROTOCOL - ); - } - if (process.env.sfp_DATADOG) { - SFPStatsSender.initializeNativeMetrics( - 'DataDog', - process.env.sfp_DATADOG_HOST, - process.env.sfp_DATADOG_API_KEY, - new ConsoleLogger() - ); - } else if (process.env.sfp_NEWRELIC) { - SFPStatsSender.initializeNativeMetrics( - 'NewRelic', - null, - process.env.sfp_NEWRELIC_API_KEY, - new ConsoleLogger() - ); - } else if (process.env.sfp_SPLUNK) { - SFPStatsSender.initializeNativeMetrics( - 'Splunk', - process.env.sfp_SPLUNK_HOST, - process.env.sfp_SPLUNK_API_KEY, - new ConsoleLogger() - ); - } - - SFPStatsSender.initializeLogBasedMetrics(); - } - - private setLogLevel(flags:FlagOutput) { - if (flags.loglevel === 'trace' || flags.loglevel === 'TRACE') SFPLogger.logLevel = LoggerLevel.TRACE; - else if (flags.loglevel === 'debug' || flags.loglevel === 'DEBUG') - SFPLogger.logLevel = LoggerLevel.DEBUG; - else if (flags.loglevel === 'info' || flags.loglevel === 'INFO') - SFPLogger.logLevel = LoggerLevel.INFO; - else if (flags.loglevel === 'warn' || flags.loglevel === 'WARN') - SFPLogger.logLevel = LoggerLevel.WARN; - else if (flags.loglevel === 'error' || flags.loglevel === 'ERROR') - SFPLogger.logLevel = LoggerLevel.ERROR; - else if (flags.loglevel === 'fatal' || flags.loglevel === 'FATAL') - SFPLogger.logLevel = LoggerLevel.FATAL; - else SFPLogger.logLevel = LoggerLevel.INFO; - } - - - protected get statics(): typeof sfpCommand { - return this.constructor as typeof sfpCommand; - } - -} diff --git a/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts b/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts deleted file mode 100644 index 53e600e87..000000000 --- a/packages/sfpowerscripts-cli/src/commands/apextests/trigger.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { - RunAllTestsInOrg, - RunApexTestSuitesOption, - RunLocalTests, - RunSpecifiedTestsOption, - TestLevel, - TestOptions, - RunAllTestsInPackageOptions, -} from '../../core/apextest/TestOptions'; -import TriggerApexTests from '../../core/apextest/TriggerApexTests'; -import sfpCommand from '../../SfpCommand'; -import { Messages } from '@salesforce/core'; -import SfpPackage from '../../core/package/SfpPackage'; - -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { CoverageOptions } from '../../core/apex/coverage/IndividualClassCoverage'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import { PackageType } from '../../core/package/SfpPackage'; -import { Flags } from '@oclif/core'; -import { loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; -const path = require('path'); - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'trigger_apex_test'); - -export default class TriggerApexTest extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp apextests:trigger -u scratchorg -l RunLocalTests -s`, - `$ sfp apextests:trigger -u scratchorg -l RunAllTestsInPackage -n -c`, - ]; - - public static flags = { - loglevel, - 'apiversion': orgApiVersionFlagSfdxStyle, - 'targetusername': requiredUserNameFlag, - testlevel: Flags.string({ - char: 'l', - description: messages.getMessage('testLevelFlagDescription'), - options: [ - 'RunSpecifiedTests', - 'RunApexTestSuite', - 'RunLocalTests', - 'RunAllTestsInOrg', - 'RunAllTestsInPackage', - ], - default: 'RunLocalTests', - }), - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - required: false, - }), - validateindividualclasscoverage: Flags.boolean({ - char: 'c', - description: messages.getMessage('validateIndividualClassCoverageFlagDescription'), - default: false, - }), - validatepackagecoverage: Flags.boolean({ - description: messages.getMessage('validatePackageCoverageFlagDescription'), - default: false, - }), - specifiedtests: Flags.string({ - description: messages.getMessage('specifiedTestsFlagDescription'), - }), - apextestsuite: Flags.string({ - description: messages.getMessage('apexTestSuiteFlagDescription'), - }), - coveragepercent: Flags.integer({ - char: 'p', - description: messages.getMessage('coveragePercentFlagDescription'), - default: 75, - }), - waittime: Flags.integer({ - char: 'w', - description: messages.getMessage('waitTimeFlagDescription'), - default: 60, - }), - }; - - public async execute() { - try { - - let testOptions: TestOptions; - let coverageOptions: CoverageOptions; - let outputdir = path.join('.testresults'); - - if (this.flags.testlevel === TestLevel.RunAllTestsInOrg.toString()) { - testOptions = new RunAllTestsInOrg(this.flags.waittime, outputdir, this.flags.synchronous); - } else if (this.flags.testlevel === TestLevel.RunAllTestsInPackage.toString()) { - if (this.flags.package === null) { - throw new Error('Package name must be specified when test level is RunAllTestsInPackage'); - } - let pkg: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - new ConsoleLogger(), - null, - this.flags.package, - { - overridePackageTypeWith: PackageType.Source, - } - ); - testOptions = new RunAllTestsInPackageOptions(pkg, this.flags.waittime, outputdir); - } else if (this.flags.testlevel === TestLevel.RunApexTestSuite.toString()) { - testOptions = new RunApexTestSuitesOption( - this.flags.waittime, - outputdir, - this.flags.apextestsuite, - this.flags.synchronous - ); - } else if (this.flags.testlevel === TestLevel.RunLocalTests.toString()) { - testOptions = new RunLocalTests(this.flags.waittime, outputdir, this.flags.synchronous); - } else if (this.flags.testlevel === TestLevel.RunSpecifiedTests.toString()) { - testOptions = new RunSpecifiedTestsOption( - this.flags.waittime, - outputdir, - this.flags.specifiedtests, - this.flags.synchronous - ); - } else { - throw new Error('Unimplemented Option, please check the option'); - } - - if ( - (this.flags.validateindividualclasscoverage || this.flags.validatepackagecoverage) && - this.flags.testlevel !== TestLevel.RunAllTestsInPackage.toString() - ) { - throw new Error('Code coverage validation is only available for test level RunAllTestsInPackage'); - } else { - coverageOptions = { - isPackageCoverageToBeValidated: this.flags.validatepackagecoverage, - isIndividualClassCoverageToBeValidated: this.flags.validateindividualclasscoverage, - coverageThreshold: this.flags.coveragepercent, - }; - } - - - const triggerApexTests: TriggerApexTests = new TriggerApexTests( - this.flags.targetusername, - testOptions, - coverageOptions, - null, - null - ); - let result = await triggerApexTests.exec(); - - if (!result.result) { - throw new Error(`Error: ${result.message}`); - } else { - console.log(`\n ${result.message ? result.message : ''}`); - } - } catch (err) { - console.log('\n'); - console.error(err.message); - process.exitCode = 1; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts b/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts deleted file mode 100644 index 1a8854edd..000000000 --- a/packages/sfpowerscripts-cli/src/commands/artifacts/fetch.ts +++ /dev/null @@ -1,109 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { LoggerLevel, Messages } from '@salesforce/core'; -import FetchImpl, { ArtifactVersion } from '../../impl/artifacts/FetchImpl'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; -import FetchArtifactsError from '../../impl/artifacts/FetchArtifactsError'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; -import SFPLogger from '@flxblio/sfp-logger'; -import { COLOR_HEADER } from '@flxblio/sfp-logger'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'fetch'); - -export default class Fetch extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp artifacts:fetch -p myreleasedefinition.yaml -f myscript.sh`, - `$ sfp artifacts:fetch -p myreleasedefinition.yaml --npm --scope myscope --npmrcpath path/to/.npmrc`, - ]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - - public static flags = { - releasedefinition: Flags.file({ - char: 'p', - description: messages.getMessage('releaseDefinitionFlagDescription'), - }), - artifactdir: Flags.directory({ - required: true, - char: 'd', - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - scriptpath: Flags.file({ - char: 'f', - description: messages.getMessage('scriptPathFlagDescription'), - }), - npm: Flags.boolean({ - description: messages.getMessage('npmFlagDescription'), - exclusive: ['scriptpath'], - }), - scope: Flags.string({ - description: messages.getMessage('scopeFlagDescription'), - dependsOn: ['npm'], - parse: async (scope) => scope.replace(/@/g, '').toLowerCase() - }), - npmrcpath: Flags.file({ - description: messages.getMessage('npmrcPathFlagDescription'), - dependsOn: ['npm'], - required: false, - }), - loglevel - }; - - public async execute() { - this.validateFlags(); - - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(this.flags.releasedefinition)).releaseDefinition; - let result: { - success: ArtifactVersion[]; - failed: ArtifactVersion[]; - }; - - let executionStartTime = Date.now(); - try { - let fetchImpl: FetchImpl = new FetchImpl( - this.flags.artifactdir, - this.flags.scriptpath, - this.flags.scope, - this.flags.npmrcpath, - new ConsoleLogger() - ); - - result = await fetchImpl.fetchArtifacts([releaseDefinition]); - } catch (err) { - if (err instanceof FetchArtifactsError) { - result = err.data; - } else { - console.log(err.message); - } - - process.exitCode = 1; - } finally { - let totalElapsedTime: number = Date.now() - executionStartTime; - - if (result) this.printSummary(result, totalElapsedTime); - } - } - - private printSummary( - result: { success: ArtifactVersion[]; failed:ArtifactVersion[] }, - totalElapsedTime: number - ) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log(`Fetched ${result.success.length} artifacts`); - - if (result.failed.length > 0) console.log(`Failed to fetch ${result.failed.length} artifacts`); - - SFPLogger.log(`Elapsed Time: ${new Date(totalElapsedTime).toISOString().substr(11, 8)}`); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - - protected validateFlags() { - if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts b/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts deleted file mode 100644 index 7c0ed8ba7..000000000 --- a/packages/sfpowerscripts-cli/src/commands/artifacts/query.ts +++ /dev/null @@ -1,57 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { LoggerLevel, Messages } from '@salesforce/core'; -import SFPOrg from '../../core/org/SFPOrg'; -import SFPLogger, { ConsoleLogger } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; -const Table = require('cli-table'); - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'artifacts_query'); - -export default class Query extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp artifacts:query -u `]; - public static enableJsonFlag = true - protected static requiresUsername = true; - protected static requiresDevhubUsername = false; - - public static flags = { - loglevel, - 'targetusername': requiredUserNameFlag, - }; - - public async execute() { - await this.org.refreshAuth(); - - let sfpOrg: SFPOrg = await SFPOrg.create({ connection: this.org.getConnection() }); - let installedArtifacts = await sfpOrg.getAllInstalledArtifacts(); - if (!this.flags.json) { - let minTable = new Table({ - head: [ - 'Package', - 'Version in org', - 'Commmit Id', - 'Subcriber Version', - 'Type', - 'Is sfp Installed', - ], - chars: ZERO_BORDER_TABLE - }); - installedArtifacts.forEach((installedArtifact) => { - minTable.push([ - installedArtifact.name, - installedArtifact.version, - installedArtifact.commitId.substring(0,8), - installedArtifact.subscriberVersion, - installedArtifact.type, - installedArtifact.isInstalledBysfp, - ]); - }); - SFPLogger.log(minTable.toString(), LoggerLevel.INFO, new ConsoleLogger()); - } else { - return installedArtifacts; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts b/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts deleted file mode 100644 index bc94d8ce8..000000000 --- a/packages/sfpowerscripts-cli/src/commands/changelog/generate.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; -import sfpCommand from '../../SfpCommand'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'generate_changelog'); - -export default class GenerateChangelog extends sfpCommand { - - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp changelog:generate -n -d path/to/artifact/directory -w -r -b `, - ]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - - public static flags = { - limit: Flags.integer({ - description: messages.getMessage('limitFlagDescription'), - }), - artifactdir: Flags.directory({ - required: true, - char: 'd', - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - releasename: Flags.string({ - required: true, - char: 'n', - description: messages.getMessage('releaseNameFlagDescription'), - }), - workitemfilter: Flags.string({ - required: true, - char: 'w', - description: messages.getMessage('workItemFilterFlagDescription'), - }), - workitemurl: Flags.string({ - required: false, - description: messages.getMessage('workItemUrlFlagDescription'), - }), - repourl: Flags.string({ - required: false, - char: 'r', - description: messages.getMessage('repoUrlFlagDescription'), - deprecated: {message:'--repourl has been deprecated'} - }), - directory: Flags.string({ - required: false, - description: messages.getMessage('directoryFlagDescription'), - }), - branchname: Flags.string({ - required: true, - char: 'b', - description: messages.getMessage('branchNameFlagDescription'), - }), - nopush: Flags.boolean({ - description: messages.getMessage('noPushFlagDescription'), - dependsOn: ['branchname'], - default: false - }), - showallartifacts: Flags.boolean({ - required: false, - description: messages.getMessage('showAllArtifactsFlagDescription'), - }), - forcepush: Flags.boolean({ - description: messages.getMessage('forcePushFlagDescription'), - hidden: true, - default: false, - }), - loglevel, - }; - - async execute() { - try { - let changelogImpl: ChangelogImpl = new ChangelogImpl( - new ConsoleLogger(), - this.flags.artifactdir, - this.flags.releasename, - this.flags.workitemfilter.split(':'), - this.flags.limit, - this.flags.workitemurl, - this.flags.showallartifacts, - this.flags.directory, - this.flags.forcepush, - this.flags.branchname, - this.flags.nopush, - null - ); - - await changelogImpl.exec(); - } catch (err) { - let errorMessage: string = ''; - if (err instanceof Array) { - for (let e of err) { - errorMessage += e.message + `\n`; - } - } else { - errorMessage = err.message; - } - console.log(errorMessage); - - process.exit(1); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts b/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts deleted file mode 100644 index 87070e906..000000000 --- a/packages/sfpowerscripts-cli/src/commands/dependency/expand.ts +++ /dev/null @@ -1,74 +0,0 @@ -import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -import path = require('path'); -import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; -import { Flags } from '@oclif/core'; -import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_expand'); - -export default class Expand extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - - protected static requiresDevhubUsername = true; - protected static requiresProject = true; - - public static flags = { - targetdevhubusername, - overwrite: Flags.boolean({ - char: 'o', - description: messages.getMessage('overWriteProjectConfigFlagDescription'), - default: false, - }), - loglevel - }; - - public async execute() { - let defaultProjectConfigPath = './project-config'; - let projectConfigFilePath: string; - try { - //Validate dependencies in sfdx-project.json // Read Manifest - let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); - const transitiveDependencyResolver = new TransitiveDependencyResolver( - projectConfig - ); - - - let resolvedDependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies(); - projectConfig = await ProjectConfig.updateProjectConfigWithDependencies(projectConfig,resolvedDependencyMap); - projectConfig = await (new UserDefinedExternalDependency()).addDependencyEntries(projectConfig, this.hubOrg.getConnection()); - - //Clean up temp directory - if (!fs.existsSync(defaultProjectConfigPath)) fs.mkdirpSync(defaultProjectConfigPath); - - if(this.flags.overwrite){ - SFPLogger.log(`Overwriting sfdx-project.json with expanded project config file`,LoggerLevel.INFO) - projectConfigFilePath = `sfdx-project.json`; - - let backupFilePath: string = path.join(defaultProjectConfigPath, `sfdx-project.json.bak`); - SFPLogger.log(`Saving a backup to ${backupFilePath}`,LoggerLevel.INFO) - fs.copySync(projectConfigFilePath, backupFilePath); - - fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); - SFPLogger.log('sfdx-project.json has been updated.',LoggerLevel.INFO) - }else{ - projectConfigFilePath = path.join(defaultProjectConfigPath, `sfdx-project.exp.json`); - fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); - SFPLogger.log(`Generated project config file has been saved to ${projectConfigFilePath}`,LoggerLevel.INFO) - } - - } catch (error) { - throw new Error('Unable to generate project config file:' + error); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/install.ts b/packages/sfpowerscripts-cli/src/commands/dependency/install.ts deleted file mode 100644 index 9d275a225..000000000 --- a/packages/sfpowerscripts-cli/src/commands/dependency/install.ts +++ /dev/null @@ -1,67 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { Messages } from '@salesforce/core'; -import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; -import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; -import SFPOrg from '../../core/org/SFPOrg'; -import { Flags } from '@oclif/core'; -import { loglevel, targetdevhubusername, requiredUserNameFlag } from '../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_install'); - -export default class Install extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - protected static requiresUsername = true; - protected static requiresDevhubUsername = true; - protected static requiresProject = true; - - public static flags = { - 'targetusername': requiredUserNameFlag, - targetdevhubusername, - installationkeys: Flags.string({ - char: 'k', - required: false, - description: messages.getMessage('installationkeysFlagDescription'), - }), - loglevel - }; - - public async execute(): Promise { - // this.org is guaranteed because requiresUsername=true, as opposed to supportsUsername - const username = this.org.getUsername(); - - //Resolve external package dependencies - let externalPackageResolver = new ExternalPackage2DependencyResolver( - this.hubOrg.getConnection(), - ProjectConfig.getSFDXProjectConfig(null), - this.flags.installationkeys - ); - let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); - - SFPLogger.log( - `Installing external package dependencies of this project in ${username}`, - LoggerLevel.INFO, - new ConsoleLogger() - ); - //Display resolved dependenencies - let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, new ConsoleLogger()); - externalDependencyDisplayer.display(); - - let packageCollectionInstaller = new InstallUnlockedPackageCollection( - await SFPOrg.create({ aliasOrUsername: username }), - new ConsoleLogger() - ); - await packageCollectionInstaller.install(externalPackage2s, true, true); - - SFPLogger.log( - COLOR_KEY_MESSAGE(`Successfully completed external dependencies of this ${username} in ${username}`) - ); - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts b/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts deleted file mode 100644 index c6aa0ced2..000000000 --- a/packages/sfpowerscripts-cli/src/commands/dependency/shrink.ts +++ /dev/null @@ -1,69 +0,0 @@ -import ShrinkImpl from '../../impl/dependency/ShrinkImpl'; -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import * as fs from 'fs-extra'; -import path = require('path'); -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; - - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_shrink'); - -export default class Shrink extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - protected static requiresProject = true; - - public static flags = { - overwrite: Flags.boolean({ - char: 'o', - description: messages.getMessage('overWriteProjectConfigFlagDescription'), - default: false, - }), - targetdevhubusername, - loglevel - }; - - public async execute() { - let defaultProjectConfigPath = './project-config'; - let projectConfigFilePath: string; - try { - //Validate dependencies in sfdx-project.json // Read Manifest - let projectConfig = ProjectConfig.getSFDXProjectConfig(process.cwd()); - const shrinkImpl = new ShrinkImpl( - this.hubOrg.getConnection(), - ); - projectConfig = await shrinkImpl.shrinkDependencies(projectConfig); - - //Create temp directory if not exist - if (!fs.existsSync(defaultProjectConfigPath)) fs.mkdirpSync(defaultProjectConfigPath); - - if(this.flags.overwrite){ - SFPLogger.log(`Overwriting sfdx-project.json with shrunk project config file`,LoggerLevel.INFO) - projectConfigFilePath = `sfdx-project.json`; - - let backupFilePath: string = path.join(defaultProjectConfigPath, `sfdx-project.json.bak`); - SFPLogger.log(`Saving a backup to ${backupFilePath}`,LoggerLevel.INFO) - fs.copySync(projectConfigFilePath, backupFilePath); - - fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); - SFPLogger.log('sfdx-project.json has been updated.',LoggerLevel.INFO) - }else{ - projectConfigFilePath = path.join(defaultProjectConfigPath, `sfdx-project.min.json`); - fs.writeFileSync(projectConfigFilePath, JSON.stringify(projectConfig, null, 4)); - SFPLogger.log(`Shrunk project config file has been saved to ${projectConfigFilePath}`,LoggerLevel.INFO) - } - - } catch (error) { - throw new Error('Unable to shrink project config file:' + error); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/impact/package.ts b/packages/sfpowerscripts-cli/src/commands/impact/package.ts deleted file mode 100644 index 4b803d1a1..000000000 --- a/packages/sfpowerscripts-cli/src/commands/impact/package.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import { Stage } from '../../impl/Stage'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import ImpactedPackageResolver, { ImpactedPackageProps } from '../../impl/impact/ImpactedPackagesResolver'; -const Table = require('cli-table'); -import path from 'path'; -import * as fs from 'fs-extra'; - - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'impact_package'); - -export default class Package extends sfpCommand { - public static flags = { - loglevel, - basebranch: Flags.string({ - description: messages.getMessage('baseCommitOrBranchFlagDescription'), - required: true, - }) - }; - - public static description = messages.getMessage('commandDescription'); - private props: ImpactedPackageProps; - - async execute(): Promise { - // Read Manifest - - this.props = { - currentStage: Stage.BUILD, - baseBranch: this.flags.basebranch, - diffOptions: { - useLatestGitTags: true, - skipPackageDescriptorChange: false, - }, - }; - - const impactedPackageResolver = new ImpactedPackageResolver(this.props, new ConsoleLogger()); - - let packagesToBeBuiltWithReasons = await impactedPackageResolver.getImpactedPackages(); - let packageDiffTable = this.createDiffPackageScheduledDisplayedAsATable(packagesToBeBuiltWithReasons); - const packagesToBeBuilt = Array.from(packagesToBeBuiltWithReasons.keys()); - - //Log Packages to be built - SFPLogger.log(COLOR_KEY_MESSAGE('Packages impacted...')); - SFPLogger.log(packageDiffTable.toString()); - - - const outputPath = path.join(process.cwd(), 'impacted-package.json'); - if (packagesToBeBuilt && packagesToBeBuilt.length > 0) - fs.writeFileSync(outputPath, JSON.stringify(packagesToBeBuilt, null, 2)); - else fs.writeFileSync(outputPath, JSON.stringify([], null, 2)); - SFPLogger.log(`Impacted packages if any written to ${outputPath}`); - - - return packagesToBeBuilt; - } - - private createDiffPackageScheduledDisplayedAsATable(packagesToBeBuilt: Map) { - let tableHead = ['Package', 'Reason', 'Last Known Tag']; - let table = new Table({ - head: tableHead, - chars: ZERO_BORDER_TABLE, - }); - for (const pkg of packagesToBeBuilt.keys()) { - let item = [ - pkg, - packagesToBeBuilt.get(pkg).reason, - packagesToBeBuilt.get(pkg).tag ? packagesToBeBuilt.get(pkg).tag : '', - ]; - table.push(item); - } - return table; - } - - -} diff --git a/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts b/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts deleted file mode 100644 index b8e7bec9c..000000000 --- a/packages/sfpowerscripts-cli/src/commands/impact/releaseconfig.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import { Stage } from '../../impl/Stage'; -import * as fs from 'fs-extra'; -import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import path from 'path'; -import ImpactedPackageResolver, { ImpactedPackageProps } from '../../impl/impact/ImpactedPackagesResolver'; -import ImpactedRelaseConfigResolver from '../../impl/impact/ImpactedReleaseConfig'; -const Table = require('cli-table'); - - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'impact_release_config'); - -export default class ReleaseConfig extends sfpCommand { - public static flags = { - loglevel, - basebranch: Flags.string({ - description: messages.getMessage('baseCommitOrBranchFlagDescription'), - required: true, - }), - releaseconfig: Flags.string({ - description: messages.getMessage('releaseConfigFileFlagDescription'), - default: 'config', - }), - explictDependencyCheck: Flags.boolean({ - description: messages.getMessage('explictDependencyCheckFlagDescription'), - default: false, - }), - filterBy: Flags.string({ - description: messages.getMessage('filterByFlagDescription'), - }), - }; - - public static description = messages.getMessage('commandDescription'); - private props: ImpactedPackageProps; - isMultiConfigFilesEnabled: boolean; - - async execute(): Promise { - // Read Manifest - - this.props = { - branch: this.flags.branch, - currentStage: Stage.VALIDATE, - baseBranch: this.flags.basebranch, - diffOptions: { - useLatestGitTags: true, - skipPackageDescriptorChange: false, - }, - }; - - const impactedPackageResolver = new ImpactedPackageResolver(this.props, new ConsoleLogger()); - - let packagesToBeBuiltWithReasons = await impactedPackageResolver.getImpactedPackages(); - let packageDiffTable = this.createDiffPackageScheduledDisplayedAsATable(packagesToBeBuiltWithReasons); - const packagesToBeBuilt = Array.from(packagesToBeBuiltWithReasons.keys()); - - //Log Packages to be built - SFPLogger.log(COLOR_KEY_MESSAGE('Packages impacted...')); - SFPLogger.log(packageDiffTable.toString()); - - const impactedReleaseConfigResolver = new ImpactedRelaseConfigResolver(); - - let impactedReleaseConfigs = impactedReleaseConfigResolver.getImpactedReleaseConfigs( - packagesToBeBuilt, - this.flags.releaseconfig, - this.flags.explictDependencyCheck, - this.flags.filterBy - ); - - let impactedReleaseConfigTable = this.createImpactedReleaseConfigsAsATable(impactedReleaseConfigs.include); - //Log Packages to be built - SFPLogger.log(COLOR_KEY_MESSAGE('Release Configs impacted...')); - SFPLogger.log(impactedReleaseConfigTable.toString()); - - const outputPath = path.join(process.cwd(), 'impacted-release-configs.json'); - if (impactedReleaseConfigs && impactedReleaseConfigs.include.length > 0) - fs.writeFileSync(outputPath, JSON.stringify(impactedReleaseConfigs, null, 2)); - else fs.writeFileSync(outputPath, JSON.stringify([], null, 2)); - if (!this.flags.filterBy) SFPLogger.log(`Impacted release configs written to ${outputPath}`); - else - SFPLogger.log( - `Impacted release configs written to ${outputPath},${ - impactedReleaseConfigs.include[0]?.releaseName - ? `filtered impacted release config found for ${impactedReleaseConfigs.include[0]?.releaseName}` - : `no impacted release config found for ${this.flags.filterBy}` - }` - ); - - return impactedReleaseConfigs.include; - } - - private createDiffPackageScheduledDisplayedAsATable(packagesToBeBuilt: Map) { - let tableHead = ['Package', 'Reason', 'Last Known Tag']; - if (this.isMultiConfigFilesEnabled && this.props.currentStage == Stage.BUILD) { - tableHead.push('Scratch Org Config File'); - } - let table = new Table({ - head: tableHead, - chars: ZERO_BORDER_TABLE, - }); - for (const pkg of packagesToBeBuilt.keys()) { - let item = [ - pkg, - packagesToBeBuilt.get(pkg).reason, - packagesToBeBuilt.get(pkg).tag ? packagesToBeBuilt.get(pkg).tag : '', - ]; - - table.push(item); - } - return table; - } - - private createImpactedReleaseConfigsAsATable(impacatedReleaseConfigs: any[]) { - let tableHead = ['Release/Domain Name', 'Pools', 'ReleaseConfig Path']; - let table = new Table({ - head: tableHead, - chars: ZERO_BORDER_TABLE, - }); - for (const impactedReleaseConfig of impacatedReleaseConfigs) { - let item = [ - impactedReleaseConfig.releaseName, - impactedReleaseConfig.pool, - impactedReleaseConfig.filePath, - ]; - table.push(item); - } - return table; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/metrics/report.ts b/packages/sfpowerscripts-cli/src/commands/metrics/report.ts deleted file mode 100644 index 6b5b0a3a7..000000000 --- a/packages/sfpowerscripts-cli/src/commands/metrics/report.ts +++ /dev/null @@ -1,88 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'metrics_report'); - -export default class Report extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = false; - protected static requiresProject = false; - - public static examples = ['$ sfp metrics:report -m -t -v ']; - - public static flags = { - metric: Flags.string({ - description: 'metrics to publish', - required: true, - char: 'm', - }), - type: Flags.string({ - options: [ - 'gauge', - 'counter', - 'timer', - ], - description: 'type of metric', - required: true, - char: 't', - }), - value: Flags.string({ - description: 'value of metric', - char: 'v', - }), - tags: Flags.string({ - description: 'tags for metric', - required: false, - char: 'g', - }), - loglevel - }; - - public async execute(): Promise { - this.validateEnvVars(); - - switch (this.flags.type) { - case 'gauge': - SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Gauge Metric ${this.flags.metric} with value ${this.flags.value}`)); - SFPStatsSender.logGauge(this.flags.metric, this.flags.value, this.flags.tags?JSON.parse(this.flags.tags):undefined); - break; - case 'counter': - SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Count Metric ${this.flags.metric}`)); - SFPStatsSender.logCount(this.flags.metric, this.flags.tags?JSON.parse(this.flags.tags):undefined); - break; - case 'timer': - SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing Elapsed Metric ${this.flags.metric} with value ${this.flags.value}`)); - SFPStatsSender.logElapsedTime(this.flags.metric, Number.parseInt(this.flags.value), this.flags.tags?JSON.parse(this.flags.tags):undefined); - break; - default: - throw new Error('Invalid Metric Type'); - }; - - - } - - - private validateEnvVars() { - if ( - !( - process.env.sfp_STATSD || - process.env.sfp_DATADOG || - process.env.sfp_NEWRELIC || - process.env.sfp_SPLUNK - ) - ) { - throw new Error('Environment variable not set for metrics. No metrics will be published.'); - } - } -} - diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts deleted file mode 100644 index 6cbcfb656..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/build.ts +++ /dev/null @@ -1,45 +0,0 @@ -import BuildImpl, { BuildProps } from '../../impl/parallelBuilder/BuildImpl'; -import { Stage } from '../../impl/Stage'; -import BuildBase from '../../BuildBase'; -import { Messages } from '@salesforce/core'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'build'); - -export default class Build extends BuildBase { - public static description = messages.getMessage('commandDescription'); - - getStage() { - return Stage.BUILD; - } - - getBuildProps(): BuildProps { - let buildProps: BuildProps = { - configFilePath: this.flags.configfilepath, - devhubAlias: this.flags.devhubalias, - repourl: this.flags.repourl, - waitTime: this.flags.waittime, - isQuickBuild: false, - isDiffCheckEnabled: this.flags.diffcheck, - buildNumber: this.flags.buildnumber, - executorcount: this.flags.executorcount, - branch: this.flags.branch, - currentStage: Stage.BUILD, - isBuildAllAsSourcePackages: false, - diffOptions: { - useLatestGitTags: true, - skipPackageDescriptorChange: false, - }, - }; - return buildProps; - } - - getBuildImplementer(buildProps: BuildProps): BuildImpl { - let buildImpl = new BuildImpl(buildProps); - return buildImpl; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts deleted file mode 100644 index 18844663b..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/deploy.ts +++ /dev/null @@ -1,168 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { Messages } from '@salesforce/core'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../../impl/deploy/DeployImpl'; -import { Stage } from '../../impl/Stage'; -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_KEY_MESSAGE, - COLOR_SUCCESS, -} from '@flxblio/sfp-logger'; -import { COLOR_TIME } from '@flxblio/sfp-logger'; -import getFormattedTime from '../../core/utils/GetFormattedTime'; -import { Flags } from '@oclif/core'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { LoggerLevel } from '@flxblio/sfp-logger'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'deploy'); - -export default class Deploy extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp orchestrator:deploy -u `]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - protected static requiresProject = false; - - public static flags = { - targetorg: requiredUserNameFlag, - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - waittime: Flags.integer({ - description: messages.getMessage('waitTimeFlagDescription'), - default: 120, - }), - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagFlagDescription'), - }), - skipifalreadyinstalled: Flags.boolean({ - required: false, - default: false, - description: messages.getMessage('skipIfAlreadyInstalled'), - }), - baselineorg: Flags.string({ - char: 'b', - description: messages.getMessage('baselineorgFlagDescription'), - required: false, - dependsOn: ['skipifalreadyinstalled'], - }), - allowunpromotedpackages: Flags.boolean({ - description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), - deprecated: { - message: '--allowunpromotedpackages is deprecated, All packages are allowed' - }, - hidden: true, - }), - retryonfailure: Flags.boolean({ - description: messages.getMessage('retryOnFailureFlagDescription'), - hidden: true, - }), - releaseconfig: Flags.string({ - description: messages.getMessage('configFileFlagDescription'), - }), - enablesourcetracking: Flags.boolean({ - description: messages.getMessage('enableSourceTrackingFlagDescription'), - }), - logsgroupsymbol, - loglevel - }; - - public async execute() { - let executionStartTime = Date.now(); - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`deploy`)}`)); - SFPLogger.log(COLOR_HEADER(`Skip Packages If Already Installed: ${this.flags.skipifalreadyinstalled}`)); - SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); - SFPLogger.log(COLOR_HEADER(`Target Environment: ${this.flags.targetorg}`)); - if(this.flags.releaseconfig) SFPLogger.log(COLOR_HEADER(`Filter according to: ${this.flags.releaseconfig}`)); - if (this.flags.baselineorg) SFPLogger.log(COLOR_HEADER(`Baselined Against Org: ${this.flags.baselineorg}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - let deploymentResult: DeploymentResult; - - let tags = { - targetOrg: this.flags.targetorg, - }; - - if (this.flags.tag != null) { - tags['tag'] = this.flags.tag; - } - - let deployProps: DeployProps = { - targetUsername: this.flags.targetorg, - artifactDir: this.flags.artifactdir, - waitTime: this.flags.waittime, - tags: tags, - isTestsToBeTriggered: false, - deploymentMode: this.flags.enablesourcetracking? DeploymentMode.SOURCEPACKAGES_PUSH: DeploymentMode.NORMAL, - skipIfPackageInstalled: this.flags.skipifalreadyinstalled, - logsGroupSymbol: this.flags.logsgroupsymbol, - currentStage: Stage.DEPLOY, - baselineOrg: this.flags.baselineorg, - isRetryOnFailure: this.flags.retryonfailure, - releaseConfigPath: this.flags.releaseconfig, - }; - - try { - let deployImpl: DeployImpl = new DeployImpl(deployProps); - - deploymentResult = await deployImpl.exec(); - - if (deploymentResult.failed.length > 0 || deploymentResult.error) { - process.exitCode = 1; - } - } catch (error) { - SFPLogger.log(COLOR_ERROR(error)); - process.exitCode = 1; - } finally { - let totalElapsedTime: number = Date.now() - executionStartTime; - - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `${deploymentResult.deployed.length} packages deployed in ${COLOR_TIME( - getFormattedTime(totalElapsedTime) - )} with {${deploymentResult.failed.length}} errors` - ) - ); - - if (deploymentResult.failed.length > 0) { - SFPLogger.log( - COLOR_ERROR( - `\nPackages Failed to Deploy`, - deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) - ) - ); - } - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - - SFPStatsSender.logCount('deploy.scheduled', tags); - - SFPStatsSender.logGauge('deploy.packages.scheduled', deploymentResult.scheduled, tags); - - SFPStatsSender.logGauge('deploy.duration', totalElapsedTime, tags); - - SFPStatsSender.logGauge('deploy.succeeded.packages', deploymentResult.deployed.length, tags); - - SFPStatsSender.logGauge('deploy.failed.packages', deploymentResult.failed.length, tags); - - if (deploymentResult.failed.length > 0) { - SFPStatsSender.logCount('deploy.failed', tags); - } else { - SFPStatsSender.logCount('deploy.succeeded', tags); - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts deleted file mode 100644 index 18aa7daa9..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/prepare.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import PrepareImpl from '../../impl/prepare/PrepareImpl'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import { Stage } from '../../impl/Stage'; -import * as fs from 'fs-extra'; -import ScratchOrgInfoFetcher from '../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher'; -import Ajv from 'ajv'; -import path = require('path'); -import { PoolErrorCodes } from '../../core/scratchorg/pool/PoolError'; -import SFPLogger, { - LoggerLevel, - COLOR_ERROR, - COLOR_HEADER, - COLOR_SUCCESS, - COLOR_TIME, - COLOR_KEY_MESSAGE, -} from '@flxblio/sfp-logger'; -import getFormattedTime from '../../core/utils/GetFormattedTime'; -import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; -import { COLOR_WARNING } from '@flxblio/sfp-logger'; -import SFPOrg from '../../core/org/SFPOrg'; -import { Flags } from '@oclif/core'; -import { loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'prepare'); - -export default class Prepare extends sfpCommand { - protected static requiresDevhubUsername = true; - protected static requiresProject = true; - - public static flags = { - targetdevhubusername, - poolconfig: Flags.file({ - required: false, - default: 'config/poolconfig.json', - char: 'f', - description: messages.getMessage('poolConfigFlagDescription'), - }), - npmrcpath: Flags.file({ - description: messages.getMessage('npmrcPathFlagDescription'), - required: false, - }), - keys: Flags.string({ - required: false, - description: messages.getMessage('keysDescription'), - }), - logsgroupsymbol, - loglevel - }; - - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp orchestrator:prepare -f config/mypoolconfig.json -v `]; - - public async execute(): Promise { - let executionStartTime = Date.now(); - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`prepare`)}`)); - - //Read pool config - try { - let poolConfig: PoolConfig = fs.readJSONSync(this.flags.poolconfig); - this.validatePoolConfig(poolConfig); - //Assign Keys to the config - if (this.flags.keys) poolConfig.keys = this.flags.keys; - - this.displayHeader(poolConfig); - - //Assign npmrcPath to the config - if (this.flags.npmrcpath) { - if (poolConfig.fetchArtifacts?.npm) poolConfig.fetchArtifacts.npm.npmrcPath = this.flags.npmrcpath; - else - SFPLogger.log( - COLOR_WARNING( - 'npmrcPath found in flag, however the configuration doesnt seem to use npm, Are you sure your schema is good?' - ) - ); - } - - let tags = { - stage: Stage.PREPARE, - poolName: poolConfig.tag, - }; - - await this.hubOrg.refreshAuth(); - const hubConn = this.hubOrg.getConnection(); - - this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); - - let hubOrgAsSfPOrg = await SFPOrg.create({ connection: this.hubOrg.getConnection() }); - let prepareImpl = new PrepareImpl(hubOrgAsSfPOrg, poolConfig, this.flags.loglevel); - - let results = await prepareImpl.exec(); - if (results.isOk()) { - let totalElapsedTime = Date.now() - executionStartTime; - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `Provisioned {${results.value.scratchOrgs.length}} scratchorgs out of ${ - results.value.to_allocate - } requested with ${COLOR_ERROR(results.value.failedToCreate)} failed in ${COLOR_TIME( - getFormattedTime(totalElapsedTime) - )} ` - ) - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - await this.getCurrentRemainingNumberOfOrgsInPoolAndReport(poolConfig); - - SFPStatsSender.logGauge('prepare.succeededorgs', results.value.scratchOrgs.length, tags); - if (results.value.scratchOrgs.length > 0) - SFPStatsSender.logGauge('prepare.duration', Date.now() - executionStartTime, tags); - } else if (results.isErr()) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log(COLOR_ERROR(results.error.message), LoggerLevel.ERROR); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - switch (results.error.errorCode) { - case PoolErrorCodes.Max_Capacity: - process.exitCode = 0; - break; - case PoolErrorCodes.No_Capacity: - process.exitCode = 0; - break; - case PoolErrorCodes.PrerequisiteMissing: - process.exitCode = 1; - break; - case PoolErrorCodes.UnableToProvisionAny: - SFPStatsSender.logGauge('prepare.failedorgs', results.error.failed, tags); - process.exitCode = 1; - break; - } - } - } catch (err) { - throw new Error('Unable to execute command .. ' + err); - } - } - - private displayHeader(poolConfig: PoolConfig) { - SFPLogger.log(COLOR_HEADER(`Pool Name: ${poolConfig.tag}`)); - SFPLogger.log(COLOR_HEADER(`Requested Count of Orgs: ${poolConfig.maxAllocation}`)); - SFPLogger.log( - COLOR_HEADER( - `Scratch Orgs to be submitted to pool in case of failures: ${ - poolConfig.succeedOnDeploymentErrors ? 'true' : 'false' - }` - ) - ); - - SFPLogger.log( - COLOR_HEADER(`All packages in the repo to be installed: ${poolConfig.installAll ? 'true' : 'false'}`) - ); - - SFPLogger.log( - COLOR_HEADER( - `Enable Source Tracking: ${ - poolConfig.enableSourceTracking || poolConfig.enableSourceTracking === undefined ? 'true' : 'false' - }` - ) - ); - - if (poolConfig.enableVlocity) SFPLogger.log(COLOR_HEADER(`Enable Vlocity Config: true`)); - - if (poolConfig.fetchArtifacts) { - if (poolConfig.fetchArtifacts.artifactFetchScript) - SFPLogger.log( - COLOR_HEADER(`Script provided to fetch artifacts: ${poolConfig.fetchArtifacts.artifactFetchScript}`) - ); - if (poolConfig.fetchArtifacts.npm) { - SFPLogger.log(COLOR_HEADER(`Fetch artifacts from pre-authenticated NPM registry: true`)); - } - } - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - - private async getCurrentRemainingNumberOfOrgsInPoolAndReport(poolConfig: PoolConfig) { - try { - const results = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.flags.tag, - false, - true - ); - - let tags = { - stage: Stage.PREPARE, - poolName: poolConfig.tag, - }; - - let availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); - - SFPStatsSender.logGauge('pool.available', availableSo.length, tags); - } catch (error) { - //do nothing, we are not reporting anything if anything goes wrong here - } - } - - public validatePoolConfig(poolConfig: any) { - let ajv = new Ajv({ allErrors: true }); - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'pooldefinition.schema.json'), - { encoding: 'UTF-8' } - ); - let validator = ajv.compile(schema); - let isSchemaValid = validator(poolConfig); - if (!isSchemaValid) { - let errorMsg: string = `The pool configuration is invalid, Please fix the following errors\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts deleted file mode 100644 index 205acb622..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/promote.ts +++ /dev/null @@ -1,115 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { Messages } from '@salesforce/core'; -import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl' -import ArtifactFetcher from '../../core/artifacts/ArtifactFetcher'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import { PackageType } from '../../core/package/SfpPackage'; -import { Flags, ux } from '@oclif/core'; -import { loglevel, targetdevhubusername } from '../../flags/sfdxflags'; -import { LoggerLevel } from '@flxblio/sfp-logger'; -import { COLOR_HEADER } from '@flxblio/sfp-logger'; -import SFPLogger from '@flxblio/sfp-logger'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'promote'); - -export default class Promote extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp orchestrator:promote -d path/to/artifacts -v `]; - - protected static requiresDevhubUsername = true; - - public static flags = { - targetdevhubusername, - artifactdir: Flags.directory({ - required: true, - char: 'd', - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - outputdir: Flags.directory({ - required: false, - char: 'o', - description: messages.getMessage('outputDirectoryFlagDescription'), - hidden: true, - deprecated: { - message: '--outputdir is deprecated, Artifacts are no longer modified after promote', - }, - }), - loglevel - }; - - public async execute() { - SFPLogger.log(COLOR_HEADER('command: promote')); - SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - //Refresh HubOrg Authentication - await this.hubOrg.refreshAuth(); - - let unpromotedPackages: { name: string; error: string }[] = []; - try { - let artifacts = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); - - if (artifacts.length === 0) { - throw new Error(`No artifacts found at ${this.flags.artifactdir}`); - } - - let result: boolean = true; - let promotedPackages: string[] = []; - for (let artifact of artifacts) { - let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); - try { - if (sfpPackage.package_type === PackageType.Unlocked) { - let promoteUnlockedPackageImpl = new PromoteUnlockedPackageImpl( - artifact.sourceDirectoryPath, - sfpPackage.package_version_id, - this.hubOrg.getUsername() - ); - await promoteUnlockedPackageImpl.promote(); - } - - promotedPackages.push(sfpPackage.packageName); - } catch (err) { - result = false; - - unpromotedPackages.push({ - name: sfpPackage.packageName, - error: err.message, - }); - } - } - console.log(`Promoted packages:`, promotedPackages); - - // Overall exit status is 1 if a package failed to promote - if (!result) { - throw new Error(); - } - } catch (err) { - console.log(err.message); - - // Print unpromoted packages with reason for failure - if (unpromotedPackages.length > 0) { - ux.table(unpromotedPackages, { name: {}, error: {} }); - } - - // Fail the task when an error occurs - process.exitCode = 1; - } - } - - private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { - let segments = packageVersionNumber.split('.'); - - if (segments.length === 4) { - packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { - if (segmentsIdx === 3) return version + '-' + segment; - else return version + '.' + segment; - }); - } - - return packageVersionNumber; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts deleted file mode 100644 index 1ceb82900..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/publish.ts +++ /dev/null @@ -1,460 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { Messages } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import path = require('path'); -import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_KEY_MESSAGE, - COLOR_SUCCESS, - COLOR_TIME, -} from '@flxblio/sfp-logger'; -import getFormattedTime from '../../core/utils/GetFormattedTime'; -import defaultShell from '../../core/utils/DefaultShell'; -import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import Git from '../../core/git/Git'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import PackageVersionLister from '../../core/package/version/PackageVersionLister'; -import SFPOrg from '../../core/org/SFPOrg'; -import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; -import { LoggerLevel } from '@flxblio/sfp-logger'; -import GitTags from '../../core/git/GitTags'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'publish'); - -export default class Promote extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp orchestrator:publish -f path/to/script`, - `$ sfp orchestrator:publish --npm`, - `$ sfp orchestrator:publish -f path/to/script -p -v HubOrg`, - `$ sfp orchestrator:publish -f path/to/script --gittag --pushgittag`, - ]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - - public static flags = { - artifactdir: Flags.directory({ - required: true, - char: 'd', - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - publishpromotedonly: Flags.boolean({ - char: 'p', - description: messages.getMessage('publishPromotedOnlyFlagDescription'), - dependsOn: ['devhubalias'], - }), - 'devhubalias':optionalDevHubFlag, - scriptpath: Flags.file({ - char: 'f', - description: messages.getMessage('scriptPathFlagDescription'), - }), - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagFlagDescription'), - }), - gittag: Flags.boolean({ - description: messages.getMessage('gitTagFlagDescription'), - default: false, - }), - gittaglimit: Flags.integer({ - description: messages.getMessage('gitTagLimitFlagDescription'), - }), - gittagage: Flags.integer({ - description: messages.getMessage('gitTagAgeFlagDescription'), - }), - pushgittag: Flags.boolean({ - description: messages.getMessage('gitPushTagFlagDescription'), - default: false, - }), - npm: Flags.boolean({ - description: messages.getMessage('npmFlagDescription'), - exclusive: ['scriptpath'], - }), - scope: Flags.string({ - description: messages.getMessage('scopeFlagDescription'), - dependsOn: ['npm'], - parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), - }), - npmtag: Flags.string({ - description: messages.getMessage('npmTagFlagDescription'), - dependsOn: ['npm'], - required: false, - deprecated: { - message: - '--npmtag is deprecated, sfp will automatically tag the artifact with the branch name', - }, - }), - npmrcpath: Flags.file({ - description: messages.getMessage('npmrcPathFlagDescription'), - dependsOn: ['npm'], - required: false, - }), - logsgroupsymbol, - loglevel - }; - private git: Git; - - public async execute() { - let nPublishedArtifacts: number = 0; - let failedArtifacts: string[] = []; - - let executionStartTime = Date.now(); - - let succesfullyPublishedPackageNamesForTagging: { - name: string; - version: string; - type: string; - tag: string; - commitId: string; - }[] = []; - - let npmrcFilesToCleanup: string[] = []; - this.git = await Git.initiateRepo(new ConsoleLogger()); - - try { - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`publish`)}`)); - SFPLogger.log(COLOR_HEADER(`target: ${this.flags.scriptpath ? this.flags.scriptpath : 'NPM'}`)); - SFPLogger.log( - COLOR_HEADER(`Publish promoted artifacts only: ${this.flags.publishpromotedonly ? true : false}`) - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - let packageVersionList: any; - if (this.flags.publishpromotedonly) { - let hubOrg = await SFPOrg.create({ aliasOrUsername: this.flags.devhubalias }); - let packageVersionLister: PackageVersionLister = new PackageVersionLister(hubOrg); - packageVersionList = await packageVersionLister.listAllReleasedVersions(process.cwd()); - } - - let artifacts = ArtifactFetcher.findArtifacts(this.flags.artifactdir); - let artifactFilePaths = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); - - // Pattern captures two named groups, the "package" name and "version" number - let pattern = new RegExp('(?^.*)(?:_sfp_artifact_)(?.*)(?:\\.zip)'); - for (let artifact of artifacts) { - let packageName: string; - let packageVersionNumber: string; - - let match: RegExpMatchArray = path.basename(artifact).match(pattern); - - if (match !== null) { - packageName = match.groups.package; - packageVersionNumber = match.groups.version; - } else { - // artifact filename doesn't match pattern - continue; - } - - let sfpPackage = await this.getPackageInfo(artifactFilePaths, packageName, packageVersionNumber); - - let packageType = sfpPackage.package_type; - let packageVersionId = sfpPackage.package_version_id; - - if (this.flags.publishpromotedonly && packageType === PackageType.Unlocked) { - let isReleased = this.isPackageVersionIdReleased(packageVersionList, packageVersionId); - - if (!isReleased) { - failedArtifacts.push(`${packageName} v${packageVersionNumber}`); - SFPLogger.log( - `Skipping ${packageName} Version ${packageVersionNumber}. Package Version Id ${packageVersionId} has not been promoted.` - ); - process.exitCode = 1; - continue; - } - } - - try { - if (this.flags.npm) { - await this.publishUsingNpm(sfpPackage, packageVersionNumber, npmrcFilesToCleanup); - } else { - await this.publishUsingScript(packageName, packageVersionNumber, artifact); - } - - succesfullyPublishedPackageNamesForTagging.push({ - name: packageName, - version: packageVersionNumber.replace('-', '.'), - type: packageType, - tag: `${packageName}_v${packageVersionNumber.replace('-', '.')}`, - commitId: sfpPackage.sourceVersion - }); - - nPublishedArtifacts++; - } catch (err) { - failedArtifacts.push(`${packageName} v${packageVersionNumber}`); - SFPLogger.log(err.message); - process.exitCode = 1; - } - } - - if (this.flags.gittag) { - await this.createGitTags(succesfullyPublishedPackageNamesForTagging); - await this.pushGitTags(succesfullyPublishedPackageNamesForTagging); - } - - - if (this.flags.gittagage && this.flags.gittaglimit) { - await this.deleteGitTagsOlderThan(succesfullyPublishedPackageNamesForTagging, this.flags.gittagage, this.flags.gittaglimit); - } else if (this.flags.gittagage) { - await this.deleteGitTagsOlderThan(succesfullyPublishedPackageNamesForTagging, this.flags.gittagage); - } else if (this.flags.gittaglimit) { - await this.deleteExcessGitTags(succesfullyPublishedPackageNamesForTagging, this.flags.gittaglimit); - } - - - } catch (err) { - SFPLogger.log(err.message); - - // Fail the task when an error occurs - process.exitCode = 1; - } finally { - if (npmrcFilesToCleanup.length > 0) { - npmrcFilesToCleanup.forEach((npmrcFile) => { - fs.unlinkSync(npmrcFile); - }); - } - - let totalElapsedTime: number = Date.now() - executionStartTime; - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `${nPublishedArtifacts} artifacts published in ${COLOR_TIME( - getFormattedTime(totalElapsedTime) - )} with {${COLOR_ERROR(failedArtifacts.length)}} errors` - ) - ); - - if (failedArtifacts.length > 0) { - SFPLogger.log(COLOR_ERROR(`Packages Failed to Publish`, failedArtifacts)); - } - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - let tags = { - publish_promoted_only: this.flags.publishpromotedonly ? 'true' : 'false', - }; - - if (this.flags.tag != null) { - tags['tag'] = this.flags.tag; - } - - SFPStatsSender.logGauge('publish.duration', totalElapsedTime, tags); - - SFPStatsSender.logGauge('publish.succeeded', nPublishedArtifacts, tags); - - if (failedArtifacts.length > 0) { - SFPStatsSender.logGauge('publish.failed', failedArtifacts.length, tags); - } - } - } - - private async publishUsingNpm(sfpPackage: SfpPackage, packageVersionNumber: string, npmrcFilesToCleanup: string[]) { - let publishGroupSection = new GroupConsoleLogs(`Publishing ${sfpPackage.packageName}`).begin(); - let artifactRootDirectory = path.dirname(sfpPackage.sourceDir); - - // NPM does not accept packages with uppercase characters - let name: string = sfpPackage.packageName.toLowerCase() + '_sfp_artifact'; - - //Check whether the user has already passed in @ - - if (this.flags.scope) { - let scope: string = this.flags.scope.replace(/@/g, '').toLowerCase(); - name = `@${scope}/` + name; - } - - let packageJson = { - name: name, - version: packageVersionNumber, - repository: sfpPackage.repository_url, - }; - - fs.writeFileSync(path.join(artifactRootDirectory, 'package.json'), JSON.stringify(packageJson, null, 4)); - - if (this.flags.npmrcpath) { - fs.copyFileSync(this.flags.npmrcpath, path.join(artifactRootDirectory, '.npmrc')); - - npmrcFilesToCleanup.push(path.join(artifactRootDirectory, '.npmrc')); - } - - let cmd = `npm publish`; - - //Do a tag based on the branch - if (sfpPackage.branch) { - cmd += ` --tag ${sfpPackage.branch}`; - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Publishing ${sfpPackage.packageName} Version ${packageVersionNumber} with tag ${sfpPackage.branch}...` - ) - ); - } - - let npmPublishExecutor: ExecuteCommand = new ExecuteCommand(new ConsoleLogger(), LoggerLevel.INFO, true); - await npmPublishExecutor.execCommand(cmd, artifactRootDirectory); - - publishGroupSection.end(); - } - - private async publishUsingScript(packageName: string, packageVersionNumber: string, artifact: string) { - let publishGroupSection = new GroupConsoleLogs(`Publishing ${packageName}`).begin(); - let cmd: string; - if (process.platform !== 'win32') { - cmd = `${defaultShell()} -e ${this.flags.scriptpath} ${packageName} ${packageVersionNumber} ${artifact} ${ - this.flags.publishpromotedonly ? true : false - }`; - } else { - cmd = `cmd.exe /c ${this.flags.scriptpath} ${packageName} ${packageVersionNumber} ${artifact} ${ - this.flags.publishpromotedonly ? true : false - }`; - } - - SFPLogger.log(COLOR_KEY_MESSAGE(`Publishing ${packageName} Version ${packageVersionNumber}...`)); - - let scriptExecutor: ExecuteCommand = new ExecuteCommand(new ConsoleLogger(), LoggerLevel.INFO, true); - await scriptExecutor.execCommand(cmd, process.cwd()); - publishGroupSection.end(); - } - - protected validateFlags() { - if (this.flags.scriptpath === undefined && this.flags.npm === undefined) - throw new Error('Either --scriptpath or --npm flag must be provided'); - - if (this.flags.scriptpath && !fs.existsSync(this.flags.scriptpath)) - throw new Error(`Script path ${this.flags.scriptpath} does not exist`); - - if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); - } - - private async pushGitTags( - sucessfullyPublishedPackages: { - name: string; - version: string; - type: string; - tag: string; - commitId: string; - }[] - ) { - - if (this.flags.pushgittag) { - let tagsForPushing:string[]=[]; - for (let succesfullyPublishedPackage of sucessfullyPublishedPackages) { - SFPLogger.log(COLOR_KEY_MESSAGE(`Pushing Git Tags to Repo ${succesfullyPublishedPackage.tag}`)); - tagsForPushing.push(succesfullyPublishedPackage.tag); - } - await this.git.pushTags(tagsForPushing) - } - } - - private async createGitTags( - sucessfullyPublishedPackages: { - name: string; - version: string; - type: string; - tag: string; - commitId: string; - }[] - ) { - - for (let sucessFullyPublishedPackage of sucessfullyPublishedPackages) { - SFPLogger.log(COLOR_KEY_MESSAGE(`Creating Git Tags in Repo ${sucessFullyPublishedPackage.tag}`)); - await this.git.addAnnotatedTag( - sucessFullyPublishedPackage.tag, - `${sucessFullyPublishedPackage.name} ${sucessFullyPublishedPackage.type} Package ${sucessFullyPublishedPackage.version}`, - sucessFullyPublishedPackage.commitId - ); - } - } - - //Exclude the latest git tag up to a specified number of tags, and then deletes the excess tags that exceed that limit. - private async deleteExcessGitTags( tags: { - name: string; - version: string; - type: string; - tag: string; - commitId: string; - }[], limit: number) { - //const pkgs = ProjectConfig.getAllPackages(this.git.getRepositoryPath()); - const tagsToDelete: string[] = []; - - await Promise.all(tags.map(async (tag) => { - const gitTags = new GitTags(this.git, tag.name); - const tags = await gitTags.limitTags(limit); - tagsToDelete.push(...tags); - })); - - if (tagsToDelete.length > 0) { - SFPLogger.log(COLOR_KEY_MESSAGE('Removing the following Git tag(s):')); - for (let tag of tagsToDelete) { - SFPLogger.log(COLOR_KEY_MESSAGE(tag)); - } - await this.git.deleteTags(tagsToDelete); - } - } - - //Deletes Git tags that are older than a specified number of days. - private async deleteGitTagsOlderThan( tags: { - name: string; - version: string; - type: string; - tag: string; - commitId: string; - }[], daysToKeep: number - , limit?: number) { - - const tagsToDelete: string[] = []; - - await Promise.all(tags.map(async (tag) => { - const gitTags = new GitTags(this.git, tag.name); - const tags = await gitTags.filteredOldTags(daysToKeep, limit); - tagsToDelete.push(...tags); - })); - - if (tagsToDelete.length > 0) { - SFPLogger.log(COLOR_KEY_MESSAGE('Removing the following Git tag(s):')); - for (let tag of tagsToDelete) { - SFPLogger.log(COLOR_KEY_MESSAGE(tag)); - } - await this.git.deleteTags(tagsToDelete); - } - - } - - - private isPackageVersionIdReleased(packageVersionList: any, packageVersionId: string): boolean { - let packageVersion = packageVersionList.find((pkg) => { - return pkg.SubscriberPackageVersionId === packageVersionId; - }); - - if (packageVersion) return true; - else return false; - } - - /** - * Get sourceDirectory and packageMetadata of artifact with package name and version - * @param artifacts - * @param packageName - * @param packageVersionNumber - */ - private async getPackageInfo(artifacts: Artifact[], packageName, packageVersionNumber): Promise { - for (let artifact of artifacts) { - let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); - if ( - sfpPackage.packageName === packageName && - sfpPackage.versionNumber === packageVersionNumber.replace('-', '.') - ) { - return sfpPackage; - } - } - - throw new Error( - `Unable to find artifact metadata for ${packageName} Version ${packageVersionNumber.replace('-', '.')}` - ); - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts deleted file mode 100644 index 0ff13dabb..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/quickbuild.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Messages } from '@salesforce/core'; -import BuildImpl, { BuildProps } from '../../impl/parallelBuilder/BuildImpl'; -import { Stage } from '../../impl/Stage'; -import BuildBase from '../../BuildBase'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'quickbuild'); - -export default class QuickBuild extends BuildBase { - public static description = messages.getMessage('commandDescription'); - - getStage() { - return Stage.QUICKBUILD; - } - - getBuildProps(): BuildProps { - let buildProps: BuildProps = { - configFilePath: this.flags.configfilepath, - devhubAlias: this.flags.devhubalias, - repourl: this.flags.repourl, - waitTime: this.flags.waittime, - isQuickBuild: true, - isDiffCheckEnabled: this.flags.diffcheck, - buildNumber: this.flags.buildnumber, - executorcount: this.flags.executorcount, - branch: this.flags.branch, - currentStage: Stage.QUICKBUILD, - isBuildAllAsSourcePackages: false, - diffOptions: { - useLatestGitTags: true, - skipPackageDescriptorChange: false, - }, - }; - return buildProps; - } - getBuildImplementer(buildProps: BuildProps): BuildImpl { - let buildImpl = new BuildImpl(buildProps); - return buildImpl; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts deleted file mode 100644 index 57f8d913b..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/release.ts +++ /dev/null @@ -1,256 +0,0 @@ -import sfpCommand from '../../SfpCommand'; -import { LoggerLevel, Messages } from '@salesforce/core'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import ReleaseImpl, { ReleaseProps, ReleaseResult } from '../../impl/release/ReleaseImpl'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; -import ReleaseError from '../../errors/ReleaseError'; -import path = require('path'); -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_TIME, - COLOR_SUCCESS, - COLOR_WARNING, - COLOR_KEY_MESSAGE, - ConsoleLogger, -} from '@flxblio/sfp-logger'; -import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'release'); - -export default class Release extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `sfp orchestrator:release -p path/to/releasedefinition.yml -u myorg --npm --scope myscope --generatechangelog`, - ]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - protected static requiresProject = false; - - public static flags = { - releasedefinition: arrayFlagSfdxStyle({ - char: 'p', - description: messages.getMessage('releaseDefinitionFlagDescription'), - required: true, - }), - targetorg: requiredUserNameFlag, - scriptpath: Flags.file({ - char: 'f', - description: messages.getMessage('scriptPathFlagDescription'), - }), - npm: Flags.boolean({ - description: messages.getMessage('npmFlagDescription'), - exclusive: ['scriptpath'], - }), - scope: Flags.string({ - description: messages.getMessage('scopeFlagDescription'), - dependsOn: ['npm'], - parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), - }), - npmrcpath: Flags.file({ - description: messages.getMessage('npmrcPathFlagDescription'), - dependsOn: ['npm'], - required: false, - }), - logsgroupsymbol, - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagFlagDescription'), - }), - dryrun: Flags.boolean({ - description: messages.getMessage('dryRunFlagDescription'), - default: false, - hidden: true, - }), - waittime: Flags.integer({ - description: messages.getMessage('waitTimeFlagDescription'), - default: 120, - }), - keys: Flags.string({ - required: false, - description: messages.getMessage('keysFlagDescription'), - }), - generatechangelog: Flags.boolean({ - default: false, - description: messages.getMessage('generateChangelogFlagDescription'), - }), - directory: Flags.string({ - char: 'd', - description: messages.getMessage('directoryFlagDescription'), - }), - branchname: Flags.string({ - dependsOn: ['generatechangelog'], - char: 'b', - description: messages.getMessage('branchNameFlagDescription'), - }), - allowunpromotedpackages: Flags.boolean({ - description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), - hidden: true, - deprecated: { - message: '--allowunpromotedpackages is deprecated, All packages are allowed', - }, - }), - devhubalias: optionalDevHubFlag, - loglevel - }; - - public async execute() { - this.validateFlags(); - - let tags = { - targetOrg: this.flags.targetorg, - }; - - if (this.flags.tag != null) { - tags['tag'] = this.flags.tag; - } - - let executionStartTime = Date.now(); - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`release`)}`)); - SFPLogger.log(COLOR_HEADER(`Target Org: ${this.flags.targetorg}`)); - SFPLogger.log(COLOR_HEADER(`Release Definitions: ${this.flags.releasedefinition}`)); - SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${path.resolve('artifacts')}`)); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - let releaseDefinitions: ReleaseDefinitionSchema[] = []; - for (const pathToReleaseDefintion of this.flags.releasedefinition) { - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)).releaseDefinition; - - //Support Legacy by taking the existing single workItemFilter and pushing it to the new model - if(releaseDefinition.changelog?.workItemFilter) - { - releaseDefinition.changelog.workItemFilters = new Array(); - releaseDefinition.changelog.workItemFilters.push(releaseDefinition.changelog?.workItemFilter); - } - - if (this.flags.isGenerateChangelog && !releaseDefinition.changelog) - throw new Error('changelog parameters must be specified in release definition to generate changelog'); - - if ( - releaseDefinition.promotePackagesBeforeDeploymentToOrg && - this.flags.targetorg == releaseDefinition.promotePackagesBeforeDeploymentToOrg && - !this.flags.devhubalias - ) - throw new Error('DevHub is mandatory when promote is used within release defintion'); - - releaseDefinitions.push(releaseDefinition); - } - - let releaseResult: ReleaseResult; - try { - let props: ReleaseProps = { - releaseDefinitions: releaseDefinitions, - targetOrg: this.flags.targetorg, - fetchArtifactScript: this.flags.scriptpath, - isNpm: this.flags.npm, - scope: this.flags.scope, - npmrcPath: this.flags.npmrcpath, - logsGroupSymbol: this.flags.logsgroupsymbol, - tags: tags, - isDryRun: this.flags.dryrun, - waitTime: this.flags.waittime, - keys: this.flags.keys, - isGenerateChangelog: this.flags.generatechangelog, - devhubUserName: this.flags.devhubalias, - branch: this.flags.branchname, - directory:this.flags.directory, - }; - - let releaseImpl: ReleaseImpl = new ReleaseImpl(props,new ConsoleLogger()); - - releaseResult = await releaseImpl.exec(); - if(!this.flags.dryrun) - SFPStatsSender.logCount('release.succeeded', tags); - } catch (err) { - if (err instanceof ReleaseError) { - releaseResult = err.data; - } else SFPLogger.log(err.message); - - if(!this.flags.dryrun) - SFPStatsSender.logCount('release.failed', tags); - - // Fail the task when an error occurs - process.exitCode = 1; - } finally { - let totalElapsedTime: number = Date.now() - executionStartTime; - - if (releaseResult) { - this.printReleaseSummary(releaseResult, totalElapsedTime); - this.sendMetrics(releaseResult, tags, totalElapsedTime); - } - } - } - - private sendMetrics(releaseResult: ReleaseResult, tags: any, totalElapsedTime: number) { - if(!this.flags.dryrun) - { - SFPStatsSender.logCount('release.scheduled', tags); - - SFPStatsSender.logGauge('release.duration', totalElapsedTime, tags); - - let packagesScheduled = 0; - let packagesSucceeded = 0; - let packagesFailed = 0; - - for (const deploymentResults of releaseResult.succeededDeployments) { - packagesScheduled += deploymentResults.result.scheduled; - packagesSucceeded += deploymentResults.result.deployed.length; - } - - for (const deploymentResults of releaseResult.failedDeployments) { - packagesScheduled += deploymentResults.result.scheduled; - packagesSucceeded += deploymentResults.result.deployed.length; - packagesFailed += deploymentResults.result.failed.length; - } - - SFPStatsSender.logGauge('release.packages.scheduled', packagesScheduled, tags); - SFPStatsSender.logGauge('release.packages.succeeded', packagesSucceeded, tags); - SFPStatsSender.logGauge('release.packages.failed', packagesFailed, tags); - } - } - - private printReleaseSummary(releaseResult: ReleaseResult, totalElapsedTime: number): void { - if (this.flags.logsgroupsymbol?.[0]) - SFPLogger.log(COLOR_HEADER(this.flags.logsgroupsymbol[0], 'Release Summary')); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - if (releaseResult.installDependenciesResult) { - SFPLogger.log(COLOR_HEADER(`\nPackage Dependencies`)); - SFPLogger.log(COLOR_SUCCESS(` ${releaseResult.installDependenciesResult.success.length} succeeded`)); - SFPLogger.log(COLOR_WARNING(` ${releaseResult.installDependenciesResult.skipped.length} skipped`)); - SFPLogger.log(COLOR_ERROR(` ${releaseResult.installDependenciesResult.failed.length} failed`)); - } - - for (const succeededDeployment of releaseResult.succeededDeployments) { - SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${succeededDeployment.releaseDefinition.release}`)); - SFPLogger.log(COLOR_SUCCESS(` ${succeededDeployment.result.deployed.length} succeeded`)); - SFPLogger.log(COLOR_ERROR(` ${succeededDeployment.result.failed.length} failed`)); - } - - for (const failedDeployment of releaseResult.failedDeployments) { - SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${failedDeployment.releaseDefinition.release}`)); - SFPLogger.log(COLOR_SUCCESS(` ${failedDeployment.result.deployed.length} succeeded`)); - SFPLogger.log( - COLOR_ERROR( - `\nPackages Failed to Deploy`, - failedDeployment.result.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) - ) - ); - } - - SFPLogger.log(COLOR_TIME(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substr(11, 8)}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - - protected validateFlags() { - if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); - - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts deleted file mode 100644 index 45dc3ffcb..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/validate.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import ValidateError from '../../errors/ValidateError'; -import ValidateResult from '../../impl/validate/ValidateResult'; -import * as fs from 'fs-extra'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; -import { LoggerLevel } from '@flxblio/sfp-logger'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'validate'); - -export default class Validate extends sfpCommand { - protected static requiresProject = true; - - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - - public static examples = [ - `$ sfp orchestrator:validate -p "POOL_TAG_1,POOL_TAG_2" -v `, - ]; - - //Fix Typo - public static flags = { - pools: arrayFlagSfdxStyle({ - char: 'p', - description: messages.getMessage('poolsFlagDescription'), - required: true, - }), - targetdevhubusername, - mode: Flags.string({ - description: 'validation mode', - default: 'thorough', - required: true, - options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], - }), - installdeps: Flags.boolean({ - description: messages.getMessage('installDepsFlagDescription'), - default: false, - }), - releaseconfig: Flags.string({ - description: messages.getMessage('configFileFlagDescription'), - }), - coveragepercent: Flags.integer({ - description: messages.getMessage('coveragePercentFlagDescription'), - default: 75, - }), - disablesourcepkgoverride: Flags.boolean({ - description: messages.getMessage('disableSourcePackageOverride'), - default: false, - }), - deletescratchorg: Flags.boolean({ - char: 'x', - description: messages.getMessage('deleteScratchOrgFlagDescription'), - default: false, - }), - orginfo: Flags.boolean({ - description: messages.getMessage('orgInfoFlagDescription'), - default: false, - }), - keys: Flags.string({ - required: false, - description: messages.getMessage('keysFlagDescription'), - }), - basebranch: Flags.string({ - description: messages.getMessage('baseBranchFlagDescription'), - }), - enableimpactanalysis: Flags.boolean({ - description: messages.getMessage('enableImpactAnalysisFlagDescription'), - dependsOn: ['basebranch'], - }), - enabledependencyvalidation: Flags.boolean({ - description: messages.getMessage('enableDependencyValidation'), - dependsOn: ['basebranch'], - }), - tag: Flags.string({ - description: messages.getMessage('tagFlagDescription'), - }), - disableparalleltesting: Flags.boolean({ - description: messages.getMessage('disableParallelTestingFlagDescription'), - default: false, - }), - disablediffcheck: Flags.boolean({ - description: messages.getMessage('disableDiffCheckFlagDescription'), - default: false, - }), - disableartifactupdate: Flags.boolean({ - description: messages.getMessage('disableArtifactUpdateFlagDescription'), - default: false, - }), - logsgroupsymbol, - loglevel - }; - - async execute(): Promise { - let executionStartTime = Date.now(); - - await this.hubOrg.refreshAuth(); - - let tags: { [p: string]: string }; - tags = { - tag: this.flags.tag != null ? this.flags.tag : undefined, - validation_mode: this.flags.mode, - releaseConfig: this.flags.releaseconfig, - }; - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`validate`)}`)); - SFPLogger.log(COLOR_HEADER(`Pools being used: ${this.flags.pools}`)); - SFPLogger.log( - COLOR_HEADER( - `Validation Mode: ${COLOR_KEY_MESSAGE( - `${ - ValidationMode[ - Object.keys(ValidationMode)[ - (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) - ] - ] - }` - )}` - ) - ); - if (this.flags.mode != ValidationMode.FAST_FEEDBACK) { - SFPLogger.log(COLOR_HEADER(`Coverage Percentage: ${this.flags.coveragepercent}`)); - } - SFPLogger.log( - COLOR_HEADER(`Dependency Validation: ${this.flags.enabledependencyvalidation ? 'true' : 'false'}`) - ); - - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - let validateResult: ValidateResult; - try { - let validateProps: ValidateProps = { - validateAgainst: ValidateAgainst.PRECREATED_POOL, - validationMode: - ValidationMode[ - Object.keys(ValidationMode)[ - (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) - ] - ], - coverageThreshold: this.flags.coveragepercent, - logsGroupSymbol: this.flags.logsgroupsymbol, - pools: this.flags.pools, - hubOrg: this.hubOrg, - shapeFile: this.flags.shapefile, - isDeleteScratchOrg: this.flags.deletescratchorg, - keys: this.flags.keys, - baseBranch: this.flags.basebranch, - diffcheck: !this.flags.disablediffcheck, - disableArtifactCommit: this.flags.disableartifactupdate, - orgInfo: this.flags.orginfo, - disableSourcePackageOverride : this.flags.disablesourcepkgoverride, - disableParallelTestExecution: this.flags.disableparalleltesting, - installExternalDependencies: this.flags.installdeps, - }; - - setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig,validateProps); - - let validateImpl: ValidateImpl = new ValidateImpl(validateProps); - - validateResult = await validateImpl.exec(); - - SFPStatsSender.logCount('validate.succeeded', tags); - } catch (error) { - if (error instanceof ValidateError) { - validateResult = error.data; - } else SFPLogger.log(error.message); - - SFPStatsSender.logCount('validate.failed', tags); - - process.exitCode = 1; - } finally { - let totalElapsedTime: number = Date.now() - executionStartTime; - - SFPStatsSender.logGauge('validate.duration', totalElapsedTime, tags); - - SFPStatsSender.logCount('validate.scheduled', tags); - - if (validateResult) { - SFPStatsSender.logGauge( - 'validate.packages.scheduled', - validateResult.deploymentResult?.scheduled, - tags - ); - - SFPStatsSender.logGauge( - 'validate.packages.succeeded', - validateResult.deploymentResult?.deployed?.length, - tags - ); - - SFPStatsSender.logGauge( - 'validate.packages.failed', - validateResult.deploymentResult?.failed?.length, - tags - ); - } - } - - function setReleaseConfigForReleaseBasedModes(releaseconfigPath:string,validateProps: ValidateProps) { - if (validateProps.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - validateProps.validationMode == ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) { - if (releaseconfigPath && fs.existsSync(releaseconfigPath)) { - validateProps.releaseConfigPath = releaseconfigPath; - } - - else { - if (!releaseconfigPath) - throw new Error(`Release config is required when using validation by release config`); - else if (!fs.existsSync(releaseconfigPath)) - throw new Error(`Release config at ${releaseconfigPath} doesnt exist, Please check the path`); - } - } - } - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts b/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts deleted file mode 100644 index 0b9b1f2ec..000000000 --- a/packages/sfpowerscripts-cli/src/commands/orchestrator/validateAgainstOrg.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { LoggerLevel, Messages, Org } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -import ValidateError from '../../errors/ValidateError'; -import ValidateResult from '../../impl/validate/ValidateResult'; -import { loglevel, logsgroupsymbol, requiredUserNameFlag, targetdevhubusername } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'validateAgainstOrg'); - -export default class ValidateAgainstOrg extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp orchestrator:validateAgainstOrg -u `]; - - public static flags = { - targetorg: requiredUserNameFlag, - mode: Flags.string({ - description: 'validation mode', - default: 'thorough', - required: true, - options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], - }), - releaseconfig: Flags.string({ - description: messages.getMessage('configFileFlagDescription'), - }), - coveragepercent: Flags.integer({ - description: messages.getMessage('coveragePercentFlagDescription'), - default: 75, - }), - diffcheck: Flags.boolean({ - description: messages.getMessage('diffCheckFlagDescription'), - default: false, - }), - disableartifactupdate: Flags.boolean({ - description: messages.getMessage('disableArtifactUpdateFlagDescription'), - default: false, - }), - logsgroupsymbol, - basebranch: Flags.string({ - description: messages.getMessage('baseBranchFlagDescription'), - }), - orginfo: Flags.boolean({ - description: messages.getMessage('orgInfoFlagDescription'), - default: false, - }), - installdeps: Flags.boolean({ - description: messages.getMessage('installDepsFlagDescription'), - default: false, - }), - devhubalias: targetdevhubusername, - disablesourcepkgoverride: Flags.boolean({ - description: messages.getMessage('disableSourcePackageOverride'), - dependsOn:['devhubalias'] - }), - disableparalleltesting: Flags.boolean({ - description: messages.getMessage('disableParallelTestingFlagDescription'), - default: false, - }), - loglevel - }; - - async execute(): Promise { - let executionStartTime = Date.now(); - - let tags: { [p: string]: string }; - tags = { - tag: this.flags.tag != null ? this.flags.tag : undefined, - validation_mode: this.flags.mode, - releaseConfig: this.flags.releaseconfig, - }; - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`validateAgainstOrg`)}`)); - SFPLogger.log(COLOR_HEADER(`Target Org: ${this.flags.targetorg}`)); - SFPLogger.log( - COLOR_HEADER( - `Validation Mode: ${COLOR_KEY_MESSAGE( - `${ - ValidationMode[ - Object.keys(ValidationMode)[ - (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) - ] - ] - }` - )}` - ) - ); - if (this.flags.mode != ValidationMode.FAST_FEEDBACK) { - SFPLogger.log(COLOR_HEADER(`Coverage Percentage: ${this.flags.coveragepercent}`)); - } - - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - - let validateResult: ValidateResult; - try { - let validateProps: ValidateProps = { - validateAgainst: ValidateAgainst.PROVIDED_ORG, - validationMode: ValidationMode[ - Object.keys(ValidationMode)[ - (Object.values(ValidationMode) as string[]).indexOf(this.flags.mode) - ] - ], - coverageThreshold: this.flags.coveragepercent, - logsGroupSymbol: this.flags.logsgroupsymbol, - targetOrg: this.flags.targetorg, - diffcheck: this.flags.diffcheck, - baseBranch: this.flags.basebranch, - disableArtifactCommit: this.flags.disableartifactupdate, - disableSourcePackageOverride: this.flags.disablesourcepkgoverride, - disableParallelTestExecution: this.flags.disableparalleltesting, - orgInfo: this.flags.orginfo, - installExternalDependencies: this.flags.installdeps, - }; - - - //Add check for devhub - if(this.flags.devhubalias) - { - validateProps.hubOrg = await Org.create({aliasOrUsername:this.flags.devhubalias}); - } - - setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig,validateProps); - let validateImpl: ValidateImpl = new ValidateImpl(validateProps); - validateResult = await validateImpl.exec(); - } catch (error) { - if (error instanceof ValidateError) { - validateResult = error.data; - } - - SFPStatsSender.logCount('validate.failed', tags); - - process.exitCode = 1; - } finally { - let totalElapsedTime: number = Date.now() - executionStartTime; - - SFPStatsSender.logGauge('validate.duration', totalElapsedTime, tags); - - SFPStatsSender.logCount('validate.scheduled', tags); - - if (validateResult) { - SFPStatsSender.logGauge( - 'validate.packages.scheduled', - validateResult.deploymentResult?.scheduled, - tags - ); - - SFPStatsSender.logGauge( - 'validate.packages.succeeded', - validateResult.deploymentResult?.deployed?.length, - tags - ); - - SFPStatsSender.logGauge( - 'validate.packages.failed', - validateResult.deploymentResult?.failed?.length, - tags - ); - } - } - - function setReleaseConfigForReleaseBasedModes(releaseconfigPath:string,validateProps: ValidateProps) { - if (validateProps.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - validateProps.validationMode == ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) { - if (releaseconfigPath && fs.existsSync(releaseconfigPath)) { - validateProps.releaseConfigPath = releaseconfigPath; - } - - else { - if (!releaseconfigPath) - throw new Error(`Release config is required when using validation by release config`); - else if (!fs.existsSync(releaseconfigPath)) - throw new Error(`Release config at ${releaseconfigPath} doesnt exist, Please check the path`); - } - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/data/create.ts b/packages/sfpowerscripts-cli/src/commands/package/data/create.ts deleted file mode 100644 index 4631d2c51..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/data/create.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Messages } from '@salesforce/core'; -import ProjectConfig from '../../../core/project/ProjectConfig' -import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; -import PackageCreateCommand from '../../../PackageCreateCommand'; -import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; -import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'create_data_package'); - -export default class CreateDataPackage extends PackageCreateCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp package:data:create -n mypackage -v `, - `$ sfp package:data:create -n -v --diffcheck --gittag`, - ]; - - public static flags = { - package: Flags.string({ - required: true, - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - versionnumber: Flags.string({ - required: true, - char: 'v', - description: messages.getMessage('versionNumberFlagDescription'), - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - diffcheck: Flags.boolean({ - description: messages.getMessage('diffCheckFlagDescription'), - }), - branch: Flags.string({ - description: messages.getMessage('branchFlagDescription'), - }), - gittag: Flags.boolean({ - description: messages.getMessage('gitTagFlagDescription'), - }), - repourl: Flags.string({ - char: 'r', - description: messages.getMessage('repoUrlFlagDescription'), - }), - refname: Flags.string({ - description: messages.getMessage('refNameFlagDescription'), - }), - loglevel - }; - - protected async create(): Promise { - let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(null, this.sfdxPackage); - if (packageDescriptor.type?.toLowerCase() !== PackageType.Data) { - throw new Error("Data packages must have 'type' property of PackageType.Data defined in sfdx-project.json"); - } - - let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - new ConsoleLogger(), - null, - this.sfdxPackage, - { - packageVersionNumber: this.versionNumber, - sourceVersion: this.commitId, - repositoryUrl: this.repositoryURL, - branch: this.branch, - } - ); - - console.log(COLOR_SUCCESS(`Created data package ${sfpPackage.packageName}`)); - return sfpPackage; - } - - protected getConfigFilePath(): string { - return null; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/data/install.ts b/packages/sfpowerscripts-cli/src/commands/package/data/install.ts deleted file mode 100644 index 51827ebb6..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/data/install.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Messages } from '@salesforce/core'; -import InstallPackageCommand from '../../../InstallPackageCommand'; -import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; -import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; -import { Flags } from '@oclif/core'; -import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; - - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'install_data_package'); - -export default class InstallDataPackage extends InstallPackageCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp package:data:install -n mypackage -u `]; - - public static deprecated:boolean = true; - - public static flags = { - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - required: true, - }), - targetorg: requiredUserNameFlag, - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - skiponmissingartifact: Flags.boolean({ - char: 's', - description: messages.getMessage('skipOnMissingArtifactFlagDescription'), - }), - skipifalreadyinstalled: Flags.boolean({ description: messages.getMessage('skipIfAlreadyInstalled') }), - loglevel - }; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - - public async install() { - try { - - SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) - - - const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; - let options: SfpPackageInstallationOptions = { - skipIfPackageInstalled: skipIfAlreadyInstalled - }; - - - let result = await SfpPackageInstaller.installPackage( - new ConsoleLogger(), - this.sfpPackage, - this.sfpOrg, - options - ); - - - - if (result.result === PackageInstallationStatus.Failed) { - throw new Error(result.message); - } - } catch (err) { - console.log(err); - process.exitCode = 1; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/install.ts b/packages/sfpowerscripts-cli/src/commands/package/install.ts deleted file mode 100644 index 7dd37751d..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/install.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Messages } from '@salesforce/core'; -import InstallPackageCommand from '../../InstallPackageCommand'; -import { PackageInstallationStatus } from '../../core/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; -import { Flags } from '@oclif/core'; -import { loglevel, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { PackageType } from '../../core/package/SfpPackage'; - - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'install_package'); - -export default class Install extends InstallPackageCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp package:install -n packagename -u sandboxalias -i`]; - - public static flags = { - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - targetorg: requiredUserNameFlag, - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - securitytype: Flags.string({ - description: messages.getMessage('securityTypeFlagDescription'), - options: ['full', 'none'], - default: 'none', - }), - skipifalreadyinstalled: Flags.boolean({ - char: 'f', - description: messages.getMessage('skipIfAlreadyInstalled'), - }), - upgradetype: Flags.string({ - description: messages.getMessage('upgradeTypeFlagDescription'), - options: ['delete-only', 'deprecate-only', 'mixed-mode'], - default: 'mixed-mode', - }), - optimizedeployment: Flags.boolean({ - char: 'o', - description: messages.getMessage('optimizedeployment'), - default: false, - required: false, - }), - skiptesting: Flags.boolean({ - char: 't', - description: messages.getMessage('skiptesting'), - default: false, - required: false, - }), - waittime: Flags.string({ - description: messages.getMessage('waitTimeFlagDescription'), - default: '120', - }), - publishwaittime: Flags.string({ - description: messages.getMessage('publishWaitTimeFlagDescription'), - default: '10', - }), - loglevel - }; - - protected static requiresUsername = true; - protected static requiresDevhubUsername = false; - - public async install() { - try { - const installationkey = this.flags.installationkey; - const security_type = this.flags.securitytype; - const upgrade_type = this.flags.upgradetype; - const waitTime = this.flags.waittime; - const publishWaitTime = this.flags.publishwaittime; - const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; - const optimizeDeployment: boolean = this.flags.optimizedeployment; - const skipTesting: boolean = this.flags.skiptesting; - - - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`install`)}`)); - SFPLogger.log(COLOR_HEADER(`Package Name: ${this.sfpPackage.packageName}`)); - SFPLogger.log(COLOR_HEADER(`Package Type: ${this.sfpPackage.packageType}`)); - SFPLogger.log(COLOR_HEADER(`Skip Packages If Already Installed: ${this.flags.skipifalreadyinstalled?`true`:`false`}`)); - SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${this.flags.artifactdir}`)); - SFPLogger.log(COLOR_HEADER(`Target Environment: ${this.flags.targetorg}`)); - - - if(this.sfpPackage.packageType == PackageType.Unlocked) - { - - SFPLogger.log(COLOR_HEADER(`Security Type: ${this.flags.securitytype}`)); - SFPLogger.log(COLOR_HEADER(`Upgrade Type: ${this.flags.upgradetype}`)); - SFPLogger.log(COLOR_HEADER(`Apex Compile Mode: package`)); - } - else if(this.sfpPackage.packageType == PackageType.Source) - { - SFPLogger.log(COLOR_HEADER(`Optimize Deployment: ${this.flags.optimizedeployment}`)); - SFPLogger.log(COLOR_HEADER(`Skip Testing: ${this.flags.skiptesting}`)); - } - - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - - let options: SfpPackageInstallationOptions = { - installationkey: installationkey, - apexcompile: `package`, - securitytype: security_type, - optimizeDeployment: optimizeDeployment, - skipTesting: skipTesting, - upgradetype: upgrade_type, - waitTime: waitTime, - publishWaitTime: publishWaitTime, - disableArtifactCommit: false, - skipIfPackageInstalled: skipIfAlreadyInstalled, - apiVersion: this.sfpPackage.apiVersion - }; - - let result = await SfpPackageInstaller.installPackage( - new ConsoleLogger(), - this.sfpPackage, - this.sfpOrg, - options - ); - - if (result.result === PackageInstallationStatus.Failed) { - throw new Error(result.message); - } - } catch (err) { - console.log(err); - process.exitCode = 1; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/source/create.ts b/packages/sfpowerscripts-cli/src/commands/package/source/create.ts deleted file mode 100644 index 0c2817fd6..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/source/create.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Messages } from '@salesforce/core'; -import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; -import PackageCreateCommand from '../../../PackageCreateCommand'; -import SfpPackage, { PackageType } from '../../../core/package/SfpPackage'; -import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'create_source_package'); - -export default class CreateSourcePackage extends PackageCreateCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp package:source:create -n mypackage -v `, - `$ sfp package:source:create -n -v --diffcheck --gittag` - ]; - - protected static requiresUsername = false; - protected static requiresDevhubUsername = false; - protected static requiresProject = true; - - public static flags = { - package: Flags.string({ - required: true, - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - versionnumber: Flags.string({ - required: true, - char: 'v', - description: messages.getMessage('versionNumberFlagDescription'), - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - diffcheck: Flags.boolean({ description: messages.getMessage('diffCheckFlagDescription') }), - branch: Flags.string({ - description: messages.getMessage('branchFlagDescription'), - }), - gittag: Flags.boolean({ description: messages.getMessage('gitTagFlagDescription') }), - repourl: Flags.string({ char: 'r', description: messages.getMessage('repoUrlFlagDescription') }), - refname: Flags.string({ description: messages.getMessage('refNameFlagDescription') }), - loglevel - }; - - protected async create(): Promise { - let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - new ConsoleLogger(), - null, - this.sfdxPackage, - { - overridePackageTypeWith: PackageType.Source, - packageVersionNumber: this.versionNumber, - sourceVersion: this.commitId, - repositoryUrl: this.repositoryURL, - branch: this.branch, - } - ); - - console.log(COLOR_SUCCESS(`Created source package ${sfpPackage.packageName}`)); - - return sfpPackage; - } - - protected getConfigFilePath(): string { - return null; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/source/install.ts b/packages/sfpowerscripts-cli/src/commands/package/source/install.ts deleted file mode 100644 index 14746c316..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/source/install.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Messages } from '@salesforce/core'; -import InstallPackageCommand from '../../../InstallPackageCommand'; -import * as fs from 'fs-extra'; -import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import { DeploymentType } from '../../../core/deployers/DeploymentExecutor'; -import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; -import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'install_source_package'); - -export default class InstallSourcePackage extends InstallPackageCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp package:source:install -n mypackage -u `]; - - public static deprecated:boolean = true; - - public static flags = { - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - required: true, - }), - targetorg: requiredUserNameFlag, - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - skipifalreadyinstalled: Flags.boolean({ - description: messages.getMessage('skipIfAlreadyInstalled'), - }), - skiponmissingartifact: Flags.boolean({ - char: 's', - description: messages.getMessage('skipOnMissingArtifactFlagDescription'), - }), - optimizedeployment: Flags.boolean({ - char: 'o', - description: messages.getMessage('optimizedeployment'), - default: false, - required: false, - }), - skiptesting: Flags.boolean({ - char: 't', - description: messages.getMessage('skiptesting'), - default: false, - required: false, - }), - waittime: Flags.string({ - description: messages.getMessage('waitTimeFlagDescription'), - default: '120', - }), - refname: Flags.string({ - description: messages.getMessage('refNameFlagDescription'), - }), - loglevel - }; - - public async install(): Promise { - - SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) - - - const sfdx_package: string = this.flags.package; - const optimizeDeployment: boolean = this.flags.optimizedeployment; - const skipTesting: boolean = this.flags.skiptesting; - const wait_time: string = this.flags.waittime; - const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; - - console.log('sfp.Install Source Package To Org'); - - try { - let options: SfpPackageInstallationOptions = { - optimizeDeployment: optimizeDeployment, - skipTesting: skipTesting, - waitTime: wait_time, - deploymentType: DeploymentType.MDAPI_DEPLOY, - apiVersion: this.sfpPackage.apiVersion || this.sfpPackage.payload.Package.version, // Use package.xml version for backwards compat with old artifacts - disableArtifactCommit: false, - skipIfPackageInstalled : skipIfAlreadyInstalled - }; - - - let result = await SfpPackageInstaller.installPackage( - new ConsoleLogger(), - this.sfpPackage, - this.sfpOrg, - options - ); - - - if (result.result == PackageInstallationStatus.Failed) { - throw new Error(result.message); - } else { - console.log(`Succesfully Installed source package ${sfdx_package}`); - - console.log('\n\nOutput variables:'); - if (result.deploy_id) { - if (this.flags.refname) { - fs.writeFileSync( - '.env', - `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, - { flag: 'a' } - ); - console.log( - `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}` - ); - } else { - fs.writeFileSync( - '.env', - `sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, - { flag: 'a' } - ); - console.log(`sfp_installsourcepackage_deployment_id=${result.deploy_id}`); - } - } - } - } catch (error) { - console.log(error.message); - process.exitCode = 1; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts b/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts deleted file mode 100644 index 81972d059..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/unlocked/create.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Messages } from '@salesforce/core'; -import PackageCreateCommand from '../../../PackageCreateCommand'; -import { COLOR_SUCCESS, ConsoleLogger } from '@flxblio/sfp-logger'; -import SfpPackage from '../../../core/package/SfpPackage'; -import SfpPackageBuilder from '../../../core/package/SfpPackageBuilder'; -import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'create_unlocked_package'); - -export default class CreateUnlockedPackage extends PackageCreateCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresUsername = false; - protected static requiresDevhubUsername = true; - protected static requiresProject = true; - - public static examples = [ - `$ sfp package:unlocked:create -n -b -x -v --refname `, - `$ sfp package:unlocked:create -n -b -x -v --diffcheck --gittag`, - ]; - - public static flags = { - package: Flags.string({ - required: true, - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - installationkey: Flags.string({ - char: 'k', - description: messages.getMessage('installationKeyFlagDescription'), - exclusive: ['installationkeybypass'], - }), - installationkeybypass: Flags.boolean({ - char: 'x', - description: messages.getMessage('installationKeyBypassFlagDescription'), - exclusive: ['installationkey'], - }), - diffcheck: Flags.boolean({ - description: messages.getMessage('diffCheckFlagDescription'), - }), - gittag: Flags.boolean({ - description: messages.getMessage('gitTagFlagDescription'), - }), - targetdevhubusername, - repourl: Flags.string({ - char: 'r', - description: messages.getMessage('repoUrlFlagDescription'), - }), - versionnumber: Flags.string({ - description: messages.getMessage('versionNumberFlagDescription'), - }), - configfilepath: Flags.file({ - char: 'f', - description: messages.getMessage('configFilePathFlagDescription'), - default: 'config/project-scratch-def.json', - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - enablecoverage: Flags.boolean({ - description: messages.getMessage('enableCoverageFlagDescription'), - }), - isvalidationtobeskipped: Flags.boolean({ - char: 's', - description: messages.getMessage('isValidationToBeSkippedFlagDescription'), - }), - branch: Flags.string({ - description: messages.getMessage('branchFlagDescription'), - }), - tag: Flags.string({ - description: messages.getMessage('tagFlagDescription'), - }), - waittime: Flags.string({ - description: messages.getMessage('waitTimeFlagDescription'), - default: '120', - }), - refname: Flags.string({ - description: messages.getMessage('refNameFlagDescription'), - }), - loglevel - }; - - public async create(): Promise { - //TODO: Use tag info - let tag: string = this.flags.tag; - let installationkeybypass = this.flags.installationkeybypass; - let isCoverageEnabled: boolean = this.flags.enablecoverage; - let isSkipValidation: boolean = this.flags.isvalidationtobeskipped; - let installationkey = this.flags.installationkey; - let waitTime = this.flags.waittime; - - //Handle Installation Keys - if (installationkey === null || installationkey === undefined) { - installationkeybypass = true; - } - - let sfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - new ConsoleLogger(), - null, - this.sfdxPackage, - { - packageVersionNumber: this.versionNumber, - sourceVersion: this.commitId, - repositoryUrl: this.repositoryURL, - branch: this.branch, - configFilePath: this.flags.configfilepath, - }, - { - devHub: this.hubOrg.getUsername(), - installationkeybypass: installationkeybypass as boolean, - breakBuildIfEmpty: true, - waitTime: waitTime as string, - isCoverageEnabled: isCoverageEnabled as boolean, - isSkipValidation: isSkipValidation as boolean, - } - ); - - console.log(COLOR_SUCCESS(`Created unlocked package ${sfpPackage.packageName}`)); - return sfpPackage; - } - - protected getConfigFilePath(): string { - return this.flags.configfilepath; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts b/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts deleted file mode 100644 index 001e06743..000000000 --- a/packages/sfpowerscripts-cli/src/commands/package/unlocked/install.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { Messages } from '@salesforce/core'; -import InstallPackageCommand from '../../../InstallPackageCommand'; -import { PackageInstallationStatus } from '../../../core/package/packageInstallers/PackageInstallationResult'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import { SfpPackageInstallationOptions } from '../../../core/package/packageInstallers/InstallPackage'; -import SfpPackageInstaller from '../../../core/package/SfpPackageInstaller'; -import { Flags } from '@oclif/core'; -import { loglevel, requiredUserNameFlag } from '../../../flags/sfdxflags'; - - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'install_unlocked_package'); - -export default class InstallUnlockedPackage extends InstallPackageCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp package:unlocked:install -n packagename -u sandboxalias -i`]; - - public static deprecated:boolean = true; - - public static flags = { - package: Flags.string({ - char: 'n', - description: messages.getMessage('packageFlagDescription'), - }), - targetorg: requiredUserNameFlag, - installationkey: Flags.string({ - char: 'k', - description: messages.getMessage('installationKeyFlagDescription'), - }), - apexcompileonlypackage: Flags.boolean({ - char: 'a', - description: messages.getMessage('apexCompileOnlyPackageFlagDescription'), - }), - artifactdir: Flags.directory({ - description: messages.getMessage('artifactDirectoryFlagDescription'), - default: 'artifacts', - }), - securitytype: Flags.string({ - description: messages.getMessage('securityTypeFlagDescription'), - options: ['Custom', 'Full', 'None'], - default: 'Full', - }), - skipifalreadyinstalled: Flags.boolean({ - char: 'f', - description: messages.getMessage('skipIfAlreadyInstalled'), - }), - skiponmissingartifact: Flags.boolean({ - char: 's', - description: messages.getMessage('skipOnMissingArtifactFlagDescription'), - dependsOn: ['packageinstalledfrom'], - }), - upgradetype: Flags.string({ - description: messages.getMessage('upgradeTypeFlagDescription'), - options: ['delete-only', 'deprecate-only', 'mixed-mode'], - default: 'mixed-mode', - }), - waittime: Flags.string({ - description: messages.getMessage('waitTimeFlagDescription'), - default: '120', - }), - publishwaittime: Flags.string({ - description: messages.getMessage('publishWaitTimeFlagDescription'), - default: '10', - }), - loglevel - }; - - protected static requiresUsername = true; - protected static requiresDevhubUsername = false; - - public async install() { - - SFPLogger.log(`This command is now deprecated, please proceed to use sfp package:install instead`,LoggerLevel.WARN) - - try { - const installationkey = this.flags.installationkey; - const apexcompileonlypackage = this.flags.apexcompileonlypackage; - const security_type = this.flags.securitytype; - const upgrade_type = this.flags.upgradetype; - const waitTime = this.flags.waittime; - const publishWaitTime = this.flags.publishwaittime; - const skipIfAlreadyInstalled = this.flags.skipifalreadyinstalled; - - let options: SfpPackageInstallationOptions = { - installationkey: installationkey, - apexcompile: apexcompileonlypackage ? `package` : `all`, - securitytype: security_type, - upgradetype: upgrade_type, - waitTime: waitTime, - publishWaitTime: publishWaitTime, - disableArtifactCommit: false, - skipIfPackageInstalled: skipIfAlreadyInstalled, - apiVersion: this.sfpPackage.apiVersion || this.sfpPackage.payload.Package.version, // Use package.xml version for backwards compat with old artifacts - }; - - let result = await SfpPackageInstaller.installPackage( - new ConsoleLogger(), - this.sfpPackage, - this.sfpOrg, - options - ); - - if (result.result === PackageInstallationStatus.Failed) { - throw new Error(result.message); - } - } catch (err) { - console.log(err); - process.exitCode = 1; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/pool/delete.ts b/packages/sfpowerscripts-cli/src/commands/pool/delete.ts deleted file mode 100644 index 8ef6856d3..000000000 --- a/packages/sfpowerscripts-cli/src/commands/pool/delete.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Messages } from '@salesforce/core'; -import PoolDeleteImpl from '../../core/scratchorg/pool/PoolDeleteImpl'; -import OrphanedOrgsDeleteImpl from '../../core/scratchorg/pool/OrphanedOrgsDeleteImpl'; -import ScratchOrg from '../../core/scratchorg/ScratchOrg'; -import sfpCommand from '../../SfpCommand'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { COLOR_WARNING } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; -const Table = require('cli-table'); - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'pool_delete'); - -export default class Delete extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - - public static examples = [ - `$ sfp pool:delete -t core `, - `$ sfp pool:delete -t core -v devhub`, - `$ sfp pool:delete --orphans -v devhub`, - ]; - - public static flags = { - targetdevhubusername, - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagDescription'), - required: false, - }), - allscratchorgs: Flags.boolean({ - char: 'a', - description: messages.getMessage('allscratchorgsDescription'), - required: false, - }), - inprogressonly: Flags.boolean({ - char: 'i', - description: messages.getMessage('inprogressonlyDescription'), - required: false, - exclusive: ['allscratchorgs'], - }), - orphans: Flags.boolean({ - char: 'o', - description: messages.getMessage('recoverOrphanedScratchOrgsDescription'), - required: false, - }), - 'apiversion': orgApiVersionFlagSfdxStyle, - loglevel, - }; - - public async execute(): Promise<{ orgId: string; username: string; operation: string }[]> { - await this.hubOrg.refreshAuth(); - const hubConn = this.hubOrg.getConnection(); - - this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); - - let scratchOrgOperationResults: { orgId: string; username: string; operation: string }[] = []; - //User want to delete orphans only - if (this.flags.orphans && !this.flags.tag) { - let orphanedOrgsDeleteImpl = new OrphanedOrgsDeleteImpl(this.hubOrg, new ConsoleLogger()); - let recoveredScratchOrgs = (await orphanedOrgsDeleteImpl.execute()) as ScratchOrg[]; - this.pushToResults('recovered', recoveredScratchOrgs, scratchOrgOperationResults); - } else { - let poolDeleteImpl = new PoolDeleteImpl( - this.hubOrg, - this.flags.tag, - this.flags.mypool, - this.flags.allscratchorgs, - this.flags.inprogressonly, - new ConsoleLogger() - ); - - let deletedOrgs = (await poolDeleteImpl.execute()) as ScratchOrg[]; - this.pushToResults('deleted', deletedOrgs, scratchOrgOperationResults); - - let orphanedOrgsDeleteImpl = new OrphanedOrgsDeleteImpl(this.hubOrg, new ConsoleLogger()); - let recoverdScratchOrgs = (await orphanedOrgsDeleteImpl.execute()) as ScratchOrg[]; - this.pushToResults('recovered', recoverdScratchOrgs, scratchOrgOperationResults); - } - this.displayScrathOrgOperationsAsTable(scratchOrgOperationResults); - return scratchOrgOperationResults; - } - - private pushToResults( - operation: string, - scratchOrgs: ScratchOrg[], - result: { orgId: string; username: string; operation: string }[] - ) { - for (const scratchOrg of scratchOrgs) { - result.push({ orgId: scratchOrg.orgId, username: scratchOrg.username, operation: operation }); - } - } - - private displayScrathOrgOperationsAsTable( - scratchOrgOperationResults: { orgId: string; username: string; operation: string }[] - ) { - const table = new Table({ - head: ['Operation', 'OrgId', 'Username'], - chars: ZERO_BORDER_TABLE, - }); - - if (scratchOrgOperationResults.length > 0) { - scratchOrgOperationResults.forEach((scratchOrgOperation) => { - table.push([COLOR_KEY_MESSAGE(scratchOrgOperation.operation), scratchOrgOperation.orgId, scratchOrgOperation.username]); - }); - - SFPLogger.log(`The command resulted in the following operation`, LoggerLevel.INFO, new ConsoleLogger()); - SFPLogger.log(table.toString(), LoggerLevel.INFO, new ConsoleLogger()); - } else { - SFPLogger.log( - `${COLOR_WARNING(`No Scratch Orgs were found to be operated upon, The command will now exit`)}`, - LoggerLevel.INFO, - new ConsoleLogger() - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts b/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts deleted file mode 100644 index 02baaa0d8..000000000 --- a/packages/sfpowerscripts-cli/src/commands/pool/fetch.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Messages } from '@salesforce/core'; -import ScratchOrg from '../../core/scratchorg/ScratchOrg'; -import { AnyJson } from '@salesforce/ts-types'; -import PoolFetchImpl from '../../core/scratchorg/pool/PoolFetchImpl'; -import * as fs from 'fs-extra'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import InstalledArtifactsDisplayer from '../../core/display/InstalledArtifactsDisplayer'; -import InstalledPackageDisplayer from '../../core/display/InstalledPackagesDisplayer'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import SFPOrg from '../../core/org/SFPOrg'; -import { COLOR_HEADER } from '@flxblio/sfp-logger'; -import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; -import { COLOR_TIME } from '@flxblio/sfp-logger'; -import getFormattedTime from '../../core/utils/GetFormattedTime'; -import sfpCommand from '../../SfpCommand'; -import { Flags, ux } from '@oclif/core'; -import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poolFetch'); - -export default class Fetch extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - public static enableJsonFlag = true; - - public static examples = [ - `$ sfp pool:fetch -t core `, - `$ sfp pool:fetch -t core -v devhub`, - `$ sfp pool:fetch -t core -v devhub -m`, - `$ sfp pool:fetch -t core -v devhub -s testuser@test.com`, - ]; - - public static flags = { - targetdevhubusername, - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagDescription'), - required: true, - }), - alias: Flags.string({ - char: 'a', - description: messages.getMessage('aliasDescription'), - required: false, - }), - sendtouser: Flags.string({ - char: 's', - description: messages.getMessage('sendToUserDescription'), - required: false, - }), - setdefaultusername: Flags.boolean({ - char: 'd', - description: messages.getMessage('setdefaultusernameDescription'), - required: false, - }), - nosourcetracking: Flags.boolean({ - default: false, - description: messages.getMessage('noSourceTrackingDescription'), - required: false, - }), - 'apiversion': orgApiVersionFlagSfdxStyle, - loglevel - }; - - public async execute(): Promise { - const fetchStartTime: number = Date.now(); - - - await this.hubOrg.refreshAuth(); - const hubConn = this.hubOrg.getConnection(); - - if (this.flags.json) SFPLogger.logLevel = LoggerLevel.HIDE; - - SFPLogger.log( - COLOR_KEY_MESSAGE(`Fetching a scratch org from pool ${this.flags.tag} in Org ${this.hubOrg.getOrgId()}`), - LoggerLevel.INFO - ); - - this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); - - let fetchImpl = new PoolFetchImpl( - this.hubOrg, - this.flags.tag, - false, - false, - this.flags.sendtouser, - this.flags.alias, - this.flags.setdefaultusername - ); - - if (!this.flags.nosourcetracking) { - SFPLogger.log( - COLOR_KEY_MESSAGE(`Enabling source tracking, this will take a bit of time, please hang on`) - ); - fetchImpl.setSourceTrackingOnFetch(); - } - - let result = (await fetchImpl.execute()) as ScratchOrg; - - if (!this.flags.json && !this.flags.sendtouser) { - await this.displayOrgContents(result); - - ux.log(`======== Scratch org details ========`); - let list = []; - for (let [key, value] of Object.entries(result)) { - if (value) { - list.push({ key: key, value: value }); - } - } - //add alias info - if (this.flags.alias) list.push({ key: 'alias', value: this.flags.alias }); - - ux.table(list, {key:{},value:{}}); - this.printFetchSummary(!this.flags.nosourcetracking, Date.now() - fetchStartTime); - } - - return result as AnyJson; - } - - /** - * Display artifacts and managed packages installed in the org - * @param soDetail - */ - private async displayOrgContents(soDetail: ScratchOrg) { - try { - let scratchOrgAsSFPOrg = await SFPOrg.create({ aliasOrUsername: soDetail.username }); - let installedManagedPackages = await scratchOrgAsSFPOrg.getAllInstalledManagedPackages(); - SFPLogger.log('Installed managed packages:', LoggerLevel.INFO); - InstalledPackageDisplayer.printInstalledPackages(installedManagedPackages, null); - - let installedArtifacts = await scratchOrgAsSFPOrg.getInstalledArtifacts(); - InstalledArtifactsDisplayer.printInstalledArtifacts(installedArtifacts, null); - } catch (error) { - SFPLogger.log( - 'Failed to query packages/artifacts installed in the org due to \n' + error.message, - LoggerLevel.ERROR - ); - } - } - - private printFetchSummary(isSourceTrackingEnabled: boolean, totalElapsedTime: number): void { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - if (!isSourceTrackingEnabled) { - SFPLogger.log( - COLOR_SUCCESS(`Succesfully fetched a scratch org in ${COLOR_TIME(getFormattedTime(totalElapsedTime))}`) - ); - } else { - SFPLogger.log( - COLOR_SUCCESS( - `Succesfully fetched a scratch org and enabled source tracking in ${COLOR_TIME( - getFormattedTime(totalElapsedTime) - )}` - ) - ); - } - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/pool/list.ts b/packages/sfpowerscripts-cli/src/commands/pool/list.ts deleted file mode 100644 index e4761f392..000000000 --- a/packages/sfpowerscripts-cli/src/commands/pool/list.ts +++ /dev/null @@ -1,129 +0,0 @@ - -import { AnyJson } from '@salesforce/ts-types'; -import poolListImpl from '../../core/scratchorg/pool/PoolListImpl'; -import ScratchOrg from '../../core/scratchorg/ScratchOrg'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import { Flags, ux } from '@oclif/core'; -import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poollist'); - -export default class List extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - public static enableJsonFlag = true - - public static examples = [ - `$ sfp pool:list -t core `, - `$ sfp pool:list -t core -v devhub`, - `$ sfp pool:list -t core -v devhub -m`, - `$ sfp pool:list -t core -v devhub -m -a`, - ]; - - public static flags = { - targetdevhubusername, - 'apiversion': orgApiVersionFlagSfdxStyle, - tag: Flags.string({ - char: 't', - description: messages.getMessage('tagDescription'), - required: false, - }), - mypool: Flags.boolean({ - char: 'm', - description: messages.getMessage('mypoolDescription'), - required: false, - }), - allscratchorgs: Flags.boolean({ - char: 'a', - description: messages.getMessage('allscratchorgsDescription'), - required: false, - }), - loglevel - }; - - public async execute(): Promise { - await this.hubOrg.refreshAuth(); - const hubConn = this.hubOrg.getConnection(); - - this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); - - let listImpl = new poolListImpl(this.hubOrg, this.flags.tag, this.flags.allscratchorgs); - - let result = (await listImpl.execute()) as ScratchOrg[]; - - if (!this.flags.mypool && result.length > 0) { - result.forEach((element) => { - delete element.password; - }); - } - - let scratchOrgInuse = result.filter((element) => element.status === 'In use'); - let scratchOrgNotInuse = result.filter((element) => element.status === 'Available'); - let scratchOrgInProvision = result.filter((element) => element.status === 'Provisioning in progress'); - - if (!this.flags.json) { - if (result.length > 0) { - ux.log(`======== Scratch org Details ========`); - - if (!this.flags.tag) { - ux.log(`List of all the pools in the org`); - - this.logTagCount(result); - ux.log('==================================='); - } - - if (this.flags.allscratchorgs) { - ux.log(`Used Scratch Orgs in the pool: ${scratchOrgInuse.length}`); - } - ux.log(`Unused Scratch Orgs in the Pool : ${scratchOrgNotInuse.length} \n`); - if (scratchOrgInProvision.length && scratchOrgInProvision.length > 0) { - ux.log(`Scratch Orgs being provisioned in the Pool : ${scratchOrgInProvision.length} \n`); - } - - if (this.flags.mypool) { - // ux.table(result, {'tag':{}, 'orgId':{}, 'username':{}, 'password':{}, 'expiryDate':{}, 'status':{}, 'loginURL':{}}); - } else { - //ux.table(result, ['tag', 'orgId', 'username', 'expiryDate', 'status', 'loginURL']); - } - } else { - SFPLogger.log(`No Scratch orgs available, time to create your pool.`, LoggerLevel.ERROR); - } - } - - let output = { - total: scratchOrgInuse.length + scratchOrgNotInuse.length + scratchOrgInProvision.length, - inuse: scratchOrgInuse.length, - unused: scratchOrgNotInuse.length, - inprovision: scratchOrgInProvision.length, - scratchOrgDetails: result, - }; - - return output; - } - - private logTagCount(result: ScratchOrg[]) { - let tagCounts: any = result.reduce(function (obj, v) { - obj[v.tag] = (obj[v.tag] || 0) + 1; - return obj; - }, {}); - - let tagArray = new Array(); - - Object.keys(tagCounts).forEach(function (key) { - tagArray.push({ - tag: key, - count: tagCounts[key], - }); - }); - - ux.table(tagArray, {'tag':{}, 'count':{}}); - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts b/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts deleted file mode 100644 index 6a0251f65..000000000 --- a/packages/sfpowerscripts-cli/src/commands/pool/metrics/publish.ts +++ /dev/null @@ -1,133 +0,0 @@ -import sfpCommand from '../../../SfpCommand'; -import SFPStatsSender from '../../../core/stats/SFPStatsSender'; -import PoolListImpl from '../../../core/scratchorg/pool/PoolListImpl'; -import ScratchOrg from '../../../core/scratchorg/ScratchOrg'; -import LimitsFetcher from '../../../core/limits/LimitsFetcher'; -const Table = require('cli-table'); -import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import { loglevel, targetdevhubusername } from '../../../flags/sfdxflags'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_metrics_publish'); - -export default class Publish extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - protected static requiresProject = false; - - public static examples = ['$ sfp pool:metrics:publish -v ']; - - public static flags = { - targetdevhubusername, - loglevel - }; - - public async execute(): Promise { - this.validateEnvVars(); - - let nPooledScratchOrgs: number = 0; - let pools: { [p: string]: poolMetrics }; - - try { - const listOfScratchOrgs = (await new PoolListImpl(this.hubOrg, null, true).execute()) as ScratchOrg[]; - - nPooledScratchOrgs = listOfScratchOrgs.length ? listOfScratchOrgs.length : 0; - pools = this.getMetricsForEachPool(listOfScratchOrgs); - } catch (err) { - SFPLogger.log( - `Failed to get metrics for scratch org pools. Ensure prerequisites are installed for pooling.`, - LoggerLevel.TRACE - ); - } - - const table = new Table({ - head: ['Metric', 'Value', 'Tag'], - }); - - const limits = await new LimitsFetcher(this.hubOrg.getConnection()).getApiLimits(); - const remainingActiveScratchOrgs = limits.find((limit) => limit.name === 'ActiveScratchOrgs').remaining; - const remainingDailyScratchOrgs = limits.find((limit) => limit.name === 'DailyScratchOrgs').remaining; - const devhubUserName = this.hubOrg.getUsername() - - SFPStatsSender.logGauge(`scratchorgs.active.remaining`, remainingActiveScratchOrgs, {target_org: devhubUserName}); - SFPStatsSender.logGauge(`scratchorgs.daily.remaining`, remainingDailyScratchOrgs, {target_org: devhubUserName}); - - table.push(['sfp.scratchorgs.active.remaining', remainingActiveScratchOrgs, devhubUserName]); - table.push(['sfp.scratchorgs.daily.remaining', remainingDailyScratchOrgs, devhubUserName]); - - SFPStatsSender.logGauge(`pool.footprint`, nPooledScratchOrgs); - table.push(['sfp.pool.footprint', nPooledScratchOrgs, '']); - - if (pools) { - for (let pool of Object.entries(pools)) { - SFPStatsSender.logGauge('pool.total', pool[1].nTotal, { poolName: pool[0] }); - SFPStatsSender.logGauge('pool.available', pool[1].nAvailable, { poolName: pool[0] }); - SFPStatsSender.logGauge('pool.inuse', pool[1].nInUse, { poolName: pool[0] }); - SFPStatsSender.logGauge('pool.provisioning', pool[1].nProvisioningInProgress, { poolName: pool[0] }); - - table.push(['sfp.pool.total', pool[1].nTotal, pool[0]]); - table.push(['sfp.pool.available', pool[1].nAvailable, pool[0]]); - table.push(['sfp.pool.inuse', pool[1].nInUse, pool[0]]); - table.push(['sfp.pool.provisioning', pool[1].nProvisioningInProgress, pool[0]]); - } - } - - SFPLogger.log(COLOR_KEY_MESSAGE('Metrics published:'), LoggerLevel.INFO); - SFPLogger.log(table.toString(), LoggerLevel.INFO); - } - - private getMetricsForEachPool(listOfScratchOrgs: ScratchOrg[]) { - const pools: { [p: string]: poolMetrics } = {}; - - listOfScratchOrgs.forEach((scratchOrg) => { - if (!pools[scratchOrg.tag]) { - pools[scratchOrg.tag] = { - nTotal: 0, - nAvailable: 0, - nInUse: 0, - nProvisioningInProgress: 0, - }; - } - if (scratchOrg.status === 'Available') { - pools[scratchOrg.tag].nAvailable++; - } else if (scratchOrg.status === 'In use') { - pools[scratchOrg.tag].nInUse++; - } else if (scratchOrg.status === 'Provisioning in progress') { - pools[scratchOrg.tag].nProvisioningInProgress++; - } - - pools[scratchOrg.tag].nTotal = - pools[scratchOrg.tag].nAvailable + - pools[scratchOrg.tag].nInUse + - pools[scratchOrg.tag].nProvisioningInProgress; - }); - - return pools; - } - - private validateEnvVars() { - if ( - !( - process.env.sfp_STATSD || - process.env.sfp_DATADOG || - process.env.sfp_NEWRELIC || - process.env.sfp_SPLUNK - ) - ) { - throw new Error('Environment variable not set for metrics. No metrics will be published.'); - } - } -} - -interface poolMetrics { - nTotal: number; - nAvailable: number; - nInUse: number; - nProvisioningInProgress: number; -} diff --git a/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts b/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts deleted file mode 100644 index 98916f405..000000000 --- a/packages/sfpowerscripts-cli/src/commands/pool/org/delete.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { AnyJson } from '@salesforce/ts-types'; -import sfpCommand from '../../../SfpCommand'; -import PoolOrgDeleteImpl from '../../../core/scratchorg/pool/PoolOrgDeleteImpl'; -import SFPLogger from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import { - loglevel, - orgApiVersionFlagSfdxStyle, - targetdevhubusername, - requiredUserNameFlag, -} from '../../../flags/sfdxflags'; -import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_org_delete'); - -export default class Delete extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - protected static requiresDevhubUsername = true; - - public static examples = [`$ sfp pool:org:delete -u test-xasdasd@example.com -v devhub`]; - - public static flags = { - apiversion: orgApiVersionFlagSfdxStyle, - targetusername: requiredUserNameFlag, - targetdevhubusername, - loglevel, - }; - - public async execute(): Promise { - await this.hubOrg.refreshAuth(); - const hubConn = this.hubOrg.getConnection(); - - this.flags.apiversion = this.flags.apiversion || (await hubConn.retrieveMaxApiVersion()); - - let aliasAccessor = await AliasAccessor.create(); - let resolvedAliasOrUserName:string; - if (aliasAccessor.resolveAlias(this.flags.targetusername)) { - resolvedAliasOrUserName = aliasAccessor.resolveUsername(this.flags.targetusername); - } else { - resolvedAliasOrUserName = this.flags.targetusername; - } - - let poolOrgDeleteImpl = new PoolOrgDeleteImpl(this.hubOrg, resolvedAliasOrUserName); - - await poolOrgDeleteImpl.execute(); - if (!this.flags.json) - SFPLogger.log(`Scratch org with username or alias ${this.flags.targetusername} is deleted successfully`); - - return { username: this.flags.username, messages: 'Scratch Org deleted Succesfully' } as AnyJson; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/profile/merge.ts b/packages/sfpowerscripts-cli/src/commands/profile/merge.ts deleted file mode 100644 index 1955a40d1..000000000 --- a/packages/sfpowerscripts-cli/src/commands/profile/merge.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Messages, Org } from '@salesforce/core'; -import { isNil } from 'lodash'; -import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import ProfileRetriever from '@flxblio/sfprofiles/lib/impl/metadata/retriever/profileRetriever'; -import ProfileMerge from '@flxblio/sfprofiles/lib/impl/source/profileMerge'; -import sfpCommand from '../../SfpCommand'; -import Table from 'cli-table'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; - -Messages.importMessagesDirectory(__dirname); - -const messages = Messages.loadMessages('@flxblio/sfp', 'profile_merge'); - -export default class Merge extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp profile:merge -u sandbox`, - `$ sfp profile:merge -f force-app -n "My Profile" -u sandbox`, - `$ sfp profile:merge -f "module1, module2, module3" -n "My Profile1, My profile2" -u sandbox`, - ]; - - public static flags = { - folder: arrayFlagSfdxStyle({ - char: 'f', - description: messages.getMessage('folderFlagDescription'), - required: false, - }), - profilelist: arrayFlagSfdxStyle({ - char: 'n', - description: messages.getMessage('profileListFlagDescription'), - required: false, - }), - metadata: arrayFlagSfdxStyle({ - char: 'm', - description: messages.getMessage('metadataFlagDescription'), - required: false, - }), - delete: Flags.boolean({ - char: 'd', - description: messages.getMessage('deleteFlagDescription'), - required: false, - }), - targetorg: requiredUserNameFlag, - 'apiversion': orgApiVersionFlagSfdxStyle, - loglevel, - }; - - // Comment this out if your command does not require an org username - protected static requiresUsername = true - - // Set this to true if your command requires a project workspace; 'requiresProject' is false by default - protected static requiresProject = true; - - public async execute(): Promise { - let argFolder = this.flags.folder; - let argProfileList = this.flags.profilelist; - let argMetadatas = this.flags.metadata; - - // argMetadatas = (val: string) => { - // let parts = val.split(':'); - // return { - // MetadataType: parts[0].trim(), - // ApiName: parts.length >= 2 ? parts[1].trim() : '*', - // }; - // }; - - Sfpowerkit.initCache(); - - let metadatas = undefined; - let invalidArguments = []; - - if (argMetadatas !== undefined) { - metadatas = {}; - ProfileRetriever.supportedMetadataTypes.forEach((val) => { - metadatas[val] = []; - }); - for (let i = 0; i < argMetadatas.length; i++) { - if (ProfileRetriever.supportedMetadataTypes.includes(argMetadatas[i].MetadataType)) { - metadatas[argMetadatas[i].MetadataType].push(argMetadatas[i].ApiName); - } else { - invalidArguments.push(argMetadatas[i].MetadataType); - } - } - if (invalidArguments.length > 0) { - throw new Error( - 'Metadata(s) ' + invalidArguments.join(', ') + ' is/are not supported.' - ); - } - } - - if (!isNil(argFolder) && argFolder.length !== 0) { - Sfpowerkit.setDefaultFolder(argFolder[0]); - } - ``; - - - this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); - const profileUtils = new ProfileMerge(this.org); - - let mergedProfiles = await profileUtils.merge(argFolder, argProfileList || [], metadatas, this.flags.delete); - - const table = new Table({ - head: ['State', 'Full Name', 'Type', 'Path'], - chars: ZERO_BORDER_TABLE, - }); - if (mergedProfiles.added) { - mergedProfiles.added.forEach((profile) => { - table.push({ - state: 'Add', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - if (mergedProfiles.updated) { - mergedProfiles.updated.forEach((profile) => { - table.push({ - state: 'Merged', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - if (this.flags.delete) { - if (mergedProfiles.deleted) { - mergedProfiles.deleted.forEach((profile) => { - table.push({ - state: 'Deleted', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - } else { - if (mergedProfiles.deleted) { - mergedProfiles.deleted.forEach((profile) => { - table.push({ - state: 'Skipped', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - } - SFPLogger.log(table.toString(), LoggerLevel.INFO); - - return mergedProfiles; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts b/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts deleted file mode 100644 index 571af5b55..000000000 --- a/packages/sfpowerscripts-cli/src/commands/profile/reconcile.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Messages, Org } from '@salesforce/core'; -import * as _ from 'lodash'; -import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import { METADATA_INFO } from '@flxblio/sfprofiles/lib/impl/metadata/metadataInfo'; -import * as path from 'path'; -import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; -import MetadataFiles from '@flxblio/sfprofiles/lib/impl/metadata/metadataFiles'; -import sfpCommand from '../../SfpCommand'; -const Table = require('cli-table'); -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import { Flags } from '@oclif/core'; -import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); - - -const messages = Messages.loadMessages('@flxblio/sfp', 'profile_reconcile'); - -export default class Reconcile extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp profile:reconcile --folder force-app -d destfolder -s`, - `$ sfp profile:reconcile --folder force-app,module2,module3 -u sandbox -d destfolder`, - `$ sfp profile:reconcile -u myscratchorg -d destfolder`, - ]; - - - - public static flags = { - folder:arrayFlagSfdxStyle({ - char: 'f', - description: messages.getMessage('folderFlagDescription'), - required: false, - }), - profilelist: arrayFlagSfdxStyle({ - char: 'n', - description: messages.getMessage('nameFlagDescription'), - required: false, - }), - destfolder: Flags.directory({ - char: 'd', - description: messages.getMessage('destFolderFlagDescription'), - required: false, - }), - sourceonly: Flags.boolean({ - char: 's', - description: messages.getMessage('sourceonlyFlagDescription'), - required: false, - }), - targetorg: requiredUserNameFlag, - 'apiversion': orgApiVersionFlagSfdxStyle, - loglevel, - - }; - - // Comment this out if your command does not require an org username - protected static requiresUsername = false; - - // Comment this out if your command does not support a hub org username - //protected static supportsDevhubUsername = true; - - // Set this to true if your command requires a project workspace; 'requiresProject' is false by default - protected static requiresProject = true; - - public async execute(): Promise> { - let argFolder = this.flags.folder; - let argProfileList = this.flags.profilelist; - - if (!this.flags.sourceonly) { - if (_.isNil(this.flags.targetorg)) { - throw new Error('Either set sourceonly flag or provide and org for reconcile'); - } else { - this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); - } - } - - MetadataFiles.sourceOnly = this.flags.sourceonly; - - if (!_.isNil(argFolder) && argFolder.length !== 0) { - Sfpowerkit.setDefaultFolder(argFolder[0]); - } - - let result = []; - - try { - let profileReconciler = new ProfileReconcile(this.org); - let reconcileProfiles = await profileReconciler.reconcile( - argFolder, - argProfileList || [], - this.flags.destfolder - ); - - // Return an object to be displayed with --json - - reconcileProfiles.forEach((file) => { - result.push({ - state: 'Cleaned', - fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), - type: 'Profile', - path: path.relative(process.cwd(), file), - }); - }); - } catch (err) { - SFPLogger.log(err, LoggerLevel.ERROR); - - SFPLogger.log( - 'An error occured during profile reconcile. You can rerun the command after a moment.', - LoggerLevel.ERROR - ); - } - const table = new Table({ - head: ['State', 'Full Name', 'Type', 'Path'], - chars: ZERO_BORDER_TABLE, - }); - for (let res of result) { - table.push([res.state, res.fullName, res.type, res.path]); - } - SFPLogger.log(table.toString(), LoggerLevel.INFO); - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts b/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts deleted file mode 100644 index d1b1853e0..000000000 --- a/packages/sfpowerscripts-cli/src/commands/profile/retrieve.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Messages, Org } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import { isNil } from 'lodash'; -import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; -import ProfileSync from '@flxblio/sfprofiles/lib/impl/source/profileSync'; -import sfpCommand from '../../SfpCommand'; -import Table from 'cli-table'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; -import { Flags } from '@oclif/core'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; - - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'profile_retrieve'); - -export default class Retrieve extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp profile:retrieve -u prod`, - `$ sfp profile:retrieve -f force-app -n "My Profile" -u prod`, - `$ sfp profile:retrieve -f "module1, module2, module3" -n "My Profile1, My profile2" -u prod`, - ]; - - - public static flags = { - folder: arrayFlagSfdxStyle({ - char: 'f', - description: messages.getMessage('folderFlagDescription'), - required: false, - }), - profilelist: arrayFlagSfdxStyle({ - char: 'n', - description: messages.getMessage('profileListFlagDescription'), - required: false, - }), - delete: Flags.boolean({ - char: 'd', - description: messages.getMessage('deleteFlagDescription'), - required: false, - }), - targetorg: requiredUserNameFlag, - 'apiversion': orgApiVersionFlagSfdxStyle, - loglevel, - }; - - // Comment this out if your command does not require an org username - protected static requiresUsername = true; - - // Set this to true if your command requires a project workspace; 'requiresProject' is false by default - protected static requiresProject = true; - - public async execute(): Promise { - let argFolder: string = this.flags.folder; - let argProfileList: string[] = this.flags.profilelist; - - let folders: string[] = []; - if (!isNil(argFolder) && argFolder.length !== 0) { - for (let dir of argFolder) { - if (!fs.existsSync(dir)) { - throw new Error(`The profile path ${dir} does not exist.`); - } - } - folders.push(...argFolder); - } - - Sfpowerkit.initCache(); - - SFPLogger.log(COLOR_WARNING(messages.getMessage('retriveDelayWarning')),LoggerLevel.INFO); - SFPLogger.log(COLOR_KEY_MESSAGE(`Retrieving profiles from ${this.flags.targetorg}`),LoggerLevel.INFO ); - - this.org = await Org.create({ aliasOrUsername: this.flags.targetorg }); - const profileUtils = new ProfileSync(this.org); - - let syncProfiles = await profileUtils.sync(folders, argProfileList || [], this.flags.delete); - - const table = new Table({ - head: ['State', 'Full Name', 'Type', 'Path'], - chars: ZERO_BORDER_TABLE, - }); - if (syncProfiles.added) { - syncProfiles.added.forEach((profile) => { - table.push({ - state: 'Add', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - if (syncProfiles.updated) { - syncProfiles.updated.forEach((profile) => { - table.push({ - state: 'Updated', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - if (this.flags.delete) { - if (syncProfiles.deleted) { - syncProfiles.deleted.forEach((profile) => { - table.push({ - state: 'Deleted', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - } else { - if (syncProfiles.deleted) { - syncProfiles.deleted.forEach((profile) => { - table.push({ - state: 'Skipped', - fullName: profile.name, - type: 'Profile', - path: profile.path, - }); - }); - } - } - - return syncProfiles; - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts b/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts deleted file mode 100644 index 0bad08e90..000000000 --- a/packages/sfpowerscripts-cli/src/commands/releasedefinition/generate.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { Messages } from '@salesforce/core'; -import ReleaseDefinitionGenerator from '../../impl/release/ReleaseDefinitionGenerator'; -import sfpCommand from '../../SfpCommand'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'releasedefinition_generate'); - -export default class Generate extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [ - `$ sfp releasedefinition:generate -n -c -f `, - ]; - - protected static requiresProject = true; - protected static requiresDevhubUsername = false; - - public static flags = { - gitref: Flags.string({ - char: 'c', - description: messages.getMessage('commitFlagDescription'), - required: true - }), - configfile: Flags.string({ - char: 'f', - required: true, - description: messages.getMessage('configFileFlagDescription'), - }), - releasename: Flags.string({ - char: 'n', - required: true, - description: messages.getMessage('releaseNameFlagDescription'), - }), - branchname: Flags.string({ - char: 'b', - description: messages.getMessage('branchNameFlagDescription'), - }), - directory: Flags.string({ - char: 'd', - description: messages.getMessage('directoryFlagDescription'), - }), - nopush: Flags.boolean({ - description: messages.getMessage('noPushFlagDescription'), - default:false - }), - forcepush: Flags.boolean({ - description: messages.getMessage('forcePushFlagDescription'), - dependsOn: ['push'], - }), - loglevel - }; - - async execute(): Promise { - try { - let releaseDefinitionGenerator: ReleaseDefinitionGenerator = new ReleaseDefinitionGenerator( - new ConsoleLogger(), - this.flags.gitref, - this.flags.configfile, - this.flags.releasename, - this.flags.branchname, - this.flags.directory, - this.flags.nopush, - this.flags.forcepush - ); - return await releaseDefinitionGenerator.exec(); - } catch (err) { - let errorMessage: string = ''; - if (err instanceof Array) { - for (let e of err) { - errorMessage += e.message + `\n`; - } - } else { - errorMessage = err.message; - } - console.log(errorMessage); - - process.exit(1); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/commands/repo/patch.ts b/packages/sfpowerscripts-cli/src/commands/repo/patch.ts deleted file mode 100644 index 1781b3286..000000000 --- a/packages/sfpowerscripts-cli/src/commands/repo/patch.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import FetchImpl from '../../impl/artifacts/FetchImpl'; -import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; -import path = require('path'); -import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; -import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import SFPLogger, { ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; -import Git from '../../core/git/Git'; -import * as fs from 'fs-extra'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; -import { COLOR_WARNING } from '@flxblio/sfp-logger'; -import { COLOR_HEADER } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol } from '../../flags/sfdxflags'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'patch'); - -export default class Patch extends sfpCommand { - public static description = messages.getMessage('commandDescription'); - - public static examples = [`$ sfp repo:patch -n `]; - - protected static requiresProject = true; - protected static requiresDevhubUsername = false; - - public static flags = { - releasedefinitions: arrayFlagSfdxStyle({ - char: 'p', - required: true, - description: messages.getMessage('releaseDefinitionFlagDescription'), - }), - sourcebranchname: Flags.string({ - char: 's', - required: true, - description: messages.getMessage('sourcebranchNameFlagDescription'), - }), - targetbranchname: Flags.string({ - char: 't', - required: true, - description: messages.getMessage('targetbranchNameFlagDescription'), - }), - scriptpath: Flags.file({ - char: 'f', - description: messages.getMessage('scriptPathFlagDescription'), - }), - npm: Flags.boolean({ - description: messages.getMessage('npmFlagDescription'), - exclusive: ['scriptpath'], - }), - scope: Flags.string({ - description: messages.getMessage('scopeFlagDescription'), - dependsOn: ['npm'], - parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), - }), - npmrcpath: Flags.file({ - description: messages.getMessage('npmrcPathFlagDescription'), - dependsOn: ['npm'], - required: false, - }), - logsgroupsymbol, - loglevel - }; - - async execute(): Promise { - let git; - try { - let logger: Logger = new ConsoleLogger(); - - SFPLogger.log( - COLOR_HEADER(`Source Branch: ${this.flags.sourcebranchname}`), - LoggerLevel.INFO, - logger - ); - SFPLogger.log( - COLOR_HEADER(`Release Defintion: ${this.flags.releasedefinitions}`), - LoggerLevel.INFO, - logger - ); - SFPLogger.log( - COLOR_HEADER(`Target Branch: ${this.flags.targetbranchname}`), - LoggerLevel.INFO, - logger - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - //Load release definition - let releaseDefinitions = await this.loadReleaseDefintions(this.flags.releasedefinitions); - - SFPLogger.log(EOL, LoggerLevel.INFO, logger); - SFPLogger.log(COLOR_WARNING('This process may take a bit of time'), LoggerLevel.INFO, logger); - - //Create temporary git rep - git = await Git.initiateRepoAtTempLocation(logger, null, this.flags.sourcebranchname); - await git.createBranch(this.flags.targetbranchname); - - //Fetch artifacts - await this.fetchArtifacts( - releaseDefinitions, - this.flags.scriptpath, - this.flags.scope, - this.flags.npmrcpath, - logger - ); - - //overwrite modules - await this.overwriteModules(releaseDefinitions, git, logger); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Patching of Branch ${this.flags.targetbranchname} with release ${this.flags.releasedefinitions} completed` - ), - LoggerLevel.INFO - ); - SFPLogger.log(COLOR_KEY_MESSAGE(`New Branch with patches created ${this.flags.targetbranchname}`), LoggerLevel.INFO); - } finally { - if (git) await git.deleteTempoRepoIfAny(); - } - } - - - private async fetchArtifacts( - releaseDefintions: ReleaseDefinitionSchema[], - fetchArtifactScript: string, - scope: string, - npmrcPath: string, - logger: Logger - ) { - let groupSection = new GroupConsoleLogs('Fetching artifacts').begin(); - SFPLogger.log(COLOR_KEY_MESSAGE('Fetching artifacts'), LoggerLevel.INFO, logger); - let fetchImpl: FetchImpl = new FetchImpl('artifacts', fetchArtifactScript, scope, npmrcPath, logger); - await fetchImpl.fetchArtifacts(releaseDefintions); - groupSection.end(); - } - - private async loadReleaseDefintions(releaseDefinitionPaths: []): Promise { - let releaseDefinitions: ReleaseDefinitionSchema[] = []; - for (const pathToReleaseDefintion of releaseDefinitionPaths) { - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)) - .releaseDefinition; - releaseDefinitions.push(releaseDefinition); - } - return releaseDefinitions; - } - - private async overwriteModules(releaseDefinitions: ReleaseDefinitionSchema[], git: Git, logger: Logger) { - let temporaryWorkingDirectory = git.getRepositoryPath(); - let revisedProjectConfig = ProjectConfig.getSFDXProjectConfig(temporaryWorkingDirectory); - for (const releaseDefinition of releaseDefinitions) { - let revisedArtifactDirectory = path.join( - 'artifacts', - releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') - ); - - let artifacts = ArtifactFetcher.fetchArtifacts(revisedArtifactDirectory, null, logger); - - if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${revisedArtifactDirectory}`); - - //Convert artifacts to SfpPackages - let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts, logger); - - //Grab the latest projectConfig from Packages - let sfpPackageInquirer: SfpPackageInquirer = new SfpPackageInquirer(sfpPackages, logger); - let sfdxProjectConfigFromLeadingArtifact = sfpPackageInquirer.getLatestProjectConfig(); - - - let idx = 0; - for (const sfpPackage of sfpPackages) { - SFPLogger.log(`Processing package ${sfpPackage.packageName}`); - - let packageDescriptorFromArtifact=ProjectConfig.getPackageDescriptorFromConfig( - sfpPackage.packageName, - sfdxProjectConfigFromLeadingArtifact - ); - - - //Retrieve the project directory path from the current working directory and remove it - try { - //Find path - let pathToPackageInSourceBranch = ProjectConfig.getPackageDescriptorFromConfig( - sfpPackage.packageName, - revisedProjectConfig - ).path; - //Remove the path mentioned in the target path - fs.removeSync(path.join(temporaryWorkingDirectory, pathToPackageInSourceBranch)); - } catch (error) { - //Package not found, do nothing - } - - //Create new path as mentioned in artifact - fs.mkdirpSync(path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory)); - - - //Copy from artifacts to each package directory - //If diff, artifact will only contain delta, so use the version control to checkout the entire reference - if(sfpPackage.packageType==PackageType.Diff) - { - - await git.checkoutPath(sfpPackage.commitSHATo, sfpPackage.packageDirectory); - } - else - { - fs.copySync( - path.join(sfpPackage.sourceDir, sfpPackage.packageDirectory), - path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory) - ); - } - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Succesfully copied from artifact ${sfpPackage.packageName} ${sfpPackage.package_version_number} to target directory` - ), - LoggerLevel.INFO - ); - - //Find package index and replace the descriptor from the artifact - let packageIndex = this.getPackageIndex(sfpPackage.packageName, revisedProjectConfig); - if (packageIndex != -1) { - revisedProjectConfig.packageDirectories = revisedProjectConfig.packageDirectories.map( - (sfdxPackage) => { - if (sfdxPackage.package == sfpPackage.packageName) { - delete packageDescriptorFromArtifact.default; - return packageDescriptorFromArtifact; - } else { - return sfdxPackage; - } - } - ); - } else { - //Package is not in the source branch, so find an anchor package - let currentIdx = idx--; - while (true) { - if ((currentIdx = -1)) { - //There is no package above me to anchor. so just add it 0 - revisedProjectConfig.packageDirectories.splice( - 0, - 0, - packageDescriptorFromArtifact - ); - } else { - packageIndex = this.getPackageIndex( - sfpPackages[currentIdx].packageName, - revisedProjectConfig - ); - if (packageIndex >= 0) { - revisedProjectConfig.packageDirectories.splice( - packageIndex, - 0, - packageDescriptorFromArtifact - ); - } else currentIdx--; - } - } - } - //Write sfdx project.json immediately - fs.writeJSONSync( - path.join(temporaryWorkingDirectory, 'sfdx-project.json'), - revisedProjectConfig, - { - spaces: 4, - } - ); - - //Commit to git - try { - await git.commitFile( - [sfpPackage.packageDescriptor.path, 'sfdx-project.json'], - `Reset ${sfpPackage.packageName} to ${sfpPackage.package_version_number}` - ); - await git.addAnnotatedTag(`${sfpPackage.packageName}_v${sfpPackage.package_version_number}-ALIGN`, - `${sfpPackage.packageName} ${sfpPackage.packageType} Package ${sfpPackage.package_version_number}`); - } catch (error) { - //Ignore - } - - SFPLogger.log( - COLOR_KEY_MESSAGE(`Processed ${sfpPackage.packageName} to ${sfpPackage.package_version_number}`), - LoggerLevel.INFO - ); - - idx++; - } - SFPLogger.log('Packages' + sfpPackages.length, LoggerLevel.TRACE, logger); - } - //Push back - await git.pushToRemote(this.flags.targetbranchname, true); - await git.pushTags(); - } - - private async generateSfpPackageFromArtifacts(artifacts: Artifact[], logger: Logger): Promise { - let sfpPackages: SfpPackage[] = []; - for (const artifact of artifacts) { - let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, logger); - sfpPackages.push(sfpPackage); - } - return sfpPackages; - } - - private getPackageIndex(sfdxPackage: string, projectConfig: any) { - return projectConfig.packageDirectories.find((packageDescriptor) => packageDescriptor.package == sfdxPackage); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts deleted file mode 100644 index b7e20ea49..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/ApexClassFetcher.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from "../queryHelper/ChunkCollection"; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ApexClassFetcher { - constructor(private conn: Connection) {} - - /** - * Query Apex Classes by Name - * - * @param classNames - * @returns - */ - public async fetchApexClassByName(classNames: string[]): Promise<{ Id: string; Name: string }[]> { - let result: {Id: string; Name: string}[] = []; - - const chunks = chunkCollection(classNames); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query - const query = `SELECT ID, Name FROM ApexClass WHERE Name IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); - result = result.concat(records); - } - - return result; - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts deleted file mode 100644 index 9b17c3d4d..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/ApexTriggerFetcher.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from '../queryHelper/ChunkCollection'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ApexTriggerFetcher { - constructor(private conn: Connection) {} - - /** - * Query Triggers by Name - * - * @param triggerNames - * @returns - */ - public async fetchApexTriggerByName(triggerNames: string[]): Promise<{ Id: string; Name: string }[]> { - let result: {Id: string, Name: string}[] = []; - - const chunks = chunkCollection(triggerNames); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); // transform into formatted string for query - const query = `SELECT ID, Name FROM ApexTrigger WHERE Name IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ Id: string; Name: string }>(query, this.conn, false); - result = result.concat(records); - } - - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts deleted file mode 100644 index f1f543365..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/coverage/ApexCodeCoverageAggregateFetcher.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Connection } from '@salesforce/core'; -import chunkCollection from '../../queryHelper/ChunkCollection'; -import QueryHelper from '../../queryHelper/QueryHelper'; - -export default class ApexCodeCoverageAggregateFetcher { - constructor(private conn: Connection) {} - - /** - * Query ApexCodeCoverageAggregate by list of ApexClassorTriggerId - * @param listOfApexClassOrTriggerId - * @returns - */ - public async fetchACCAById(listOfApexClassOrTriggerId: string[]): Promise<{ - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }[]> { - let result: { - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }[] = []; - - const chunks = chunkCollection(listOfApexClassOrTriggerId); - for (const chunk of chunks) { - const formattedChunk = chunk.map(elem => `'${elem}'`).toString(); - let query = `SELECT ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverageAggregate WHERE ApexClassorTriggerId IN (${formattedChunk})`; - - const records = await QueryHelper.query<{ - ApexClassOrTriggerId: string; - NumLinesCovered: number; - NumLinesUncovered: number; - Coverage: any; - }>(query, this.conn, true); - result = result.concat(records); - } - - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts b/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts deleted file mode 100644 index 978361887..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/coverage/IndividualClassCoverage.ts +++ /dev/null @@ -1,76 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from "@flxblio/sfp-logger" - -export default class IndividualClassCoverage { - public constructor(private codeCoverage: any, private logger: Logger) {} - - public getIndividualClassCoverage(classesToBeValidated?:string[]): ClassCoverage[] { - let individualClassCoverage: { - name: string; - coveredPercent: number; - }[] = []; - - // Return every class in coverage json if test level is not RunAllTestsInPackage - individualClassCoverage = this.codeCoverage.map((cls) => { - return { name: cls.name, coveredPercent: cls.coveredPercent }; - }); - - // Filter individualClassCoverage based on classesToBeValidated - if(classesToBeValidated && classesToBeValidated.length > 0) - individualClassCoverage = individualClassCoverage.filter((cls) => { - return classesToBeValidated.includes(cls.name); - }); - - - return individualClassCoverage; - } - - public validateIndividualClassCoverage( - individualClassCoverage: ClassCoverage[], - coverageThreshold?: number - ): { - result: boolean; - message: string; - classesCovered?: ClassCoverage[]; - classesWithInvalidCoverage?: ClassCoverage[]; - } { - if (coverageThreshold < 75) { - SFPLogger.log('Setting minimum coverage percentage to 75%.', LoggerLevel.INFO, this.logger); - coverageThreshold = 75; - } - - SFPLogger.log( - `Validating individual classes for code coverage greater than ${coverageThreshold} percent`, - LoggerLevel.INFO, - this.logger - ); - let classesWithInvalidCoverage = individualClassCoverage.filter((cls) => { - return cls.coveredPercent < coverageThreshold; - }); - - if (classesWithInvalidCoverage.length > 0) { - return { - result: false, - message: 'There are classes which do not satisfy the individual coverage requirements', - classesCovered: individualClassCoverage, - classesWithInvalidCoverage: classesWithInvalidCoverage, - }; - } else - return { - result: true, - message: 'All classes in this test run meet the required coverage threshold', - classesCovered: individualClassCoverage, - }; - } -} - -export type CoverageOptions = { - isPackageCoverageToBeValidated: boolean; - isIndividualClassCoverageToBeValidated: boolean; - coverageThreshold: number; - classesToBeValidated?: string[]; -}; - -export type ClassCoverage = { - name: string; - coveredPercent: number; -}; diff --git a/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts b/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts deleted file mode 100644 index a4d7eb57e..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/parser/ApexTypeFetcher.ts +++ /dev/null @@ -1,134 +0,0 @@ -import * as fs from 'fs-extra'; -const path = require('path'); -const { globSync } = require('glob'); - -import ApexTypeListener from './listeners/ApexTypeListener'; - -import { - ApexLexer, - ApexParser, - ApexParserListener, - CaseInsensitiveInputStream, - ThrowingErrorListener, - CommonTokenStream, - ParseTreeWalker, -} from 'apex-parser'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import { ApexClasses } from '../../package/SfpPackage'; - -/** - * Get Apex type of cls files in a search directory. - * Sorts files into classes, test classes and interfaces. - */ -export default class ApexTypeFetcher { - private apexSortedByType: ApexSortedByType = { - class: [], - testClass: [], - interface: [], - parseError: [], - }; - - constructor(private searchDir: string) {} - - public getClassesClassifiedByType(): ApexSortedByType { - let clsFiles: string[]; - if (fs.existsSync(this.searchDir)) { - clsFiles = globSync(`**/*.cls`, { - cwd: this.searchDir, - absolute: true, - }); - } else { - throw new Error(`Search directory does not exist`); - } - - for (let clsFile of clsFiles) { - let clsPayload: string = fs.readFileSync(clsFile, 'utf8'); - let fileDescriptor: FileDescriptor = { - name: path.basename(clsFile, '.cls'), - filepath: clsFile, - }; - - // Parse cls file - let compilationUnitContext; - try { - let lexer = new ApexLexer(new CaseInsensitiveInputStream(clsFile, clsPayload)); - let tokens: CommonTokenStream = new CommonTokenStream(lexer); - - let parser = new ApexParser(tokens); - parser.removeErrorListeners(); - parser.addErrorListener(new ThrowingErrorListener()); - - compilationUnitContext = parser.compilationUnit(); - } catch (err) { - SFPLogger.log(`Failed to parse ${clsFile} in ${this.searchDir}`, LoggerLevel.WARN); - SFPLogger.log(err.message, LoggerLevel.WARN); - - fileDescriptor.error = err; - this.apexSortedByType.parseError.push(fileDescriptor); - - continue; - } - - let apexTypeListener: ApexTypeListener = new ApexTypeListener(); - - // Walk parse tree to determine Apex type - ParseTreeWalker.DEFAULT.walk(apexTypeListener as ApexParserListener, compilationUnitContext); - - let apexType = apexTypeListener.getApexType(); - - if (apexType.class) { - this.apexSortedByType.class.push(fileDescriptor); - if (apexType.testClass) { - this.apexSortedByType.testClass.push(fileDescriptor); - } - } else if (apexType.interface) { - this.apexSortedByType.interface.push(fileDescriptor); - } else { - fileDescriptor.error = { message: 'Unknown Apex Type' }; - this.apexSortedByType.parseError.push(fileDescriptor); - } - } - return this.apexSortedByType; - } - - public getTestClasses(): ApexClasses { - let testClassNames: ApexClasses = this.apexSortedByType.testClass.map((fileDescriptor) => fileDescriptor.name); - return testClassNames; - } - - public getClassesOnlyExcludingTestsAndInterfaces(): ApexClasses { - let packageClasses: ApexClasses = this.apexSortedByType.class.map((fileDescriptor) => fileDescriptor.name); - - if (packageClasses != null) { - let testClassesInPackage: ApexClasses = this.apexSortedByType.testClass.map( - (fileDescriptor) => fileDescriptor.name - ); - if (testClassesInPackage != null && testClassesInPackage.length > 0) - packageClasses = packageClasses.filter((item) => !testClassesInPackage.includes(item)); - - let interfacesInPackage: ApexClasses = this.apexSortedByType.testClass.map( - (fileDescriptor) => fileDescriptor.name - ); - if (interfacesInPackage != null && interfacesInPackage.length > 0) - packageClasses = packageClasses.filter((item) => !interfacesInPackage.includes(item)); - - let parseError: ApexClasses = this.apexSortedByType.parseError.map((fileDescriptor) => fileDescriptor.name); - if (parseError != null && parseError.length > 0) - packageClasses = packageClasses.filter((item) => !parseError.includes(item)); - } - return packageClasses; - } -} - -export type ApexSortedByType = { - class: FileDescriptor[]; - testClass: FileDescriptor[]; - interface: FileDescriptor[]; - parseError: FileDescriptor[]; -}; - -export type FileDescriptor = { - name: string; - filepath: string; - error?: any; -}; diff --git a/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts b/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts deleted file mode 100644 index 12e6e2181..000000000 --- a/packages/sfpowerscripts-cli/src/core/apex/parser/listeners/ApexTypeListener.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - ApexParserListener, - AnnotationContext, - InterfaceDeclarationContext, - ClassDeclarationContext, -} from 'apex-parser'; - -export default class ApexTypeListener implements ApexParserListener { - private apexType: ApexType = { - class: false, - testClass: false, - interface: false, - }; - - enterAnnotation(ctx: AnnotationContext): void { - if (ctx.text.toUpperCase().startsWith('@ISTEST')) { - this.apexType.testClass= true; - } - } - - enterInterfaceDeclaration(ctx: InterfaceDeclarationContext): void { - this.apexType.interface = true; - } - - enterClassDeclaration(ctx: ClassDeclarationContext): void { - this.apexType.class = true; - } - - public getApexType(): ApexType { - return this.apexType; - } -} - -interface ApexType { - class: boolean; - testClass: boolean; - interface: boolean; -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts b/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts deleted file mode 100644 index ca2dbd0e0..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/ApexTestSuite.ts +++ /dev/null @@ -1,30 +0,0 @@ - -const fs = require('fs-extra'); -import path from 'path'; -import xml2json from '../utils/xml2json'; -import { globSync } from 'glob'; - -export default class ApexTestSuite { - public constructor(private sourceDir: string, private suiteName: string) {} - - public async getConstituentClasses(): Promise { - let testSuitePaths: string[] = globSync(`**${this.suiteName}.testSuite-meta.xml`, { - cwd: this.sourceDir, - absolute: true, - }); - - console.log('testSuitePaths',testSuitePaths); - - if (!testSuitePaths[0]) throw new Error(`Apex Test Suite ${this.suiteName} not found`); - - let apex_test_suite: any = await xml2json(fs.readFileSync(path.resolve(testSuitePaths[0]))); - - if (Array.isArray(apex_test_suite.ApexTestSuite.testClassName)) { - return apex_test_suite.ApexTestSuite.testClassName; - } else { - let testClassess = new Array(); - testClassess.push(apex_test_suite.ApexTestSuite.testClassName); - return testClassess; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts b/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts deleted file mode 100644 index bd6fb7712..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/ClearCodeCoverage.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Connection, Org } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { chunkArray } from '../utils/ChunkArray'; -const CODECOV_AGGREGATE_QUERY = `SELECT Id FROM ApexCodeCoverageAggregate`; -const APEX_TEST_RESULT_QUERY = `SELECT Id FROM ApexTestResult`; -import { delay } from '../utils/Delay'; - -export default class ClearTestResults { - private conn: Connection; - - public constructor(private org: Org, private logger: Logger) {} - /** - * Clear coverage and test results - */ - public async clear() { - this.conn = this.org.getConnection(); - - SFPLogger.log(`Clearing Coverage Results`, LoggerLevel.DEBUG, this.logger); - let codeCoverageAggregate = await QueryHelper.query(CODECOV_AGGREGATE_QUERY, this.conn, true); - await this.deleteRecords('ApexCodeCoverageAggregate', codeCoverageAggregate); - SFPLogger.log(`Cleared Coverage Results`, LoggerLevel.DEBUG, this.logger); - - SFPLogger.log(`Clearing Test Results`, LoggerLevel.DEBUG, this.logger); - let testResults = await QueryHelper.query(APEX_TEST_RESULT_QUERY, this.conn, true); - await this.deleteRecords('ApexTestResult', testResults); - SFPLogger.log(`Cleared Test Results`, LoggerLevel.DEBUG, this.logger); - - SFPLogger.log(`Cleared Existing Coverage and Test Results`, LoggerLevel.INFO, this.logger); - - //allow org to catchup - await delay(10000); - } - - private async deleteRecords(objectType: string, records: any[]) { - if (records && records.length > 0) { - let idsList: string[] = records.map((elem) => elem.Id); - let errors = []; - for (let idsToDelete of chunkArray(2000, idsList)) { - const deleteResults: any = await this.conn.tooling.destroy(objectType, idsToDelete); - deleteResults.forEach((elem) => { - if (!elem.success) { - errors = errors.concat(elem.errors); - } - }); - } - - if (errors.length > 0) { - throw new Error(JSON.stringify(errors)); - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts b/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts deleted file mode 100644 index a271a79b7..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/ImpactedApexTestClassFetcher.ts +++ /dev/null @@ -1,90 +0,0 @@ -import * as _ from 'lodash'; -import ApexDepedencyCheckImpl from "@flxblio/apexlink/lib/ApexDepedencyCheckImpl" -import Component from '../dependency/Component'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SfpPackage, { PackageType } from '../package/SfpPackage'; -import path from 'path'; - -export default class ImpactedApexTestClassFetcher { - public constructor( - private sfpPackage: SfpPackage, - private changedComponents: Component[], - private logger: Logger, - private loglevel?: LoggerLevel - ) {} - - public async getImpactedTestClasses(): Promise { - - let invalidatedClasses = []; - let invalidatedTestClasses = []; - - try - { - let validatedChangedComponents = this.changedComponents.filter( - (component) => component.package == this.sfpPackage.packageName - ); - - SFPLogger.log(`Computing impacted apex class and associated tests`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Changed components ${JSON.stringify(validatedChangedComponents)}`, LoggerLevel.INFO, this.logger); - - - - let apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,path.join(this.sfpPackage.workingDirectory, this.sfpPackage.packageDirectory)); - let dependencies = (await apexLinkImpl.execute()).dependencies; - - if(dependencies.length==0) - { - //go for another attempt - SFPLogger.log(`No dependencies found, retrying with apexlink,Retrying again`, LoggerLevel.INFO,this.logger); - apexLinkImpl = new ApexDepedencyCheckImpl(this.logger,this.sfpPackage.workingDirectory); - dependencies = (await apexLinkImpl.execute()).dependencies; - } - - SFPLogger.log(`Dependencies: ${JSON.stringify(dependencies)}`, LoggerLevel.INFO,this.logger); - - //compute invalidated apex classes - for (const changedComponent of validatedChangedComponents) { - //If the component is a permset or profile, add every test class - //There is a change in security model, add all test classes as invalidated - // Temoorarily disabled this check as it is not working as expected - if (this.sfpPackage.packageType != PackageType.Diff && _.includes(['Profile', 'PermissionSet', 'SharingRules'], changedComponent.type)) { - SFPLogger.log( - COLOR_WARNING(`Change in Security Model, pushing all test classes through`), - LoggerLevel.INFO, - this.logger - ); - invalidatedClasses = invalidatedClasses.concat(this.sfpPackage.apexTestClassses); - break; - } - - for (const apexClass of dependencies) { - // push any apex class or test class that is changed, which would then get filtered during subsequent matching with test class - if (apexClass.name == changedComponent.fullName) invalidatedClasses.push(apexClass.name); - - // push any apex class or test class who is dependent on the changed entity - for (const dependsOn of apexClass.dependencies) { - if (changedComponent.fullName == dependsOn) invalidatedClasses.push(apexClass.name); - } - } - } - - SFPLogger.log(`Impacted classes: ${COLOR_KEY_MESSAGE(invalidatedClasses)}`, LoggerLevel.INFO, this.logger); - //Filter all apex classes by means of whats is detected in test classes list - invalidatedTestClasses = _.intersection(invalidatedClasses, this.sfpPackage.apexTestClassses); - SFPLogger.log( - `Impacted test classes: ${COLOR_KEY_MESSAGE(invalidatedTestClasses)}`, - LoggerLevel.INFO, - this.logger - ); - }catch(error) - { - SFPLogger.log( - `Unable to compute impacted test classes, defaulting to all test classes due to error ${error}`, - LoggerLevel.ERROR, - this.logger - ); - invalidatedClasses = this.sfpPackage.apexTestClassses; - } - return invalidatedTestClasses; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts b/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts deleted file mode 100644 index 315f3d47a..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/JSONReporter.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* - * 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 - */ -import { ApexTestResultData, ApexTestResultOutcome, TestResult } from '@salesforce/apex-node'; - -export type CliJsonFormat = { - summary: object; - tests: CliTestResult[]; - coverage?: CliCoverageResult; -}; - -type CliTestResult = { - Id: string; - QueueItemId: string; - StackTrace: string; - Message: string; - AsyncApexJobId: string; - MethodName: string; - Outcome: ApexTestResultOutcome; - ApexClass: { Id: string; Name: string; NamespacePrefix: string }; - RunTime: number; - FullName: string; -}; - -type ClassCoverage = { - id: string; - name: string; - totalLines: number; - lines: {}; - totalCovered: number; - coveredPercent: number; -}; - -type PerClassCoverage = { - ApexTestClass: { - Id: string; - Name: string; - }; - Coverage?: { coveredLines: number[]; uncoveredLines: number[] }; - TestMethodName: string; - NumLinesCovered: number; - ApexClassOrTrigger: { - Id: string; - Name: string; - }; - NumLinesUncovered: number; -}; - -type CliCoverageResult = { - coverage: ClassCoverage[]; - records: PerClassCoverage[]; - summary: { - totalLines: number; - coveredLines: number; - testRunCoverage: string; - orgWideCoverage: string; - }; -}; - -const skippedProperties = ['skipRate', 'coveredLines', 'totalLines']; -const timeProperties = ['testExecutionTimeInMs', 'testTotalTimeInMs', 'commandTimeInMs']; - -export class JsonReporter { - public format( - result: TestResult - ): { - summary: object; - tests: CliTestResult[]; - coverage?: CliCoverageResult; - } { - return { - summary: this.formatSummary(result), - tests: this.formatTestResults(result.tests), - ...(result.codecoverage - ? { - coverage: this.formatCoverage(result), - } - : {}), - }; - } - - private formatSummary(testResult: TestResult): object { - const summary = {}; - - Object.entries(testResult.summary).forEach(([key, value]) => { - if (skippedProperties.includes(key)) { - return; - } - - if (timeProperties.includes(key)) { - key = key.replace('InMs', ''); - value = `${value} ms`; - } - - Object.assign(summary, { [key]: value }); - }); - - return summary; - } - - private formatTestResults(testResults: ApexTestResultData[]): CliTestResult[] { - return testResults.map((test) => { - return { - Id: test.id, - QueueItemId: test.queueItemId, - StackTrace: test.stackTrace, - Message: test.message, - AsyncApexJobId: test.asyncApexJobId, - MethodName: test.methodName, - Outcome: test.outcome, - ApexClass: { - Id: test.apexClass.id, - Name: test.apexClass.name, - NamespacePrefix: test.apexClass.namespacePrefix, - }, - RunTime: test.runTime, - FullName: test.fullName, - }; - }) as CliTestResult[]; - } - - private formatCoverage(testResult: TestResult): CliCoverageResult { - const formattedCov = { - coverage: [], - records: [], - summary: { - totalLines: testResult.summary.totalLines, - coveredLines: testResult.summary.coveredLines, - orgWideCoverage: testResult.summary.orgWideCoverage, - testRunCoverage: testResult.summary.testRunCoverage, - }, - } as CliCoverageResult; - - if (testResult.codecoverage) { - formattedCov.coverage = testResult.codecoverage.map((cov) => { - const lines: { [key: number]: number } = {}; - cov.coveredLines.forEach((covLine) => (lines[covLine] = 1)); - cov.uncoveredLines.forEach((uncovLine) => (lines[uncovLine] = 0)); - - return { - id: cov.apexId, - name: cov.name, - totalLines: cov.numLinesCovered + cov.numLinesUncovered, - lines, - totalCovered: cov.numLinesCovered, - coveredPercent: parseInt(cov.percentage), - } as ClassCoverage; - }); - - testResult.tests.forEach((test) => { - if (test.perClassCoverage) { - test.perClassCoverage.forEach((perClassCov) => { - formattedCov.records.push({ - ApexTestClass: { Id: test.id, Name: test.apexClass.name }, - ...(perClassCov.coverage ? { Coverage: perClassCov.coverage } : {}), - TestMethodName: test.methodName, - NumLinesCovered: perClassCov.numLinesCovered, - ApexClassOrTrigger: { - Id: perClassCov.apexClassOrTriggerId, - Name: perClassCov.apexClassOrTriggerName, - }, - NumLinesUncovered: perClassCov.numLinesUncovered, - } as PerClassCoverage); - }); - } - }); - } - - return formattedCov; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts b/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts deleted file mode 100644 index 15faf1fcd..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/TestOptions.ts +++ /dev/null @@ -1,73 +0,0 @@ -import * as _ from 'lodash'; -import SfpPackage from '../package/SfpPackage'; - -export class TestOptions { - synchronous?: boolean; - wait_time: number; - outputdir: string; - testLevel: TestLevel; -} - -export class RunSpecifiedTestsOption extends TestOptions { - specifiedTests: string; - constructor(wait_time: number, outputdir: string, specifiedTests: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.specifiedTests = specifiedTests; - this.testLevel = TestLevel.RunSpecifiedTests; - } -} - -export class RunApexTestSuitesOption extends TestOptions { - suiteNames: string; - constructor(wait_time: number, outputdir: string, suiteNames: string, pkg?: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.suiteNames = suiteNames; - this.testLevel = TestLevel.RunApexTestSuite; - } -} - -export class RunLocalTests extends TestOptions { - constructor(wait_time: number, outputdir: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.testLevel = TestLevel.RunLocalTests; - } -} - -export class RunAllTestsInOrg extends TestOptions { - constructor(wait_time: number, outputdir: string, synchronous?: boolean) { - super(); - this.synchronous = synchronous ? synchronous : false; - this.wait_time = wait_time ? wait_time : 60; - this.outputdir = outputdir; - this.testLevel = TestLevel.RunAllTestsInOrg; - } -} - -export class RunAllTestsInPackageOptions extends RunSpecifiedTestsOption { - public constructor(private _sfppackage: SfpPackage, wait_time: number, outputdir: string) { - super(wait_time, outputdir, _sfppackage.apexTestClassses.toString(), false); - this.synchronous = _sfppackage.packageDescriptor.testSynchronous == true ? true : false; - } - - public get sfppackage() { - return this._sfppackage; - } -} - -export enum TestLevel { - RunNoTests = 'NoTestRun', - RunSpecifiedTests = 'RunSpecifiedTests', - RunApexTestSuite = 'RunApexTestSuite', - RunLocalTests = 'RunLocalTests', - RunAllTestsInOrg = 'RunAllTestsInOrg', - RunAllTestsInPackage = 'RunAllTestsInPackage', -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts b/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts deleted file mode 100644 index a66e55dc3..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/TestReportDisplayer.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { RunAllTestsInPackageOptions, RunApexTestSuitesOption, TestOptions } from './TestOptions'; -import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from '../display/TableConstants'; - -const Table = require('cli-table'); - -export class TestReportDisplayer { - constructor(private apexTestReport: any, private testOptions: TestOptions, private fileLogger?: any) {} - - public printTestSummary(packageCoverage?: number): string { - let apexTestReport = { ...this.apexTestReport }; - SFPLogger.log('\n\n\n=== Test Summary', LoggerLevel.INFO, this.fileLogger); - let table = new Table({ - head: ['Name', 'Value'], - chars: ZERO_BORDER_TABLE - }); - - if ( - this.testOptions instanceof RunAllTestsInPackageOptions || - this.testOptions instanceof RunApexTestSuitesOption || - this.testOptions instanceof RunAllTestsInPackageOptions - ) { - delete apexTestReport.summary.testRunCoverage; - delete apexTestReport.summary.orgWideCoverage; - - if (this.testOptions instanceof RunAllTestsInPackageOptions) - apexTestReport.summary.packageCoverage = packageCoverage; - } - - Object.entries(apexTestReport.summary).forEach((keyValuePair) => { - keyValuePair[1] = keyValuePair[1] || ''; - table.push(keyValuePair); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } - - public printTestResults(): string { - SFPLogger.log('=== Test Results', LoggerLevel.INFO, this.fileLogger); - - let table = new Table({ - head: ['Test Name', 'Outcome', 'Message', 'Runtime (ms)'], - chars: ZERO_BORDER_TABLE - }); - - this.apexTestReport.tests.forEach((test) => { - if (test.Outcome === 'Pass') { - table.push([ - COLOR_SUCCESS(test.FullName || ''), - COLOR_SUCCESS(test.Outcome), - COLOR_SUCCESS(test.Message || ''), - COLOR_SUCCESS(test.RunTime || ''), - ]); - } else { - table.push([ - COLOR_ERROR(test.FullName || ''), - COLOR_ERROR(test.Outcome || ''), - COLOR_ERROR(test.Message || ''), - COLOR_ERROR(test.RunTime || ''), - ]); - } - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } - - public printCoverageReport( - coverageThreshold: number, - classesCovered?: { name: string; coveredPercent: number }[], - classesWithInvalidCoverage?: { name: string; coveredPercent: number }[] - ): { classesCoveredTable: string; classInvalidCoverageTable?: string } { - SFPLogger.log('\n\n=== Test Coverage', LoggerLevel.INFO, this.fileLogger); - let classesCoveredTable; - if (classesCovered) { - classesCoveredTable = this.printIndividualClassCoverage(classesCovered); - } - if (classesWithInvalidCoverage) { - let classInvalidCoverageTable = this.printClassesWithInvalidCoverage( - classesWithInvalidCoverage, - coverageThreshold - ); - return { classesCoveredTable, classInvalidCoverageTable }; - } else return { classesCoveredTable }; - } - - private printClassesWithInvalidCoverage( - classesWithInvalidCoverage: { name: string; coveredPercent: number }[], - coverageThreshold: number - ): string { - SFPLogger.log( - `The following classes do not satisfy the ${coverageThreshold}% code coverage requirement:`, - LoggerLevel.INFO, - this.fileLogger - ); - - return this.printIndividualClassCoverage(classesWithInvalidCoverage); - } - - private printIndividualClassCoverage(individualClassCoverage: { name: string; coveredPercent: number }[]): string { - let table = new Table({ - head: ['Class', 'Coverage Percent'], - chars: ZERO_BORDER_TABLE - }); - - individualClassCoverage.forEach((cls) => { - if (cls.coveredPercent !== null && cls.coveredPercent < 75) { - table.push([COLOR_ERROR(cls.name || ''), COLOR_ERROR(cls.coveredPercent)]); - } else if (cls.coveredPercent !== null && cls.coveredPercent >= 75) { - table.push([COLOR_SUCCESS(cls.name || ''), COLOR_SUCCESS(cls.coveredPercent)]); - } else table.push([cls.name || '', 'N/A']); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.fileLogger); - return table.toString(); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts b/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts deleted file mode 100644 index 18c45aff5..000000000 --- a/packages/sfpowerscripts-cli/src/core/apextest/TriggerApexTests.ts +++ /dev/null @@ -1,767 +0,0 @@ -const fs = require('fs-extra'); -import path = require('path'); -import { - RunSpecifiedTestsOption, - TestOptions, - RunApexTestSuitesOption, - RunLocalTests, - RunAllTestsInOrg, - RunAllTestsInPackageOptions, -} from './TestOptions'; -import IndividualClassCoverage, { CoverageOptions } from '../apex/coverage/IndividualClassCoverage'; -import { TestReportDisplayer } from './TestReportDisplayer'; -import PackageTestCoverage from '../package/coverage/PackageTestCoverage'; -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel, COLOR_ERROR } from '@flxblio/sfp-logger'; -import SFPStatsSender from '../stats/SFPStatsSender'; -import { Connection, Org } from '@salesforce/core'; -import { - TestLevel, - TestResult, - TestService, - JUnitReporter, - Progress, - ApexTestProgressValue, - CancellationTokenSource, - ApexTestResultOutcome, - ApexTestResultData, - CodeCoverageResult, -} from '@salesforce/apex-node'; -import { CliJsonFormat, JsonReporter } from './JSONReporter'; -import { Duration } from '@salesforce/kit'; -import ClearCodeCoverage from './ClearCodeCoverage'; -import _ from 'lodash'; -const retry = require('async-retry'); - -export default class TriggerApexTests { - private conn: Connection; - protected cancellationTokenSource = new CancellationTokenSource(); - - public constructor( - private target_org: string, - private testOptions: TestOptions, - private coverageOptions: CoverageOptions, - private project_directory: string, - private fileLogger?: any - ) {} - - public async exec(): Promise<{ - id: string; - result: boolean; - message: string; - }> { - let org = await Org.create({ aliasOrUsername: this.target_org }); - this.conn = org.getConnection(); - - // graceful shutdown - const exitHandler = async (): Promise => { - await this.cancellationTokenSource.asyncCancel(); - process.exit(); - }; - process.on('SIGINT', exitHandler); - process.on('SIGTERM', exitHandler); - - let startTime = Date.now(); - let testExecutionResult: boolean = false; - let testsRan: number; - let commandTime: number; - - try { - const testService = new TestService(this.conn); - - //Clear Code Coverage before triggering tests - try { - let clearCodeCoverage = new ClearCodeCoverage(org, this.fileLogger); - await clearCodeCoverage.clear(); - } catch (error) { - SFPLogger.log( - `Ignoring error in clearing code coverage attributed to ${error}.`, - LoggerLevel.DEBUG, - this.fileLogger - ); - } - - //Translate Tests to test levels used by apex-node - let translatedTestLevel: TestLevel; - //Fetch tests passed in the testOptions - let tests: string = null; - let suites: string = null; - let isCoverageToBeFetched: boolean = - this.coverageOptions.isIndividualClassCoverageToBeValidated || - this.coverageOptions.isPackageCoverageToBeValidated; - - //Translate Test Option - ({ translatedTestLevel, tests, suites } = await this.translateTestOptionToAPIVars(this.testOptions)); - //Trigger tests asynchronously - let testRunResult: TestResult; - try { - testRunResult = (await this.triggerTestAsynchronously( - testService, - translatedTestLevel, - isCoverageToBeFetched, - tests, - suites - )) as TestResult; - } catch (error) { - return { - result: false, - id: null, - message: error.message, - }; - } - - //Fetch Test Results - let testResult = await retry( - async (bail) => { - return await testService.reportAsyncResults( - testRunResult.summary.testRunId, - isCoverageToBeFetched, - this.cancellationTokenSource.token - ); - }, - { retries: 2, minTimeout: 3000 } - ); - - testResult = this.fixBadNamespaceClassFullNames(testResult); - - //Collect Failed Tests only if Parallel - testResult = await this.triggerSecondRunInSerialForParallelFailedTests( - testResult, - testService, - translatedTestLevel, - isCoverageToBeFetched - ); - - //Filter testResult for duplicate test listing - testResult = this.removeDuplicateTestListing(testResult); - - //Write Test Results to file - let jsonOutput = undefined; - try - { - jsonOutput = this.writeTestOutput(testResult); - }catch(error) - { - SFPLogger.log( - `Unable to write test results to file due to ${error}`, - LoggerLevel.DEBUG, - this.fileLogger - ); - return { - result: false, - id: testResult.summary.testRunId, - message: 'Unable to fetch test execution results, Please retry', - }; - } - - //Print tests result to screen - let testReportDisplayer = new TestReportDisplayer(jsonOutput, this.testOptions, this.fileLogger); - testReportDisplayer.printTestResults(); - - commandTime = testResult.summary.commandTimeInMs; - - if (testResult.summary.outcome == 'Failed') { - testExecutionResult = false; - - return { - result: false, - id: testResult.summary.testRunId, - message: 'Test Execution failed', - }; - } else { - if (isCoverageToBeFetched) { - let coverageResults = await this.validateForApexCoverage(jsonOutput.coverage.coverage); - testReportDisplayer.printCoverageReport( - this.coverageOptions.coverageThreshold, - coverageResults.classesCovered, - coverageResults.classesWithInvalidCoverage - ); - - testsRan = testResult.summary.testsRan; - testReportDisplayer.printTestSummary(coverageResults.packageTestCoverage); - - testExecutionResult = coverageResults.result; - SFPStatsSender.logGauge('apextest.testcoverage', coverageResults.packageTestCoverage, { - package: - this.testOptions instanceof RunAllTestsInPackageOptions - ? this.testOptions.sfppackage.packageName - : null, - }); - return { - result: coverageResults.result, - id: testResult.summary.testRunId, - message: coverageResults.message, - }; - } else { - testExecutionResult = true; - SFPStatsSender.logGauge( - 'apextest.testcoverage', - Number.parseInt(testResult.summary.testRunCoverage), - { - package: - this.testOptions instanceof RunAllTestsInPackageOptions - ? this.testOptions.sfppackage.packageName - : null, - } - ); - return { - result: true, - id: testResult.summary.testRunId, - message: `Test execution succesfully completed`, - }; - } - } - } finally { - this.reportMetrics(this.testOptions, { - targetOrg: this.target_org, - startTime, - testExecutionResult, - testsRan, - commandTime, - }); - } - } - - private async translateTestOptionToAPIVars( - testOptions: TestOptions - ): Promise<{ translatedTestLevel: TestLevel; tests: string; suites: string }> { - let translatedTestLevel: TestLevel; - let tests: string; - let suites: string; - if (testOptions instanceof RunAllTestsInPackageOptions) { - ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForAllTestInPackageOptions(testOptions)); - } else if (testOptions instanceof RunSpecifiedTestsOption) { - ({ translatedTestLevel, tests } = await this.getTranslatedOptionsForSpecifiedTests(testOptions)); - } else if (testOptions instanceof RunApexTestSuitesOption) { - translatedTestLevel = TestLevel.RunSpecifiedTests; - suites = (testOptions as RunApexTestSuitesOption).suiteNames; - SFPLogger.log( - `Test Suites to be executed: ${COLOR_KEY_MESSAGE(suites)}`, - LoggerLevel.INFO, - this.fileLogger - ); - } else if (testOptions instanceof RunLocalTests) { - translatedTestLevel = TestLevel.RunLocalTests; - SFPLogger.log( - `Triggering all ${COLOR_KEY_MESSAGE(`local tests`)}in the org`, - LoggerLevel.INFO, - this.fileLogger - ); - } else if (testOptions instanceof RunAllTestsInOrg) { - SFPLogger.log( - `Triggering all ${COLOR_KEY_MESSAGE(`all tests`)}in the org`, - LoggerLevel.INFO, - this.fileLogger - ); - translatedTestLevel = TestLevel.RunAllTestsInOrg; - } - return { translatedTestLevel, tests, suites }; - } - - private removeDuplicateTestListing(testResult: any): any { - let modifiedTestResult = _.cloneDeep(testResult); - - let toEliminateIndices = []; - for (let index = 0; index < modifiedTestResult.tests.length; index++) { - let idx = index; - let duplicateIndices = [index]; - while (idx != -1) { - idx = _.findIndex( - modifiedTestResult.tests, - (elem: any) => { - return elem.methodName == modifiedTestResult.tests[index].methodName - && elem.apexClass.name == modifiedTestResult.tests[index].apexClass.name; - }, - idx + 1 - ); - if (idx != -1) duplicateIndices.push(idx); - } - if (duplicateIndices.length > 1) { - for (const idx of duplicateIndices) { - if (modifiedTestResult.tests[idx].outcome != 'Pass') toEliminateIndices.push(idx); - } - } - } - - modifiedTestResult.tests = modifiedTestResult.tests.filter(function (value, index, arr) { - return !toEliminateIndices.includes(index); - }); - - if (toEliminateIndices.length > 0) modifiedTestResult = this.combineTestResult(modifiedTestResult); - - return modifiedTestResult; - } - - private async getTranslatedOptionsForSpecifiedTests(testOptions: RunSpecifiedTestsOption) { - let translatedTestLevel = TestLevel.RunSpecifiedTests; - let tests = testOptions.specifiedTests; - SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); - SFPLogger.log( - `Test Mode: ${COLOR_KEY_MESSAGE(this.testOptions.synchronous == true ? 'serial' : 'parallel')}`, - LoggerLevel.INFO, - this.fileLogger - ); - //Toggle to serial - await this.toggleParallelApexTesting( - this.conn, - this.fileLogger, - this.testOptions.synchronous == true ? true : false - ); - return { translatedTestLevel, tests }; - } - - private async getTranslatedOptionsForAllTestInPackageOptions(testOptions: RunAllTestsInPackageOptions) { - SFPLogger.log( - `Test Mode Descriptor in Package 'testSynchronous': ${ - testOptions.sfppackage.packageDescriptor.testSynchronous - ? testOptions.sfppackage.packageDescriptor.testSynchronous - : false - }`, - LoggerLevel.TRACE, - this.fileLogger - ); - SFPLogger.log( - `Test Mode: ${COLOR_KEY_MESSAGE(testOptions.synchronous == true ? 'serial' : 'parallel')}`, - LoggerLevel.INFO, - this.fileLogger - ); - await this.toggleParallelApexTesting( - this.conn, - this.fileLogger, - testOptions.synchronous == true ? true : false - ); - let translatedTestLevel = TestLevel.RunSpecifiedTests; - let tests = testOptions.specifiedTests; - SFPLogger.log(`Tests to be executed: ${COLOR_KEY_MESSAGE(tests)}`, LoggerLevel.INFO, this.fileLogger); - return { translatedTestLevel, tests }; - } - - private async triggerSecondRunInSerialForParallelFailedTests( - testResult: TestResult, - testService: TestService, - translatedTestLevel: TestLevel, - isCoverageToBeFetched: boolean - ) { - let modifiedTestResult = _.cloneDeep(testResult); - if (!this.testOptions.synchronous) { - let parallelFailedTestClasses: string[] = []; - let testClassesThatDonotContributedCoverage: string[] = []; - - let testToBeTriggered: string[] = []; - for (const test of modifiedTestResult.tests) { - if (test.outcome == ApexTestResultOutcome.Fail) { - //Check for messages - if ( - test.message.includes(`Your request exceeded the time limit for processing`) || - test.message.includes(`UNABLE_TO_LOCK_ROW`) || - test.message.includes(`Internal Salesforce Error`) || - test.message.includes(`LIMIT_EXCEEDED`) || - test.message.includes(`Too many concurrent Apex compilations during resource mitigation`) - ) { - if (!testToBeTriggered.includes(test.apexClass.fullName)) { - parallelFailedTestClasses.push(test.apexClass.fullName); - testToBeTriggered.push(test.apexClass.fullName); - } - } - } - - if (test.outcome == ApexTestResultOutcome.Pass) { - if ( - !test.perClassCoverage && - (this.coverageOptions.isPackageCoverageToBeValidated || - this.coverageOptions.isIndividualClassCoverageToBeValidated) - ) { - if (!testToBeTriggered.includes(test.apexClass.fullName)) { - testClassesThatDonotContributedCoverage.push(test.apexClass.fullName); - if (!testToBeTriggered.includes(test.apexClass.fullName)) - testToBeTriggered.push(test.apexClass.fullName); - } - } - } - } - - if (parallelFailedTestClasses.length > 0) { - SFPLogger.log( - `Failed Tests while triggered in parallel: ${COLOR_KEY_MESSAGE( - parallelFailedTestClasses.toString() - )}`, - LoggerLevel.INFO, - this.fileLogger - ); - } - - if (testClassesThatDonotContributedCoverage.length > 0) { - SFPLogger.log( - `Test Classes that were not able to contribute coverage: ${COLOR_KEY_MESSAGE( - testClassesThatDonotContributedCoverage.toString() - )}`, - LoggerLevel.INFO, - this.fileLogger - ); - } - - if (testToBeTriggered.length > 0) { - SFPLogger.log( - `Triggering tests synchronously: ${COLOR_KEY_MESSAGE(testToBeTriggered.toString())}`, - LoggerLevel.INFO, - this.fileLogger - ); - //Trigger Second Test Run - //Convert to sequential - await this.toggleParallelApexTesting(this.conn, this.fileLogger, true); - - //Trigger tests asynchronously - let secondRuntestRunResult: TestResult; - secondRuntestRunResult = await retry( - async (bail) => { - return (await this.triggerTestAsynchronously( - testService, - translatedTestLevel, - isCoverageToBeFetched, - testToBeTriggered.toString(), - null - )) as TestResult; - }, - { retries: 2, minTimeout: 3000 } - ); - - secondRuntestRunResult = this.fixBadNamespaceClassFullNames(secondRuntestRunResult); - - //Fetch Test Results - const secondTestResult = this.fixBadNamespaceClassFullNames( - await testService.reportAsyncResults( - secondRuntestRunResult.summary.testRunId, - true, - this.cancellationTokenSource.token - ) - ); - - this.writeTestOutput(secondTestResult); - - //Merge original test results with second run - const mergedTestResults: ApexTestResultData[] = modifiedTestResult.tests; - for (const testObject of secondTestResult.tests){ - const index = mergedTestResults.findIndex((test) => test.fullName === testObject.fullName); - if (index !== -1) { - mergedTestResults[index] = testObject; - }else{ - mergedTestResults.push(testObject); - } - } - modifiedTestResult.tests = mergedTestResults; - - //Merge original code coverage with second run - if (isCoverageToBeFetched) { - const mergedCodecoverage: CodeCoverageResult[] = modifiedTestResult.codecoverage; - for (const codeCoverageObject of secondTestResult.codecoverage){ - - const index = mergedCodecoverage.findIndex((codeCoverage) => codeCoverage.name === codeCoverageObject.name); - if (index !== -1) { - mergedCodecoverage[index] = codeCoverageObject; - }else{ - mergedCodecoverage.push(codeCoverageObject); - } - } - modifiedTestResult.codecoverage = mergedCodecoverage; - } - - //Now redo the math - modifiedTestResult = this.combineTestResult(modifiedTestResult, secondRuntestRunResult); - } - } - - return modifiedTestResult; - } - - private fixBadNamespaceClassFullNames(testResult: any): any { - let modifiedTestResult = _.cloneDeep(testResult); - - try - { - modifiedTestResult.tests = modifiedTestResult.tests.map((test) => { - return { - ...test, - ...{ - fullName: test.fullName?.replace('__', '.'), - apexClass: { - ...test.apexClass, - ...{ - fullName: test.apexClass?.fullName?.replace('__', '.'), - }, - }, - }, - }; - }); - }catch(error) - { - SFPLogger.log( - `Unable to fix bad namespace class full names due to ${error}`, - LoggerLevel.DEBUG, - this.fileLogger - ); - modifiedTestResult = _.cloneDeep(testResult); - } - - return modifiedTestResult; - } - - private combineTestResult(testResult: TestResult, testResultSecondRun?: TestResult) { - testResult.summary.failing = 0; - testResult.summary.passing = 0; - testResult.summary.skipped = 0; - - for (const test of testResult.tests) { - if (test.outcome === ApexTestResultOutcome.Pass) testResult.summary.passing++; - else if (test.outcome === ApexTestResultOutcome.Fail) testResult.summary.failing++; - else if (test.outcome === ApexTestResultOutcome.Skip) testResult.summary.skipped++; - } - - if (testResult.summary.failing > 0) testResult.summary.outcome = 'Failed'; - else testResult.summary.outcome = 'Passed'; - - testResult.summary.passRate = (testResult.summary.passing / testResult.summary.testsRan) * 100 + '%'; - testResult.summary.failRate = (testResult.summary.failing / testResult.summary.testsRan) * 100 + '%'; - testResult.summary.commandTimeInMs = - testResult.summary.commandTimeInMs + testResultSecondRun?.summary.commandTimeInMs; - testResult.summary.testExecutionTimeInMs = - testResult.summary.testExecutionTimeInMs + testResultSecondRun?.summary.testExecutionTimeInMs; - testResult.summary.testTotalTimeInMs = - testResult.summary.testTotalTimeInMs + testResultSecondRun?.summary.testTotalTimeInMs; - - delete testResult.summary.testRunCoverage; - delete testResult.summary.orgWideCoverage; - delete testResult.summary.totalLines; - delete testResult.summary.coveredLines; - - if (testResultSecondRun) - testResult.summary.testRunId = testResult.summary.testRunId.concat( - '_', - testResultSecondRun.summary.testRunId - ); - return testResult; - } - - /** - * Trigger tests asynchronously - * @param {TestService} testService - * @param {TestLevel} testLevel - * @param {string} tests? - * @param {string} suites? - */ - private async triggerTestAsynchronously( - testService: TestService, - testLevel: TestLevel, - isCoverageToBeFetched: boolean, - tests?: string, - suites?: string - ) { - const payload = await testService.buildAsyncPayload(testLevel, null, tests, suites); - - let result = await testService.runTestAsynchronous( - payload, - isCoverageToBeFetched, - false, - new ProgressReporter(this.fileLogger), - this.cancellationTokenSource.token - ); - - if (this.cancellationTokenSource.token.isCancellationRequested) { - throw new Error(`A previous run is being cancelled.. Please try after some time`); - } - - return result; - } - - private async validateForApexCoverage( - coverageReport: any - ): Promise<{ - result: boolean; - message?: string; - packageTestCoverage?: number; - classesCovered?: { - name: string; - coveredPercent: number; - }[]; - classesWithInvalidCoverage?: { - name: string; - coveredPercent: number; - }[]; - }> { - if (this.testOptions instanceof RunAllTestsInPackageOptions) { - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - this.testOptions.sfppackage, - coverageReport, - this.fileLogger, - this.conn - ); - - return packageTestCoverage.validateTestCoverage(this.coverageOptions.coverageThreshold); - } else { - if (this.coverageOptions.isIndividualClassCoverageToBeValidated) { - let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( - coverageReport, - this.fileLogger - ); - return coverageValidator.validateIndividualClassCoverage( - coverageValidator.getIndividualClassCoverage(this.coverageOptions.classesToBeValidated), - this.coverageOptions.coverageThreshold - ); - } else { - let coverageValidator: IndividualClassCoverage = new IndividualClassCoverage( - coverageReport, - this.fileLogger - ); - return coverageValidator.validateIndividualClassCoverage( - coverageValidator.getIndividualClassCoverage() - ); - } - } - } - - private writeJUnit(testResult: TestResult) { - SFPLogger.log( - `Junit Report file available at ${path.join( - this.testOptions.outputdir, - `test-result-${testResult.summary.testRunId}-junit.xml` - )}` - ); - let reportAsJUnitReport = new JUnitReporter().format(testResult); - fs.writeFileSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-junit.xml`), - reportAsJUnitReport - ); - } - - private writeTestOutput(testResult: TestResult): CliJsonFormat { - const jsonOutput = this.formatResultInJson(testResult); - - //write output files - fs.ensureDirSync(this.testOptions.outputdir); - - //Write files - fs.writeJSONSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}.json`), - testResult, - { spaces: 4 } - ); - - if (jsonOutput.coverage) - fs.writeJSONSync( - path.join(this.testOptions.outputdir, `test-result-${testResult.summary.testRunId}-coverage.json`), - jsonOutput.coverage?.coverage, - { spaces: 4 } - ); - - //Write Junit Result no matter what - this.writeJUnit(testResult); - - return jsonOutput; - } - - private formatResultInJson(result: TestResult): CliJsonFormat { - try { - const reporter = new JsonReporter(); - return reporter.format(result); - } catch (error) { - return null; - } - } - - //Enable Synchronus Compile on Deploy - private async toggleParallelApexTesting(conn: Connection, logger: Logger, toEnable: boolean) { - try { - SFPLogger.log(`Set enableDisableParallelApexTesting:${toEnable}`, LoggerLevel.TRACE, logger); - let apexSettingMetadata = { fullName: 'ApexSettings', enableDisableParallelApexTesting: toEnable }; - let result = await conn.metadata.upsert('ApexSettings', apexSettingMetadata); - if (result.success) { - SFPLogger.log(`Successfully updated apex testing setting`, LoggerLevel.INFO, logger); - } - } catch (error) { - SFPLogger.log( - `Skipping toggling of enableDisableParallelApexTesting due to ${error}..`, - LoggerLevel.INFO, - logger - ); - } - } - - private reportMetrics( - testOptions: TestOptions, - testMetrics: { - targetOrg: string; - startTime: number; - testExecutionResult: boolean; - testsRan: number; - commandTime?: number; - } - ) { - let elapsedTime = Date.now() - testMetrics.startTime; - - if (testMetrics.testExecutionResult) - SFPStatsSender.logGauge('apextest.tests.ran', testMetrics.testsRan, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - - SFPStatsSender.logGauge('apextest.testtotal.time', elapsedTime, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions['testlevel'], - target_org: testMetrics.targetOrg, - }); - - if (testMetrics.commandTime) - SFPStatsSender.logGauge('apextest.command.time', testMetrics.commandTime, { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - - SFPStatsSender.logCount('apextests.triggered', { - test_result: String(testMetrics.testExecutionResult), - package: testOptions instanceof RunAllTestsInPackageOptions ? testOptions.sfppackage.packageName : null, - type: testOptions.testLevel, - target_org: testMetrics.targetOrg, - }); - } -} -export class ProgressReporter implements Progress { - private lastExecutedTime; - constructor(private logger: Logger) { - this.lastExecutedTime = Date.now(); - } - - report(value: ApexTestProgressValue): void { - try { - let count = {}; - //Limit printing an update to 30 seconds - if (Date.now() - this.lastExecutedTime > Duration.seconds(30).milliseconds) { - if (value.type == 'TestQueueProgress') { - for (const elem of value.value.records) { - if (elem?.Status) { - if (!count[elem.Status]) { - count[elem.Status] = 1; - } else count[elem.Status]++; - } - } - let statusString = ''; - - //Compute total - let total: number = 0; - for (const [key, value] of Object.entries(count)) { - total += value as number; - } - statusString = `Completed:${count['Completed'] ? count['Completed'] : 0}/${total} Queued(${ - count['Queued'] ? count['Queued'] : 0 - }) Failed(${COLOR_ERROR(count['Failed'] ? count['Failed'] : 0)}) `; - SFPLogger.log(`Test Status: ` + COLOR_KEY_MESSAGE(statusString), LoggerLevel.INFO, this.logger); - this.lastExecutedTime = Date.now(); - } - } - } catch (error) { - //Ignore any results during reporting - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts b/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts deleted file mode 100644 index fd0c94644..000000000 --- a/packages/sfpowerscripts-cli/src/core/artifacts/ArtifactFetcher.ts +++ /dev/null @@ -1,224 +0,0 @@ -import path = require('path'); -import * as fs from 'fs-extra'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { globSync } from 'glob'; -import AdmZip = require('adm-zip'); -import semver = require('semver'); -import tar = require('tar'); - -export default class ArtifactFetcher { - /** - * Decider for which artifact retrieval method to use - * Returns empty array if no artifacts are found - * @param artifactDirectory - * @param sfdx_package - */ - public static fetchArtifacts(artifactDirectory: string, sfdx_package?: string, logger?: Logger): Artifact[] { - let result: Artifact[] = []; - - if (!fs.existsSync(artifactDirectory)) { - throw new Error(`Artifact directory ${path.resolve(artifactDirectory)} does not exist`); - } - - let artifacts: string[] = this.findArtifacts(artifactDirectory, sfdx_package); - - SFPLogger.log(`Artifacts: ${JSON.stringify(artifacts)}`, LoggerLevel.TRACE, logger); - - for (let artifact of artifacts) { - let artifactFilePaths: Artifact; - if (path.extname(artifact) === '.zip') { - artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromZipFile(artifact); - } else if (path.extname(artifact) === '.tgz') { - artifactFilePaths = ArtifactFetcher.fetchArtifactFilePathsFromTarball(artifact); - } else { - throw new Error(`Unhandled artifact format ${artifact}, neither tar or zip file`); - } - result.push(artifactFilePaths); - } - - return result; - } - - /** - * Helper method for retrieving the ArtifactFilePaths of an artifact folder - * @param packageMetadataFilePath - */ - private static fetchArtifactFilePathsFromFolder(packageMetadataFilePath: string): Artifact { - let sourceDirectory = path.join(path.dirname(packageMetadataFilePath), `source`); - - let changelogFilePath = path.join(path.dirname(packageMetadataFilePath), `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Helper method for retrieving ArtifactFilePaths of an artifact zip - * @param artifact - */ - private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; - - fs.mkdirpSync(unzippedArtifactsDirectory); - let zip = new AdmZip(artifact); - - // Overwrite existing files - zip.extractAllTo(unzippedArtifactsDirectory, true); - - let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0]; - if (artifactName == null) { - throw new Error(`Failed to fetch artifact file paths for ${artifact}`); - } - - let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, artifactName, 'artifact_metadata.json'); - - let sourceDirectory = path.join(unzippedArtifactsDirectory, artifactName, `source`); - - let changelogFilePath = path.join(unzippedArtifactsDirectory, artifactName, `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Helper method for retrieving ArtifactFilePaths of a tarball - * @param artifact - */ - private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; - fs.mkdirpSync(unzippedArtifactsDirectory); - - tar.x({ - file: artifact, - cwd: unzippedArtifactsDirectory, - sync: true, - }); - - let packageMetadataFilePath = path.join(unzippedArtifactsDirectory, 'package', 'artifact_metadata.json'); - - let sourceDirectory = path.join(unzippedArtifactsDirectory, 'package', `source`); - - let changelogFilePath = path.join(unzippedArtifactsDirectory, 'package', `changelog.json`); - - let artifactFilePaths: Artifact = { - packageMetadataFilePath: packageMetadataFilePath, - sourceDirectoryPath: sourceDirectory, - changelogFilePath: changelogFilePath, - }; - - ArtifactFetcher.existsArtifactFilepaths(artifactFilePaths); - - return artifactFilePaths; - } - - /** - * Find zip and tarball artifacts - * Artifact format/s: - * sfp_artifact_.zip, - * [sfdx_package]_sfp_artifact_[version].zip, - * [sfdx_package]_sfp_artifact_[version].tgz - */ - public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] { - let pattern: string; - if (sfdx_package) { - pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`; - } else { - pattern = `**/*sfp_artifact*.@(zip|tgz)`; - } - - let artifacts: string[] = globSync(pattern, { - cwd: artifactDirectory, - absolute: true, - }); - - if (sfdx_package && artifacts.length > 1) { - SFPLogger.log(`Found more than one artifact for ${sfdx_package}`, LoggerLevel.INFO); - let latestArtifact: string = ArtifactFetcher.getLatestArtifact(artifacts); - SFPLogger.log(`Using latest artifact ${latestArtifact}`, LoggerLevel.INFO); - return [latestArtifact]; - } else return artifacts; - } - - /** - * Get the artifact with the latest semantic version - * @param artifacts - */ - private static getLatestArtifact(artifacts: string[]) { - // Consider zip & tarball artifacts only - artifacts = artifacts.filter((artifact) => { - let ext: string = path.extname(artifact); - return ext === '.zip' || ext === '.tgz'; - }); - - let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); - let versions: string[] = artifacts.map((artifact) => { - let match: RegExpMatchArray = path.basename(artifact).match(pattern); - let version = match?.groups.version; - - if (version) return version; - else throw new Error('Corrupted artifact detected with no version number'); - }); - - // Pick artifact with latest semantic version - let sortedVersions: string[] = semver.sort(versions); - let latestVersion: string = sortedVersions.pop(); - - return artifacts.find((artifact) => artifact.includes(latestVersion)); - } - - /** - * Verify that artifact filepaths exist on the file system - * @param artifactFilePaths - */ - private static existsArtifactFilepaths(artifactFilePaths: Artifact): void { - Object.values(artifactFilePaths).forEach((filepath) => { - if (!fs.existsSync(filepath)) throw new Error(`Artifact filepath ${filepath} does not exist`); - }); - } - - /** - * Decider for task outcome if the artifact cannot be found - * @param artifacts_filepaths - * @param isToSkipOnMissingArtifact - */ - public static missingArtifactDecider(artifacts: Artifact[], isToSkipOnMissingArtifact: boolean): boolean { - if (artifacts.length === 0 && !isToSkipOnMissingArtifact) { - throw new Error(`Artifact not found, Please check the inputs`); - } else if (artifacts.length === 0 && isToSkipOnMissingArtifact) { - SFPLogger.log( - `Skipping task as artifact is missing, and 'Skip If no artifact is found' ${isToSkipOnMissingArtifact}` - ); - return true; - } - } - - private static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} - -export interface Artifact { - packageMetadataFilePath: string; - sourceDirectoryPath?: string; - changelogFilePath?: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts b/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts deleted file mode 100644 index 6ce94ec2d..000000000 --- a/packages/sfpowerscripts-cli/src/core/artifacts/generators/ArtifactGenerator.ts +++ /dev/null @@ -1,105 +0,0 @@ -import path = require('path'); -import * as fs from 'fs-extra'; -import GeneratePackageChangelog from '../../changelog/GeneratePackageChangelog'; -import { Changelog } from '../../changelog/interfaces/GenericChangelogInterfaces'; -import * as rimraf from 'rimraf'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import AdmZip = require('adm-zip'); -import SfpPackage from '../../package/SfpPackage'; - -export default class ArtifactGenerator { - //Generates the universal artifact used by the CLI and AZP - public static async generateArtifact( - sfpPackage: SfpPackage, - project_directory: string, - artifact_directory: string - ): Promise { - try { - // Artifact folder consisting of artifact metadata, changelog & source - let artifactFolder: string = `${sfpPackage.packageName}_sfp_artifact`; - - // Absolute filepath of artifact - let artifactFilepath: string; - - if (artifact_directory != null) { - artifactFilepath = path.resolve(artifact_directory, artifactFolder); - } else { - artifactFilepath = path.resolve(artifactFolder); - } - - fs.mkdirpSync(artifactFilepath); - - let sourcePackage: string = path.join(artifactFilepath, `source`); - fs.mkdirpSync(sourcePackage); - - //Clean up temp directory - if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfp'))) - rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfp')); - if (fs.existsSync(path.join(sfpPackage.workingDirectory, '.sfdx'))) - rimraf.sync(path.join(sfpPackage.workingDirectory, '.sfdx')); - - fs.copySync(sfpPackage.workingDirectory, sourcePackage); - rimraf.sync(sfpPackage.workingDirectory); - - //Modify Source Directory to the new source directory inside the artifact - sfpPackage.sourceDir = `source`; - - let artifactMetadataFilePath: string = path.join(artifactFilepath, `artifact_metadata.json`); - - fs.writeFileSync(artifactMetadataFilePath, JSON.stringify(sfpPackage, null, 4)); - - // Generate package changelog - // Doesnt need a from version number, as it always generate from start - let generatePackageChangelog: GeneratePackageChangelog = new GeneratePackageChangelog( - sfpPackage.packageName, - undefined, - sfpPackage.sourceVersion, - project_directory - ); - - let packageChangelog: Changelog = await generatePackageChangelog.exec(); - - let changelogFilepath: string = path.join(artifactFilepath, `changelog.json`); - - fs.writeFileSync(changelogFilepath, JSON.stringify(packageChangelog, null, 4)); - - SFPLogger.log('Artifact Copy Completed', LoggerLevel.DEBUG); - - let zip = new AdmZip(); - zip.addLocalFolder(artifactFilepath, artifactFolder); - SFPLogger.log(`Zipping ${artifactFolder}`, LoggerLevel.DEBUG); - - let packageVersionNumber: string = ArtifactGenerator.substituteBuildNumberWithPreRelease( - sfpPackage.versionNumber - ); - - let zipArtifactFilepath: string = artifactFilepath + `_` + packageVersionNumber + `.zip`; - zip.writeZip(zipArtifactFilepath); - - SFPLogger.log( - `Artifact Generation Completed for ${sfpPackage.packageType} to ${zipArtifactFilepath}`, - LoggerLevel.INFO - ); - - // Cleanup unzipped artifact - rimraf.sync(artifactFilepath); - - return zipArtifactFilepath; - } catch (error) { - throw new Error('Unable to create artifact' + error); - } - } - - private static substituteBuildNumberWithPreRelease(packageVersionNumber: string) { - let segments = packageVersionNumber.split('.'); - - if (segments.length === 4) { - packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { - if (segmentsIdx === 3) return version + '-' + segment; - else return version + '.' + segment; - }); - } - - return packageVersionNumber; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts b/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts deleted file mode 100644 index d4c04424d..000000000 --- a/packages/sfpowerscripts-cli/src/core/changelog/GeneratePackageChangelog.ts +++ /dev/null @@ -1,76 +0,0 @@ -import ProjectConfig from '../project/ProjectConfig'; -import simplegit, { SimpleGit, LogOptions } from 'simple-git'; -import { Changelog } from './interfaces/GenericChangelogInterfaces'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; - -/** - * A class for generating a changelog between two commits - * for a single package - */ -export default class GeneratePackageChangelog { - constructor( - private readonly sfdx_package: string, - private readonly revFrom: string, - private readonly revTo: string, - private readonly project_directory: string - ) {} - - public async exec(): Promise { - let git: SimpleGit; - if (this.project_directory != null) { - git = simplegit(this.project_directory); - } else { - git = simplegit(); - } - - let packageDescriptor; - try { - packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(this.project_directory, this.sfdx_package); - } catch (err) { - SFPLogger.log(`Unable to find descriptor for package ${this.sfdx_package}`, LoggerLevel.WARN); - SFPLogger.log(err.message, LoggerLevel.WARN); - } - - let revFrom: string; - if (this.revFrom) { - revFrom = await git.revparse(['--short', `${this.revFrom}^{}`]); - } - - - let revTo: string = await git.revparse(['--short', `${this.revTo}^{}`]); - - let options: LogOptions = { - file: packageDescriptor ? `${packageDescriptor['path']}*` : packageDescriptor, - }; - if(revFrom) - { - options.from = revFrom; - options.to = revTo; - } - - const gitLogResult = await git.log(options); - - let changelog: Changelog = { - name: undefined, - from: undefined, - to: undefined, - commits: [], - }; - - changelog['name'] = this.sfdx_package; - changelog['from'] = revFrom; - changelog['to'] = revTo; - - for (let commit of gitLogResult.all) { - changelog['commits'].push({ - commitId: commit.hash.slice(0, 8), - date: commit.date, - author: commit.author_name, - message: commit.message, - body: commit.body, - }); - } - - return changelog; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts b/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts deleted file mode 100644 index d9929d0ad..000000000 --- a/packages/sfpowerscripts-cli/src/core/changelog/interfaces/GenericChangelogInterfaces.ts +++ /dev/null @@ -1,30 +0,0 @@ -export interface Changelog { - /** - * Name of the package - */ - name: string; - - /** - * Backwards-compatibility for delta package - */ - from: string; - - /** - * Commit Id from which package was created - * May not necessarily be the first element in commits - */ - to: string; - - /** - * Commits that modified the package - */ - commits: Commit[]; -} - -export interface Commit { - commitId: string; - date: string; - author: string; - message: string; - body: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts b/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts deleted file mode 100644 index 253b64313..000000000 --- a/packages/sfpowerscripts-cli/src/core/dependency/ChangedComponentsFetcher.ts +++ /dev/null @@ -1,93 +0,0 @@ -import Git from '../git/Git'; -import IgnoreFiles from '../ignore/IgnoreFiles'; -import ProjectConfig from '../project/ProjectConfig'; -import MetadataFiles from '../metadata/MetadataFiles'; -import Component from './Component'; -import * as fs from 'fs-extra'; -import path = require('path'); -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; - -export default class ChangedComponentsFetcher { - constructor(private baseBranch: string) {} - - async fetch(): Promise { - const components: Component[] = []; - - let git: Git = await Git.initiateRepo(); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(null); - - if (!this.baseBranch.includes('origin')) { - // for user convenience, use full ref name to avoid errors involving missing local refs - this.baseBranch = `remotes/origin/${this.baseBranch}`; - } - - let diff: string[] = await git.diff([this.baseBranch, `HEAD`, `--no-renames`, `--name-only`]); - - // Filter diff to package directories - diff = diff.filter((filepath) => - projectConfig.packageDirectories.find((pkg) => - // TODO: make comparison more robust - filepath.includes(pkg.path) - ) - ); - - // Apply root forceignore to the diff - let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync('.forceignore', 'utf8')); - diff = ignoreFiles.filter(diff); - - let componentSuccesses = this.getComponentSuccessesFromReports(); - - if (diff.length > 0) { - for (const filepath of diff) { - const fullApiName = MetadataFiles.getFullApiName(filepath); - - // find package that file belongs to - const indexOfPackage = projectConfig.packageDirectories.findIndex((pkg) => filepath.includes(pkg.path)); - - const packageName = projectConfig.packageDirectories[indexOfPackage].package; - - const componentSuccess = componentSuccesses.find( - (component) => component.fullName === fullApiName && component.id - ); - - if (componentSuccess) { - const component: Component = { - id: componentSuccess.id, - fullName: componentSuccess.fullName, - type: componentSuccess.componentType, - files: [filepath], - package: packageName, - packageType: ProjectConfig.getPackageType(projectConfig, packageName), - indexOfPackage: indexOfPackage, - }; - - components.push(component); - } else { - SFPLogger.log(`Unable to find ID for ${fullApiName} in deployment reports`, LoggerLevel.DEBUG); - // Ignore file if it's not an identifiable component - continue; - } - } - } - - return components; - } - - /** - * Aggregates component successes from MDAPI deploy reports - */ - private getComponentSuccessesFromReports(): any[] { - let componentSuccesses: any[] = []; - - const reportsDir: string = '.sfp/mdapiDeployReports'; - if (fs.existsSync(reportsDir)) { - let reports = fs.readdirSync(reportsDir); - reports.forEach((report) => { - let data = JSON.parse(fs.readFileSync(path.join(reportsDir, report), 'utf8')); - componentSuccesses = componentSuccesses.concat(data.result.details.componentSuccesses); - }); - } - return componentSuccesses; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/Component.ts b/packages/sfpowerscripts-cli/src/core/dependency/Component.ts deleted file mode 100644 index 7fe64298b..000000000 --- a/packages/sfpowerscripts-cli/src/core/dependency/Component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PackageType } from "../package/SfpPackage"; - -/** - * Component details and package it belongs to - */ -export default interface Component { - id: string; - fullName: string; - type: string; - files?: string[]; - package?: string; - packageType?: PackageType; - indexOfPackage?: number; - namespace?: string; - dependencies?: Component[]; -} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts b/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts deleted file mode 100644 index 80493b56e..000000000 --- a/packages/sfpowerscripts-cli/src/core/dependency/DependencyViolation.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Component from './Component'; - -export default interface DependencyViolation { - component: Component; - dependency: any; - description: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts b/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts deleted file mode 100644 index 008ec7b59..000000000 --- a/packages/sfpowerscripts-cli/src/core/dependency/Entrypoint.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Component from './Component'; - -/** - * Used by sfdc-soup API calls - */ -export default interface Entrypoint { - name: string; - type: string; - id: string; -} - -export function component2entrypoint(components: Component[]): Entrypoint[] { - return components.map((component) => { - return { - name: component.fullName, - type: component.type, - id: component.id, - } as Entrypoint; - }); -} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts deleted file mode 100644 index ea9f2c3d4..000000000 --- a/packages/sfpowerscripts-cli/src/core/deployers/DeploySourceToOrgImpl.ts +++ /dev/null @@ -1,230 +0,0 @@ -import SFPLogger, { - COLOR_ERROR, - COLOR_HEADER, - COLOR_KEY_MESSAGE, - COLOR_SUCCESS, - Logger, - LoggerLevel, -} from '@flxblio/sfp-logger'; - -import { Duration } from '@salesforce/kit'; -import DeploymentExecutor, { DeploySourceResult } from './DeploymentExecutor'; -import { - ComponentSet, - DeployMessage, - DeployResult, - MetadataApiDeployOptions, - RequestStatus, -} from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import path from 'path'; -import SFPOrg from '../org/SFPOrg'; -import getFormattedTime from '../utils/GetFormattedTime'; -import { TestLevel } from '../apextest/TestOptions'; -import { SfProject } from '@salesforce/core'; -import { SourceTracking } from '@salesforce/source-tracking'; - -export default class DeploySourceToOrgImpl implements DeploymentExecutor { - public constructor( - private org: SFPOrg, - private projectDir: string, - private componentSet: ComponentSet, - private deploymentOptions: DeploymentOptions, - private logger?: Logger - ) {} - - public async exec(): Promise { - let deploySourceResult = {} as DeploySourceResult; - - if (this.deploymentOptions.apiVersion) this.componentSet.sourceApiVersion = this.deploymentOptions.apiVersion; - - //Get Deploy ID - let result = await this.deploy(this.componentSet); - - this.writeResultToReport(result); - - if (this.deploymentOptions.sourceTracking) { - await this.handleSourceTracking(this.org, this.logger, this.projectDir, result); - } - - //Handle Responses - if (result.response.status == RequestStatus.Succeeded) { - deploySourceResult.message = `Successfully deployed`; - deploySourceResult.result = result.response.success; - deploySourceResult.deploy_id = result.response.id; - } else { - if (result.response.status == RequestStatus.Canceled) { - deploySourceResult.message = `The deployment request ${result.response.id} was cancelled by ${result.response.canceledByName}`; - } else { - deploySourceResult.message = this.handlErrorMesasge(result); - } - deploySourceResult.response = result.response; - deploySourceResult.result = false; - deploySourceResult.deploy_id = result.response.id; - } - return deploySourceResult; - } - - private handlErrorMesasge(result: DeployResult): string { - if (result.response.numberComponentErrors == 0) { - return 'Unable to fetch report, Check your org for details'; - } else if (result.response.numberComponentErrors > 0) { - return this.constructComponentErrorMessage(result.response.details.componentFailures, this.logger); - } else if (result.response.details.runTestResult) { - return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; - } else { - return 'Unable to fetch report, Check your org for details'; - } - } - - private constructComponentErrorMessage(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { - let errorMessage = `Unable to deploy due to failure in some components, check log for details`; - - if (componentFailures === null || componentFailures === undefined) return; - - if (componentFailures instanceof Array) { - //Search for other scenarios and if background Job is being executed, override the error message - for (let failure of componentFailures) { - let scenario = classifyErrorScenarios(failure); - if (scenario == `BackgroundJob`) { - errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; - break; - } - } - } else { - let failure = componentFailures; - let scenario = classifyErrorScenarios(failure); - if (scenario == `BackgroundJob`) { - errorMessage = `Unable to deploy due to an ongoing background job from a previous package`; - } - } - - function classifyErrorScenarios(failure: DeployMessage) { - let scenario = `Component Error`; - //Override if background job is being executed - if (failure.problem.includes(`background job is being executed`)) { - scenario = `BackgroundJob`; - } - return scenario; - } - return errorMessage; - } - - private writeResultToReport(result: DeployResult) { - let deploymentReports = `.sfp/mdapiDeployReports`; - fs.mkdirpSync(deploymentReports); - fs.writeFileSync( - path.join(deploymentReports, `${result.response.id}.json`), - JSON.stringify(this.formatResultAsJSON(result)) - ); - } - - private async buildDeploymentOptions(org: SFPOrg): Promise { - let metdataDeployOptions: MetadataApiDeployOptions = { - usernameOrConnection: org.getConnection(), - apiOptions: {}, - }; - - if (this.deploymentOptions.apiVersion) metdataDeployOptions.apiVersion = this.deploymentOptions.apiVersion; - - if (this.deploymentOptions.testLevel == TestLevel.RunLocalTests) { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunLocalTests; - } else if (this.deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunSpecifiedTests; - metdataDeployOptions.apiOptions.runTests = this.deploymentOptions.specifiedTests.split(`,`); - } else { - metdataDeployOptions.apiOptions.testLevel = TestLevel.RunNoTests; - } - - if (this.deploymentOptions.ignoreWarnings) { - metdataDeployOptions.apiOptions.ignoreWarnings = true; - } - - metdataDeployOptions.apiOptions.rollbackOnError = this.deploymentOptions.rollBackOnError; - - return metdataDeployOptions; - } - - private async deploy(componentSet: ComponentSet) { - let deploymentOptions = await this.buildDeploymentOptions(this.org); - const deploy = await componentSet.deploy(deploymentOptions); - - let startTime = Date.now(); - SFPLogger.log(`Deploying to ${this.org.getUsername()} with id:${deploy.id}`, LoggerLevel.INFO, this.logger); - // Attach a listener to check the deploy status on each poll - deploy.onUpdate((response) => { - const { status, numberComponentsDeployed, numberComponentsTotal } = response; - const progress = `${numberComponentsDeployed}/${numberComponentsTotal}`; - const message = `Status: ${COLOR_KEY_MESSAGE(status)} Progress: ${COLOR_KEY_MESSAGE(progress)}`; - SFPLogger.log(message, LoggerLevel.INFO, this.logger); - }); - - deploy.onFinish((response) => { - let deploymentDuration = Date.now() - startTime; - if (response.response.success) { - SFPLogger.log( - COLOR_SUCCESS( - `Succesfully Deployed ${COLOR_HEADER( - response.response.numberComponentsDeployed - )} components in ${getFormattedTime(deploymentDuration)}` - ), - LoggerLevel.INFO, - this.logger - ); - } else - SFPLogger.log( - COLOR_ERROR(`Failed to deploy after ${getFormattedTime(deploymentDuration)}`), - LoggerLevel.INFO, - this.logger - ); - }); - - // Wait for polling to finish and get the DeployResult object - const hoursInWaitTime = Number(this.deploymentOptions.waitTime) / 60; - const result = await deploy.pollStatus({ frequency: Duration.seconds(30), timeout: Duration.hours(hoursInWaitTime) }); - return result; - } - - //For compatibility with cli output - private formatResultAsJSON(result) { - const response = result?.response ? result.response : {}; - return { - result: { - ...response, - details: { - componentSuccesses: response?.details?.componentSuccesses, - componentFailures: response?.details?.componentFailures, - runTestResult: response?.details?.runTestResult, - }, - }, - }; - } - - private async handleSourceTracking(org: SFPOrg, logger: Logger, projectDir: string, result: DeployResult) { - if (result.response.success) { - try { - const project = await SfProject.resolve(this.projectDir); - const tracking = await SourceTracking.create({ - org: org, - project: project, - }); - await tracking.ensureRemoteTracking(); - tracking.updateTrackingFromDeploy(result); - } catch (error) { - SFPLogger.log(`Unable to update source tracking due to \n ${error}`, LoggerLevel.WARN, logger); - } - } - } -} - -export class DeploymentOptions { - ignoreWarnings: boolean; - waitTime: string; - checkOnly?: boolean; - apiVersion?: string; - testLevel?: TestLevel; - apexTestSuite?: string; - specifiedTests?: string; - sourceTracking?: boolean; - rollBackOnError?: boolean; -} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts deleted file mode 100644 index 1e1165abf..000000000 --- a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentExecutor.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MetadataApiDeployStatus } from "@salesforce/source-deploy-retrieve"; - -export default interface DeploymentExecutor { - exec(): Promise; -} - -export interface DeploySourceResult { - deploy_id: string; - result: boolean; - message: string; - response?:MetadataApiDeployStatus -} - -export enum DeploymentType { - SOURCE_PUSH, - MDAPI_DEPLOY, -} diff --git a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts b/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts deleted file mode 100644 index 2f8c0b0f6..000000000 --- a/packages/sfpowerscripts-cli/src/core/deployers/DeploymentSettingsService.ts +++ /dev/null @@ -1,64 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { Connection } from '@salesforce/core'; -import { IpRange, SecuritySettings } from 'jsforce/lib/api/metadata'; - -export default class DeploymentSettingsService { - constructor(private conn: Connection) {} - - //Enable Synchronus Compile on Deploy - public async enableSynchronousCompileOnDeploy(logger: Logger) { - try { - let apexSettingMetadata = { fullName: 'ApexSettings', enableCompileOnDeploy: true }; - let result = await this.conn.metadata.upsert('ApexSettings', apexSettingMetadata); - if (result.success) { - SFPLogger.log( - `${COLOR_KEY_MESSAGE( - 'Enabled Synchronous Compile on Org succesfully as this is the last package in queue' - )}`, - LoggerLevel.INFO, - logger - ); - } - } catch (error) { - SFPLogger.log( - `Skipping Synchronous Compile on Org succesfully due to ${error}..`, - LoggerLevel.INFO, - logger - ); - } - } - - public async relaxAllIPRanges(logger: Logger, ipRangesAsStringArray?: string[]) { - let ipRanges: IpRange[] = []; - if (!ipRangesAsStringArray) { - ipRanges = this.getFullRange(); - } else { - ipRanges = []; - //transform to ipRange Array - for (const ipRange of ipRangesAsStringArray) { - ipRanges.push({ start: ipRange, end: ipRange }); - } - } - let securitySettingsMetadata: SecuritySettings = { - fullName: 'SecuritySettings', - networkAccess: { ipRanges: ipRanges }, - }; - try { - let result = await this.conn.metadata.upsert('SecuritySettings', securitySettingsMetadata); - if (result.success) { - SFPLogger.log(`${COLOR_KEY_MESSAGE('Relaxed all ipRanges in the org')}`, LoggerLevel.INFO, logger); - } - } catch (error) { - SFPLogger.log(`Unable to relax IP range in org due to ${error.message}`, LoggerLevel.ERROR, logger); - throw error; - } - } - - private getFullRange(): IpRange[] { - let ipRanges = []; - for (let i = 0; i < 255; i += 2) { - ipRanges.push({ start: `${i}.0.0.0`, end: `${i + 1}.255.255.255` }); - } - return ipRanges; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts deleted file mode 100644 index 09c6e54ca..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/DependencyViolationDisplayer.ts +++ /dev/null @@ -1,31 +0,0 @@ -const Table = require('cli-table'); -import DependencyViolation from '../dependency/DependencyViolation'; -import SFPLogger from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class DependencyViolationDisplayer { - public static printDependencyViolations(dependencyViolations: DependencyViolation[]) { - if (!dependencyViolations || dependencyViolations.length === 0) return; - - const table = new Table({ - head: ['API Name', 'Type', 'Package', 'Dependency', 'Dependency Type', 'Dependency Package', 'Problem'], - chars: ZERO_BORDER_TABLE - }); - - SFPLogger.log('The following components resulted in failures:'); - - dependencyViolations.forEach((violation) => { - table.push([ - violation.component.fullName, - violation.component.type, - violation.component.package, - violation.dependency.fullName, - violation.dependency.type, - violation.dependency.package, - violation.description, - ]); - }); - - SFPLogger.log(table.toString()); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts deleted file mode 100644 index 8a0ea62d3..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/DeployErrorDisplayer.ts +++ /dev/null @@ -1,103 +0,0 @@ -const Table = require('cli-table'); -import { CodeCoverageWarnings, DeployMessage, Failures, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class DeployErrorDisplayer { - private static printMetadataFailedToDeploy(componentFailures: DeployMessage | DeployMessage[], logger: Logger) { - if (componentFailures === null || componentFailures === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name', 'Problem Type', 'Problem'], - chars: ZERO_BORDER_TABLE - }); - - let pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.componentType, - componentFailure.fullName, - componentFailure.problemType, - componentFailure.problem, - ]; - table.push(item); - }; - - if (componentFailures instanceof Array) { - for (let failure of componentFailures) { - pushComponentFailureIntoTable(failure); - } - } else { - let failure = componentFailures; - pushComponentFailureIntoTable(failure); - } - SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, logger); - SFPLogger.log(table.toString(), LoggerLevel.ERROR, logger); - } - - public static displayErrors(response: MetadataApiDeployStatus, logger: Logger) { - SFPLogger.log(`Gathering Final Deployment Status`, null, logger); - - if (response.numberComponentErrors == 0) { - return 'Unable to fetch report, Check your org for details'; - } else if (response.numberComponentErrors > 0) { - this.printMetadataFailedToDeploy(response.details.componentFailures, logger); - return response.errorMessage; - } else if (response.details.runTestResult) { - if (response.details.runTestResult.codeCoverageWarnings) { - this.displayCodeCoverageWarnings(response.details.runTestResult.codeCoverageWarnings, logger); - } - - if (response.details.runTestResult.failures) { - this.displayTestFailures(response.details.runTestResult.failures, logger); - } - return 'Unable to deploy due to unsatisfactory code coverage and/or test failures'; - } else { - return 'Unable to fetch report, Check your org for details'; - } - } - - private static displayCodeCoverageWarnings( - codeCoverageWarnings: CodeCoverageWarnings | CodeCoverageWarnings[], - logger: Logger - ) { - let table = new Table({ - head: ['Name', 'Message'], - }); - - if (Array.isArray(codeCoverageWarnings)) { - codeCoverageWarnings.forEach((coverageWarningElement) => { - table.push([coverageWarningElement['name'], coverageWarningElement.message]); - }); - } else { - table.push([codeCoverageWarnings['name'], codeCoverageWarnings.message]); - } - - if (table.length > 1) { - SFPLogger.log( - 'Unable to deploy due to unsatisfactory code coverage, Check the following classes:', - LoggerLevel.WARN, - logger - ); - SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); - } - } - - private static displayTestFailures(testFailures: Failures | Failures[], logger: Logger) { - let table = new Table({ - head: ['Test Name', 'Method Name', 'Message'], - chars: ZERO_BORDER_TABLE - }); - - if (Array.isArray(testFailures)) { - testFailures.forEach((elem) => { - table.push([elem.name, elem.methodName, elem.message]); - }); - } else { - table.push([testFailures.name, testFailures.methodName, testFailures.message]); - } - if (table.length > 1) { - SFPLogger.log('Unable to deploy due to test failures:', LoggerLevel.WARN, logger); - SFPLogger.log(table.toString(), LoggerLevel.WARN, logger); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts deleted file mode 100644 index e484e0724..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/DeploymentOptionDisplayer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { TestLevel } from '../apextest/TestOptions'; -import { DeploymentOptions } from '../deployers/DeploySourceToOrgImpl'; - -export default class DeploymentOptionDisplayer { - public static printDeploymentOptions(deploymentOptions: DeploymentOptions, logger?: Logger) { - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - SFPLogger.log(`${COLOR_HEADER(`Deployment Options`)}`, LoggerLevel.INFO, logger); - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - SFPLogger.log(`TestLevel: ${COLOR_KEY_MESSAGE(deploymentOptions.testLevel)}`, LoggerLevel.INFO, logger); - if (deploymentOptions.testLevel == TestLevel.RunSpecifiedTests) - SFPLogger.log( - `Tests to be triggered: ${COLOR_KEY_MESSAGE(deploymentOptions.specifiedTests)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log( - `Ignore Warnings: ${COLOR_KEY_MESSAGE(deploymentOptions.ignoreWarnings)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log( - `Roll Back on Error: ${COLOR_KEY_MESSAGE(deploymentOptions.rollBackOnError)}`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log(`API Version: ${COLOR_KEY_MESSAGE(deploymentOptions.apiVersion)}`, LoggerLevel.INFO, logger); - SFPLogger.log( - `${COLOR_HEADER( - `=================================================================================================` - )}`, - LoggerLevel.INFO, - logger - ); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts deleted file mode 100644 index 3227b8695..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/ExternalDependencyDisplayer.ts +++ /dev/null @@ -1,30 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; -import Package2Detail from '../package/Package2Detail'; -import { ZERO_BORDER_TABLE } from './TableConstants'; -const Table = require('cli-table'); - -export default class ExternalDependencyDisplayer { - public constructor(private externalPackage2s: Package2Detail[], private logger: Logger) {} - - public display() { - if (this.externalPackage2s.length > 0) { - let table = new Table({ - head: ['Order', 'Package', 'Version', 'Subscriber Version Id'], - chars: ZERO_BORDER_TABLE - }); - let i = 0; - for (const externalPackage of this.externalPackage2s) { - table.push([ - i++, - externalPackage.name, - externalPackage.versionNumber ? externalPackage.versionNumber : 'N/A', - externalPackage.subscriberPackageVersionId ? externalPackage.subscriberPackageVersionId:'N/A, Could be part of current operation', - ]); - } - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log(COLOR_KEY_MESSAGE(`Resolved external package dependencies:`), LoggerLevel.INFO, this.logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); - } - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts deleted file mode 100644 index d0ef5f96f..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/InstalledArtifactsDisplayer.ts +++ /dev/null @@ -1,22 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class InstalledArtifactsDisplayer { - public static printInstalledArtifacts(artifacts: any, logger: Logger) { - if (!artifacts) return; - else if(artifacts.length==0) return; - - let table = new Table({ - head: ['Artifact', 'Version', 'Commit Id'], - chars: ZERO_BORDER_TABLE - }); - - artifacts.forEach((artifact) => { - table.push([artifact.Name, artifact.Version__c, artifact.CommitId__c?artifact.CommitId__c:""]); - }); - - SFPLogger.log(COLOR_KEY_MESSAGE('Artifacts installed in org:'), LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts deleted file mode 100644 index 32460d356..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/InstalledPackagesDisplayer.ts +++ /dev/null @@ -1,22 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import Package2Detail from '../package/Package2Detail'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class InstalledPackagesDisplayer { - public static printInstalledPackages(packages: Package2Detail[], logger: Logger) { - if (packages == null) return; - - let table = new Table({ - head: ['Package', 'Version', 'Type', 'isOrgDependent'], - chars: ZERO_BORDER_TABLE - }); - - packages.forEach((pkg) => { - table.push([pkg.name, pkg.versionNumber, pkg.type, pkg.isOrgDependent]); - }); - - SFPLogger.log(COLOR_KEY_MESSAGE('Packages installed in org:'), LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts b/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts deleted file mode 100644 index ca2806cc4..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/PackageComponentPrinter.ts +++ /dev/null @@ -1,27 +0,0 @@ -const Table = require('cli-table'); -import { LazyCollection, SourceComponent } from '@salesforce/source-deploy-retrieve'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PackageComponentPrinter { - public static printComponentTable(components: LazyCollection, logger: Logger) { - //If Manifest is null, just return - if (components === null || components === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name'], - chars: ZERO_BORDER_TABLE - }); - - let componentArray = components.toArray(); - componentArray.sort((a, b) => a.type.name.localeCompare(b.type.name)); - - for (const component of componentArray) { - let item = [component.type.name, component.fullName]; - table.push(item); - } - - SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts deleted file mode 100644 index e2540aeb9..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/PackageDependencyDisplayer.ts +++ /dev/null @@ -1,35 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; -const Table = require('cli-table'); - -export default class PackageDependencyDisplayer { - public static printPackageDependencies( - dependencies: { package: string; versionNumber?: string }[], - projectConfig: any, - logger: Logger - ) { - if (Array.isArray(dependencies)) { - SFPLogger.log('Package Dependencies:', LoggerLevel.INFO, logger); - const table = new Table({ - head: ['Order','Package', 'Version'], - chars: ZERO_BORDER_TABLE, - style: { 'padding-left': 3 }, - }); - let order=1; - for (const dependency of dependencies) { - let versionNumber = 'N/A'; - - if (!dependency.versionNumber) - versionNumber = projectConfig.packageAliases[dependency.package] - ? projectConfig.packageAliases[dependency.package] - : 'N/A'; - else versionNumber = dependency.versionNumber; - - const row = [order,dependency.package, versionNumber]; - table.push(row); - order++; - } - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts b/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts deleted file mode 100644 index 7703c9cc2..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/PackageMetadataPrinter.ts +++ /dev/null @@ -1,38 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PackageMetadataPrinter { - public static printMetadataToDeploy(payload: any, logger: Logger) { - //If Manifest is null, just return - if (payload === null || payload === undefined) return; - - let table = new Table({ - head: ['Metadata Type', 'API Name'], - chars: ZERO_BORDER_TABLE - }); - - let pushTypeMembersIntoTable = (type) => { - if (type['members'] instanceof Array) { - for (let member of type['members']) { - let item = [type.name, member]; - table.push(item); - } - } else { - let item = [type.name, type.members]; - table.push(item); - } - }; - - if (payload['Package']['types'] instanceof Array) { - for (let type of payload['Package']['types']) { - pushTypeMembersIntoTable(type); - } - } else { - let type = payload['Package']['types']; - pushTypeMembersIntoTable(type); - } - SFPLogger.log('The following metadata will be deployed:', LoggerLevel.INFO, logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, logger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts b/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts deleted file mode 100644 index 3cfc6cf16..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/PushErrorDisplayer.ts +++ /dev/null @@ -1,75 +0,0 @@ -const Table = require('cli-table'); -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from './TableConstants'; - -export default class PushErrorDisplayer { - public static printMetadataFailedToPush(error: any, packageLogger: Logger) { - if (error == null) return; - - let table; - let pushComponentFailureIntoTable; - if (error.name === 'sourceConflictDetected') { - table = new Table({ - head: ['State', 'API Name', 'Metadata Type', 'File Path'], - chars: ZERO_BORDER_TABLE - }); - - pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.state, - componentFailure.fullName, - componentFailure.type, - componentFailure.filePath, - ]; - - // Replace "undefined" values with "NA". cli-table breaks for undefined cells - item.forEach((elem, idx, item) => { - if (elem === undefined) { - item[idx] = 'NA'; - } - }); - - table.push(item); - }; - } else if (error.name === 'DeployFailed') { - table = new Table({ - head: ['Metadata Type', 'API Name', 'Problem Type', 'FilePath','Problem'], - }); - - pushComponentFailureIntoTable = (componentFailure) => { - let item = [ - componentFailure.type, - componentFailure.fullName, - componentFailure.problemType, - componentFailure.error, - componentFailure.filePath, - ]; - - // Replace "undefined" values with "NA". cli-table breaks for undefined cells - item.forEach((elem, idx, item) => { - if (elem === undefined) { - item[idx] = 'NA'; - } - }); - - table.push(item); - }; - } else { - SFPLogger.log('Unknown error type. Failed to print table.', LoggerLevel.ERROR, packageLogger); - return; - } - - if (error.data instanceof Array) { - for (let componentFailure of error.data) { - pushComponentFailureIntoTable(componentFailure); - } - } else { - let failure = error.data; - pushComponentFailureIntoTable(failure); - } - - SFPLogger.log('The following components resulted in failures:', LoggerLevel.ERROR, packageLogger); - - SFPLogger.log(table.toString(), LoggerLevel.ERROR, packageLogger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts b/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts deleted file mode 100644 index 4caeefcdc..000000000 --- a/packages/sfpowerscripts-cli/src/core/display/TableConstants.ts +++ /dev/null @@ -1,38 +0,0 @@ - -export const ZERO_BORDER_TABLE = { - top: ' ', - 'top-mid': ' ', - 'top-left': ' ', - 'top-right': ' ', - bottom: ' ', - 'bottom-mid': ' ', - 'bottom-left': ' ', - 'bottom-right': ' ', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ' ', -}; - - - -export const COLON_MIDDLE_BORDER_TABLE = { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ':', -}; diff --git a/packages/sfpowerscripts-cli/src/core/git/Git.ts b/packages/sfpowerscripts-cli/src/core/git/Git.ts deleted file mode 100644 index 97089b71f..000000000 --- a/packages/sfpowerscripts-cli/src/core/git/Git.ts +++ /dev/null @@ -1,246 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import simplegit, { SimpleGit } from 'simple-git'; -import fs = require('fs-extra'); -import GitIdentity from './GitIdentity'; -const tmp = require('tmp'); - -//Git Abstraction -export default class Git { - private _git: SimpleGit; - private repositoryLocation: string; - private tempRepoLocation: any; - private _isATemporaryRepo: boolean = false; - - private constructor(private projectDir?: string, private logger?: Logger) { - if (this.projectDir) { - this._git = simplegit(this.projectDir); - this.repositoryLocation = this.projectDir; - } else { - this._git = simplegit(); - this.repositoryLocation = process.cwd(); - } - } - - async fetch() { - return this._git.fetch('origin'); - } - - async getHeadCommit(): Promise { - return this._git.revparse(['HEAD']); - } - - async show(options: string[]): Promise { - return this._git.show(options); - } - - async tag(options: string[]): Promise { - let tagResult = await this._git.tag(options); - - let temp: string[] = tagResult.split('\n'); - temp.pop(); - - return temp; - } - - async diff(options: string[]): Promise { - let diffResult = await this._git.diff(options); - - let temp: string[] = diffResult.split('\n'); - temp.pop(); - - return temp; - } - - async log(options: string[]): Promise { - let gitLogResult = await this._git.log(options); - - return gitLogResult['all'][0]['hash'].split('\n'); - } - - public async getRemoteOriginUrl(overrideOriginURL?: string): Promise { - let remoteOriginURL; - if (!overrideOriginURL) { - remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; - if (!remoteOriginURL) { - remoteOriginURL = (await this._git.getConfig('remote.origin.url')).value; - } - SFPLogger.log(`Fetched Remote URL ${remoteOriginURL}`, LoggerLevel.DEBUG); - } else remoteOriginURL = overrideOriginURL; - - if (!remoteOriginURL) throw new Error('Remote origin must be set in repository'); - - return remoteOriginURL; - } - - public async commitFile(pathToFiles: string[], message = `[skip ci] Autogenerated commit by sfp`) { - try { - await new GitIdentity(this._git).setUsernameAndEmail(); - await this._git.add(pathToFiles); - await this._git.commit(message); - SFPLogger.log(`Committed File ${pathToFiles}`); - } catch (error) { - SFPLogger.log( - `Unable to commit file, probably due to no change or something else,Please try manually`, - LoggerLevel.ERROR - ); - throw error; - } - } - - async pushTags(tags?: string[]) { - if (!tags) await this._git.pushTags(); - else { - for (let tag of tags) { - await this._git.push('origin', tag); - } - } - } - - async deleteTags(tags?: string[]) { - if (tags) await this._git.push('origin', '--delete', tags); - } - - async addAnnotatedTag(tagName: string, annotation: string, commitId?: string) { - try { - await new GitIdentity(this._git).setUsernameAndEmail(); - if (!commitId) { - await this._git.addAnnotatedTag(tagName, annotation); - } else { - const commands = ['tag', tagName, commitId, '-m', annotation]; - await this._git.raw(commands); - } - } catch (error) { - SFPLogger.log( - `Unable to commit file, probably due to no change or something else,Please try manually`, - LoggerLevel.ERROR - ); - throw error; - } - } - - public async isBranchExists(branch: string): Promise { - const listOfBranches = await this._git.branch(['-la']); - - return listOfBranches.all.find((elem) => elem.endsWith(branch)) ? true : false; - } - - static async initiateRepoAtTempLocation(logger: Logger, commitRef?: string, branch?: string): Promise { - let locationOfCopiedDirectory = tmp.dirSync({ unsafeCleanup: true }); - - SFPLogger.log(`Copying the repository to ${locationOfCopiedDirectory.name}`, LoggerLevel.INFO, logger); - let repoDir = locationOfCopiedDirectory.name; - - // Copy source directory to temp dir - fs.copySync(process.cwd(), repoDir); - - //Initiate git on new repo on using the abstracted object - let git = new Git(repoDir, logger); - git._isATemporaryRepo = true; - git.tempRepoLocation = locationOfCopiedDirectory; - - await git.addSafeConfig(repoDir); - await git.getRemoteOriginUrl(); - await git.fetch(); - if (branch) { - await git.createBranch(branch); - } - if (commitRef) { - await git.checkout(commitRef, true); - } - - SFPLogger.log( - `Successfully created temporary repository at ${repoDir} with commit ${commitRef ? commitRef : 'HEAD'}`, - LoggerLevel.INFO, - logger - ); - return git; - } - - static async initiateRepo(logger?: Logger, projectDir?: string) { - let git = new Git(projectDir, logger); - if (projectDir) await git.addSafeConfig(projectDir); - else { - await git.addSafeConfig(process.cwd()); - } - await git.getRemoteOriginUrl(); - return git; - } - - public getRepositoryPath() { - return this.repositoryLocation; - } - - async deleteTempoRepoIfAny() { - if (this.tempRepoLocation) this.tempRepoLocation.removeCallback(); - } - - async addSafeConfig(repoDir: string) { - try - { - //add workaround for safe directory (https://github.com/actions/runner/issues/2033) - await this._git.addConfig('safe.directory', repoDir, false, 'global'); - }catch(error) - { - //ignore error - SFPLogger.log(`Unable to set safe.directory`,LoggerLevel.TRACE) - } - } - - async pushToRemote(branch: string, isForce: boolean) { - if (!branch) branch = (await this._git.branch()).current; - SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger); - if (process.env.sfp_OVERRIDE_ORIGIN_URL) { - await this._git.removeRemote('origin'); - await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL); - } - - if (isForce) { - await this._git.push('origin', branch, [`--force`]); - } else { - await this._git.push('origin', branch); - } - } - - isATemporaryRepo(): boolean { - return this._isATemporaryRepo; - } - - async getCurrentCommitId() { - return this._git.revparse(['HEAD']); - } - - async checkout(commitRef: string, isForce?: boolean) { - if (isForce) { - return this._git.checkout(commitRef, [`--force`]); - } else return this._git.checkout(commitRef, {}); - } - - async checkoutPath(commitRef: string, path: string, isForce?: boolean) { - if (isForce) { - return this._git.checkout(commitRef, [path, `--force`]); - } else return this._git.checkout(commitRef, [path]); - } - - async stageChangedFiles(path: string): Promise { - try { - await this._git.add(path); - return true; - } catch (error) { - SFPLogger.log(`Nothing to add, ignoring`, LoggerLevel.INFO, this.logger); - return false; - } - } - async createBranch(branch: string) { - if (await this.isBranchExists(branch)) { - await this._git.checkout(branch, ['-f']); - try { - // For ease-of-use when running locally and local branch exists - await this._git.merge([`refs/remotes/origin/${branch}`]); - } catch (error) { - SFPLogger.log(`Unable to find remote`, LoggerLevel.TRACE, this.logger); - } - } else { - await this._git.checkout(['-b', branch]); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts b/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts deleted file mode 100644 index ce904bf9b..000000000 --- a/packages/sfpowerscripts-cli/src/core/git/GitDiffUtil.ts +++ /dev/null @@ -1,175 +0,0 @@ -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as _ from 'lodash'; - -import { LoggerLevel } from '@salesforce/core'; -import simplegit, { SimpleGit } from 'simple-git'; -import SFPLogger, { Logger } from '@flxblio/sfp-logger'; -const SEP = /\/|\\/; - -export interface DiffFileStatus { - revisionFrom: string; - revisionTo: string; - path: string; - renamedPath?: string; -} - -export interface DiffFile { - deleted: DiffFileStatus[]; - addedEdited: DiffFileStatus[]; -} - -const git: SimpleGit = simplegit(); - -export default class GitDiffUtils { - private gitTreeRevisionTo: { - revision: string; - path: string; - }[]; - - public async isFileIncludesContent(diffFile: DiffFileStatus, content: string): Promise { - let fileAsString = await git.show(['--raw', diffFile.revisionFrom]); - let result = fileAsString.includes(content); - return result; - } - - public async fetchFileListRevisionTo(revisionTo: string, logger: Logger) { - SFPLogger.log('Fetching file list from target revision ' + revisionTo, LoggerLevel.TRACE, logger); - this.gitTreeRevisionTo = []; - let revisionTree = await git.raw(['ls-tree', '-r', revisionTo]); - const sepRegex = /\n|\r/; - let lines = revisionTree.split(sepRegex); - for (let i = 0; i < lines.length; i++) { - if (lines[i] === '') continue; - let fields = lines[i].split(/\t/); - let pathStr = fields[1]; - let revisionSha = fields[0].split(/\s/)[2]; - let fileMetadata = { - revision: revisionSha, - path: path.join('.', pathStr), - }; - this.gitTreeRevisionTo.push(fileMetadata); - } - return this.gitTreeRevisionTo; - } - - public async copyFile(filePath: string, outputFolder: string, logger: Logger) { - SFPLogger.log(`Copying file ${filePath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); - if (fs.existsSync(path.join(outputFolder, filePath))) { - SFPLogger.log(`File ${filePath} already in output folder. `, LoggerLevel.TRACE, logger); - return; - } - - let gitFiles: { - revision: string; - path: string; - }[] = []; - this.gitTreeRevisionTo.forEach((file) => { - if (file.path === filePath) { - gitFiles.push(file); - } - }); - - if(gitFiles.length==0) - throw new Error(`Unable to find the required file ${filePath} in Git.., Did you really commit the file?`) - - let copyOutputFolder = outputFolder; - for (let i = 0; i < gitFiles.length; i++) { - outputFolder = copyOutputFolder; - let gitFile = gitFiles[i]; - - SFPLogger.log( - `Associated file ${i}: ${gitFile.path} Revision: ${gitFile.revision}`, - LoggerLevel.TRACE, - logger - ); - - let outputPath = path.join(outputFolder, gitFile.path); - - let filePathParts = gitFile.path.split(SEP); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - // Create folder structure - for (let i = 0; i < filePathParts.length - 1; i++) { - let folder = filePathParts[i].replace('"', ''); - outputFolder = path.join(outputFolder, folder); - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - let fileContent = await git.binaryCatFile(['-p', gitFile.revision]); - fs.writeFileSync(outputPath, fileContent); - } - } - - public async copyFolder(folderPath: string, outputFolder: string, logger: Logger) { - SFPLogger.log(`Copying folder ${folderPath} from git to ${outputFolder}`, LoggerLevel.TRACE, logger); - if (fs.existsSync(path.join(outputFolder, folderPath))) { - SFPLogger.log(`Folder ${folderPath} already in output folder. `, LoggerLevel.TRACE, logger); - return; - } - - this.gitTreeRevisionTo.forEach((file) => { - let fileToCompare = file.path; - if (fileToCompare.startsWith(folderPath)) { - this.copyFile(fileToCompare, outputFolder, logger); - } - }); - } - - public getChangedOrAdded(list1: any[], list2: any[], key: string) { - let result: any = { - addedEdited: [], - deleted: [], - }; - - //Ensure array - if (!_.isNil(list1) && !Array.isArray(list1)) { - list1 = [list1]; - } - if (!_.isNil(list2) && !Array.isArray(list2)) { - list2 = [list2]; - } - - if (_.isNil(list1) && !_.isNil(list2) && list2.length > 0) { - result.addedEdited.push(...list2); - } - - if (_.isNil(list2) && !_.isNil(list1) && list1.length > 0) { - result.deleted.push(...list1); - } - - if (!_.isNil(list1) && !_.isNil(list2)) { - list1.forEach((elem1) => { - let found = false; - for (let i = 0; i < list2.length; i++) { - let elem2 = list2[i]; - if (elem1[key] === elem2[key]) { - //check if edited - if (!_.isEqual(elem1, elem2)) { - result.addedEdited.push(elem2); - } - found = true; - break; - } - } - if (!found) { - result.deleted.push(elem1); - } - }); - - //Check for added elements - - let addedElement = _.differenceWith(list2, list1, function (element1: any, element2: any) { - return element1[key] === element2[key]; - }); - - if (!_.isNil(addedElement)) { - result.addedEdited.push(...addedElement); - } - } - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts b/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts deleted file mode 100644 index ecc806d82..000000000 --- a/packages/sfpowerscripts-cli/src/core/git/GitIdentity.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { SimpleGit } from 'simple-git/promise'; - -export default class GitIdentity { - constructor(private git: SimpleGit) {} - - async setUsernameAndEmail(): Promise { - await this.setUsername(); - await this.setEmail(); - } - - private async setUsername(): Promise { - let username: string; - - if (process.env.sfp_GIT_USERNAME) { - username = process.env.sfp_GIT_USERNAME; - } else { - username = 'sfp'; - } - - await this.git.addConfig('user.name', username); - } - - private async setEmail(): Promise { - let email: string; - - if (process.env.sfp_GIT_EMAIL) { - email = process.env.sfp_GIT_EMAIL; - } else { - email = 'sfp@flxblio.io'; - } - - await this.git.addConfig('user.email', email); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/git/GitTags.ts b/packages/sfpowerscripts-cli/src/core/git/GitTags.ts deleted file mode 100644 index 846585451..000000000 --- a/packages/sfpowerscripts-cli/src/core/git/GitTags.ts +++ /dev/null @@ -1,151 +0,0 @@ -import Git from './Git'; -import child_process = require('child_process'); - -export default class GitTags { - constructor(private git: Git, private sfdx_package: string) {} - - /*** - * Returns list of sorted tags, belonging to package, that are reachable from HEAD and - * follow the first parent on merge commits. - * If there are no tags, returns empty array - * @param sfdx_package - */ - async listTagsOnBranch(): Promise { - let tags: string[] = await this.git.tag([ - `-l`, - `${this.sfdx_package}_v*`, - `--sort=creatordate`, - `--merged`, - ]); - - if (tags.length > 0) return this.filterTagsAgainstBranch(tags); - else return tags; - } - - private async filterTagsAgainstBranch(tags: string[]): Promise { - // Get full-length commit ID's on the current branch, following the first parent on merge commits - let commits: string[] = await this.git.log([`--pretty=format:%H`, `--first-parent`]); - - // Get the tags' associated commit ID - // Dereference (-d) tags into object IDs - //TODO: Remove this direct usage - let gitShowRefTagsBuffer = child_process.execSync(`git show-ref --tags -d | grep "${this.sfdx_package}_v*"`, { - maxBuffer: 5 * 1024 * 1024, - stdio: 'pipe', - cwd: this.git.getRepositoryPath() - }); - - let gitShowRefTags = gitShowRefTagsBuffer.toString(); - - let refTags: string[] = gitShowRefTags.split('\n'); - refTags.pop(); // Remove last empty element - - // Filter ref tags, only including tags that point to the branch - // By checking whether all 40 digits in the tag commit ID matches an ID in the branch's commit log - let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40))); - - // Only match the name of the tags pointing to the branch - refTagsPointingToBranch = refTagsPointingToBranch.map( - (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1] - ); - - // Filter the sorted tags - only including tags that point to the branch - let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag)); - - return tagsPointingToBranch; - } - - public async getVersionFromLatestTag(): Promise { - let version: string; - - let tags = await this.listTagsOnBranch(); - let latestTag = tags.pop(); - if (latestTag) { - let match: RegExpMatchArray = latestTag.match( - /^.*_v(?[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|\.LATEST|\.NEXT)?(\-ALIGN)?)$/ - ); - if (match) version = this.substituteBuildNumberWithPreRelease(match.groups.version); - else throw new Error(`Failed to find valid tag for ${this.sfdx_package}`); - } else throw new Error(`Failed to find latest tag for ${this.sfdx_package}`); - - return version; - } - - private substituteBuildNumberWithPreRelease(packageVersionNumber: string) { - let segments = packageVersionNumber.split('.'); - //Strip ALIGN - if (segments.length == 4 && segments[3].includes('ALIGN')) { - segments[3] = segments[3].substring(0, segments[3].indexOf('-')); - } - - if (segments.length === 4) { - packageVersionNumber = segments.reduce((version, segment, segmentsIdx) => { - if (segmentsIdx === 3) return version + '-' + segment; - else return version + '.' + segment; - }); - } - - return packageVersionNumber; - } - - - public async limitTags(limit: number): Promise{ - let rawTags = await this.listTagsOnBranch(); - - if (rawTags.length <= limit) { - return []; - } - - const tags:string [] = rawTags.slice(0, Math.abs(limit) * -1); - return tags; - } - - - public async filteredOldTags(daysToKeep: number, limit?: number): Promise { - const currentTimestamp = Math.floor(Date.now() / 1000); - - let rawTags: string[]; - if (limit) { - rawTags = await this.limitTags(limit); - } else { - rawTags = await this.listTagsOnBranch(); - } - - if (rawTags.length < 0) { - return []; - } - - let tags: string[] = await this.getTagsWithTimestamps(rawTags); - - const filteredTags = tags - .map(tagStr => { - const [name, timestampStr] = tagStr.split(' '); - const timestamp = parseInt(timestampStr, 10); - return { name, timestamp }; - }) - .filter(tag => { - const daysSinceTag = (currentTimestamp - tag.timestamp) / 86400; - return tag.name && daysSinceTag > daysToKeep; - }); - - return filteredTags.map(tag => tag.name); - } - - private async getTagsWithTimestamps(tags: string[]): Promise { - const timestampPromises: Promise[] = []; - - // Create an array of promises that will get the tagger date for each tag - tags.forEach((tag: string) => { - timestampPromises.push( - this.git.log(['--format=%at', `refs/tags/${tag}`]) - .then((output: string[]) => parseInt(output[0].trim(), 10)) - ); - }); - - // Wait for all promises to resolve and format the output - const timestamps: number[] = await Promise.all(timestampPromises); - const tagsWithTimestamp = tags.map((tag: string, index: number) => `${tag} ${timestamps[index]}`); - return tagsWithTimestamp - } - -} diff --git a/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts b/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts deleted file mode 100644 index 9a48420f9..000000000 --- a/packages/sfpowerscripts-cli/src/core/ignore/IgnoreFiles.ts +++ /dev/null @@ -1,13 +0,0 @@ -import ignore, { Ignore } from 'ignore'; - -export default class IgnoreFiles { - private _ignore: Ignore; - - constructor(pattern: string) { - this._ignore = ignore().add(pattern); - } - - filter(pathnames: string[]): string[] { - return this._ignore.filter(pathnames); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts b/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts deleted file mode 100644 index da4e69186..000000000 --- a/packages/sfpowerscripts-cli/src/core/limits/LimitsFetcher.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Connection } from '@salesforce/core'; -const retry = require('async-retry'); - -export default class LimitsFetcher { - constructor(private conn: Connection) {} - - public async getApiLimits() { - const limits: { name: string; max: number; remaining: number }[] = []; - const endpoint = `${this.conn.instanceUrl}/services/data/v${this.conn.version}/limits`; - - const result = await retry( - async (bail) => { - return this.conn.request<{ - [p: string]: { Max: number; Remaining: number }; - }>(endpoint); - }, - { retries: 3, minTimeout: 2000 } - ); - - Object.keys(result).forEach((limitName) => { - limits.push({ - name: limitName, - max: result[limitName].Max, - remaining: result[limitName].Remaining, - }); - }); - - return limits; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts deleted file mode 100644 index 063dbbbd3..000000000 --- a/packages/sfpowerscripts-cli/src/core/metadata/CustomFieldFetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -const fs = require('fs-extra'); -import { XMLParser } from 'fast-xml-parser'; -import MetadataFetcher from './MetadataFetcher'; -import { - ComponentSet, - MetadataConverter, - MetadataResolver, - ZipTreeContainer, -} from '@salesforce/source-deploy-retrieve'; -import path from 'path'; -import { makeRandomId } from '../utils/RandomId'; - -export default class CustomFieldFetcher extends MetadataFetcher { - constructor(logger: Logger) { - super(logger); - } - - public async getCustomFields(org: SFPOrg, fields: string[]) { - SFPLogger.log(`Fetching Custom Fields from Org`, LoggerLevel.INFO, this.logger); - let retriveLocation = await this.fetchPackageFromOrg(org, { - types: { name: 'CustomField', members: fields.length > 1 ? fields : fields[0] }, - }); - - const zipTree = await ZipTreeContainer.create(fs.readFileSync(retriveLocation.zipLocation)); - const zipResolver = new MetadataResolver(undefined, zipTree); - const zipComponents = zipResolver.getComponentsFromPath('.'); - let packageName = makeRandomId(6); - await new MetadataConverter().convert(zipComponents, 'source', { - type: 'directory', - outputDirectory: path.join(retriveLocation.unzippedLocation, 'source'), - packageName: packageName - }); - - //Write a force ignore file as its required for component set resolution - fs.writeFileSync(path.resolve(retriveLocation.unzippedLocation, 'source', '.forceignore'), '# .forceignore v2'); - - let sourceBackedComponents = ComponentSet.fromSource(path.resolve(retriveLocation.unzippedLocation, 'source')); - - return {components:sourceBackedComponents,location:path.join(retriveLocation.unzippedLocation, 'source',packageName)} - } - - -} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts deleted file mode 100644 index ef41f6061..000000000 --- a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFetcher.ts +++ /dev/null @@ -1,71 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -import { delay } from '../utils/Delay'; -const fs = require('fs-extra'); -import AdmZip = require('adm-zip'); -import { Connection } from '@salesforce/core'; -import { RetrieveResult } from 'jsforce/lib/api/metadata'; -import { makeRandomId } from '../utils/RandomId'; - -export default class MetadataFetcher { - constructor(protected logger: Logger) {} - - - protected async fetchPackageFromOrg(org: SFPOrg, members: any) { - let connection = org.getConnection(); - const apiversion = await org.getConnection().retrieveMaxApiVersion(); - - let retrieveRequest = { - apiVersion: Number(apiversion), - }; - - retrieveRequest['singlePackage'] = true; - retrieveRequest['unpackaged'] = members; - connection.metadata.pollTimeout = 60; - let retrievedId = await connection.metadata.retrieve(retrieveRequest); - SFPLogger.log(`Fetching metadata from ${connection.getUsername()}`, LoggerLevel.DEBUG, this.logger); - - let metadata_retrieve_result = await this.checkRetrievalStatus(connection, retrievedId.id); - if (!metadata_retrieve_result.zipFile) - SFPLogger.log('Unable to find the requested metadata', LoggerLevel.ERROR, this.logger); - - let retriveLocation = `.sfp/retrieved/${retrievedId.id}`; - //Extract Security - let zipFileName = `${retriveLocation}/unpackaged_${makeRandomId(8)}.zip`; - fs.mkdirpSync(retriveLocation); - fs.writeFileSync(zipFileName, metadata_retrieve_result.zipFile, { - encoding: 'base64', - }); - this.extract(retriveLocation, zipFileName); - // fs.unlinkSync(zipFileName); - return {zipLocation:zipFileName,unzippedLocation:retriveLocation}; - } - - private async checkRetrievalStatus( - conn: Connection, - retrievedId: string, - isToBeLoggedToConsole: boolean = true - ): Promise { - let metadata_result:RetrieveResult; - - while (true) { - metadata_result = await conn.metadata.checkRetrieveStatus(retrievedId); - - if (metadata_result.done === false) { - if (isToBeLoggedToConsole) SFPLogger.log(`Polling for Retrieval Status`, LoggerLevel.INFO, this.logger); - await delay(5000); - } else { - //this.ux.logJson(metadata_result); - break; - } - } - return metadata_result; - } - - - private extract(unzippedDirectory: string, zipFile: string) { - let zip = new AdmZip(zipFile); - // Overwrite existing files - zip.extractAllTo(unzippedDirectory, true); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts deleted file mode 100644 index cffbea0d6..000000000 --- a/packages/sfpowerscripts-cli/src/core/metadata/MetadataFiles.ts +++ /dev/null @@ -1,343 +0,0 @@ -//TODO: Replace with SDR -import * as path from 'path'; -import { MetadataInfo, METADATA_INFO, MetadataDescribe, SOURCE_EXTENSION_REGEX } from './MetadataInfo'; -import FileUtils from '../utils/Fileutils'; -import * as _ from 'lodash'; -import ignore from 'ignore'; -import * as fs from 'fs-extra'; -import ProjectConfig from '../project/ProjectConfig'; -import { globSync } from 'glob'; - -const SEP = /\/|\\/; - -export default class MetadataFiles { - public static sourceOnly: boolean = false; - forceignore: any; - public constructor() { - if (fs.existsSync('.forceignore')) { - this.forceignore = ignore().add(fs.readFileSync('.forceignore', 'utf8').toString()); - } else { - this.forceignore = ignore(); - } - } - static getFullApiName(fileName: string): string { - let fullName = ''; - let metadateType = MetadataInfo.getMetadataName(fileName); - let splitFilepath = fileName.split(SEP); - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); - if (isObjectChild) { - let objectName = splitFilepath[splitFilepath.length - 3]; - let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0]; - fullName = objectName.concat('.' + fieldName); - } else { - fullName = splitFilepath[splitFilepath.length - 1].split('.')[0]; - } - return fullName; - } - static getFullApiNameWithExtension(fileName: string): string { - let fullName = ''; - let metadateType = MetadataInfo.getMetadataName(fileName); - let splitFilepath = fileName.split(SEP); - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); - if (isObjectChild) { - let objectName = splitFilepath[splitFilepath.length - 3]; - let fieldName = splitFilepath[splitFilepath.length - 1]; - fullName = objectName.concat('.' + fieldName); - } else { - fullName = splitFilepath[splitFilepath.length - 1]; - } - return fullName; - } - - public static isCustomMetadata(filepath: string, name: string): boolean { - let result = true; - let splitFilepath = filepath.split(SEP); - let componentName = splitFilepath[splitFilepath.length - 1]; - componentName = componentName.substring(0, componentName.indexOf('.')); - if (name === METADATA_INFO.CustomField.xmlName || name === METADATA_INFO.CustomObject.xmlName) { - //Custom Field or Custom Object - result = componentName.endsWith('__c') || componentName.endsWith('__mdt'); - } - return result; - } - public static getMemberNameFromFilepath(filepath: string, name: string): string { - let member: string; - let splitFilepath = filepath.split(SEP); - let lastIndex = splitFilepath.length - 1; - let isObjectChild = METADATA_INFO.CustomObject.childXmlNames.includes(name); - let metadataDescribe: MetadataDescribe = METADATA_INFO[name]; - if (isObjectChild) { - let objectName = splitFilepath[lastIndex - 2]; - let fieldName = splitFilepath[lastIndex].split('.')[0]; - member = objectName.concat('.' + fieldName); - } else if (metadataDescribe.inFolder) { - let baseName = metadataDescribe.directoryName; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - cmpPath = cmpPath.substring(0, cmpPath.indexOf('.')); - member = cmpPath.replace(SEP, '/'); - } else { - if (SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) { - member = splitFilepath[lastIndex].replace(SOURCE_EXTENSION_REGEX, ''); - } else { - const auraRegExp = new RegExp('aura'); - const lwcRegExp = new RegExp('lwc'); - const staticResourceRegExp = new RegExp('staticresources'); - const experienceBundleRegExp = new RegExp('experiences'); - if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) { - member = splitFilepath[lastIndex - 1]; - } else if (staticResourceRegExp.test(filepath)) { - //Return the fileName - let baseName = 'staticresources'; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - member = cmpPath.split(SEP)[0]; - let extension = path.parse(member).ext; - - member = member.replace(new RegExp(extension + '$'), ''); - } else if (experienceBundleRegExp.test(filepath)) { - //Return the fileName - let baseName = 'experiences'; - let baseIndex = filepath.indexOf(baseName) + baseName.length; - let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator - member = cmpPath.split(SEP)[0]; - let extension = path.parse(member).ext; - - member = member.replace(new RegExp(extension + '$'), ''); - } else { - let extension = path.parse(splitFilepath[lastIndex]).ext; - member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), ''); - } - } - } - return member; - } - - public loadComponents(srcFolder: string, checkIgnore = true): void { - var metadataFiles: string[] = FileUtils.getAllFilesSync(srcFolder); - let keys = Object.keys(METADATA_INFO); - if (Array.isArray(metadataFiles) && metadataFiles.length > 0) { - metadataFiles.forEach((metadataFile) => { - let found = false; - - for (let i = 0; i < keys.length; i++) { - let match = false; - if (metadataFile.endsWith(METADATA_INFO[keys[i]].sourceExtension)) { - match = true; - } else if ( - METADATA_INFO[keys[i]].inFolder && - metadataFile.endsWith(METADATA_INFO[keys[i]].folderExtension) - ) { - match = true; - } - if (match) { - if (_.isNil(METADATA_INFO[keys[i]].files)) { - METADATA_INFO[keys[i]].files = []; - METADATA_INFO[keys[i]].components = []; - } - if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { - METADATA_INFO[keys[i]].files.push(metadataFile); - - let name = FileUtils.getFileNameWithoutExtension( - metadataFile, - METADATA_INFO[keys[i]].sourceExtension - ); - - if (METADATA_INFO[keys[i]].isChildComponent) { - let fileParts = metadataFile.split(SEP); - let parentName = fileParts[fileParts.length - 3]; - name = parentName + '.' + name; - } - - METADATA_INFO[keys[i]].components.push(name); - } - found = true; - break; - } - } - - if (!found) { - const auraRegExp = new RegExp('aura'); - if (auraRegExp.test(metadataFile) && SOURCE_EXTENSION_REGEX.test(metadataFile)) { - if (_.isNil(METADATA_INFO.AuraDefinitionBundle.files)) { - METADATA_INFO.AuraDefinitionBundle.files = []; - METADATA_INFO.AuraDefinitionBundle.components = []; - } - if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { - METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile); - - let name = FileUtils.getFileNameWithoutExtension(metadataFile); - METADATA_INFO.AuraDefinitionBundle.components.push(name); - } - } - } - }); - } else { - keys.forEach((key) => { - if (_.isNil(METADATA_INFO[key].files)) { - METADATA_INFO[key].files = []; - METADATA_INFO[key].components = []; - } - }); - } - } - //Check if a component is accepted by forceignore. - public accepts(filePath: string) { - return !this.forceignore.ignores(path.relative(process.cwd(), filePath)); - } - - public async isInModuleFolder(filePath: string) { - const packageDirectories = ProjectConfig.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path); - if (!packageDirectories || packageDirectories.length == 0) { - return false; - } - const moduleFolder = packageDirectories.find((packageFolder) => { - let packageFolderNormalized = path.relative('', packageFolder); - return filePath.startsWith(packageFolderNormalized); - }); - return moduleFolder !== undefined; - } - - /** - * Copy a file to an outpu directory. If the filePath is a Metadata file Path, - * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls. - * Enforcing the .forceignore to ignire file ignored in the project. - * @param filePath - * @param outputFolder - */ - public static copyFile(filePath: string, outputFolder: string) { - console.log(`Copying file ${filePath} from file system to ${outputFolder}`); - const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json']; - const pairStatResources = METADATA_INFO.StaticResource.directoryName; - const pairStatResourcesRegExp = new RegExp(pairStatResources); - const pairAuaraRegExp = new RegExp(METADATA_INFO.AuraDefinitionBundle.directoryName); - - let copyOutputFolder = outputFolder; - - if (!fs.existsSync(filePath)) { - return; - } - - let exists = fs.existsSync(path.join(outputFolder, filePath)); - if (exists) { - return; - } - - if (filePath.startsWith('.')) { - let parts = path.parse(filePath); - if (parts.dir === '') { - fs.copyFileSync(filePath, path.join(outputFolder, filePath)); - return; - } - } - - let fileName = path.parse(filePath).base; - //exclude lwc ignored files - if (LWC_IGNORE_FILES.includes(fileName)) { - return; - } - - let filePathParts = filePath.split(SEP); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - // Create folder structure - for (let i = 0; i < filePathParts.length - 1; i++) { - let folder = filePathParts[i].replace('"', ''); - outputFolder = path.join(outputFolder, folder); - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - - // Copy all file with same base name - let associatedFilePattern = ''; - if (SOURCE_EXTENSION_REGEX.test(filePath)) { - associatedFilePattern = filePath.replace(SOURCE_EXTENSION_REGEX, '.*'); - } else { - let extension = path.parse(filePath).ext; - associatedFilePattern = filePath.replace(extension, '.*'); - } - let files = globSync(associatedFilePattern); - for (let i = 0; i < files.length; i++) { - if (fs.lstatSync(files[i]).isDirectory() == false) { - let oneFilePath = path.join('.', files[i]); - let oneFilePathParts = oneFilePath.split(SEP); - fileName = oneFilePathParts[oneFilePathParts.length - 1]; - let outputPath = path.join(outputFolder, fileName); - fs.copyFileSync(files[i], outputPath); - } - } - - // Hadle ObjectTranslations - // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied - if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) { - let parentFolder = filePathParts[filePathParts.length - 2]; - let objectTranslation = parentFolder + METADATA_INFO.CustomObjectTranslation.sourceExtension; - let outputPath = path.join(outputFolder, objectTranslation); - let sourceFile = filePath.replace(fileName, objectTranslation); - if (fs.existsSync(sourceFile) == true) { - fs.copyFileSync(sourceFile, outputPath); - } - } - - //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED - if (pairStatResourcesRegExp.test(filePath)) { - outputFolder = path.join('.', copyOutputFolder); - let srcFolder = '.'; - let staticRecourceRoot = ''; - let resourceFile = ''; - for (let i = 0; i < filePathParts.length; i++) { - outputFolder = path.join(outputFolder, filePathParts[i]); - srcFolder = path.join(srcFolder, filePathParts[i]); - if (filePathParts[i] === METADATA_INFO.StaticResource.directoryName) { - let fileOrDirname = filePathParts[i + 1]; - let fileOrDirnameParts = fileOrDirname.split('.'); - srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); - outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); - resourceFile = srcFolder + METADATA_INFO.StaticResource.sourceExtension; - METADATA_INFO.StaticResource.sourceExtension; - staticRecourceRoot = outputFolder + METADATA_INFO.StaticResource.sourceExtension; - if (fs.existsSync(srcFolder)) { - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - break; - } - } - if (fs.existsSync(srcFolder)) { - FileUtils.copyRecursiveSync(srcFolder, outputFolder); - } - if (fs.existsSync(resourceFile)) { - fs.copyFileSync(resourceFile, staticRecourceRoot); - } - } - //FOR AURA components and LWC components - if (pairAuaraRegExp.test(filePath)) { - outputFolder = path.join('.', copyOutputFolder); - let srcFolder = '.'; - for (let i = 0; i < filePathParts.length; i++) { - outputFolder = path.join(outputFolder, filePathParts[i]); - srcFolder = path.join(srcFolder, filePathParts[i]); - if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') { - let fileOrDirname = filePathParts[i + 1]; - let fileOrDirnameParts = fileOrDirname.split('.'); - srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); - outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); - - if (fs.existsSync(srcFolder)) { - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - } - break; - } - } - if (fs.existsSync(srcFolder)) { - FileUtils.copyRecursiveSync(srcFolder, outputFolder); - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts b/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts deleted file mode 100644 index b3a888cce..000000000 --- a/packages/sfpowerscripts-cli/src/core/metadata/MetadataInfo.ts +++ /dev/null @@ -1,214 +0,0 @@ -//TODO: Replace with SDR -import * as _ from 'lodash'; -import * as path from 'path'; -import * as fs from 'fs-extra'; - -export const SOURCE_EXTENSION_REGEX = /\.[a-zA-Z]+-meta\.xml/; -const SPLITED_TYPES = { - CustomField: { - suffix: 'field', - folder: 'fields', - }, - BusinessProcess: { - suffix: 'businessProcess', - folder: 'businessProcesses', - }, - CompactLayout: { - suffix: 'compactLayout', - folder: 'compactLayouts', - }, - FieldSet: { - suffix: 'fieldSet', - folder: 'fieldSets', - }, - RecordType: { - suffix: 'recordType', - folder: 'recordTypes', - }, - ListView: { - suffix: 'listView', - folder: 'listViews', - }, - SharingReason: { - suffix: 'sharingReason', - folder: 'sharingReasons', - }, - ValidationRule: { - suffix: 'validationRule', - folder: 'validationRules', - }, - WebLink: { - suffix: 'webLink', - folder: 'webLinks', - }, -}; - -export interface MetadataDescribe { - directoryName?: string; - inFolder?: boolean; - metaFile?: boolean; - suffix?: string; - xmlName?: string; - sourceExtension?: string; - childXmlNames?: string[]; - folderExtension?: string; - files?: string[]; - components?: string[]; - isChildComponent?: boolean; -} - -export interface MetadataInfo { - CustomApplication?: MetadataDescribe; - ApexClass?: MetadataDescribe; - ApexPage?: MetadataDescribe; - CustomField?: MetadataDescribe; - CustomObject?: MetadataDescribe; - CustomPermission?: MetadataDescribe; - ExternalDataSource?: MetadataDescribe; - ExperienceBundle?: MetadataDescribe; - Flow?: MetadataDescribe; - RecordType?: MetadataDescribe; - ListView?: MetadataDescribe; - WebLink?: MetadataDescribe; - ValidationRule?: MetadataDescribe; - CompactLayout?: MetadataDescribe; - BujsinessProcess?: MetadataDescribe; - CustomTab?: MetadataDescribe; - Layout?: MetadataDescribe; - Profile?: MetadataDescribe; - Translations?: MetadataDescribe; - CustomLabel?: MetadataDescribe; - CustomLabels?: MetadataDescribe; - GlobalValueSet?: MetadataDescribe; - CustomMetadata?: MetadataDescribe; - Document?: MetadataDescribe; - Queue?: MetadataDescribe; - Group?: MetadataDescribe; - Role?: MetadataDescribe; - Report?: MetadataDescribe; - Dashboard?: MetadataDescribe; - EmailTemplate?: MetadataDescribe; - CustomSite?: MetadataDescribe; - PermissionSet?: MetadataDescribe; - StaticResource?: MetadataDescribe; - CustomObjectTranslation?: MetadataDescribe; - AuraDefinitionBundle?: MetadataDescribe; - Workflow?: MetadataDescribe; - SharingRules?: MetadataDescribe; - LightningComponentBundle?: MetadataDescribe; -} - -export class MetadataInfo { - static loadMetadataInfo(): MetadataInfo { - let metadataInfo: MetadataInfo = {}; - let resourcePath = path.join(__dirname, '..', '..', '..', 'resources', 'metadatainfo.json'); - const fileData = fs.readFileSync(resourcePath, 'utf8'); - let metadataInfoJSON = JSON.parse(fileData); - metadataInfoJSON.metadataObjects.forEach((metadata) => { - let metadataDescribe = metadata as MetadataDescribe; - if (_.isNil(metadata.suffix)) { - if (metadata.xmlName === 'AuraDefinitionBundle') { - metadata.suffix = 'cmp'; - metadataDescribe.suffix = 'cmp'; - } else if (metadata.xmlName == 'LightningComponentBundle') { - metadata.suffix = 'js'; - metadataDescribe.suffix = 'js'; - } - } - metadataDescribe.sourceExtension = `.${metadata.suffix}-meta.xml`; - if (metadata.inFolder) { - let folderExtensionPrefix = metadata.suffix; - if (_.isNil(metadata.suffix)) { - folderExtensionPrefix = metadata.xmlName.charAt(0).toLowerCase + metadata.xmlName.slice(1); - } - metadataDescribe.folderExtension = `.${folderExtensionPrefix}Folder-meta.xml`; - } - - //Generate Describe of cheildItems if exists - if (!_.isNil(metadata.childXmlNames)) { - metadata.childXmlNames.forEach((element) => { - let splitedElement = SPLITED_TYPES[element]; - if (!_.isNil(splitedElement)) { - let childDescribe: MetadataDescribe = {}; - childDescribe.directoryName = SPLITED_TYPES[element].folder; - childDescribe.suffix = SPLITED_TYPES[element].suffix; - childDescribe.xmlName = element; - childDescribe.inFolder = false; - childDescribe.metaFile = false; - childDescribe.isChildComponent = true; - childDescribe.sourceExtension = `.${SPLITED_TYPES[element].suffix}-meta.xml`; - metadataInfo[childDescribe.xmlName] = childDescribe; - } - }); - } - metadataInfo[metadataDescribe.xmlName] = metadataDescribe; - }); - return metadataInfo; - } - - static getMetadataName(metadataFile: string, validateSourceExtension = true): string { - let matcher = metadataFile.match(SOURCE_EXTENSION_REGEX); - let extension = ''; - if (matcher) { - extension = matcher[0]; - } else { - extension = path.parse(metadataFile).ext; - } - //SfPowerKit.ux.log(extension); - let metadataName = ''; - - const auraRegExp = new RegExp('aura'); - const lwcRegExp = new RegExp('lwc'); - const staticResourceRegExp = new RegExp('staticresources'); - const experienceBundleRegExp = new RegExp('experiences'); - const documentRegExp = new RegExp('documents'); - if (auraRegExp.test(metadataFile) && (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension)) { - metadataName = METADATA_INFO.AuraDefinitionBundle.xmlName; - } else if ( - lwcRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.LightningComponentBundle.xmlName; - } else if ( - staticResourceRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.StaticResource.xmlName; - } else if ( - experienceBundleRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.ExperienceBundle.xmlName; - } else if ( - documentRegExp.test(metadataFile) && - (SOURCE_EXTENSION_REGEX.test(metadataFile) || !validateSourceExtension) - ) { - metadataName = METADATA_INFO.Document.xmlName; - } else { - let keys = Object.keys(METADATA_INFO); - for (let i = 0; i < keys.length; i++) { - let metaDescribe = METADATA_INFO[keys[i]]; - if ( - metaDescribe.sourceExtension === extension || - ('.' + metaDescribe.suffix === extension && !validateSourceExtension) || - metaDescribe.folderExtension === extension - ) { - metadataName = metaDescribe.xmlName; - break; - } - } - } - return metadataName; - } -} - -export const METADATA_INFO = MetadataInfo.loadMetadataInfo(); -export const UNSPLITED_METADATA = [ - METADATA_INFO.Workflow, - METADATA_INFO.SharingRules, - METADATA_INFO.CustomLabels, - METADATA_INFO.Profile, - METADATA_INFO.PermissionSet, -]; - -export const PROFILE_PERMISSIONSET_EXTENSION = [METADATA_INFO.Profile, METADATA_INFO.PermissionSet]; diff --git a/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts b/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts deleted file mode 100644 index 971717dbe..000000000 --- a/packages/sfpowerscripts-cli/src/core/metadata/SettingsFetcher.ts +++ /dev/null @@ -1,22 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -const fs = require('fs-extra'); -import { XMLParser } from 'fast-xml-parser'; -import MetadataFetcher from './MetadataFetcher'; - -export default class SettingsFetcher extends MetadataFetcher { - constructor(logger: Logger) { - super(logger); - } - - public async getSetttingMetadata(org: SFPOrg, setting: string) { - SFPLogger.log(`Fetching ${setting}Settings from Org`, LoggerLevel.INFO, this.logger); - let retriveLocation = (await this.fetchPackageFromOrg(org, { - types: { name: 'Settings', members: setting }, - })).unzippedLocation; - let resultFile = `${retriveLocation}/settings/${setting}.settings`; - const parser = new XMLParser(); - let parsedSettings = parser.parse(fs.readFileSync(resultFile).toString())[`${setting}Settings`]; - return parsedSettings; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts deleted file mode 100644 index 7ded33399..000000000 --- a/packages/sfpowerscripts-cli/src/core/org/OrgDetailsFetcher.ts +++ /dev/null @@ -1,120 +0,0 @@ -import extractDomainFromUrl from '../utils/extractDomainFromUrl'; -import { convertAliasToUsername } from '../utils/AliasList'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import ScratchOrgInfoFetcher from './ScratchOrgInfoFetcher'; -import OrganizationFetcher from './OrganizationFetcher'; -import { AuthInfo, Connection, Org, trimTo15 } from '@salesforce/core'; - -export default class OrgDetailsFetcher { - private static usernamesToOrgDetails: { [P: string]: OrgDetails } = {}; - - constructor(private username: string) {} - - public async getOrgDetails(): Promise { - //Convert alias to username - this.username = await convertAliasToUsername(this.username); - - if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) - return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; - - const authInfo = await AuthInfo.create({ username: this.username }); - - let authInfoFields = authInfo.getFields(); - - - let sfdxAuthUrl: string; - try { - sfdxAuthUrl = authInfo.getSfdxAuthUrl(); - } catch (error) { - SFPLogger.log(`Unable to get SFDX Auth URL: ${error.message}`, LoggerLevel.TRACE, null); - } - - const isScratchOrg = authInfoFields.devHubUsername; - let scratchOrgInfo = isScratchOrg - ? await this.getScratchOrgDetails(authInfoFields.orgId, authInfo) - : ({} as ScratchOrgDetails); - - const organization = await this.getOrganization(authInfo); - - OrgDetailsFetcher.usernamesToOrgDetails[this.username] = { - sfdxAuthUrl: sfdxAuthUrl, - instanceUrl: authInfoFields.instanceUrl, - ...authInfoFields, - ...scratchOrgInfo, - ...organization, - }; - - return OrgDetailsFetcher.usernamesToOrgDetails[this.username]; - } - - public async getOrgDomainUrl(): Promise { - await this.getOrgDetails(); - - if (OrgDetailsFetcher.usernamesToOrgDetails[this.username]) { - let domain = extractDomainFromUrl(OrgDetailsFetcher.usernamesToOrgDetails[this.username].instanceUrl); - if (domain) return domain; - else return ''; - } else { - return ''; - } - } - - private async getScratchOrgDetails(orgId: string, authInfo: AuthInfo): Promise { - const hubOrg: Org = await ( - await Org.create({ - connection: await Connection.create({ - authInfo: authInfo, - }), - }) - ).getDevHubOrg(); - - let scratchOrgInfo = ( - await new ScratchOrgInfoFetcher(hubOrg).getScratchOrgInfoByOrgId([trimTo15(orgId)]) - )[0]; - - if (scratchOrgInfo) { - return { - isScratchOrg:true, - status: scratchOrgInfo.Status, - }; - } else { - throw new Error( - `No information for scratch org with ID ${trimTo15( - orgId - )} found in Dev Hub ${hubOrg.getUsername()}` - ); - } - } - - private async getOrganization(authInfo: AuthInfo) { - const connection = await Connection.create({ - authInfo: authInfo, - }); - - const results = await new OrganizationFetcher(connection).fetch(); - - if (results[0]) { - return { - isSandbox: results[0].IsSandbox, - organizationType: results[0].OrganizationType, - }; - } else { - throw new Error(`No Organization records found for ${connection.getUsername()}`); - } - } -} - -export interface OrgDetails extends ScratchOrgDetails, Organization { - sfdxAuthUrl: string; - instanceUrl:string; -} - -export interface ScratchOrgDetails { - isScratchOrg:boolean; - status: string; -} - -export interface Organization { - isSandbox: boolean; - organizationType: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts deleted file mode 100644 index b453b9851..000000000 --- a/packages/sfpowerscripts-cli/src/core/org/OrganizationFetcher.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class OrganizationFetcher { - constructor(private conn: Connection) {} - - public fetch() { - const query = 'SELECT OrganizationType, IsSandbox FROM Organization LIMIT 1'; - - return QueryHelper.query<{ OrganizationType: string; IsSandbox: boolean }>(query, this.conn, false); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts b/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts deleted file mode 100644 index d1fc38c18..000000000 --- a/packages/sfpowerscripts-cli/src/core/org/SFPOrg.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { Org } from '@salesforce/core'; -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import Package2Detail from '../package/Package2Detail'; -import SfpPackage from '../package/SfpPackage'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { convertUsernameToAlias } from '../utils/AliasList'; -import ObjectCRUDHelper from '../utils/ObjectCRUDHelper'; -import InstalledPackagesQueryExecutor from './packageQuery/InstalledPackagesQueryExecutor'; - -export default class SFPOrg extends Org { - /** - * Get list of all artifacts in an org - */ - public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) { - let records=[] - try { - records = await QueryHelper.query( - `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`, - this.getConnection(), - false - ); - return records; - } catch (error) { - SFPLogger.log( - 'Unable to fetch any sfp artifacts in the org\n' + - '1. sfp package is not installed in the org\n' + - '2. The required prerequisite object is not deployed to this org\n', - LoggerLevel.WARN, - logger - ); - } - return records; - } - /** - * Check whether an artifact is installed in a Org - * @param {Logger} logger - * @param {SfpPackage} sfpPackage - */ - public async isArtifactInstalledInOrg( - logger: Logger, - sfpPackage: SfpPackage - ): Promise<{ isInstalled: boolean; versionNumber?: string }> { - let result: { isInstalled: boolean; versionNumber?: string } = { - isInstalled: false, - }; - try { - SFPLogger.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, LoggerLevel.TRACE, logger); - result.isInstalled = false; - let installedArtifacts = await this.getInstalledArtifacts(); - let packageName = sfpPackage.packageName; - for (const artifact of installedArtifacts) { - if (artifact.Name === packageName) { - result.versionNumber = artifact.Version__c; - if (artifact.Version__c === sfpPackage.package_version_number) { - result.isInstalled = true; - return result; - } - } - } - } catch (error) { - SFPLogger.log( - 'Unable to fetch any sfp artifacts in the org\n' + - '1. sfp package is not installed in the org\n' + - '2. The required prerequisite object is not deployed to this org\n', - LoggerLevel.WARN, - logger - ); - } - return result; - } - /** - * Updates or Create information about an artifact in the org - * @param {Logger} logger - * @param {SfpPackage} sfpPackage - */ - public async updateArtifactInOrg(logger: Logger, sfpPackage: SfpPackage): Promise { - let artifactId = await this.getArtifactRecordId(sfpPackage); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Existing artifact record id for ${sfpPackage.packageName} in Org for ${ - sfpPackage.package_version_number - }: ${artifactId ? artifactId : 'N/A'}` - ), - LoggerLevel.INFO, - logger - ); - - let packageName = sfpPackage.package_name; - - if (artifactId == null) { - artifactId = await ObjectCRUDHelper.createRecord( - this.getConnection(), - 'sfpArtifact2__c', - { - Name: packageName, - Tag__c: sfpPackage.tag, - Version__c: sfpPackage.package_version_number, - CommitId__c: sfpPackage.sourceVersion, - } - ); - } else { - artifactId = await ObjectCRUDHelper.updateRecord( - this.getConnection(), - 'sfpArtifact2__c', - { - Id: artifactId, - Name: packageName, - Tag__c: sfpPackage.tag, - Version__c: sfpPackage.package_version_number, - CommitId__c: sfpPackage.sourceVersion, - } - ); - } - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Updated Org with new Artifact ${packageName} ${sfpPackage.package_version_number} ${ - artifactId ? artifactId : '' - }` - ), - LoggerLevel.INFO, - logger - ); - return artifactId; - } - - private async getArtifactRecordId(sfpPackage: SfpPackage): Promise { - let installedArtifacts = await this.getInstalledArtifacts(); - - let packageName = sfpPackage.packageName; - for (const artifact of installedArtifacts) { - if (artifact.Name === packageName) { - return artifact.Id; - } - } - return null; - } - /** - * Retrieves all packages(recognized by Salesforce) installed in the org - */ - public async getAllInstalled2GPPackages(): Promise { - const installedPackages: Package2Detail[] = []; - - let records = await InstalledPackagesQueryExecutor.exec(this.getConnection()); - - records.forEach((record) => { - let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`; - - let packageDetails: Package2Detail = { - name: record.SubscriberPackage.Name, - package2Id: record.SubscriberPackageId, - namespacePrefix: record.SubscriberPackage.NamespacePrefix, - subscriberPackageVersionId: record.SubscriberPackageVersion.Id, - versionNumber: packageVersionNumber, - type: record.SubscriberPackageVersion.Package2ContainerOptions, - isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent, - }; - - installedPackages.push(packageDetails); - }); - - return installedPackages; - } - - /** - * Retrives all managed packages in the org - */ - public async getAllInstalledManagedPackages(): Promise { - const installedPackages = await this.getAllInstalled2GPPackages(); - return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed'); - } - /** - * List all the packages created in DevHub, will throw an error, if its not a DevHub - */ - public async listAllPackages() { - if (await this.determineIfDevHubOrg(true)) { - let records = await QueryHelper.query(packageQuery, this.getConnection(), true); - records.forEach((record) => { - record.IsOrgDependent = - record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No'; - }); - - return records; - } else throw new Error('Package Type Information can only be fetched from a DevHub'); - } - - public async getAlias(): Promise { - return await convertUsernameToAlias(this.getUsername()); - } - - /** - * Return all artifacts including sfp as well as external unlocked/managed - */ - public async getAllInstalledArtifacts():Promise { - let artifacts = await this.getInstalledArtifacts(`Name`); - let installedArtifacts: InstalledArtifact[]=[]; - let installed2GPPackages = await this.getAllInstalled2GPPackages(); - - artifacts.forEach((artifact) => { - let installedArtifact: InstalledArtifact = { - name: artifact.Name, - version: artifact.Version__c, - commitId:artifact.CommitId__c, - isInstalledBysfp: true, - }; - let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name); - if (packageFound) { - installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId; - if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`; - else installedArtifact.type = `Unlocked`; - } else { - installedArtifact.subscriberVersion = `N/A`; - installedArtifact.type = `Source/Data`; - } - installedArtifacts.push(installedArtifact); - }); - - installed2GPPackages.forEach((installed2GPPackage) => { - let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name); - if (!packageFound) { - let installedArtifact: InstalledArtifact = { - name: installed2GPPackage.name, - version: installed2GPPackage.versionNumber, - commitId: `N/A`, - }; - if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`; - else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`; - else installedArtifact.type = `Unlocked`; - - installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId; - installedArtifact.isInstalledBysfp = false; - installedArtifacts.push(installedArtifact); - } - }); - return installedArtifacts; - } -} - -const packageQuery = - 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' + - 'FROM Package2 ' + - 'WHERE IsDeprecated != true ' + - 'ORDER BY NamespacePrefix, Name'; - - -export interface InstalledArtifact { - name: string; - version: string; - commitId?: string; - subscriberVersion?: string; - type?: string; - isInstalledBysfp?: boolean; -} - -export interface sfpArtifact2__c { - Id?: string; - Name: string; - Tag__c: string; - Version__c: string; - CommitId__c: string; -} - -export interface PackageTypeInfo { - Id: string; - Name: string; - Description: string; - NamespacePrefix: string; - ContainerOptions: string; - IsOrgDependent: boolean | string; -} diff --git a/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts b/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts deleted file mode 100644 index c238af473..000000000 --- a/packages/sfpowerscripts-cli/src/core/org/ScratchOrgInfoFetcher.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Org, trimTo15 } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -export default class ScratchOrgInfoFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgInfoByOrgId(orgId: string[]) { - const conn = this.hubOrg.getConnection(); - - let collection = orgId - .map((id) => { - return `'${trimTo15(id)}'`; - }) - .toString(); - - let query = ` - SELECT Id, ScratchOrg, Status - FROM ScratchOrgInfo - WHERE ScratchOrg IN (${collection}) - `; - - return QueryHelper.query(query, conn, false); - } -} - -export interface ScratchOrgInfo { - Id: string; - ScratchOrg: string; - Status: 'New' | 'Deleted' | 'Active' | 'Error'; -} diff --git a/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts b/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts deleted file mode 100644 index 2d124718c..000000000 --- a/packages/sfpowerscripts-cli/src/core/org/packageQuery/InstalledPackagesQueryExecutor.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; - -export default class InstalledPackagesQueryExecutor { - static async exec(conn: Connection) { - const installedPackagesQuery = - 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, ' + - 'SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, ' + - 'SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber, SubscriberPackageVersion.Package2ContainerOptions, SubscriberPackageVersion.IsOrgDependent FROM InstalledSubscriberPackage ' + - 'ORDER BY SubscriberPackageId'; - - return QueryHelper.query(installedPackagesQuery, conn, true); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts b/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts deleted file mode 100644 index 55c55deed..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/Package2Detail.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default interface Package2Detail { - name: string; - package2Id?: string; - namespacePrefix?: string; - subscriberPackageVersionId?: string; - versionNumber?: string; - type?: string; - isOrgDependent?: boolean; - key?: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts deleted file mode 100644 index 9c4833062..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/SfpPackage.ts +++ /dev/null @@ -1,143 +0,0 @@ -import _ from 'lodash'; -import { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; - -export type ApexClasses = Array; - -class PackageInfo { - id?: string; - package_name: string; - package_version_number?: string; - package_version_id?: string; - package_type?: string; - test_coverage?: number; - has_passed_coverage_check?: boolean; - repository_url?: string; - sourceVersion?: string; - branch?: string; - apextestsuite?: string; - isApexFound?: boolean; - assignPermSetsPreDeployment?: string[]; - assignPermSetsPostDeployment?: string[]; - apexTestClassses?: string[]; - isPickListsFound?: boolean; - isTriggerAllTests?: boolean; - isProfilesFound?: boolean; - isPermissionSetGroupFound?: boolean; - isPromoted?: boolean; - tag?: string; - isDependencyValidated?: boolean; - destructiveChanges?: any; - destructiveChangesPath?: string; - payload?: any; - metadataCount?: number; - sourceDir?: string; - dependencies?: any; - reconcileProfiles?: boolean; - isPayLoadContainTypesSupportedByProfiles?: boolean; - creation_details?: { creation_time?: number; timestamp?: number }; - deployments?: { target_org: string; sub_directory?: string; installation_time?: number; timestamp?: number }[]; - apiVersion?: string; - postDeploymentScript?: string; - preDeploymentScript?: string; - apexClassWithOutTestClasses?: ApexClasses; - triggers?: ApexClasses; - configFilePath?: string; - packageDescriptor?: any; - commitSHAFrom?:string; - commitSHATo?:string; - packageDirectory?: string; - apexClassesSortedByTypes?: ApexSortedByType; - projectConfig?: any; - changelogFilePath?: string; -} - -export default class SfpPackage extends PackageInfo { - public projectDirectory: string; - public workingDirectory: string; - public mdapiDir: string; - public destructiveChangesPath: string; - public resolvedPackageDirectory: string; - - public version: string = '5'; - - //Just a few helpers to resolve api differene - public get packageName(): string { - return this.package_name; - } - - public get versionNumber(): string { - return this.package_version_number; - } - - public set versionNumber(versionNumber:string) - { - this.package_version_number = versionNumber; - } - - public get packageType(): string { - return this.package_type.toLocaleLowerCase(); - } - - public set packageType(packageType: string) { - this.package_type = packageType; - } - /** - * Do not use this constructor directly, use SfPPackageBuilder - * to build a package - * - */ - public constructor() { - super(); - } - - toJSON(): PackageInfo { - let castToPackageMetadata = _.cloneDeep(this); - delete castToPackageMetadata.workingDirectory; - delete castToPackageMetadata.mdapiDir; - delete castToPackageMetadata.projectConfig; - delete castToPackageMetadata.packageDescriptor; - delete castToPackageMetadata.projectDirectory; - delete castToPackageMetadata.resolvedPackageDirectory; - delete castToPackageMetadata.isTriggerAllTests; - return castToPackageMetadata; - } -} - - -export enum PackageType { - Unlocked = "unlocked", - Source = "source", - Data = "data", - Diff = "diff" -} - -export interface DiffPackageMetadata { - - - sourceVersionFrom?: string; - sourceVersionTo?: string; - isProfilesFound?: boolean; - apexTestClassses?: string[]; - isApexFound?: boolean; - isPicklistFound?: boolean; - isPermissionSetGroupFound?: boolean; - isPermissionSetFound?: boolean; - payload?: any; - metadataCount?: number; - profilesToReconcile?: number; - destructiveChanges?: any; - sourceDir?: string; - invalidatedTestClasses?: ApexClasses; - isPayLoadContainTypesSupportedByProfiles?:boolean; -} -export interface SfpPackageParams { - overridePackageTypeWith?: string; - branch?: string; - packageVersionNumber?: string; - repositoryUrl?: string; - sourceVersion?: string; - configFilePath?: string; - pathToReplacementForceIgnore?: string; - revisionFrom?: string; - revisionTo?: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts deleted file mode 100644 index e394099a1..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/SfpPackageBuilder.ts +++ /dev/null @@ -1,278 +0,0 @@ -import ApexTypeFetcher, { ApexSortedByType } from '../apex/parser/ApexTypeFetcher'; -import ProjectConfig from '../project/ProjectConfig'; -import SfpPackageContentGenerator from './generators/SfpPackageContentGenerator'; -import SourceToMDAPIConvertor from './packageFormatConvertors/SourceToMDAPIConvertor'; -import PackageManifest from './components/PackageManifest'; -import MetadataCount from './components/MetadataCount'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -import path from 'path'; -import { Artifact } from '../artifacts/ArtifactFetcher'; -import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from './SfpPackage'; -import PropertyFetcher from './propertyFetchers/PropertyFetcher'; -import AssignPermissionSetFetcher from './propertyFetchers/AssignPermissionSetFetcher'; -import DestructiveManifestPathFetcher from './propertyFetchers/DestructiveManifestPathFetcher'; -import ReconcilePropertyFetcher from './propertyFetchers/ReconcileProfilePropertyFetcher'; -import CreateUnlockedPackageImpl from './packageCreators/CreateUnlockedPackageImpl'; -import CreateSourcePackageImpl from './packageCreators/CreateSourcePackageImpl'; -import CreateDataPackageImpl from './packageCreators/CreateDataPackageImpl'; -import lodash = require('lodash'); -import { EOL } from 'os'; -import PackageVersionUpdater from './version/PackageVersionUpdater'; -import { AnalyzerRegistry } from './analyser/AnalyzerRegistry'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import CreateDiffPackageImp from './packageCreators/CreateDiffPackageImpl'; -import { COLOR_WARNING } from '@flxblio/sfp-logger'; - -export default class SfpPackageBuilder { - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string, - params?: SfpPackageParams, - packageCreationParams?: PackageCreationParams, - projectConfig?: any - ) { - if (!projectConfig) { - projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - } else { - // Clone the projectConfig to prevent mutation - projectConfig = lodash.cloneDeep(projectConfig); - } - - let propertyFetchers: PropertyFetcher[] = [ - new AssignPermissionSetFetcher(), - new DestructiveManifestPathFetcher(), - new ReconcilePropertyFetcher(), - ]; - - let startTime = Date.now; - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.package_name = sfdx_package; - sfpPackage.projectConfig = projectConfig; - sfpPackage.apiVersion = sfpPackage.projectConfig.sourceApiVersion; - sfpPackage.packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig( - sfdx_package, - sfpPackage.projectConfig - ); - sfpPackage.projectDirectory = projectDirectory?projectDirectory:''; - sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; - //Set Default Version Number - sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; - - //set additional options - sfpPackage.sourceVersion = params?.sourceVersion; - sfpPackage.branch = params?.branch; - sfpPackage.repository_url = params?.repositoryUrl; - if (params?.configFilePath == null) sfpPackage.configFilePath = 'config/project-scratch-def.json'; - else sfpPackage.configFilePath = params?.configFilePath; - - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getsfpProperties(sfpPackage, logger); - } - - //Get Package Type - sfpPackage.package_type = ProjectConfig.getPackageType(projectConfig, sfdx_package); - - sfpPackage = SfpPackageBuilder.handleVersionNumber(params, sfpPackage, packageCreationParams); - - // Requires destructiveChangesPath which is set by the property fetcher - sfpPackage.workingDirectory = await SfpPackageContentGenerator.generateSfpPackageDirectory( - logger, - sfpPackage.projectDirectory, - sfpPackage.projectConfig, - sfpPackage.packageName, - sfpPackage.packageDescriptor.path, - sfpPackage.versionNumber, - sfpPackage.destructiveChangesPath, - sfpPackage.configFilePath, - params?.pathToReplacementForceIgnore - ); - - sfpPackage.resolvedPackageDirectory = path.join(sfpPackage.workingDirectory, sfpPackage.packageDescriptor.path); - - //Don't proceed further if packageType is Data - if (sfpPackage.package_type != PackageType.Data) { - let sourceToMdapiConvertor = new SourceToMDAPIConvertor( - sfpPackage.workingDirectory, - sfpPackage.packageDescriptor.path, - ProjectConfig.getSFDXProjectConfig(sfpPackage.workingDirectory).sourceApiVersion, - logger - ); - sfpPackage.mdapiDir = (await sourceToMdapiConvertor.convert()).packagePath; - const packageManifest: PackageManifest = await PackageManifest.create(sfpPackage.mdapiDir); - - sfpPackage.payload = packageManifest.manifestJson; - sfpPackage.triggers = packageManifest.fetchTriggers(); - sfpPackage.isApexFound = packageManifest.isApexInPackage(); - sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); - sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); - sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); - - let apexFetcher: ApexTypeFetcher = new ApexTypeFetcher(sfpPackage.mdapiDir); - sfpPackage.apexClassesSortedByTypes = apexFetcher.getClassesClassifiedByType(); - sfpPackage.apexTestClassses = apexFetcher.getTestClasses(); - sfpPackage.metadataCount = await MetadataCount.getMetadataCount( - sfpPackage.workingDirectory, - sfpPackage.packageDescriptor.path - ); - sfpPackage.apexClassWithOutTestClasses = apexFetcher.getClassesOnlyExcludingTestsAndInterfaces(); - - sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); - - //Load component Set - let componentSet = ComponentSet.fromSource( - path.resolve(sfpPackage.workingDirectory, sfpPackage.projectDirectory, sfpPackage.packageDirectory) - ); - - //Run through all analyzers - let analyzers = AnalyzerRegistry.getAnalyzers(); - for (const analyzer of analyzers) { - if (analyzer.isEnabled(sfpPackage, logger)) sfpPackage = await analyzer.analyze(sfpPackage,componentSet, logger); - } - } - - //Create the actual package - let createPackage; - - if (!packageCreationParams) packageCreationParams = { breakBuildIfEmpty: true }; - - let packageType = sfpPackage.package_type; - if (params?.overridePackageTypeWith) packageType = params?.overridePackageTypeWith.toLocaleLowerCase(); - - //Get Implementors - switch (packageType) { - case PackageType.Unlocked: - createPackage = new CreateUnlockedPackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Source: - createPackage = new CreateSourcePackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Data: - createPackage = new CreateDataPackageImpl( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - case PackageType.Diff: - packageCreationParams.revisionFrom = params.revisionFrom; - packageCreationParams.revisionTo = params.revisionTo; - createPackage = new CreateDiffPackageImp( - sfpPackage.workingDirectory, - sfpPackage, - packageCreationParams, - logger, - params - ); - break; - } - - return createPackage.exec(); - } - - /* - * Handle version Numbers of package - * If VersionNumber is explcitly passed, use that - * else allow autosubstitute using buildNumber for Source and Data if available - */ - private static handleVersionNumber( - params: SfpPackageParams, - sfpPackage: SfpPackage, - packageCreationParams: PackageCreationParams - ) { - if (params?.packageVersionNumber) { - sfpPackage.versionNumber = params.packageVersionNumber; - } else if (packageCreationParams?.buildNumber) { - if (sfpPackage.packageType != PackageType.Unlocked) { - let versionUpdater: PackageVersionUpdater = new PackageVersionUpdater(); - sfpPackage.versionNumber = versionUpdater.substituteBuildNumber( - sfpPackage, - packageCreationParams.buildNumber - ); - } - } else { - sfpPackage.versionNumber = sfpPackage.packageDescriptor.versionNumber; - } - return sfpPackage; - } - - public static async buildPackageFromArtifact(artifact: Artifact, logger: Logger): Promise { - //Read artifact metadata - let sfpPackage = new SfpPackage(); - Object.assign(sfpPackage, fs.readJSONSync(artifact.packageMetadataFilePath, { encoding: 'utf8' })); - sfpPackage.sourceDir = artifact.sourceDirectoryPath; - sfpPackage.changelogFilePath = artifact.changelogFilePath; - - sfpPackage.projectConfig = ProjectConfig.getSFDXProjectConfig(artifact.sourceDirectoryPath); - sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - artifact.sourceDirectoryPath, - sfpPackage.package_name - ); - sfpPackage.projectDirectory = artifact.sourceDirectoryPath; - sfpPackage.packageDirectory = sfpPackage.packageDescriptor.path; - sfpPackage.isTriggerAllTests = this.isAllTestsToBeTriggered(sfpPackage, logger); - - return sfpPackage; - } - - - - private static isAllTestsToBeTriggered(sfpPackage: SfpPackage, logger: Logger) { - if ( - this.isOptimizedDeploymentForSourcePackage(sfpPackage) == false || - (sfpPackage.packageType == PackageType.Source && - sfpPackage.isApexFound == true && - sfpPackage.apexTestClassses == null) - ) { - SFPLogger.printHeaderLine('WARNING! NON OPTIMAL DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,logger); - SFPLogger.log( - `This package has apex classes/triggers, In order to deploy optimally, each class need to have a minimum` + - `75% test coverage,We are unable to find any test classes in the given package, hence will be deploying` + - `via triggering all local tests,This definitely is not optimal approach on large orgs` + - `Please consider adding test classes for the classes in the package`, - LoggerLevel.INFO, - logger - ); - SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,logger); - return true; - } else return false; - } - - // Allow individual packages to use non optimized path - private static isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { - if (pkgDescriptor['isOptimizedDeployment'] == null) return true; - else return pkgDescriptor['isOptimizedDeployment']; - } -} - -// Options while creating package -export class PackageCreationParams { - breakBuildIfEmpty: boolean = true; - devHub?: string; - installationkeybypass?: boolean; - installationkey?: string; - waitTime?: string; - isCoverageEnabled?: boolean; - isSkipValidation?: boolean; - isComputeDiffPackage?: boolean; - baseBranch?: string; - buildNumber?: string; - useSelectiveBuildOnly?: boolean; - revisionFrom?:string; - revisionTo?:string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts deleted file mode 100644 index ba0e6a4d3..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInquirer.ts +++ /dev/null @@ -1,178 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -import path = require('path'); -import lodash = require('lodash'); -import { URL } from 'url'; -import SfpPackage from './SfpPackage'; - -/** - * Methods for getting information about artifacts - */ -export default class SfpPackageInquirer { - private _latestPackageManifestFromArtifacts: any; - private _pathToLatestPackageManifestFromArtifacts: string; - private _prunedLatestPackageManifestFromArtifacts: any; - - get pathToLatestPackageManifestFromArtifacts() { - return this._pathToLatestPackageManifestFromArtifacts; - } - get prunedLatestPackageManifestFromArtifacts() { - return this._prunedLatestPackageManifestFromArtifacts; - } - - constructor(private readonly sfpPackages: SfpPackage[], private packageLogger?: Logger) {} - - public getLatestProjectConfig() { - let latestPackageManifest = this.getLatestPackageManifestFromArtifacts(this.sfpPackages); - - if (latestPackageManifest) { - this._latestPackageManifestFromArtifacts = latestPackageManifest.latestPackageManifest; - this._pathToLatestPackageManifestFromArtifacts = latestPackageManifest.pathToLatestPackageManifest; - - this._prunedLatestPackageManifestFromArtifacts = this.pruneLatestPackageManifest( - latestPackageManifest.latestPackageManifest, - this.sfpPackages - ); - } - return this._latestPackageManifestFromArtifacts; - } - - /** - * Gets latest package manifest from artifacts - * Returns null if unable to find latest package manifest - */ - private getLatestPackageManifestFromArtifacts( - sfpPackages: SfpPackage[] - ): { - latestPackageManifest: any; - pathToLatestPackageManifest: string; - } { - let latestPackageManifest: any; - let pathToLatestPackageManifest: string; - - this.validateArtifactsSourceRepository(); - - let latestSfpPackage: SfpPackage; - for (let sfpPackage of sfpPackages) { - if ( - latestSfpPackage == null || - latestSfpPackage.creation_details.timestamp < sfpPackage.creation_details.timestamp - ) { - latestSfpPackage = sfpPackage; - - let pathToPackageManifest = path.join(sfpPackage.sourceDir, 'manifests', 'sfdx-project.json.ori'); - if (fs.existsSync(pathToPackageManifest)) { - latestPackageManifest = JSON.parse(fs.readFileSync(pathToPackageManifest, 'utf8')); - - pathToLatestPackageManifest = pathToPackageManifest; - } - } - } - - if (latestPackageManifest) { - SFPLogger.log( - `Found latest package manifest in ${latestSfpPackage.packageName} artifact`, - LoggerLevel.INFO, - this.packageLogger - ); - - return { latestPackageManifest, pathToLatestPackageManifest }; - } else return null; - } - - /** - * Verify that artifacts are from the same source repository - */ - public validateArtifactsSourceRepository(): void { - let remoteURL: RemoteURL; - - for (let sfpPackage of this.sfpPackages) { - let currentRemoteURL: RemoteURL; - - let isHttp: boolean = sfpPackage.repository_url.match(/^https?:\/\//) ? true : false; - if (isHttp) { - const url = new URL(sfpPackage.repository_url); - currentRemoteURL = { - ref: url.toString(), - hostName: url.hostname, - pathName: url.pathname, - }; - } else { - // Handle SSH URL separately, as it is not supported by URL module - currentRemoteURL = { - ref: sfpPackage.repository_url, - hostName: null, - pathName: null, - }; - } - - if (remoteURL == null) { - remoteURL = currentRemoteURL; - continue; - } - - let isValid: boolean; - if (isHttp) { - if ( - currentRemoteURL.hostName === remoteURL.hostName && - currentRemoteURL.pathName === remoteURL.pathName - ) - isValid = true; - else isValid = false; - } else { - if (currentRemoteURL.ref === remoteURL.ref) isValid = true; - else isValid = false; - } - - if (!isValid) { - SFPLogger.log(`remoteURL: ${JSON.stringify(remoteURL)}`, LoggerLevel.DEBUG, this.packageLogger); - SFPLogger.log( - `currentRemoteURL: ${JSON.stringify(currentRemoteURL)}`, - LoggerLevel.DEBUG, - this.packageLogger - ); - throw new Error( - `Artifacts must originate from the same source repository, for deployment to work. The artifact ${sfpPackage.packageName} has repository URL that doesn't meet the current repository URL ${JSON.stringify(currentRemoteURL)} not equal ${JSON.stringify(remoteURL)}` - ); - } - } - } - - /** - * Remove packages that do not have an artifact from the package manifest - * @param latestPackageManifest - * @param artifacts - */ - private pruneLatestPackageManifest(latestPackageManifest: any, sfpPackages: SfpPackage[]) { - let prunedLatestPackageManifest = lodash.cloneDeep(latestPackageManifest); - - let packagesWithArtifacts: string[] = []; - sfpPackages.forEach((sfpPackage) => { - packagesWithArtifacts.push(sfpPackage.packageName); - }); - - let i = prunedLatestPackageManifest.packageDirectories.length; - while (i--) { - if (!packagesWithArtifacts.includes(prunedLatestPackageManifest.packageDirectories[i].package)) { - let removedPackageDirectory = prunedLatestPackageManifest.packageDirectories.splice(i, 1); - - // Also remove references to the package as a dependency - prunedLatestPackageManifest.packageDirectories.forEach((pkg) => { - let indexOfDependency = pkg.dependencies?.findIndex( - (dependency) => dependency.package === removedPackageDirectory[0].package - ); - - if (indexOfDependency >= 0) pkg.dependencies.splice(indexOfDependency, 1); - }); - } - } - - return prunedLatestPackageManifest; - } -} - -interface RemoteURL { - ref: string; - hostName: string; - pathName: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts b/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts deleted file mode 100644 index 711db5442..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/SfpPackageInstaller.ts +++ /dev/null @@ -1,63 +0,0 @@ -import path from 'path'; -import { Logger } from '@flxblio/sfp-logger'; -import SFPOrg from '../org/SFPOrg'; -import InstallDataPackageImpl from './packageInstallers/InstallDataPackageImpl'; -import { SfpPackageInstallationOptions } from './packageInstallers/InstallPackage'; -import InstallSourcePackageImpl from './packageInstallers/InstallSourcePackageImpl'; -import InstallUnlockedPackage from './packageInstallers/InstallUnlockedPackage'; -import { PackageInstallationResult } from './packageInstallers/PackageInstallationResult'; -import SfpPackage, { PackageType } from './SfpPackage'; - -export default class SfpPackageInstaller { - public static async installPackage( - logger: Logger, - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - installationOptions: SfpPackageInstallationOptions, - installationContext?: SfPPackageInstallationContext, - overridePackageTypeWith?: string - ): Promise { - let packageType = sfpPackage.packageType; - if (overridePackageTypeWith) packageType = overridePackageTypeWith; - - switch (packageType) { - case PackageType.Unlocked: - let installUnlockedPackageImpl: InstallUnlockedPackage = new InstallUnlockedPackage( - sfpPackage, - targetOrg, - installationOptions, - logger - ); - installUnlockedPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installUnlockedPackageImpl.exec(); - case PackageType.Diff: - case PackageType.Source: - installationOptions.pathToReplacementForceIgnore = installationContext?.currentStage == 'prepare' - ? path.join(sfpPackage.sourceDir, 'forceignores', '.prepareignore') - : null; - let installSourcePackageImpl: InstallSourcePackageImpl = new InstallSourcePackageImpl( - sfpPackage, - targetOrg, - installationOptions, - logger - ); - installSourcePackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installSourcePackageImpl.exec(); - case PackageType.Data: - let installDataPackageImpl: InstallDataPackageImpl = new InstallDataPackageImpl( - sfpPackage, - targetOrg, - logger, - installationOptions - ); - installDataPackageImpl.isArtifactToBeCommittedInOrg = !installationOptions.disableArtifactCommit; - return installDataPackageImpl.exec(); - default: - throw new Error('Unknown Package Type'); - } - } -} - -export class SfPPackageInstallationContext { - currentStage: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts deleted file mode 100644 index 0e4abe323..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/analyser/AnalyzerRegistry.ts +++ /dev/null @@ -1,20 +0,0 @@ -import FHTAnalyser from './FHTAnalyzer'; -import FTAnalyser from './FTAnalyzer'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import PicklistAnalyzer from './PicklistAnalyzer'; - -export class AnalyzerRegistry { - static getAnalyzers(): PackageAnalyzer[] { - let packageAnalyzers: PackageAnalyzer[] = []; - - //TODO: Make dynamic - let fhtAnalyzer = new FHTAnalyser(); - let ftAnalyser = new FTAnalyser(); - let picklistAnalyzer = new PicklistAnalyzer(); - packageAnalyzers.push(fhtAnalyzer); - packageAnalyzers.push(ftAnalyser); - packageAnalyzers.push(picklistAnalyzer); - - return packageAnalyzers; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts deleted file mode 100644 index 3d71504e6..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/analyser/FHTAnalyzer.ts +++ /dev/null @@ -1,76 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import * as yaml from 'js-yaml'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class FHTAnalyser implements PackageAnalyzer { - - public getName() { - return "Field History Tracking Analyzer" - } - - - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - - let fhtFields: { [key: string]: Array } = {}; - - //read the yaml - let fhtYamlPath = path.join( - sfpPackage.workingDirectory, - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - '/postDeploy/history-tracking.yml' - ); - - //read components mentioned in yaml - if (fs.existsSync(fhtYamlPath)) { - //convert yaml to json - fhtFields = yaml.load(fs.readFileSync(fhtYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; - } - - - //filter the components in the package - fhtFields = await this.addFieldsFromComponentSet(fhtFields, componentSet); - - if (Object.keys(fhtFields).length>0) { - sfpPackage['isFHTFieldFound'] = true; - sfpPackage['fhtFields'] = fhtFields; - } - } catch (error) { - //Ignore error for now - SFPLogger.log(`Unable to process Field History Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - private async addFieldsFromComponentSet( - fhtFields: { [key: string]: Array }, - componentSet: ComponentSet - ): Promise>> { - let sourceComponents = componentSet.getSourceComponents().toArray(); - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { - continue; - } - - let customField = sourceComponent.parseXmlSync().CustomField; - if (customField['trackHistory'] == 'true') { - let objName = sourceComponent.parent.fullName; - if (!fhtFields[objName]) fhtFields[objName] = []; - fhtFields[objName].push(sourceComponent.name); - } - } - return fhtFields; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts deleted file mode 100644 index 911e1e356..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/analyser/FTAnalyzer.ts +++ /dev/null @@ -1,74 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import * as yaml from 'js-yaml'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class FTAnalyser implements PackageAnalyzer { - - public getName(): string { - return "Feed Tracking Analyzer"; - }; - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - - let ftFields: { [key: string]: Array } = {}; - - //read the yaml - let ftYamlPath = path.join( - sfpPackage.workingDirectory, - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - '/postDeploy/feed-tracking.yml' - ); - - //read components mentioned in yaml - if (fs.existsSync(ftYamlPath)) { - //convert yaml to json - ftFields = yaml.load(fs.readFileSync(ftYamlPath, { encoding: 'utf-8' })) as {[key: string]: string[]}; - } - - - //filter the components in the package - ftFields = await this.addFieldsFromComponentSet(ftFields, componentSet); - - if (Object.keys(ftFields).length>0) { - sfpPackage['isFTFieldFound'] = true; - sfpPackage['ftFields'] = ftFields; - } - } catch (error) { - //Ignore error for now - SFPLogger.log(`Unable to process Feed Tracking due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - private async addFieldsFromComponentSet( - ftFields: { [key: string]: Array }, - componentSet: ComponentSet - ): Promise>> { - let sourceComponents = componentSet.getSourceComponents().toArray(); - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name !== registry.types.customobject.children.types.customfield.name) { - continue; - } - - let customField = sourceComponent.parseXmlSync().CustomField; - if (customField['trackFeedHistory'] == 'true') { - let objName = sourceComponent.parent.fullName; - if (!ftFields[objName]) ftFields[objName] = []; - ftFields[objName].push(sourceComponent.name); - } - } - return ftFields; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts deleted file mode 100644 index 3072da027..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/analyser/PackageAnalyzer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Logger } from "@flxblio/sfp-logger"; -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import SfpPackage from "../SfpPackage"; - -export interface PackageAnalyzer -{ - getName(); - analyze(sfpPackage: SfpPackage,componentSet:ComponentSet,logger:Logger): Promise - isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise - - -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts b/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts deleted file mode 100644 index 35f24476c..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/analyser/PicklistAnalyzer.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { PackageAnalyzer } from './PackageAnalyzer'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class PicklistAnalyzer implements PackageAnalyzer { - - public getName() { - return "Picklist Analyzer" - } - - - - public async analyze(sfpPackage: SfpPackage, componentSet:ComponentSet, logger:Logger): Promise { - try { - let sourceComponents = componentSet.getSourceComponents().toArray(); - let components = []; - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name == registry.types.customobject.name) { - //issues/1367 - //this can add child elements that are not custom fields.. - components.push(...sourceComponent.getChildren()); - } - - if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { - components.push(sourceComponent); - } - } - - if (components) { - for (const fieldComponent of components) { - let customField = fieldComponent.parseXmlSync().CustomField; - //issues/1367 - //if the component isn't a field customField will be undefined..so check - if (customField && customField['type'] == 'Picklist') { - sfpPackage.isPickListsFound= true; - break; - } - } - } - } catch (error) { - SFPLogger.log(`Unable to process Picklist update due to ${error.message}`,LoggerLevel.TRACE,logger); - } - return sfpPackage; - } - - public async isEnabled(sfpPackage: SfpPackage,logger:Logger): Promise { - if (sfpPackage.packageType != PackageType.Data) return true; - else return false; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts deleted file mode 100644 index 5edac57a7..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/components/DeployDestructiveManifestToOrgImpl.ts +++ /dev/null @@ -1,129 +0,0 @@ -import SFPLogger from '@flxblio/sfp-logger'; -import { Connection } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import { delay } from '../../utils/Delay'; -import { LoggerLevel } from '@flxblio/sfp-logger'; -import SFPOrg from '../../org/SFPOrg'; -import AdmZip from "adm-zip" -import path from 'path'; -import tmp from "tmp"; -import { XMLParser } from 'fast-xml-parser'; -import { isEmpty } from 'lodash'; - -export default class DeployDestructiveManifestToOrgImpl { - public constructor(private sfpOrg: SFPOrg, private destructiveManifestPath: string) { } - - - - - public async exec(): Promise { - //Connect to the org - const conn = this.sfpOrg.getConnection(); - const apiversion = await conn.retrieveMaxApiVersion(); - let workingDirectory = this.generateCacheDirectory(); - await this.copyAndValidateDestructiveManifest(this.destructiveManifestPath, workingDirectory); - this.generateEmptyPackageXml(workingDirectory, apiversion); - let zipFile = await this.generateDeploymentZipFile(workingDirectory); - await this.deployDestructiveManifest(zipFile, conn); - } - - private generateCacheDirectory() { - - let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); - let tempDir = tmpDirObj.name; - let destructCacheDirectory = path.join(tempDir, 'destruct'); - fs.mkdirSync(destructCacheDirectory); - return destructCacheDirectory; - } - - private async copyAndValidateDestructiveManifest(existingManifestPath: string, workingDirectory: string) { - let destructiveManifestFile = path.join(workingDirectory, 'destructiveChanges.xml'); - - //Copy Destructive Manifest File to Temporary Directory - fs.copyFileSync(existingManifestPath, destructiveManifestFile); - const parser = new XMLParser(); - let destructiveChanges = await parser.parse(fs.readFileSync(path.resolve(destructiveManifestFile))); - - if (isEmpty(destructiveChanges['Package']['types'])) { - throw new Error('Invalid Destructive Change Definition encountered, please check'); - } - - SFPLogger.log(destructiveChanges['Package']['types'], LoggerLevel.TRACE); - } - - - private generateEmptyPackageXml(workingDirectory: string, apiversion: string) { - let packageXml = ` - - - * - CustomLabel - - ${apiversion} - `; - - let packageXmlPath = path.join(workingDirectory, 'package.xml'); - fs.outputFileSync(packageXmlPath, packageXml); - - SFPLogger.log(`Empty Package.xml with ${apiversion} created at ${workingDirectory}`, LoggerLevel.DEBUG); - } - - private async generateDeploymentZipFile(workingDirectory: string) { - let zip = new AdmZip(); - zip.addLocalFolder(workingDirectory); - zip.writeZip(path.join(workingDirectory, 'package.zip')); - return path.join(workingDirectory, 'package.zip'); - } - - - - private async deployDestructiveManifest(zipFile: string, conn: Connection) { - //Deploy Package - conn.metadata.pollTimeout = 300; - - const zipStream = fs.createReadStream(zipFile); - let deployResult = await conn.metadata.deploy(zipStream, { rollbackOnError: true, singlePackage: true }); - - - SFPLogger.log( - `Deploying Destructive Changes with ID ${deployResult.id} to ${conn.getUsername()}`, - LoggerLevel.INFO - ); - let deploymentStatus = await this.checkDeploymentStatus(conn, deployResult.id); - - if (deploymentStatus.success) { - if (deploymentStatus.success) - SFPLogger.log( - `Deployed Destructive Changes in target org ${conn.getUsername()} succesfully`, - LoggerLevel.INFO - ); - } else { - let componentFailures = deploymentStatus.details.componentFailures; - let errorResult = []; - componentFailures.forEach((failure) => { - errorResult.push({ - componentType: failure.componentType, - fullName: failure.fullName, - problem: failure.problem, - }); - }); - - console - throw new Error('Unable to deploy the Destructive Changes: ' + JSON.stringify(errorResult)); - } - } - - private async checkDeploymentStatus(conn: Connection, retrievedId: string) { - - while (true) { - let result = await conn.metadata.checkDeployStatus(retrievedId, true); - - if (!result.done) { - SFPLogger.log('Polling for Deployment Status', LoggerLevel.INFO); - await delay(5000); - } else { - return result; - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts b/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts deleted file mode 100644 index 23454e15d..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/components/MetadataCount.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { globSync } from 'glob'; -import path from 'path'; - -export default class MetadataCount { - public static async getMetadataCount(projectDirectory: string, sourceDirectory: string): Promise { - let metadataCount; - try { - let metadataFiles: string[] = globSync(`**/*-meta.xml`, { - cwd: projectDirectory ? path.join(projectDirectory, sourceDirectory) : sourceDirectory, - absolute: true, - }); - metadataCount = metadataFiles.length; - } catch (error) { - metadataCount = -1; - } - return metadataCount; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts b/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts deleted file mode 100644 index 9d0be4521..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/components/PackageManifest.ts +++ /dev/null @@ -1,271 +0,0 @@ -import path from 'path'; -import * as fs from 'fs-extra'; -import { ApexClasses } from '../SfpPackage'; -import xml2json from '../../utils/xml2json'; -const xml2js = require('xml2js'); - -export default class PackageManifest { - private _manifestJson; - private _manifestXml: string; - - /** - * Getter for package manifest JSON - */ - get manifestJson() { - return this._manifestJson; - } - - /** - * Getter for package manifest XML - */ - get manifestXml(): string { - return this._manifestXml; - } - - private constructor() {} - - /** - * Factory method - * @param mdapiDir directory containing package.xml - * @returns instance of PackageManifest - */ - static async create(mdapiDir: string): Promise { - const packageManifest = new PackageManifest(); - - const packageXml: string = fs.readFileSync(path.join(mdapiDir, 'package.xml'), 'utf8'); - - packageManifest._manifestXml = packageXml; - packageManifest._manifestJson = await xml2json(packageXml); - - return packageManifest; - } - - /** - * Factory method - * @param components - * @param apiVersion - * @returns intance of PackageManifest - */ - static createFromScratch(components: { fullName: string; type: string }[], apiVersion: string): PackageManifest { - const packageManifest = new PackageManifest(); - - const packageJson = { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [], - version: apiVersion, - }; - - components.forEach((component) => { - const type = packageJson.types.find((type) => type.name === component.type); - if (type) { - // Add member to existing type - type.members.push(component.fullName); - } else { - // create new type - const newType = { - name: component.type, - members: [component.fullName], - }; - packageJson.types.push(newType); - } - }); - - const builder = new xml2js.Builder({ - xmldec: { version: '1.0', encoding: 'UTF-8' }, - }); - - let packageObj = { - Package: packageJson, - }; - - packageManifest._manifestXml = builder.buildObject(packageObj); - packageManifest._manifestJson = packageObj; - - return packageManifest; - } - - /** - * Factory method - * @param manifest package JSON - * @returns instance of PackageManifest - */ - static async createWithJSONManifest(manifest: any): Promise { - const packageManifest = new PackageManifest(); - packageManifest._manifestJson = manifest; - - const builder = new xml2js.Builder({ - xmldec: { version: '1.0', encoding: 'UTF-8' }, - }); - - packageManifest._manifestXml = builder.buildObject(manifest); - - return packageManifest; - } - - /** - * - * @returns true or false, for whether there are profiles - */ - public isProfilesInPackage(): boolean { - let isProfilesFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'Profile') { - isProfilesFound = true; - break; - } - } - } else if (this.manifestJson.Package.types.name === 'Profile') { - isProfilesFound = true; - } - } - - return isProfilesFound; - } - - /** - * - * @returns true or false, for whether there are profiles - */ - public isPermissionSetsInPackage(): boolean { - let isPermissionSetFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'PermissionSet') { - isPermissionSetFound = true; - break; - } - } - } else if (this.manifestJson.Package.types.name === 'PermissionSet') { - isPermissionSetFound = true; - } - } - - return isPermissionSetFound; - } - - public isPermissionSetGroupsFoundInPackage(): boolean { - let isPermissionSetGroupFound = false; - if (Array.isArray(this._manifestJson?.Package?.types)) { - for (let type of this._manifestJson.Package.types) { - if (type.name === 'PermissionSetGroup') { - isPermissionSetGroupFound = true; - break; - } - } - } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') { - isPermissionSetGroupFound = true; - } - return isPermissionSetGroupFound; - } - - /** - * - * @returns true or false, for whether there are Apex classes and/or triggers - */ - public isApexInPackage(): boolean { - let isApexFound = false; - - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name === 'ApexClass' || type.name === 'ApexTrigger') { - isApexFound = true; - break; - } - } - } else if ( - this._manifestJson.Package.types.name === 'ApexClass' || - this._manifestJson.Package.types.name === 'ApexTrigger' - ) { - isApexFound = true; - } - } - - return isApexFound; - } - - /** - * - * @returns Apex triggers if there are any, otherwise returns undefined - */ - public fetchTriggers(): ApexClasses { - let triggers: string[]; - - let types; - if (this._manifestJson.Package.types) { - if (this._manifestJson.Package.types instanceof Array) { - types = this._manifestJson.Package.types; - } else { - // Create array with single type - types = [this._manifestJson.Package.types]; - } - } - - if (types) { - for (const type of types) { - if (type.name === 'ApexTrigger') { - if (type.members instanceof Array) { - triggers = type.members; - } else { - // Create array with single member - triggers = [type.members]; - } - break; - } - } - } - - return triggers; - } - - public isPayloadContainTypesOtherThan(providedType: string): boolean { - let anyOtherType = false; - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (type.name !== providedType) { - anyOtherType = true; - break; - } - } - } else if (this._manifestJson.Package.types.name !== providedType) { - anyOtherType = true; - } - } - return anyOtherType; - } - - public isPayLoadContainTypesSupportedByProfiles(): boolean { - const profileSupportedMetadataTypes = [ - 'ApexClass', - 'CustomApplication', - 'CustomObject', - 'CustomField', - 'Layout', - 'ApexPage', - 'CustomTab', - 'RecordType', - 'SystemPermissions', - ]; - - let containsProfileSupportedType = false; - if (this._manifestJson.Package.types) { - if (Array.isArray(this._manifestJson.Package.types)) { - for (const type of this._manifestJson.Package.types) { - if (profileSupportedMetadataTypes.includes(type.name)) { - containsProfileSupportedType = true; - break; - } - } - } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) { - containsProfileSupportedType = true; - } - } - return containsProfileSupportedType; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts b/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts deleted file mode 100644 index 7f6a6eef1..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/components/PackageToComponent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import Component from '../../dependency/Component'; - - -export default class PackageToComponent { - public constructor(private packageName:string,private packageDirectory:string) {} - - public generateComponents() { - const components: Component[] = []; - - let componentSet = ComponentSet.fromSource(this.packageDirectory); - - let componentSetArray = componentSet.getSourceComponents().toArray(); - - for (const individualComponentFromComponentSet of componentSetArray) { - const component: Component = { - id: undefined, - fullName: individualComponentFromComponentSet.fullName, - type: individualComponentFromComponentSet.type.name, - files: [individualComponentFromComponentSet.xml], - package: this.packageName, - }; - components.push(component); - } - - return components; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts b/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts deleted file mode 100644 index 209c95b29..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/components/ReconcileProfileAgainstOrgImpl.ts +++ /dev/null @@ -1,53 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; -const Table = require('cli-table'); -import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import { METADATA_INFO } from '../../metadata/MetadataInfo'; - -export default class ReconcileProfileAgainstOrgImpl { - public constructor(private sfpOrg:SFPOrg, private project_directory: string, private logger: Logger) {} - - public async exec() { - - let result=[]; - try { - let profileReconciler = new ProfileReconcile(this.sfpOrg); - let reconcileProfiles = await profileReconciler.reconcile( - [ this.project_directory], - [], - undefined - ); - - // Return an object to be displayed with --json - - reconcileProfiles.forEach((file) => { - result.push({ - state: 'Cleaned', - fullName: path.basename(file, METADATA_INFO.Profile.sourceExtension), - type: 'Profile', - path: path.relative(this.project_directory, file), - }); - }); - } catch (err) { - SFPLogger.log(err, LoggerLevel.ERROR); - - SFPLogger.log( - 'An error occured during profile reconcile. You can rerun the command after a moment.', - LoggerLevel.ERROR - ); - } - const table = new Table({ - head: ['State', 'Full Name', 'Type', 'Path'], - chars: ZERO_BORDER_TABLE, - }); - for (let res of result) { - table.push([res.state, res.fullName, res.type, res.path]); - } - SFPLogger.log(table.toString(), LoggerLevel.INFO); - return result; - } - - -} diff --git a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts deleted file mode 100644 index b2d37496e..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageTestCoverage.ts +++ /dev/null @@ -1,273 +0,0 @@ -import SFPLogger, { COLOR_WARNING, Logger } from '@flxblio/sfp-logger'; -import IndividualClassCoverage from '../../apex/coverage/IndividualClassCoverage'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import ApexClassFetcher from '../../apex/ApexClassFetcher'; -import ApexCodeCoverageAggregateFetcher from '../../apex/coverage/ApexCodeCoverageAggregateFetcher'; -import ApexTriggerFetcher from '../../apex/ApexTriggerFetcher'; - -export default class PackageTestCoverage { - private individualClassCoverage: IndividualClassCoverage; - private packageTestCoverage: number = -1; // Set inital value - - public constructor( - private pkg: SfpPackage, - private codeCoverage: any, - private logger: Logger, - private readonly conn: Connection - ) { - this.individualClassCoverage = new IndividualClassCoverage(this.codeCoverage, this.logger); - } - - public async getCurrentPackageTestCoverage(): Promise { - let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; - let triggers: string[] = this.pkg.triggers; - - let filteredCodeCoverage = this.filterCodeCoverageToPackageClassesAndTriggers( - this.codeCoverage, - packageClasses, - triggers - ); - - let totalLines: number = 0; - let totalCovered: number = 0; - for (let classCoverage of filteredCodeCoverage) { - if (classCoverage.coveredPercent !== null) { - totalLines += classCoverage.totalLines; - totalCovered += classCoverage.totalCovered; - } - } - - let listOfApexClassOrTriggerId: string[] = []; - - let classesNotTouchedByTestClass = this.getClassesNotTouchedByTestClass(packageClasses, this.codeCoverage); - if (classesNotTouchedByTestClass.length > 0) { - let apexClassIds = ( - await new ApexClassFetcher(this.conn).fetchApexClassByName(classesNotTouchedByTestClass) - ).map((apexClass) => apexClass.Id); - listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(apexClassIds); - } - - let triggersNotTouchedByTestClass = this.getTriggersNotTouchedByTestClass(triggers, this.codeCoverage); - if (triggersNotTouchedByTestClass.length > 0) { - let triggerIds = ( - await new ApexTriggerFetcher(this.conn).fetchApexTriggerByName(triggersNotTouchedByTestClass) - ).map((trigger) => trigger.Id); - listOfApexClassOrTriggerId = listOfApexClassOrTriggerId.concat(triggerIds); - } - - if (listOfApexClassOrTriggerId.length > 0) { - let recordsOfApexCodeCoverageAggregate = await new ApexCodeCoverageAggregateFetcher( - this.conn - ).fetchACCAById(listOfApexClassOrTriggerId); - - if (recordsOfApexCodeCoverageAggregate.length > 0) { - let numLinesUncovered: number = 0; // aggregate number of unconvered lines for classes & triggers that are not touched by any test classes - recordsOfApexCodeCoverageAggregate.forEach((record) => { - numLinesUncovered += record.NumLinesUncovered; - }); - totalLines += numLinesUncovered; - } - } - - let testCoverage = Math.floor((totalCovered / totalLines) * 100); - this.packageTestCoverage = testCoverage; - return testCoverage; - } - - public async validateTestCoverage( - coverageThreshold?: number - ): Promise<{ - result: boolean; - message?: string; - packageTestCoverage: number; - classesCovered?: { name: string; coveredPercent: number }[]; - classesWithInvalidCoverage?: { name: string; coveredPercent: number }[]; - }> { - if (this.packageTestCoverage == -1) - //No Value available - await this.getCurrentPackageTestCoverage(); - - let classesCovered = this.getIndividualClassCoverageByPackage(this.codeCoverage); - - if (coverageThreshold == undefined || coverageThreshold < 75) { - SFPLogger.log('Setting minimum coverage percentage to 75%.'); - coverageThreshold = 75; - } - - - - if (this.pkg.packageType === PackageType.Unlocked) { - if (this.packageTestCoverage < coverageThreshold) { - // Coverage inadequate, set result to false - return { - result: false, // Had earlier Changed to warning in Apr-22, due to unstable coverage, now reverting - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - message: `${COLOR_WARNING( - `The package has an overall coverage of ${this.packageTestCoverage}%, which does not meet the required overall coverage of ${coverageThreshold}%` - )}`, - }; - } else { - return { - result: true, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - message: `Package overall coverage is greater than ${coverageThreshold}%`, - }; - } - } else if (this.pkg.packageType === PackageType.Source || this.pkg.packageType === PackageType.Diff) { - SFPLogger.log("Package type is Source. Validating individual class coverage"); - - let individualClassValidationResults = this.individualClassCoverage.validateIndividualClassCoverage( - this.getIndividualClassCoverageByPackage(this.codeCoverage), - coverageThreshold - ); - - if (individualClassValidationResults.result) { - return { - result: true, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, - message: `Individidual coverage of classes is greater than ${coverageThreshold}%`, - }; - } else { - return { - result: false, - packageTestCoverage: this.packageTestCoverage, - classesCovered: classesCovered, - classesWithInvalidCoverage: individualClassValidationResults.classesWithInvalidCoverage, - message: `There are classes that do not satisfy the minimum code coverage of ${coverageThreshold}%`, - }; - } - } else { - throw new Error('Unhandled package type'); - } - } - - private getIndividualClassCoverageByPackage(codeCoverageReport: any): { name: string; coveredPercent: number }[] { - let individualClassCoverage: { - name: string; - coveredPercent: number; - }[] = []; - - let packageClasses: string[] = this.pkg.apexClassWithOutTestClasses; - let triggers: string[] = this.pkg.triggers; - - codeCoverageReport = this.filterCodeCoverageToPackageClassesAndTriggers( - codeCoverageReport, - packageClasses, - triggers - ); - - for (let classCoverage of codeCoverageReport) { - if (classCoverage['coveredPercent'] !== null) { - individualClassCoverage.push({ - name: classCoverage['name'], - coveredPercent: classCoverage['coveredPercent'], - }); - } - } - - let namesOfClassesWithoutTest: string[] = this.getClassesNotTouchedByTestClass( - packageClasses, - codeCoverageReport - ); - - if (namesOfClassesWithoutTest.length > 0) { - let classesWithoutTest: { - name: string; - coveredPercent: number; - }[] = namesOfClassesWithoutTest.map((className) => { - return { name: className, coveredPercent: 0 }; - }); - individualClassCoverage = individualClassCoverage.concat(classesWithoutTest); - } - - // Check for triggers with no test class - let namesOfTriggersWithoutTest: string[] = this.getTriggersNotTouchedByTestClass(triggers, codeCoverageReport); - - if (namesOfTriggersWithoutTest.length > 0) { - let triggersWithoutTest: { - name: string; - coveredPercent: number; - }[] = namesOfTriggersWithoutTest.map((triggerName) => { - return { name: triggerName, coveredPercent: 0 }; - }); - individualClassCoverage = individualClassCoverage.concat(triggersWithoutTest); - } - - return individualClassCoverage; - } - - /** - * Returns names of triggers in the package that are not triggered by the execution of any test classes - * Returns empty array if triggers is null or undefined - * @param triggers - * @param codeCoverageReport - * @returns - */ - private getTriggersNotTouchedByTestClass(triggers: string[], codeCoverageReport: any): string[] { - if (triggers != null) { - return triggers.filter((trigger) => { - for (let classCoverage of codeCoverageReport) { - if (classCoverage['name'] === trigger) { - // Filter out triggers if accounted for in coverage json - return false; - } - } - return true; - }); - } else return []; - } - - /** - * Returns name of classes in the package that are not touched by the execution of any test classes - * Returns empty array if packageClasses is null or undefined - * @param packageClasses - * @param codeCoverageReport - * @returns - */ - private getClassesNotTouchedByTestClass(packageClasses: string[], codeCoverageReport: any): string[] { - if (packageClasses != null) { - return packageClasses.filter((packageClass) => { - for (let classCoverage of codeCoverageReport) { - if (classCoverage['name'] === packageClass) { - // Filter out package class if accounted for in coverage json - return false; - } - } - return true; - }); - } else return []; - } - - /** - * Filter code coverage to classes and triggers in the package - * @param codeCoverage - * @param packageClasses - * @param triggers - */ - private filterCodeCoverageToPackageClassesAndTriggers(codeCoverage, packageClasses: string[], triggers: string[]) { - let filteredCodeCoverage = codeCoverage.filter((classCoverage) => { - if (packageClasses != null) { - for (let packageClass of packageClasses) { - if (packageClass === classCoverage['name']) return true; - } - } - - if (triggers != null) { - for (let trigger of triggers) { - if (trigger === classCoverage['name']) { - return true; - } - } - } - - return false; - }); - - return filteredCodeCoverage; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts b/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts deleted file mode 100644 index bee874e13..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/coverage/PackageVersionCoverage.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Connection } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import Package2VersionFetcher from '../version/Package2VersionFetcher'; - -export default class PackageVersionCoverage { - public constructor(private connection: Connection, private logger: Logger) {} - - public async getCoverage(versionId: string): Promise { - const package2VersionFetcher = new Package2VersionFetcher(this.connection); - const package2Version = await package2VersionFetcher.fetchBySubscriberPackageVersionId(versionId); - SFPLogger.log(`Fetched Record ${JSON.stringify(package2Version)}`, LoggerLevel.TRACE, this.logger); - if (package2Version) { - var packageCoverage = {}; - packageCoverage.HasPassedCodeCoverageCheck = package2Version.HasPassedCodeCoverageCheck; - packageCoverage.coverage = package2Version.CodeCoverage ? package2Version.CodeCoverage.apexCodeCoveragePercentage : 0; - packageCoverage.packageId = package2Version.Package2Id; - packageCoverage.packageName = package2Version.Package2.Name; - packageCoverage.packageVersionId = package2Version.SubscriberPackageVersionId; - packageCoverage.packageVersionNumber = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; - - SFPLogger.log( - `Successfully Retrieved the Apex Test Coverage of the package version`, - LoggerLevel.INFO, - this.logger - ); - } else { - throw new Error(`Package version doesnot exist, Please check the version details`); - } - return packageCoverage; - } -} -interface PackageCoverage { - coverage: number; - packageName: string; - packageId: string; - packageVersionNumber: string; - packageVersionId: string; - HasPassedCodeCoverageCheck: boolean; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts deleted file mode 100644 index a91dc95e0..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/dependencies/ExternalPackage2DependencyResolver.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Connection } from '@salesforce/core'; -import PackageDependencyResolver from './PackageDependencyResolver'; -import _ from 'lodash'; -import Package2VersionFetcher from '../version/Package2VersionFetcher'; -import Package2Detail from '../Package2Detail'; - -/** - * Resolves external package dependency versions to their subscriber version - */ -export default class ExternalPackage2DependencyResolver { - //TOOD: Finalize Keys - constructor(private conn: Connection, private projectConfig, private keys) {} - - public async resolveExternalPackage2DependenciesToVersions( - packagesToBeResolved?: string[], - packagesToBeSkipped?: string[], - isDependencyValidated?: boolean - ): Promise { - if (isDependencyValidated == undefined) isDependencyValidated = true; - //Do a dependency resolution first only for external dependencies - //Resolve .LATEST to exact version numbers - let revisedProjectConfig = await new PackageDependencyResolver( - this.conn, - this.projectConfig, - packagesToBeSkipped, - null, - isDependencyValidated - ).resolvePackageDependencyVersions(); - - let packageVersions: Package2Detail[] = []; - let packageVersionFetcher = new Package2VersionFetcher(this.conn); - - let packagesToKeys: { [p: string]: string }; - if (this.keys) { - packagesToKeys = this.parseKeys(this.keys); - } - - //Resolve provided version Number to SubscriberVersionId - for (const sfdxPackage of revisedProjectConfig.packageDirectories) { - - if(packagesToBeResolved && !packagesToBeResolved.includes(sfdxPackage.package)) - continue; - - if (sfdxPackage.dependencies && Array.isArray(sfdxPackage.dependencies)) { - for (let i = 0; i < sfdxPackage.dependencies.length; i++) { - let dependency = sfdxPackage.dependencies[i]; - - if (packagesToBeSkipped && packagesToBeSkipped.includes(dependency.package)) - { - let dependendentPackage: Package2Detail = { name: dependency.package }; - packageVersions.push(dependendentPackage); - continue; - } - - if (!packageVersions.find((elem) => elem.name == dependency.package)) { - let dependendentPackage: Package2Detail = { name: dependency.package }; - if (dependency.versionNumber) { - dependendentPackage.versionNumber = dependency.versionNumber; - let packageVersion = await packageVersionFetcher.fetchByPackage2Id( - revisedProjectConfig.packageAliases[dependendentPackage.name], - dependendentPackage.versionNumber, - true - ); - dependendentPackage.subscriberPackageVersionId = - packageVersion[0].SubscriberPackageVersionId; - } else { - dependendentPackage.subscriberPackageVersionId = - revisedProjectConfig.packageAliases[dependendentPackage.name]; - } - if (packagesToKeys?.[dependendentPackage.name]) { - dependendentPackage.key = packagesToKeys[dependency.package]; - } - packageVersions.push(dependendentPackage); - } - } - } - } - return packageVersions; - } - - /** - * Parse keys in string format "packageA:key packageB:key packageC:key" - * Returns map of packages to keys - * @param keys - */ - private parseKeys(keys: string) { - let output: { [p: string]: string } = {}; - - keys = keys.trim(); - let listOfKeys = keys.split(' '); - - for (let key of listOfKeys) { - let packageKeyPair = key.split(':'); - if (packageKeyPair.length === 2) { - output[packageKeyPair[0]] = packageKeyPair[1]; - } else { - // Format is incorrect, throw an error - throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); - } - } - return output; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts deleted file mode 100644 index 43babb444..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/dependencies/PackageDependencyResolver.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { Connection } from '@salesforce/core'; -import lodash = require('lodash'); -import Git from '../../git/Git'; -import GitTags from '../../git/GitTags'; -import Package2VersionFetcher, { Package2Version } from '../version/Package2VersionFetcher'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; - - -/** - * Resolves package dependency versions to their exact versions - */ -export default class PackageDependencyResolver { - private package2VersionCache: Package2VersionCache = new Package2VersionCache(); - - constructor( - private conn: Connection, - private projectConfig, - private packagesToBeSkipped?: string[], - private packagesToBeResolved?: string[], - private resolveExternalDepenciesOnly?: boolean - ) { - // prevent mutation of original config - this.projectConfig = lodash.cloneDeep(this.projectConfig); - } - - /** - * Resolves package dependency versions in project config - * Skips dependencies on packages that are queued for build, as they are resolved dynamically(packagesToBeSkipped) - * @returns new project config JSON, does not change original JSON - */ - public async resolvePackageDependencyVersions() { - for (const packageDirectory of this.projectConfig.packageDirectories) { - if (this.packagesToBeResolved?.length > 0 && this.packagesToBeSkipped?.length > 0) { - throw Error(`Unsupported path.. Use only one of the options at any given time`); - } - - if (this.packagesToBeSkipped && !this.packagesToBeSkipped.includes(packageDirectory.package)) { - continue; - } - - if (this.packagesToBeResolved && !this.packagesToBeResolved.includes(packageDirectory.package)) { - continue; - } - if (packageDirectory.dependencies && Array.isArray(packageDirectory.dependencies)) { - for (let i = 0; i < packageDirectory.dependencies.length; i++) { - let dependency = packageDirectory.dependencies[i]; - if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) { - - throw new Error(`Can't find package id for dependency: ` + dependency.package); - } - - let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package] - - if (this.isSubscriberPackageVersionId(packageVersionId)) { - // Already resolved - continue; - } - - if (this.packagesToBeSkipped && this.packagesToBeSkipped.includes(dependency.package) && !dependency.branch) { - // Dependency is part of the same build, will be resolved when new version is created - continue; - } - let package2VersionForDependency: any = ''; - if ( dependency.branch && dependency.branch !== '' ) { - SFPLogger.log(`Specified branch: ${dependency.branch} for dependency: ${dependency.package}`, LoggerLevel.INFO); - package2VersionForDependency = await this.getPackage2VersionForDependency( - this.conn, - dependency, - packageVersionId, - dependency.branch - ); - SFPLogger.log(`Fetched latest branched package of ${dependency.package},` - +`version: ${package2VersionForDependency.MajorVersion}.` - +`${package2VersionForDependency.MinorVersion}.` - +`${package2VersionForDependency.PatchVersion}.` - +`${package2VersionForDependency.BuildNumber}`, LoggerLevel.INFO); - - let branchedPackageAlias = `${dependency.package}@` - +`${package2VersionForDependency.MajorVersion}.` - +`${package2VersionForDependency.MinorVersion}.` - +`${package2VersionForDependency.PatchVersion}.` - +`${package2VersionForDependency.BuildNumber}-` - +`${dependency.branch}`; - dependency.package = branchedPackageAlias; - this.projectConfig.packageAliases[branchedPackageAlias] = package2VersionForDependency.SubscriberPackageVersionId; - delete dependency.versionNumber; - delete dependency.branch; - continue; - - }else { - package2VersionForDependency = await this.getPackage2VersionForDependency( - this.conn, - dependency, - packageVersionId - ); - } - - - if (package2VersionForDependency == null) { - packageDirectory.dependencies.splice(i, 1); - i--; - } else - dependency.versionNumber = `${package2VersionForDependency.MajorVersion}.${package2VersionForDependency.MinorVersion}.${package2VersionForDependency.PatchVersion}.${package2VersionForDependency.BuildNumber}`; - } - } - } - return this.projectConfig; - } - - /** - * Get last validated Package2 version for package dependency - * @param conn - * @param dependency - * @returns Package2Version - */ - private async getPackage2VersionForDependency( - conn: Connection, - dependency: { package: string; versionNumber: string }, - packageVersionId: string, - branch?: string, - ): Promise { - - //Dont hit api's if its only for external dependencies - if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package)) { - if (this.resolveExternalDepenciesOnly) return null; - } - - let package2Version: Package2Version; - - let versionNumber: string = dependency.versionNumber; - let vers: string[] = versionNumber.split('.'); - if (vers.length === 4 && vers[3] === 'LATEST') { - versionNumber = `${vers[0]}.${vers[1]}.${vers[2]}`; - } - - let package2Versions: Package2Version[]; - if (this.package2VersionCache.has(packageVersionId, versionNumber)) { - package2Versions = this.package2VersionCache.get( - packageVersionId, - versionNumber - ); - } else { - const package2VersionFetcher = new Package2VersionFetcher(conn); - let records; - if( branch ){ - records = await package2VersionFetcher.fetchByPackageBranchAndName( - branch, - dependency.package, - versionNumber - ); - }else{ - records = await package2VersionFetcher.fetchByPackage2Id( - packageVersionId, - versionNumber, - true - ); - } - - this.package2VersionCache.set( - packageVersionId, - versionNumber, - records - ); - package2Versions = this.package2VersionCache.get( - packageVersionId, - versionNumber - ); - } - - if (package2Versions.length === 0) { - throw new Error( - `Failed to find any validated Package2 versions for the dependency ${dependency.package} with version ${dependency.versionNumber}` - ); - } - - if (this.projectConfig.packageDirectories.find((dir) => dir.package === dependency.package && !branch)) { - package2Version = await this.getPackage2VersionFromCurrentBranch(package2Versions, dependency); - } else { - // Take last validated package for external packages - package2Version = package2Versions[0]; - } - return package2Version; - } - - /** - * Get Package2 version created from the current branch - * @param package2Versions - * @param dependency - * @returns Package2Version - */ - private async getPackage2VersionFromCurrentBranch( - package2Versions: Package2Version[], - dependency: { package: string; versionNumber: string } - ) { - let package2VersionOnCurrentBranch: Package2Version; - - const git = await Git.initiateRepo(); - const gitTags = new GitTags(git, dependency.package); - const tags = await gitTags.listTagsOnBranch(); - - for (const package2Version of package2Versions) { - const version = `${package2Version.MajorVersion}.${package2Version.MinorVersion}.${package2Version.PatchVersion}.${package2Version.BuildNumber}`; - for (const tag of tags) { - if (tag.endsWith(version)) { - package2VersionOnCurrentBranch = package2Version; - break; - } - } - if (package2VersionOnCurrentBranch) break; - } - - if (!package2VersionOnCurrentBranch) { - throw new Error( - `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch` - ); - } - - return package2VersionOnCurrentBranch; - } - - private isSubscriberPackageVersionId(packageAlias: string): boolean { - const subscriberPackageVersionIdPrefix = '04t'; - return packageAlias.startsWith(subscriberPackageVersionIdPrefix); - } -} - -class Package2VersionCache { - private cache: { [p: string]: Package2Version[] } = {}; - - /** - * Checks whether cache contains key for package ID and version number - * @param packageId - * @param versionNumberstartw - * @returns true or false - */ - has(packageId: string, versionNumber: string): boolean { - const key = `${packageId}-${versionNumber}`; - if (this.cache[key]) return true; - else return false; - } - - /** - * Set the cache value, Package2 versions, for package ID and version number - * @param packageId - * @param versionNumber - * @param package2Versions - * @returns cache - */ - set( - packageId: string, - versionNumber: string, - package2Versions: Package2Version[] - ): { [p: string]: Package2Version[] } { - const key = `${packageId}-${versionNumber}`; - this.cache[key] = package2Versions; - return this.cache; - } - - /** - * - * @param packageId - * @param versionNumber - * @returns Package2 versions for package ID and version number - */ - get(packageId: string, versionNumber: string): Package2Version[] { - const key = `${packageId}-${versionNumber}`; - return this.cache[key]; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts b/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts deleted file mode 100644 index d91c91f27..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/dependencies/TransitiveDependencyResolver.ts +++ /dev/null @@ -1,109 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import _, { uniq } from 'lodash'; -import semver = require('semver'); -import convertBuildNumDotDelimToHyphen from '../../utils/VersionNumberConverter'; -import { Connection } from '@salesforce/core'; -import UserDefinedExternalDependencyMap from '../../project/UserDefinedExternalDependency'; - -export default class TransitiveDependencyResolver { - constructor(private sfdxProjectConfig: any, private logger?: Logger) {} - - public async resolveTransitiveDependencies(): Promise> { - SFPLogger.log('Validating Project Dependencies...', LoggerLevel.INFO, this.logger); - - let clonedProjectConfig = await _.cloneDeep(this.sfdxProjectConfig); - clonedProjectConfig = await new UserDefinedExternalDependencyMap().cleanupEntries(clonedProjectConfig); - let pkgWithDependencies = ProjectConfig.getAllPackagesAndItsDependencies(clonedProjectConfig); - pkgWithDependencies = this.fillDepsWithUserDefinedExternalDependencyMap( - pkgWithDependencies, - new UserDefinedExternalDependencyMap().fetchDependencyEntries(clonedProjectConfig) - ); - pkgWithDependencies = this.fillDepsTransitively(pkgWithDependencies); - - return pkgWithDependencies; - } - - private fillDepsWithUserDefinedExternalDependencyMap( - pkgWithDependencies: Map, - externalDependencyMap: any - ): Map { - if (externalDependencyMap) { - for (let pkg of Object.keys(externalDependencyMap)) { - pkgWithDependencies.set(pkg, externalDependencyMap[pkg]); - } - } - return pkgWithDependencies; - } - - private fillDepsTransitively( - dependencyMap: Map - ): Map { - let pkgs = Array.from(dependencyMap.keys()); - for (let pkg of pkgs) { - SFPLogger.log( - COLOR_HEADER(`fetching dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), - LoggerLevel.TRACE, - this.logger - ); - let dependenencies: { package: string; versionNumber?: string }[] = []; - for (let dependency of dependencyMap.get(pkg)) { - if (dependencyMap.get(dependency.package)) { - //push parents first - dependenencies = dependenencies.concat(dependencyMap.get(dependency.package)); - SFPLogger.log( - `pushing ${dependencyMap.get(dependency.package).length} dependencies from package ${ - dependency.package - }`, - LoggerLevel.TRACE, - this.logger - ); - } - //push itself - dependenencies.push(dependency); - } - //deduplicate dependency list - let uniqueDependencies = [ - ...new Set(dependenencies.map((objects) => JSON.stringify(objects))), - ].map((tmpString) => JSON.parse(tmpString)); - for (let j = 0; j < uniqueDependencies.length; j++) { - if (uniqueDependencies[j].versionNumber) { - let version = convertBuildNumDotDelimToHyphen(uniqueDependencies[j].versionNumber); - - for (let i = j + 1; i < uniqueDependencies.length; i++) { - if (uniqueDependencies[j].package == uniqueDependencies[i].package) { - let versionToCompare = convertBuildNumDotDelimToHyphen(uniqueDependencies[i].versionNumber); - // replace existing packageInfo if package version number is newer - if (semver.lt(version, versionToCompare)) { - uniqueDependencies = this.swapAndDropArrayElement(uniqueDependencies,j,i); - - } else { - uniqueDependencies.splice(i, 1); - i--; - } - } - } - } - //do a dedup again - uniqueDependencies = [ - ...new Set(uniqueDependencies.map((objects) => JSON.stringify(objects))), - ].map((tmpString) => JSON.parse(tmpString)); - } - dependencyMap.set(pkg, uniqueDependencies); - } - return dependencyMap; - } - - private swapAndDropArrayElement(arr: T[], i: number, j: number): T[] { - if (i < 0 || i >= arr.length || j < 0 || j >= arr.length) { - return arr; - } - - let newArr = [...arr]; - [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; - return [...newArr.slice(0, j), ...newArr.slice(j + 1)]; - } - - -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts deleted file mode 100644 index c7a74f82e..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/DeploymentCustomizer.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Logger } from "@flxblio/sfp-logger"; -import { Connection } from "@salesforce/core"; -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; -import SfpPackage from "../SfpPackage"; -import SFPOrg from "../../org/SFPOrg"; -import { DeploySourceResult } from "../../deployers/DeploymentExecutor"; - -export interface DeploymentContext -{ - apiVersion: string; - waitTime: string; -} - -export interface DeploymentCustomizer -{ - gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet:ComponentSet, conn: Connection, logger: Logger):Promise<{location:string, componentSet:ComponentSet}>; - isEnabled(sfpPackage:SfpPackage, conn:Connection,logger:Logger):Promise; - getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - getName():string - execute(sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg:SFPOrg, - logger: Logger, - deploymentContext:DeploymentContext - ):Promise -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts deleted file mode 100644 index 709ce227f..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FHTEnabler.ts +++ /dev/null @@ -1,121 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SfpPackage from '../SfpPackage'; -import { Connection } from '@salesforce/core'; - -import { Schema } from 'jsforce'; -import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import { TestLevel } from '../../apextest/TestOptions'; -import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; - -const QUERY_BODY = - 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFieldHistoryTracked = true AND EntityDefinitionId IN '; - -export default class FHTEnabler extends MetdataDeploymentCustomizer { - - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg) return false; - - if ( - sfpPackage['isFHTFieldFound'] && - (sfpPackage.packageDescriptor.enableFHT == undefined || sfpPackage.packageDescriptor.enableFHT == true) - ) { - return true; - } - } - - - - public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - { - return { - ignoreWarnings:true, - waitTime:waitTime, - apiVersion:apiVersion, - testLevel : TestLevel.RunSpecifiedTests, - specifiedTests :'skip', - rollBackOnError:true - } - } - - public async gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - //First retrieve all objects/fields of interest from the package - let objList = []; - let fieldList = []; - Object.keys(sfpPackage['fhtFields']).forEach((key) => { - objList.push(`'${key}'`); - sfpPackage['fhtFields'][key].forEach((field) => fieldList.push(key + '.' + field)); - }); - //Now query all the fields for this object where FHT is already enabled - SFPLogger.log( - `Gathering fields which are already enabled with trackHistory on target org....`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log('FHT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) - let fhtFieldsInOrg = await QueryHelper.query<{ - QualifiedApiName: string; - EntityDefinition: any; - IsFieldHistoryTracked: boolean; - }>(QUERY_BODY + '(' + objList + ')', conn, true); - - //Clear of the fields that alread has FHT applied and keep a reduced filter - fhtFieldsInOrg.map((record) => { - let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; - const index = fieldList.indexOf(field); - if (index > -1) { - fieldList.splice(index, 1); - } - }); - - if (fieldList.length > 0) { - //Now retrieve the fields from the org - let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); - let sfpOrg = await SFPOrg.create({ connection: conn }); - let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); - - - - //Modify the component set - //Parsing is risky due to various encoding, so do an inplace replacement - for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { - let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); - - metadataOfComponent = metadataOfComponent.replace( - 'false', - 'true' - ); - - - - fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); - } - - return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; - } else SFPLogger.log(`No fields are required to be updated, skipping update of Field History Tracking`, LoggerLevel.INFO, logger); - } - - public getName(): string { - return 'Field History Tracking Enabler'; - } -} - -interface CustomField { - QualifiedApiName: string; - IsFieldHistoryTracked: boolean; - EntityDefinitionId: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts deleted file mode 100644 index 3daa6708b..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/FTEnabler.ts +++ /dev/null @@ -1,107 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import * as fs from 'fs-extra'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SfpPackage from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import { Schema } from 'jsforce'; -import CustomFieldFetcher from '../../metadata/CustomFieldFetcher'; -import SFPOrg from '../../org/SFPOrg'; -import path from 'path'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import { TestLevel } from '../../apextest/TestOptions'; -import { MetdataDeploymentCustomizer } from './MetadataDeploymentCustomizer'; - -const QUERY_BODY = - 'SELECT QualifiedApiName, EntityDefinition.QualifiedApiName FROM FieldDefinition WHERE IsFeedEnabled = true AND EntityDefinitionId IN '; - -export default class FTEnabler extends MetdataDeploymentCustomizer { - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg) return false; - - if ( - sfpPackage['isFTFieldFound'] && - (sfpPackage.packageDescriptor.enableFT == undefined || sfpPackage.packageDescriptor.enableFT == true) - ) { - return true; - } - } - - public async getDeploymentOptions( target_org: string, waitTime: string, apiVersion: string):Promise - { - return { - ignoreWarnings:true, - waitTime:waitTime, - apiVersion:apiVersion, - testLevel : TestLevel.RunSpecifiedTests, - specifiedTests :'skip', - rollBackOnError:true - } - } - - public async gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - //First retrieve all objects/fields of interest from the package - let objList = []; - let fieldList = []; - Object.keys(sfpPackage['ftFields']).forEach((key) => { - objList.push(`'${key}'`); - sfpPackage['ftFields'][key].forEach((field) => fieldList.push(key + '.' + field)); - }); - //Now query all the fields for this object where FT is already enabled - SFPLogger.log( - `Gathering fields which are already enabled with feed traking in the target org....`, - LoggerLevel.INFO, - logger - ); - - SFPLogger.log('FT QUERY: '+`${QUERY_BODY + '(' + objList + ')'}`,LoggerLevel.DEBUG) - let ftFieldsInOrg = await QueryHelper.query<{ - QualifiedApiName: string; - EntityDefinition: any; - IsFeedEnabled: boolean; - }>(QUERY_BODY + '(' + objList + ')', conn, true); - - //Clear of the fields that alread has FT applied and keep a reduced filter - ftFieldsInOrg.map((record) => { - let field = record.EntityDefinition.QualifiedApiName + '.' + record.QualifiedApiName; - const index = fieldList.indexOf(field); - if (index > -1) { - fieldList.splice(index, 1); - } - }); - - if (fieldList.length > 0) { - //Now retrieve the fields from the org - let customFieldFetcher: CustomFieldFetcher = new CustomFieldFetcher(logger); - let sfpOrg = await SFPOrg.create({ connection: conn }); - let fetchedCustomFields = await customFieldFetcher.getCustomFields(sfpOrg, fieldList); - - //Modify the component set - //Parsing is risky due to various encoding, so do an inplace replacement - for (const sourceComponent of fetchedCustomFields.components.getSourceComponents()) { - let metadataOfComponent = fs.readFileSync(sourceComponent.xml).toString(); - - metadataOfComponent = metadataOfComponent.replace( - 'false', - 'true' - ); - - fs.writeFileSync(path.join(sourceComponent.xml), metadataOfComponent); - } - - return { location: fetchedCustomFields.location, componentSet: fetchedCustomFields.components }; - } else SFPLogger.log(`No fields are required to be updated,skipping updates to Feed History tracking`, LoggerLevel.INFO, logger); - } - - public getName(): string { - return 'Feed Tracking Enabler'; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts deleted file mode 100644 index 1c524e287..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/MetadataDeploymentCustomizer.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Connection } from "@salesforce/core"; -import DeploySourceToOrgImpl, { DeploymentOptions } from "../../deployers/DeploySourceToOrgImpl"; -import SfpPackage from "../SfpPackage"; -import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; -import SFPLogger,{COLOR_KEY_MESSAGE,Logger,LoggerLevel} from "@flxblio/sfp-logger" -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import SFPOrg from "../../org/SFPOrg"; -import DeploymentExecutor, { DeploySourceResult } from "../../deployers/DeploymentExecutor"; -import PackageComponentPrinter from "../../display/PackageComponentPrinter"; -import DeployErrorDisplayer from "../../display/DeployErrorDisplayer"; - -export abstract class MetdataDeploymentCustomizer implements DeploymentCustomizer -{ - abstract gatherComponentsToBeDeployed(sfpPackage: SfpPackage, componentSet: ComponentSet, conn: Connection, logger: Logger): Promise<{ location: string; componentSet: ComponentSet; }>; - abstract isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise; - abstract getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise; - abstract getName(): string; - - - async execute(sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg:SFPOrg, - logger: Logger, - deploymentContext:DeploymentContext - ):Promise - { - if (await this.isEnabled(sfpPackage, sfpOrg.getConnection(), logger)) { - SFPLogger.log( - `Executing Post Deployer ${COLOR_KEY_MESSAGE(this.getName())}`, - LoggerLevel.INFO, - logger - ); - let modifiedPackage = await this.gatherComponentsToBeDeployed( - sfpPackage, - componentSet, - sfpOrg.getConnection(), - logger - ); - - //Check if there are components to be deployed - //Asssume its sucessfully deployed - if (!modifiedPackage || modifiedPackage.componentSet.getSourceComponents().toArray().length == 0) { - return { - deploy_id: `000000`, - result: true, - message: `No deployment required`, - }; - } - - - //deploy the fht enabled components to the org - let deploymentOptions = await this.getDeploymentOptions( - sfpOrg.getUsername(), - deploymentContext.waitTime, - deploymentContext.apiVersion - ); - - //Print components inside Component Set - let components = modifiedPackage.componentSet.getSourceComponents(); - PackageComponentPrinter.printComponentTable(components, logger); - - let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( - sfpOrg, - modifiedPackage.location, - modifiedPackage.componentSet, - deploymentOptions, - logger - ); - - let result = await deploySourceToOrgImpl.exec(); - if (!result.result) { - DeployErrorDisplayer.displayErrors(result.response, logger); - } - return result; - } else { - SFPLogger.log( - `Post Deployer ${COLOR_KEY_MESSAGE(this.getName())} skipped or not enabled`, - LoggerLevel.INFO, - logger - ); - } - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts deleted file mode 100644 index b17b48be5..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts +++ /dev/null @@ -1,218 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import { DeploymentContext, DeploymentCustomizer } from './DeploymentCustomizer'; -import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; -import SFPOrg from '../../org/SFPOrg'; -import { Schema } from 'jsforce'; -import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; - -const QUERY_BODY = 'SELECT Id FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '; - -export default class PicklistEnabler implements DeploymentCustomizer { - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - if (sfpPackage.packageType === PackageType.Unlocked) { - if ( - sfpPackage.isPickListsFound && - (sfpPackage.packageDescriptor.enablePicklist == undefined || - sfpPackage.packageDescriptor.enablePicklist == true) - ) { - return true; - } - } else return false; - } - - async execute( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg: SFPOrg, - logger: Logger, - deploymentContext: DeploymentContext - ): Promise { - try { - let sourceComponents = componentSet.getSourceComponents().toArray(); - let components = []; - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name == registry.types.customobject.name) { - components.push(...sourceComponent.getChildren()); - } - - if (sourceComponent.type.name == registry.types.customobject.children.types.customfield.name) { - components.push(sourceComponent); - } - } - - if (components) { - for (const fieldComponent of components) { - let customField = fieldComponent.parseXmlSync().CustomField; - //check for empty picklists - if ( - !customField || - customField['type'] !== 'Picklist' || - !customField.valueSet?.valueSetDefinition - ) { - continue; - } - //no updates for custom metadata picklists - if (customField['fieldManageability']) continue; - - let objName = fieldComponent.parent.fullName; - let picklistName = fieldComponent.name; - let urlId = - QUERY_BODY + "'" + objName + "'" + ' AND QualifiedApiName = ' + "'" + picklistName + "'"; - - let picklistValueSource = await this.getPicklistSource(customField); - - SFPLogger.log( - `Fetching picklist for custom field ${picklistName} on object ${objName}`, - LoggerLevel.INFO, - logger - ); - - let picklistInOrg = await this.getPicklistInOrg(urlId, sfpOrg.getConnection()); - - //check for empty picklists on org and fix first deployment issue - if (!picklistInOrg?.Metadata?.valueSet?.valueSetDefinition) { - SFPLogger.log( - `Picklist field ${objName}.${picklistName} not in target Org. Skipping`, - LoggerLevel.TRACE, - logger - ); - continue; - } - - - let picklistValueInOrg = []; - - for (const value of picklistInOrg.Metadata.valueSet.valueSetDefinition.value) { - //ignore inactive values from org - if (value.isActive == false) { - continue; - } - - let valueInfo: { [key: string]: string } = {}; - valueInfo.fullName = value['valueName']; - decodeURIComponent(valueInfo.fullName); - valueInfo.label = value['label']; - decodeURIComponent(valueInfo.label); - valueInfo.default = value['default'] && value['default'] === true ? 'true' : 'false'; - picklistValueInOrg.push(valueInfo); - } - - let isPickListIdentical = this.arePicklistsIdentical(picklistValueInOrg, picklistValueSource); - - if (!isPickListIdentical) { - this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger); - } else { - SFPLogger.log( - `Picklist for custom field ${objName}.${picklistName} is identical to the source.No deployment`, - LoggerLevel.INFO, - logger - ); - } - } - - return { - deploy_id: `000000`, - result: true, - message: `Patched Picklists`, - }; - } - } catch (error) { - SFPLogger.log(`Unable to process Picklist update due to ${error.message}`, LoggerLevel.WARN, logger); - SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); - } - } - - private async getPicklistInOrg(urlId: string, conn: Connection): Promise { - let response = await QueryHelper.query(urlId, conn, true); - - if (response && Array.isArray(response) && response.length > 0 && response[0].attributes) { - let responseUrl = response[0].attributes.url; - let fieldId = responseUrl.slice(responseUrl.lastIndexOf('.') + 1); - let responsePicklist = await conn.tooling.sobject('CustomField').find({ Id: fieldId }); - - if (responsePicklist) { - return responsePicklist[0]; - } - } - } - - gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger - ): Promise<{ location: string; componentSet: ComponentSet }> { - throw new Error('Method not implemented.'); - } - getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise { - throw new Error('Method not implemented.'); - } - - private async getPicklistSource(customField: any): Promise { - let picklistValueSet = []; - let values = customField.valueSet?.valueSetDefinition?.value; - //only push values when picklist > 1 or exactly 1 value - if (Array.isArray(values)) { - for (const value of values) { - //ignore inactive values from source - if(!value?.isActive || value?.isActive == 'true'){ - picklistValueSet.push({fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'] , default: value.default, label: value['label'] ? decodeURI(value['label']) : value['label']}); - } - } - } else if (typeof values === 'object' && 'fullName' in values) { - //ignore inactive values from source - if(!values?.isActive || values?.isActive == 'true'){ - picklistValueSet.push({fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'] , default: values.default, label: values['label'] ? decodeURI(values['label']) : values['label']}); - } - } - return picklistValueSet; - } - - private arePicklistsIdentical(picklistValueInOrg: any[], picklistValueSource: any[]): boolean { - return ( - picklistValueInOrg.length === picklistValueSource.length && - picklistValueInOrg.every((element_1) => - picklistValueSource.some( - (element_2) => - element_1.fullName === element_2.fullName && - element_1.label === element_2.label && - element_1.default === element_2.default - ) - ) - ); - } - - private async deployPicklist(picklistInOrg: any, picklistValueSource: any, conn: Connection, logger: Logger) { - //empty the the old value set - picklistInOrg.Metadata.valueSet.valueSetDefinition.value = []; - picklistValueSource.map((value) => { - picklistInOrg.Metadata.valueSet.valueSetDefinition.value.push(value); - }); - picklistInOrg.Metadata.valueSet.valueSettings = []; - - let picklistToDeploy: any; - picklistToDeploy = { - attributes: picklistInOrg.attributes, - Id: picklistInOrg.Id, - Metadata: picklistInOrg.Metadata, - FullName: picklistInOrg.FullName, - }; - SFPLogger.log(`Update picklist for custom field ${picklistToDeploy.FullName}`, LoggerLevel.INFO, logger); - try { - await conn.tooling.sobject('CustomField').update(picklistToDeploy); - } catch (error) { - throw new Error( - `Unable to update picklist for custom field ${picklistToDeploy.FullName} due to ${error.message}` - ); - } - } - - public getName(): string { - return 'Picklist Enabler'; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts deleted file mode 100644 index d2ac675f6..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DeploymentCustomizer } from './DeploymentCustomizer'; -import FHTEnabler from './FHTEnabler'; -import FTEnabler from './FTEnabler'; - - -export class PostDeployersRegistry { - static getPostDeployers(): DeploymentCustomizer[] { - let postDeployers: DeploymentCustomizer[] = []; - - //TODO: Make dynamic - let fhtEnabler = new FHTEnabler(); - let ftEnabler = new FTEnabler(); - postDeployers.push(fhtEnabler); - postDeployers.push(ftEnabler); - - return postDeployers; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts deleted file mode 100644 index 2e423cbc9..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentCustomizers/PreDeployersRegistry.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DeploymentCustomizer } from './DeploymentCustomizer'; -import PicklistEnabler from './PicklistEnabler'; - - -export class PreDeployersRegistry { - static getPreDeployers(): DeploymentCustomizer[] { - let preDeployers: DeploymentCustomizer[] = []; - - let picklistEnabler = new PicklistEnabler(); - preDeployers.push(picklistEnabler); - - return preDeployers; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts deleted file mode 100644 index 47290e189..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilter.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ComponentSet } from "@salesforce/source-deploy-retrieve"; -import { Logger } from "@flxblio/sfp-logger"; -import SFPOrg from "../../org/SFPOrg"; -import { PackageType } from "../SfpPackage"; - -export interface DeploymentFilter -{ - apply(org: SFPOrg, componentSet: ComponentSet,logger:Logger):Promise; - isToApply(projectConfig: any,packageType:string): boolean; - -} - - diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts deleted file mode 100644 index 4e5721e2f..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DeploymentFilter } from './DeploymentFilter'; -import EntitlementVersionFilter from './EntitlementVersionFilter'; - - - - -export class DeploymentFilterRegistry { - static getImplementations(): DeploymentFilter[] { - let deploymentFilterImpls: DeploymentFilter[] = []; - - //TODO: Make dynamic - let entitlementVersionFilter = new EntitlementVersionFilter(); - deploymentFilterImpls.push(entitlementVersionFilter); - - - return deploymentFilterImpls; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts b/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts deleted file mode 100644 index 47d9399c8..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/deploymentFilters/EntitlementVersionFilter.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SFPOrg from '../../org/SFPOrg'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { DeploymentFilter } from './DeploymentFilter'; -import * as fs from 'fs-extra'; -import SettingsFetcher from '../../metadata/SettingsFetcher'; -import { PackageType } from '../SfpPackage'; -const { XMLBuilder } = require('fast-xml-parser'); - -const EXISTING_SLAPPROCESS_QUERY = `SELECT Name, NameNorm,VersionNumber, VersionMaster FROM SlaProcess ORDER BY VersionNumber DESC`; -const EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING = `SELECT Name, NameNorm FROM SlaProcess`; - -export default class EntitlementVersionFilter implements DeploymentFilter { - - public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { - //Only do if entitlment exits in the package - let sourceComponents = componentSet.getSourceComponents().toArray(); - let isEntitlementFound: boolean = false; - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.entitlementprocess.name) { - isEntitlementFound = true; - break; - } - } - if (!isEntitlementFound) return componentSet; - - try { - let entitlementSettings = await new SettingsFetcher(logger).getSetttingMetadata(org, `Entitlement`); - - let query; - if (entitlementSettings.enableEntitlementVersioning == true) { - SFPLogger.log(`Entitlement Versioning enabled in the org....`, LoggerLevel.INFO, logger); - query = EXISTING_SLAPPROCESS_QUERY; - } else { - SFPLogger.log(`Entitlement Versioning not enabled in the org....`, LoggerLevel.INFO, logger); - query = EXISTING_SLAPPROCESS_QUERY_NO_VERSIONING; - } - - SFPLogger.log(`Filtering Entitlement Process....`, LoggerLevel.INFO, logger); - //Fetch Entitlements currently in the org - let slaProcessesInOrg = await QueryHelper.query(query, org.getConnection(), false); - let modifiedComponentSet = new ComponentSet(); - //Compare version numbers in the org vs version in the component set - //Remove if the version numbers match - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.entitlementprocess.name) { - let slaProcessLocal = sourceComponent.parseXmlSync(); - - let slaProcessMatchedByName: SlaProcess = slaProcessesInOrg.find( - (element: SlaProcess) => element.Name == slaProcessLocal['EntitlementProcess']['name'] - ); - - if ( - slaProcessMatchedByName && - entitlementSettings.enableEntitlementVersioning && - slaProcessLocal['EntitlementProcess']['versionNumber'] > slaProcessMatchedByName.VersionNumber - ) { - //This is a deployment candidate - //Modify versionMaster tag to match in the org - slaProcessLocal['EntitlementProcess']['versionMaster'] = slaProcessMatchedByName.VersionMaster; - let builder = new XMLBuilder({ - format: true, - ignoreAttributes: false, - attributeNamePrefix: '@_', - }); - let xmlContent = builder.build(slaProcessLocal); - fs.writeFileSync(sourceComponent.xml, xmlContent); - modifiedComponentSet.add(sourceComponent); - } else if (slaProcessMatchedByName) { - SFPLogger.log( - `Skipping EntitlementProcess ${sourceComponent.name} as this version is already deployed`, - LoggerLevel.INFO, - logger - ); - } else { - //Doesnt exist, deploy - modifiedComponentSet.add(sourceComponent); - } - } else { - modifiedComponentSet.add(sourceComponent); - } - } - - SFPLogger.log(`Completed Filtering of EntitlementProcess\n`, LoggerLevel.INFO, logger); - return modifiedComponentSet; - } catch (error) { - SFPLogger.log(`Unable to filter entitlements, returning the unmodified package`, LoggerLevel.ERROR, logger); - return componentSet; - } - } - - public isToApply(projectConfig: any, packageType: string): boolean { - if (packageType != PackageType.Source) return false; - - if (projectConfig?.plugins?.sfp?.disableEntitlementFilter) return false; - else return true; - } - - - - -} - -interface SlaProcess { - Name: string; - NameNorm: string; - VersionNumber: string; - VersionMaster: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts b/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts deleted file mode 100644 index 10bd597bd..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/diff/PackageComponentDiff.ts +++ /dev/null @@ -1,424 +0,0 @@ -import * as xml2js from 'xml2js'; -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as rimraf from 'rimraf'; -import * as _ from 'lodash'; -import simplegit from 'simple-git'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import ProjectConfig from '../../project/ProjectConfig'; -import MetadataFiles from '../../metadata/MetadataFiles'; -import { SOURCE_EXTENSION_REGEX, MetadataInfo, METADATA_INFO } from '../../metadata/MetadataInfo'; -import { MetadataResolver } from '@salesforce/source-deploy-retrieve'; -import GitDiffUtils, { DiffFile, DiffFileStatus } from '../../git/GitDiffUtil'; - -const deleteNotSupported = ['RecordType']; -const git = simplegit(); -let sfdxManifest; - -export default class PackageComponentDiff { - private gitDiffUtils: GitDiffUtils; - - destructivePackageObjPre: any[]; - destructivePackageObjPost: any[]; - resultOutput: { - action: string; - metadataType: string; - componentName: string; - message: string; - path: string; - }[]; - public constructor( - private logger: Logger, - private sfdxPackage: string, - private revisionFrom?: string, - private revisionTo?: string, - private isDestructive?: boolean - ) { - if (this.revisionTo == null || this.revisionTo.trim() === '') { - this.revisionTo = 'HEAD'; - } - if (this.revisionFrom == null) { - this.revisionFrom = ''; - } - this.destructivePackageObjPost = []; - this.destructivePackageObjPre = []; - this.resultOutput = []; - - sfdxManifest = ProjectConfig.getSFDXProjectConfig(null); - this.gitDiffUtils = new GitDiffUtils(); - } - - public async build(outputFolder: string) { - rimraf.sync(outputFolder); - - const sepRegex = /\n|\r/; - let data = ''; - - //check if same commit - const commitFrom = await git.raw(['rev-list', '-n', '1', this.revisionFrom]); - const commitTo = await git.raw(['rev-list', '-n', '1', this.revisionTo]); - if (commitFrom === commitTo) { - throw new Error(`Unable to compute diff, as both commits are same`); - } - //Make it relative to make the command works from a project created as a subfolder in a repository - data = await git.diff([ - '--raw', - this.revisionFrom, - this.revisionTo, - '--relative', - ProjectConfig.getPackageDescriptorFromConfig(this.sfdxPackage, sfdxManifest).path, - ]); - - let content = data.split(sepRegex); - let diffFile: DiffFile = await this.parseContent(content); - await this.gitDiffUtils.fetchFileListRevisionTo(this.revisionTo, this.logger); - - let filesToCopy = diffFile.addedEdited; - let deletedFiles = diffFile.deleted; - - deletedFiles = deletedFiles.filter((deleted) => { - let found = false; - let deletedMetadata = MetadataFiles.getFullApiNameWithExtension(deleted.path); - for (let i = 0; i < filesToCopy.length; i++) { - let addedOrEdited = MetadataFiles.getFullApiNameWithExtension(filesToCopy[i].path); - if (deletedMetadata === addedOrEdited) { - found = true; - break; - } - } - return !found; - }); - - if (fs.existsSync(outputFolder) == false) { - fs.mkdirSync(outputFolder); - } - - const resolver = new MetadataResolver(); - - if (filesToCopy && filesToCopy.length > 0) { - for (let i = 0; i < filesToCopy.length; i++) { - - try { - let filePath = filesToCopy[i].path; - - let sourceComponents = resolver.getComponentsFromPath(filePath); - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.strategies?.adapter == AdapterId.MatchingContentFile) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.MixedContent) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - if(path.extname(sourceComponent.content)) - await this.gitDiffUtils.copyFile(sourceComponent.content, outputFolder, this.logger); - else - await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.Decomposed) { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - } else if (sourceComponent.type.strategies?.adapter == AdapterId.Bundle) { - await this.gitDiffUtils.copyFolder(sourceComponent.content, outputFolder, this.logger); - } else { - await this.gitDiffUtils.copyFile(sourceComponent.xml, outputFolder, this.logger); - } - } - } catch (error) { - - if(error.message.includes(`Unable to find the required file`)) - throw error; - - //Metadata resolver is not respecting forceignores at this stage - // So it fails on diff packages with post deploy, so lets ignore and move on - SFPLogger.log( - `Error while inferencing type of ${filesToCopy[i].path} to ${outputFolder} : ${error.message}`, - LoggerLevel.TRACE, - this.logger - ); - } - } - } - - if (this.isDestructive) { - SFPLogger.log('Creating Destructive Manifest..', LoggerLevel.TRACE, this.logger); - await this.createDestructiveChanges(deletedFiles, outputFolder); - } - - //Folder is empty after all this operations, return without copying additional files - if (fs.readdirSync(outputFolder).length === 0) { - rimraf.sync(outputFolder); - return null; - } - - SFPLogger.log(`Generating output summary`, LoggerLevel.TRACE, this.logger); - - return this.resultOutput; - } - - //TODO: Refactor using proper ignore - private checkForIngore(pathToIgnore: any[], filePath: string) { - pathToIgnore = pathToIgnore || []; - if (pathToIgnore.length === 0) { - return true; - } - - let returnVal = true; - pathToIgnore.forEach((ignore) => { - if ( - path.resolve(ignore) === path.resolve(filePath) || - path.resolve(filePath).includes(path.resolve(ignore)) - ) { - returnVal = false; - } - }); - return returnVal; - } - - private async createDestructiveChanges(filePaths: DiffFileStatus[], outputFolder: string) { - if (_.isNil(this.destructivePackageObjPost)) { - this.destructivePackageObjPost = []; - } else { - this.destructivePackageObjPost = this.destructivePackageObjPost.filter((metaType) => { - return !_.isNil(metaType.members) && metaType.members.length > 0; - }); - } - this.destructivePackageObjPre = []; - //returns root, dir, base and name - for (let i = 0; i < filePaths.length; i++) { - let filePath = filePaths[i].path; - try { - let matcher = filePath.match(SOURCE_EXTENSION_REGEX); - let extension = ''; - if (matcher) { - extension = matcher[0]; - } else { - extension = path.parse(filePath).ext; - } - - let name = MetadataInfo.getMetadataName(filePath); - - if (name) { - if (!MetadataFiles.isCustomMetadata(filePath, name)) { - // avoid to generate destructive for Standard Components - //Support on Custom Fields and Custom Objects for now - - this.resultOutput.push({ - action: 'Skip', - componentName: MetadataFiles.getMemberNameFromFilepath(filePath, name), - metadataType: 'StandardField/CustomMetadata', - message: '', - path: '--', - }); - - continue; - } - let member = MetadataFiles.getMemberNameFromFilepath(filePath, name); - if (name === METADATA_INFO.CustomField.xmlName) { - let isFormular = await this.gitDiffUtils.isFileIncludesContent(filePaths[i], ''); - if (isFormular) { - this.destructivePackageObjPre = this.buildDestructiveTypeObj( - this.destructivePackageObjPre, - name, - member - ); - - SFPLogger.log( - `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, - LoggerLevel.DEBUG, - this.logger - ); - - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'Manual Intervention Required', - }); - } else { - this.destructivePackageObjPost = this.buildDestructiveTypeObj( - this.destructivePackageObjPost, - name, - member - ); - } - SFPLogger.log( - `${filePath} ${MetadataFiles.isCustomMetadata(filePath, name)}`, - LoggerLevel.DEBUG, - this.logger - ); - - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'destructiveChanges.xml', - }); - } else { - if (!deleteNotSupported.includes(name)) { - this.destructivePackageObjPost = this.buildDestructiveTypeObj( - this.destructivePackageObjPost, - name, - member - ); - this.resultOutput.push({ - action: 'Delete', - componentName: member, - metadataType: name, - message: '', - path: 'destructiveChanges.xml', - }); - } else { - //add the component in the manual action list - // TODO - } - } - } - } catch (ex) { - this.resultOutput.push({ - action: 'ERROR', - componentName: '', - metadataType: '', - message: ex.message, - path: filePath, - }); - } - } - - this.writeDestructivechanges(this.destructivePackageObjPost, outputFolder, 'destructiveChanges.xml'); - } - - private writeDestructivechanges(destrucObj: Array, outputFolder: string, fileName: string) { - //ensure unique component per type - for (let i = 0; i < destrucObj.length; i++) { - destrucObj[i].members = _.uniq(destrucObj[i].members); - } - destrucObj = destrucObj.filter((metaType) => { - return metaType.members && metaType.members.length > 0; - }); - - if (destrucObj.length > 0) { - let dest = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: destrucObj, - }, - }; - - let destructivePackageName = fileName; - let filepath = path.join(outputFolder, destructivePackageName); - let builder = new xml2js.Builder(); - let xml = builder.buildObject(dest); - fs.writeFileSync(filepath, xml); - } - } - - private buildDestructiveTypeObj(destructiveObj, name, member) { - let typeIsPresent = false; - for (let i = 0; i < destructiveObj.length; i++) { - if (destructiveObj[i].name === name) { - typeIsPresent = true; - destructiveObj[i].members.push(member); - break; - } - } - let typeNode: any; - if (typeIsPresent === false) { - typeNode = { - name: name, - members: [member], - }; - destructiveObj.push(typeNode); - } - return destructiveObj; - } - - private async parseContent(fileContents): Promise { - const statusRegEx = /\sA\t|\sM\t|\sD\t/; - const renamedRegEx = /\sR[0-9]{3}\t|\sC[0-9]{3}\t/; - const tabRegEx = /\t/; - const deletedFileRegEx = new RegExp(/\sD\t/); - const lineBreakRegEx = /\r?\n|\r|( $)/; - - let metadataFiles = new MetadataFiles(); - - let diffFile: DiffFile = { - deleted: [], - addedEdited: [], - }; - - for (let i = 0; i < fileContents.length; i++) { - if (statusRegEx.test(fileContents[i])) { - let lineParts = fileContents[i].split(statusRegEx); - - let finalPath = path.join('.', lineParts[1].replace(lineBreakRegEx, '')); - finalPath = finalPath.trim(); - finalPath = finalPath.replace('\\303\\251', 'é'); - - if (!(await metadataFiles.isInModuleFolder(finalPath))) { - continue; - } - - if (!metadataFiles.accepts(finalPath)) { - continue; - } - - let revisionPart = lineParts[0].split(/\t|\s/); - - if (deletedFileRegEx.test(fileContents[i])) { - //Deleted - diffFile.deleted.push({ - revisionFrom: revisionPart[2].substring(0, 9), - revisionTo: revisionPart[3].substring(0, 9), - path: finalPath, - }); - } else { - // Added or edited - diffFile.addedEdited.push({ - revisionFrom: revisionPart[2].substring(0, 9), - revisionTo: revisionPart[3].substring(0, 9), - path: finalPath, - }); - } - } else if (renamedRegEx.test(fileContents[i])) { - let lineParts = fileContents[i].split(renamedRegEx); - - let paths = lineParts[1].trim().split(tabRegEx); - - let finalPath = path.join('.', paths[1].trim()); - finalPath = finalPath.replace('\\303\\251', 'é'); - let revisionPart = lineParts[0].split(/\t|\s/); - - if (!(await metadataFiles.isInModuleFolder(finalPath))) { - continue; - } - - if (!metadataFiles.accepts(paths[0].trim())) { - continue; - } - - diffFile.addedEdited.push({ - revisionFrom: '0000000', - revisionTo: revisionPart[3], - renamedPath: path.join('.', paths[0].trim()), - path: finalPath, - }); - - //allow deletion of renamed components - diffFile.deleted.push({ - revisionFrom: revisionPart[2], - revisionTo: '0000000', - path: paths[0].trim(), - }); - } - } - return diffFile; - } -} -enum AdapterId { - Bundle = 'bundle', - Decomposed = 'decomposed', - Default = 'default', - MatchingContentFile = 'matchingContentFile', - MixedContent = 'mixedContent', -} diff --git a/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts deleted file mode 100644 index e620bf96c..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/diff/PackageDiffImpl.ts +++ /dev/null @@ -1,166 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -import Git from '../../git/Git'; -import IgnoreFiles from '../../ignore/IgnoreFiles'; -import SFPLogger, { COLOR_ERROR, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import ProjectConfig from '../../project/ProjectConfig'; -import GitTags from '../../git/GitTags'; -import lodash = require('lodash'); -import { EOL } from 'os'; -import { PackageType } from '../SfpPackage'; - -export class PackageDiffOptions { - skipPackageDescriptorChange?: boolean = false; - //If not set, utlize latest git tags - useLatestGitTags?:boolean=true; - packagesMappedToLastKnownCommitId?: { [p: string]: string }; - pathToReplacementForceIgnore?: string; -} - -export default class PackageDiffImpl { - public constructor( - private logger: Logger, - private sfdx_package: string, - private project_directory: string|null, - private diffOptions?: PackageDiffOptions - ) {} - - public async exec(): Promise<{ isToBeBuilt: boolean; reason: string; tag?: string }> { - let git: Git = await Git.initiateRepo(this.logger,this.project_directory); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(this.project_directory); - let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig(this.sfdx_package, projectConfig); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `${EOL}Checking last known tags for ${this.sfdx_package} to determine whether package is to be built...`, - ), - LoggerLevel.TRACE, - this.logger - ); - - let tag: string; - if (!this.diffOptions?.useLatestGitTags && this.diffOptions?.packagesMappedToLastKnownCommitId != null) { - tag = this.getLatestCommitFromMap(this.sfdx_package, this.diffOptions?.packagesMappedToLastKnownCommitId); - } else { - tag = await this.getLatestTagFromGit(git, this.sfdx_package); - } - - if (tag) { - SFPLogger.log(COLOR_KEY_MESSAGE(`\nUtilizing tag ${tag} for ${this.sfdx_package}`),LoggerLevel.TRACE,this.logger); - - // Get the list of modified files between the tag and HEAD refs - let modified_files: string[]; - try { - modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); - } catch (error) { - SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`)); - SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`)); - SFPLogger.log(COLOR_ERROR(`Actual error received:`)); - SFPLogger.log(COLOR_ERROR(error)); - throw new Error(`Failed to compute git diff for package ${this.sfdx_package} against commit id ${tag}`) - } - - let packageType: string = ProjectConfig.getPackageType(projectConfig, this.sfdx_package); - - if (packageType !== PackageType.Data) modified_files = this.applyForceIgnoreToModifiedFiles(modified_files); - - SFPLogger.log( - `Checking for changes in source directory ${path.normalize(pkgDescriptor.path)}`, - LoggerLevel.TRACE, - this.logger - ); - - // Check whether the package has been modified - for (let filename of modified_files) { - - let normalizedPkgPath = path.normalize(pkgDescriptor.path); - let normalizedFilename = path.normalize(filename); - - let relativePath = path.relative(normalizedPkgPath, normalizedFilename); - - if (!relativePath.startsWith('..')) { - SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger); - return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag }; - } - } - - SFPLogger.log( - `Checking for changes to package descriptor in sfdx-project.json`, - LoggerLevel.TRACE, - this.logger - ); - let isPackageDescriptorChanged = await this.isPackageDescriptorChanged(git, tag, pkgDescriptor); - if (isPackageDescriptorChanged) { - return { isToBeBuilt: true, reason: `Package Descriptor Changed`, tag: tag }; - } - - return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; - } else { - SFPLogger.log( - `Tag missing for ${this.sfdx_package}...marking package for build anyways`, - LoggerLevel.TRACE, - this.logger - ); - return { isToBeBuilt: true, reason: `Previous version not found` }; - } - } - - private applyForceIgnoreToModifiedFiles(modified_files: string[]) { - let forceignorePath: string; - if (this.diffOptions?.pathToReplacementForceIgnore) forceignorePath = this.diffOptions?.pathToReplacementForceIgnore; - else if (this.project_directory != null) forceignorePath = path.join(this.project_directory, '.forceignore'); - else forceignorePath = '.forceignore'; - - let ignoreFiles: IgnoreFiles = new IgnoreFiles(fs.readFileSync(forceignorePath).toString()); - - // Filter the list of modified files with .forceignore - modified_files = ignoreFiles.filter(modified_files); - - return modified_files; - } - - private async getLatestTagFromGit(git: Git, sfdx_package: string): Promise { - const gitTags: GitTags = new GitTags(git, sfdx_package); - let tags: string[] = await gitTags.listTagsOnBranch(); - - SFPLogger.log('Analysing tags:', LoggerLevel.DEBUG); - if (tags.length > 10) { - SFPLogger.log(tags.slice(-10).toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); - } else { - SFPLogger.log(tags.toString().replace(/,/g, '\n'), LoggerLevel.TRACE,this.logger); - } - - return tags.pop(); - } - - private async isPackageDescriptorChanged(git: Git, latestTag: string, packageDescriptor: any): Promise { - let projectConfigJson: string = await git.show([`${latestTag}:sfdx-project.json`]); - let projectConfig = JSON.parse(projectConfigJson); - - let packageDescriptorFromLatestTag: string; - for (let dir of projectConfig['packageDirectories']) { - if (this.sfdx_package === dir.package) { - packageDescriptorFromLatestTag = dir; - } - } - - if (!lodash.isEqual(packageDescriptor, packageDescriptorFromLatestTag)) { - SFPLogger.log(`Found change in ${this.sfdx_package} package descriptor`, LoggerLevel.TRACE, this.logger); - - //skip check and ignore - if (this.diffOptions?.skipPackageDescriptorChange) { - SFPLogger.log(`Ignoring changes in package desriptor as asked to..`, LoggerLevel.TRACE, this.logger); - return false; - } else return true; - } else return false; - } - - private getLatestCommitFromMap(sfdx_package: string, packagesToCommits: { [p: string]: string }): string { - if (packagesToCommits[sfdx_package] != null) { - return packagesToCommits[sfdx_package]; - } else { - return null; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts b/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts deleted file mode 100644 index cf5e58c58..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/generators/SfpPackageContentGenerator.ts +++ /dev/null @@ -1,301 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import * as rimraf from 'rimraf'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { mkdirpSync } from 'fs-extra'; -import * as fs from 'fs-extra'; -import PackageComponentDiff from '../diff/PackageComponentDiff'; -let path = require('path'); - -export default class SfpPackageContentGenerator { - public static isPreDeploymentScriptAvailable: boolean = false; - public static isPostDeploymentScriptAvailable: boolean = false; - - public static async generateSfpPackageDirectory( - logger: Logger, - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - packageDirectory: string, - versionNumber:string, - destructiveManifestFilePath?: string, - configFilePath?: string, - pathToReplacementForceIgnore?: string, - revisionFrom?: string, - revisionTo?: string - ): Promise { - let artifactDirectory: string = `.sfp/${this.makefolderid(5)}_source`, - rootDirectory: string; - - if (projectDirectory) { - rootDirectory = projectDirectory; - } else { - rootDirectory = ''; - } - - if (packageDirectory == null) packageDirectory = ''; - - mkdirpSync(artifactDirectory); - - //Ensure the directory is clean - rimraf.sync(path.join(artifactDirectory, packageDirectory)); - - //Create a new directory - fs.mkdirsSync(path.join(artifactDirectory, packageDirectory)); - - SfpPackageContentGenerator.createScripts(artifactDirectory, rootDirectory, sfdx_package); - - SfpPackageContentGenerator.createForceIgnores(artifactDirectory, rootDirectory); - - - if (pathToReplacementForceIgnore) - SfpPackageContentGenerator.replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger); - - if (destructiveManifestFilePath) { - SfpPackageContentGenerator.copyDestructiveManifests( - destructiveManifestFilePath, - artifactDirectory, - rootDirectory, - logger - ); - } - - if (configFilePath) { - SfpPackageContentGenerator.copyConfigFilePath(configFilePath, artifactDirectory, rootDirectory, logger); - } - - SfpPackageContentGenerator.handleUnpackagedMetadata( - sfdx_package, - projectConfig, - rootDirectory, - artifactDirectory - ); - - SfpPackageContentGenerator.createPackageManifests( - artifactDirectory, - rootDirectory, - projectConfig, - sfdx_package, - versionNumber - ); - - fs.copySync(path.join(rootDirectory, packageDirectory), path.join(artifactDirectory, packageDirectory)); - - return artifactDirectory; - } - - private static handleUnpackagedMetadata( - sfdx_package: string, - projectConfig: any, - rootDirectory: string, - artifactDirectory: string - ) { - const packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdx_package, projectConfig); - if (packageDescriptor.unpackagedMetadata?.path) { - if (fs.pathExistsSync(packageDescriptor.unpackagedMetadata.path)) { - let unpackagedMetadataDir: string = path.join(artifactDirectory, `unpackagedMetadata`); - mkdirpSync(unpackagedMetadataDir); - fs.copySync(path.join(rootDirectory, packageDescriptor.unpackagedMetadata.path), unpackagedMetadataDir); - } else { - throw new Error(`unpackagedMetadata ${packageDescriptor.unpackagedMetadata.path} does not exist`); - } - } - } - - private static createPackageManifests( - artifactDirectory: string, - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - versionNumber:string - ) { - // Create pruned package manifest in source directory - let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdx_package); - - //Ensure version numbers are used from - cleanedUpProjectManifest.packageDirectories[0].versionNumber=versionNumber - - //Handle unpackaged metadata - if (fs.existsSync(path.join(artifactDirectory, 'unpackagedMetadata'))) { - cleanedUpProjectManifest.packageDirectories[0].unpackagedMetadata.path = path.join('unpackagedMetadata'); - cleanedUpProjectManifest.packageDirectories.push({ path: path.join('unpackagedMetadata'), default: false }); - } - - //Setup preDeployment Script Path - if (fs.existsSync(path.join(artifactDirectory, 'scripts', `preDeployment`))) - cleanedUpProjectManifest.packageDirectories[0].preDeploymentScript = path.join('scripts', `preDeployment`); - - //Setup postDeployment Script Path - if (fs.existsSync(path.join(artifactDirectory, 'scripts', `postDeployment`))) - cleanedUpProjectManifest.packageDirectories[0].postDeploymentScript = path.join( - 'scripts', - `postDeployment` - ); - - fs.writeFileSync(path.join(artifactDirectory, 'sfdx-project.json'), JSON.stringify(cleanedUpProjectManifest)); - - // Copy original package manifest - let manifestsDir: string = path.join(artifactDirectory, `manifests`); - mkdirpSync(manifestsDir); - fs.copySync(path.join(projectDirectory, 'sfdx-project.json'), path.join(manifestsDir, 'sfdx-project.json.ori')); - } - - /** - * Create scripts directory containing preDeploy & postDeploy - * @param artifactDirectory - * @param projectDirectory - * @param sfdx_package - */ - private static createScripts(artifactDirectory: string, projectDirectory: string, sfdx_package): void { - let scriptsDir: string = path.join(artifactDirectory, `scripts`); - mkdirpSync(scriptsDir); - - let packageDescriptor = ProjectConfig.getSFDXPackageDescriptor(projectDirectory, sfdx_package); - - if (packageDescriptor.preDeploymentScript) { - if (projectDirectory) - packageDescriptor.preDeploymentScript = path.join( - projectDirectory, - packageDescriptor.preDeploymentScript - ); - - if (fs.existsSync(packageDescriptor.preDeploymentScript)) { - fs.copySync(packageDescriptor.preDeploymentScript, path.join(scriptsDir, `preDeployment`)); - } else { - throw new Error(`preDeploymentScript ${packageDescriptor.preDeploymentScript} does not exist`); - } - } - - if (packageDescriptor.postDeploymentScript) { - if (projectDirectory) - packageDescriptor.postDeploymentScript = path.join( - projectDirectory, - packageDescriptor.postDeploymentScript - ); - - if (fs.existsSync(packageDescriptor.postDeploymentScript)) { - fs.copySync(packageDescriptor.postDeploymentScript, path.join(scriptsDir, `postDeployment`)); - } else { - throw new Error(`postDeploymentScript ${packageDescriptor.postDeploymentScript} does not exist`); - } - } - } - - /** - * Create root forceignore and forceignores directory containing ignore files for different stages - * @param artifactDirectory - * @param projectDirectory - */ - private static createForceIgnores(artifactDirectory: string, projectDirectory: string): void { - let forceIgnoresDir: string = path.join(artifactDirectory, `forceignores`); - mkdirpSync(forceIgnoresDir); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let ignoreFiles = projectConfig.plugins?.sfp?.ignoreFiles; - - //TODO: Make this readable - //This is a fix when sfppackage is used in stages where build is not involved - //So it has to be build from the root of the unzipped directory - //and whatever mentioned in .json is already translated - - let rootForceIgnore: string = path.join(projectDirectory, '.forceignore'); - let copyForceIgnoreForStage = (stage) => { - if (ignoreFiles?.[stage]) { - if (fs.existsSync(path.join(projectDirectory, ignoreFiles[stage]))) { - fs.copySync( - path.join(projectDirectory, ignoreFiles[stage]), - path.join(forceIgnoresDir, '.' + stage + 'ignore') - ); - } else if (fs.existsSync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'))) { - fs.copySync( - path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'), - path.join(forceIgnoresDir, '.' + stage + 'ignore') - ); - } else throw new Error(`${ignoreFiles[stage]} does not exist`); - } else fs.copySync(rootForceIgnore, path.join(forceIgnoresDir, '.' + stage + 'ignore')); - - //append additional entry to force ignore file - //TODO: Revisit the location - fs.appendFileSync( path.join(forceIgnoresDir, '.' + stage + 'ignore'),"\n**/postDeploy"); - }; - - let stages: string[] = ['prepare', 'validate', 'quickbuild', 'build']; - stages.forEach((stage) => copyForceIgnoreForStage(stage)); - - fs.copySync(rootForceIgnore, path.join(artifactDirectory, '.forceignore')); - } - - /** - * Replaces root forceignore with provided forceignore - * @param artifactDirectory - * @param pathToReplacementForceIgnore - */ - private static replaceRootForceIgnore( - artifactDirectory: string, - pathToReplacementForceIgnore: string, - logger: Logger - ): void { - if (fs.existsSync(pathToReplacementForceIgnore)) { - fs.copySync(pathToReplacementForceIgnore, path.join(artifactDirectory, '.forceignore')); - } else { - SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, logger); - SFPLogger.log( - 'Package creation will continue using the unchanged forceignore in the root directory', - LoggerLevel.INFO, - logger - ); - } - } - - private static copyDestructiveManifests( - destructiveManifestFilePath: string, - artifactDirectory: string, - projectDirectory: any, - logger: Logger - ) { - if (fs.existsSync(destructiveManifestFilePath)) { - try { - fs.mkdirsSync(path.join(artifactDirectory, 'destructive')); - fs.copySync( - path.join(projectDirectory, destructiveManifestFilePath), - path.join(artifactDirectory, 'destructive', 'destructiveChanges.xml') - ); - } catch (error) { - SFPLogger.log( - 'Unable to read/parse destructive manifest, Please check your artifacts, Will result in an error while deploying', - LoggerLevel.WARN, - logger - ); - } - } - } - - private static copyConfigFilePath( - configFilePath: string, - artifactDirectory: string, - projectDirectory: any, - logger: Logger - ) { - if (fs.existsSync(configFilePath)) { - try { - fs.mkdirsSync(path.join(artifactDirectory, 'config')); - fs.copySync( - path.join(projectDirectory, configFilePath), - path.join(artifactDirectory, 'config', 'project-scratch-def.json') - ); - } catch (error) { - SFPLogger.log(error, LoggerLevel.TRACE, logger); - SFPLogger.log('Utilizing default config file path', LoggerLevel.TRACE, logger); - } - } - } - - private static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts deleted file mode 100644 index 5d59eadba..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDataPackageImpl.ts +++ /dev/null @@ -1,86 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import path from 'path'; -import FileSystem from '../../utils/FileSystem'; -import { CreatePackage } from './CreatePackage'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; - -const SFDMU_CONFIG = 'export.json'; -const VLOCITY_CONFIG = 'VlocityComponents.yaml'; - -export default class CreateDataPackageImpl extends CreatePackage { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Data; - } - - isEmptyPackage(projectDirectory: string, packageDirectory: string): boolean { - let files: string[] = FileSystem.readdirRecursive(path.join(projectDirectory, packageDirectory)); - - let hasExportJson = files.find((file) => path.basename(file) === 'export.json'); - - let hasCsvFile = files.find((file) => path.extname(file) === '.csv'); - - let hasYAMLFile = files.find((file) => path.extname(file) === '.yaml'); //check for vlocity config - - if(hasYAMLFile) return false; - - if (!hasExportJson || !hasCsvFile) return true; - else return false; - } - - preCreatePackage(sfpPackage) { - this.validateDataPackage(sfpPackage.resolvedPackageDirectory); - } - - createPackage(sfpPackage: SfpPackage) { - //Do Nothing, as no external calls or processing is required - } - - postCreatePackage(sfpPackage: SfpPackage) {} - - printAdditionalPackageSpecificHeaders() {} - - // Validate type of data package and existence of the correct configuration files - private validateDataPackage(packageDirectory: string) { - const files = FileSystem.readdirRecursive(packageDirectory); - let isSfdmu: boolean; - let isVlocity: boolean; - - for (const file of files) { - if (path.basename(file) === SFDMU_CONFIG) isSfdmu = true; - if (path.basename(file) === VLOCITY_CONFIG) isVlocity = true; - } - - if (isSfdmu && isVlocity) { - throw new Error( - `Data package '${this.sfpPackage.packageName}' contains both SFDMU & Vlocity configuration` - ); - } else if (isSfdmu) { - SFPLogger.log( - `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, - LoggerLevel.INFO, - this.logger - ); - } else if (isVlocity) { - SFPLogger.log( - `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, - LoggerLevel.INFO, - this.logger - ); - } else { - throw new Error( - `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts deleted file mode 100644 index e94b293ab..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateDiffPackageImpl.ts +++ /dev/null @@ -1,271 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import { ApexSortedByType } from '../../apex/parser/ApexTypeFetcher'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import SfpPackage, { DiffPackageMetadata, PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import SFPOrg from '../../org/SFPOrg'; -import CreateSourcePackageImpl from './CreateSourcePackageImpl'; -import PackageToComponent from '../components/PackageToComponent'; -import path from 'path'; -import * as fs from 'fs-extra'; -import ImpactedApexTestClassFetcher from '../../apextest/ImpactedApexTestClassFetcher'; -import SourceToMDAPIConvertor from '../packageFormatConvertors/SourceToMDAPIConvertor'; -import PackageManifest from '../components/PackageManifest'; -import MetadataCount from '../components/MetadataCount'; -import * as rimraf from 'rimraf'; -import Component from '../../dependency/Component'; -import PackageComponentDiff from '../diff/PackageComponentDiff'; - -export default class CreateDiffPackageImp extends CreateSourcePackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Diff; - } - - printAdditionalPackageSpecificHeaders() {} - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - async preCreatePackage(sfpPackage: SfpPackage) { - const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); - - //Fetch Baseline commit from DevHub - let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg); - - if (this.packageCreationParams.revisionFrom) { - this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom; - } else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) { - this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]; - } else { - this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion; - } - - if (this.packageCreationParams.revisionTo) { - this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo; - } else { - this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion; - } - } - - private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) { - let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts(); - let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts); - return packagesInstalledInOrgMappedToCommits; - } - - public async createPackage(sfpPackage: SfpPackage) { - //Unresolved SHAs can be same if the package is not installed in the org or is the same - if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) { - try { - let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff( - this.logger, - this.sfpPackage.packageName, - this.sfpPackage.commitSHAFrom, - this.sfpPackage.commitSHATo, - true - ); - await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff')); - } catch (error) { - //if both are same after git resolution.. just do nothing, treat is a normal source package - if (error.message.includes('Unable to compute diff, as both commits are same')) { - SFPLogger.log( - `Both commits are same, treating it as an empty package`, - LoggerLevel.WARN, - this.logger - ); - //Create an empty diff directory to force skip of packages - const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`); - fs.mkdirpSync(diffSrcDir); - } else throw error; - } - - await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger); - - await this.replaceSourceWithDiff( - sfpPackage.workingDirectory, - sfpPackage.packageDirectory, - `diff/${sfpPackage.packageDirectory}` - ); - - SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { - package: sfpPackage.packageName, - type: sfpPackage.packageType, - }); - } - } - - postCreatePackage(sfpPackage) {} - - private async replaceSourceWithDiff( - workingDirectory: string, - packageDirectory: string, - diffPackageDirectory: string - ) { - const srcDir = path.join(workingDirectory, packageDirectory); - const diffSrcDir = path.join(workingDirectory, diffPackageDirectory); - - // Check if src directories exist, if so remove them - if (fs.pathExistsSync(srcDir)) await fs.remove(srcDir); - - // Rename diff/src directory to src - if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir); - else { - // Ensure package directory exists - await fs.mkdirpSync(diffSrcDir); - await fs.move(diffSrcDir, srcDir); - } - - //check if destructiveChanges.xml exist in diff directory - const destructiveChangesPath = path.join(workingDirectory, 'diff', 'destructiveChanges.xml'); - if (fs.existsSync(destructiveChangesPath)) { - //Move destructiveChanges.xml to diff directory - await fs.move(destructiveChangesPath, path.join(workingDirectory, 'destructiveChanges.xml')); - } - //remove diffSrcDir - if (fs.pathExistsSync(path.join(workingDirectory, 'diff'))) - fs.removeSync(path.join(workingDirectory, 'diff')); - } - - async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) { - let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; - packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts); - - return packagesMappedToLastKnownCommitId; - - async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> { - const packagesToCommits: { [p: string]: string } = {}; - let jsonOverrides = {}; - - // Add an option to override diff package from during debugging - // Also useful for when the record is yet to be baselined - try { - const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8'); - jsonOverrides = JSON.parse(jsonData); - } catch (error) { - console.log('No JSON override file found or there is an error reading it'); - } - - // Merge the installedArtifacts data with the JSON overrides - if (installedArtifacts) { - installedArtifacts.forEach((artifact) => { - packagesToCommits[artifact.Name] = artifact.CommitId__c; - }); - } - - // Add additional packages from the JSON overrides that are not in installedArtifacts - Object.keys(jsonOverrides).forEach((pkgName) => { - if (!packagesToCommits.hasOwnProperty(pkgName)) { - packagesToCommits[pkgName] = jsonOverrides[pkgName]; - } - }); - - if (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; - - return packagesToCommits; - } - } - - private async introspectDiffPackageCreated( - sfpPackage: SfpPackage, - packageParams: SfpPackageParams, - logger: Logger - ): Promise { - let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff'); - if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) { - let changedComponents = new PackageToComponent( - sfpPackage.packageName, - path.join(workingDirectory, sfpPackage.packageDirectory) - ).generateComponents(); - - let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher( - sfpPackage, - changedComponents, - logger - ); - let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses(); - - //Convert again for finding the values in the diff package - let sourceToMdapiConvertor = new SourceToMDAPIConvertor( - workingDirectory, - sfpPackage.packageDescriptor.path, - sfpPackage.apiVersion, - logger - ); - - let mdapiDirPath = (await sourceToMdapiConvertor.convert()).packagePath; - - const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath); - - sfpPackage.payload = packageManifest.manifestJson; - sfpPackage.apexTestClassses = impactedTestClasses; - sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage( - changedComponents, - sfpPackage.apexClassesSortedByTypes - ); - sfpPackage.isApexFound = packageManifest.isApexInPackage(); - sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage(); - sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage(); - sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles(); - - sfpPackage.metadataCount = await MetadataCount.getMetadataCount( - workingDirectory, - sfpPackage.packageDescriptor.path - ); - rimraf.sync(mdapiDirPath); - } else { - //Souce Diff Directory is empty - sfpPackage.payload = {}; - sfpPackage.apexTestClassses = []; - sfpPackage.apexClassWithOutTestClasses = []; - sfpPackage.isApexFound = false; - sfpPackage.isProfilesFound = false; - sfpPackage.isPermissionSetGroupFound = false; - sfpPackage.isPayLoadContainTypesSupportedByProfiles = false; - sfpPackage.metadataCount = 0; - } - - function getOnlyChangedClassesFromPackage( - changedComponents: Component[], - apexClassesSortedByTypes: ApexSortedByType - ): string[] { - // Check if the parameters are not empty or undefined - if (!changedComponents || !apexClassesSortedByTypes) { - return undefined; - } - - // Check if the 'class' property exists in apexClassesSortedByTypes - if (!apexClassesSortedByTypes.class) { - return undefined; - } - - // Get the names of all classes in the ApexSortedByType - let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name); - let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name); - const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name); - apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name)); - apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name)); - - // Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass' - const filteredComponents = changedComponents.filter( - (component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass' - ); - - // Extract the fullName property from the filtered components - const filteredChangedClasses = filteredComponents.map((component) => component.fullName); - - return filteredChangedClasses; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts deleted file mode 100644 index 4f5225b8d..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreatePackage.ts +++ /dev/null @@ -1,146 +0,0 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; - -export abstract class CreatePackage { - private startTime: number; - - constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams?: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - //Initialize Params - if (this.params == null) this.params = {}; - } - - public async exec(): Promise { - //Capture Start TimegetSFDXProjectConfig - this.startTime = Date.now(); - - //Print Header - this.printHeader(); - - //Check if the package is empty - await this.checkWhetherProvidedPackageIsEmpty(this.sfpPackage.packageDescriptor.path); - //Call lifecycle commands - await this.preCreatePackage(this.sfpPackage); - await this.createPackage(this.sfpPackage); - await this.postCreatePackage(this.sfpPackage); - - //Add addtional descriptors available - this.writeDeploymentStepsToArtifact(this.sfpPackage); - - //Send Metrics to Logging system - this.sendMetricsWhenSuccessfullyCreated(); - - return this.sfpPackage; - } - - abstract getTypeOfPackage(); - - abstract preCreatePackage(sfpPackage: SfpPackage); - abstract createPackage(sfpPackage: SfpPackage); - abstract postCreatePackage(sfpPackage: SfpPackage); - - private sendMetricsWhenSuccessfullyCreated() { - let elapsedTime = Date.now() - this.startTime; - - this.sfpPackage.creation_details = { - creation_time: elapsedTime, - timestamp: Date.now(), - }; - - if (this.getTypeOfPackage() === PackageType.Source || this.getTypeOfPackage() === PackageType.Unlocked) - SFPStatsSender.logGauge('package.metadatacount', this.sfpPackage.metadataCount, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - }); - - SFPStatsSender.logCount('package.created', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - - SFPStatsSender.logElapsedTime('package.elapsed.time', this.sfpPackage.creation_details.creation_time, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - SFPStatsSender.logElapsedTime('package.creation.elapsed_time', this.sfpPackage.creation_details.creation_time, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - is_dependency_validated: String(this.sfpPackage.isDependencyValidated), - }); - } - - private writeDeploymentStepsToArtifact(packageDescriptor: any) { - if (packageDescriptor.assignPermSetsPreDeployment) { - if (packageDescriptor.assignPermSetsPreDeployment instanceof Array) - this.sfpPackage.assignPermSetsPreDeployment = packageDescriptor.assignPermSetsPreDeployment; - else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); - } - - if (packageDescriptor.assignPermSetsPostDeployment) { - if (packageDescriptor.assignPermSetsPostDeployment instanceof Array) - this.sfpPackage.assignPermSetsPostDeployment = packageDescriptor.assignPermSetsPostDeployment; - else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); - } - } - - private async checkWhetherProvidedPackageIsEmpty(packageDirectory: string) { - if (await this.isEmptyPackage(this.projectDirectory, packageDirectory)) { - if (this.packageCreationParams.breakBuildIfEmpty) - throw new Error(`Package directory ${packageDirectory} is empty`); - else this.printEmptyArtifactWarning(); - } - } - - abstract isEmptyPackage(projectDirectory: string, packageDirectory: string); - - protected printEmptyArtifactWarning() { - SFPLogger.printHeaderLine( - `WARNING! Empty aritfact encountered`, - COLOR_WARNING, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - 'Either this folder is empty or the application of .forceignore results in an empty folder', - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log('Proceeding to create an empty artifact', LoggerLevel.INFO, this.logger); - SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO,this.logger); - } - - private printHeader() { - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`create package`)}`), LoggerLevel.INFO, this.logger); - SFPLogger.log( - COLOR_HEADER(`package name: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageName}`)}`), - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - COLOR_HEADER(`package type: ${COLOR_KEY_MESSAGE(`${this.getTypeOfPackage()}`)}`), - LoggerLevel.INFO, - this.logger - ); - - SFPLogger.log( - COLOR_HEADER(`package directory: ${COLOR_KEY_MESSAGE(`${this.sfpPackage.packageDescriptor.path}`)}`), - LoggerLevel.INFO, - this.logger - ); - - this.printAdditionalPackageSpecificHeaders(); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - abstract printAdditionalPackageSpecificHeaders(); -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts deleted file mode 100644 index bbef35a16..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateSourcePackageImpl.ts +++ /dev/null @@ -1,117 +0,0 @@ -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; -import { ApexSortedByType, FileDescriptor } from '../../apex/parser/ApexTypeFetcher'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { CreatePackage } from './CreatePackage'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; -import { COLOR_INFO } from '@flxblio/sfp-logger'; -import { COLOR_HEADER } from '@flxblio/sfp-logger'; -import { COLOR_WARNING } from '@flxblio/sfp-logger'; -const Table = require('cli-table'); - -export default class CreateSourcePackageImpl extends CreatePackage { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Source; - } - - printAdditionalPackageSpecificHeaders() {} - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - preCreatePackage(sfpPackage: SfpPackage) {} - - public async createPackage(sfpPackage: SfpPackage) { - this.handleApexTestClasses(sfpPackage); - - SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, { - package: sfpPackage.packageName, - type: sfpPackage.packageType, - }); - } - - postCreatePackage(sfpPackage) {} - - protected handleApexTestClasses(sfpPackage: SfpPackage) { - let classTypes: ApexSortedByType = sfpPackage.apexClassesSortedByTypes; - - if (sfpPackage.isApexFound && classTypes?.testClass?.length == 0) { - this.printSlowDeploymentWarning(); - sfpPackage.isTriggerAllTests = true; - } else if (sfpPackage.isApexFound && classTypes?.testClass?.length > 0) { - if (classTypes?.parseError?.length > 0) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - SFPLogger.log( - 'Unable to parse these classes to correctly identify test classes, Its not your issue, its ours!'+ - 'Please raise a issue in our repo!', - LoggerLevel.INFO, - this.logger - ); - this.printClassesIdentified(classTypes?.parseError); - sfpPackage.isTriggerAllTests = true; - } else { - this.printHintForOptimizedDeployment(); - sfpPackage.isTriggerAllTests = false; - this.printClassesIdentified(classTypes?.testClass); - sfpPackage.apexTestClassses = []; - classTypes?.testClass.forEach((element) => { - sfpPackage.apexTestClassses.push(element.name); - }); - } - } - } - - private printHintForOptimizedDeployment() { - SFPLogger.printHeaderLine('OPTION FOR DEPLOYMENT OPTIMIZATION AVAILABLE',COLOR_HEADER,LoggerLevel.INFO,this.logger); - SFPLogger.log( - `Following apex test classes were identified and can be used for deploying this package,${EOL}` + - `in an optimal manner, provided each individual class meets the test coverage requirement of 75% and above${EOL}` + - `Ensure each apex class/trigger is validated for coverage in the validation stage`, - null, - this.logger - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - private printSlowDeploymentWarning() { - SFPLogger.printHeaderLine('WARNING! YOU MIGHT NOT BE ABLE TO DEPLOY OR WILL HAVE A SLOW DEPLOYMENT',COLOR_WARNING,LoggerLevel.INFO,this.logger); - SFPLogger.log( - `This package has apex classes/triggers, however apex test classes were not found, You would not be able to deploy` + - `to production org optimally if each class do not have coverage of 75% and above,We will attempt deploying` + - `this package by triggering all local tests in the org which could be realy costly in terms of deployment time!`, - null, - this.logger - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.logger); - } - - private printClassesIdentified(fetchedClasses: FileDescriptor[]) { - if (fetchedClasses === null || fetchedClasses === undefined) return; - - let table = new Table({ - head: ['Class', 'Error'], - chars: ZERO_BORDER_TABLE - }); - - for (let fetchedClass of fetchedClasses) { - let item = [fetchedClass.name, fetchedClass.error ? JSON.stringify(fetchedClass.error) : 'N/A']; - table.push(item); - } - SFPLogger.log('Following apex test classes were identified', LoggerLevel.INFO, this.logger); - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.logger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts deleted file mode 100644 index 3d15823b1..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageCreators/CreateUnlockedPackageImpl.ts +++ /dev/null @@ -1,262 +0,0 @@ -import ProjectConfig from '../../project/ProjectConfig'; -import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -import { delay } from '../../utils/Delay'; -import SfpPackage, { PackageType, SfpPackageParams } from '../SfpPackage'; -import { CreatePackage } from './CreatePackage'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import PackageVersionCoverage from '../coverage/PackageVersionCoverage'; -import { Connection, SfProject } from '@salesforce/core'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import { EOL } from 'os'; -import SFPOrg, { PackageTypeInfo } from '../../org/SFPOrg'; -import { PackageCreationParams } from '../SfpPackageBuilder'; -import { PackageVersion, PackageVersionCreateRequestResult } from '@salesforce/packaging'; -import { Duration } from '@salesforce/kit'; -import PackageDependencyDisplayer from '../../display/PackageDependencyDisplayer'; -const path = require('path'); - -export default class CreateUnlockedPackageImpl extends CreatePackage { - private static packageTypeInfos: PackageTypeInfo[]; - private isOrgDependentPackage: boolean = false; - private connection: Connection; - private devhubOrg: SFPOrg; - workingDirectory: string; - - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - super(projectDirectory, sfpPackage, packageCreationParams, logger, params); - } - - getTypeOfPackage() { - return PackageType.Unlocked; - } - - async preCreatePackage(sfpPackage: SfpPackage) { - this.devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub }); - - this.connection = this.devhubOrg.getConnection(); - - let packageId = ProjectConfig.getPackageId(sfpPackage.projectConfig, this.sfpPackage.packageName); - - // Get working directory - this.workingDirectory = sfpPackage.workingDirectory; - - //Get the one in working directory, this is always hardcoded to match - this.params.configFilePath = path.join('config', 'project-scratch-def.json'); - - //Get Type of Package - SFPLogger.log('Fetching Package Type Info from DevHub', LoggerLevel.INFO, this.logger); - let packageTypeInfos = await this.getPackageTypeInfos(); - let packageTypeInfo = packageTypeInfos.find((pkg) => pkg.Id == packageId); - if (packageTypeInfo == null) { - SFPLogger.log( - 'Unable to find a package info for this particular package, Are you sure you created this package?', - LoggerLevel.WARN, - this.logger - ); - throw new Error('Unable to fetch Package Info'); - } - - if (packageTypeInfo.IsOrgDependent == 'Yes') this.isOrgDependentPackage = true; - - SFPLogger.log(`Package ${packageTypeInfo.Name}`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`IsOrgDependent ${packageTypeInfo.IsOrgDependent}`, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Package Id ${packageTypeInfo.Id}`, LoggerLevel.INFO, this.logger); - SFPLogger.log('-------------------------', LoggerLevel.INFO, this.logger); - - //cleanup sfp constructs in working directory - this.deletesfpAdditionsToProjectConfig(this.workingDirectory); - - //Resolve the package dependencies - if (this.isOrgDependentPackage) { - // Store original dependencies to artifact - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } else if (!this.isOrgDependentPackage && !this.packageCreationParams.isSkipValidation) { - sfpPackage.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - this.workingDirectory, - this.sfpPackage.packageName - ); - //Store the resolved dependencies - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } else { - sfpPackage.dependencies = sfpPackage.packageDescriptor['dependencies']; - } - - //Print Dependencies - PackageDependencyDisplayer.printPackageDependencies(sfpPackage.dependencies,sfpPackage.projectConfig, this.logger); - - } - - async createPackage(sfpPackage: SfpPackage) { - const sfProject = await SfProject.resolve(this.workingDirectory); - - // fix for #1202 - // bug packaging lib doesnt support unpackaged metadata from working directory which is not the root - // it keeps on searching for the unpackage in the root folder - // so fix up the path manually - let targetPackageDir = sfProject.getPackageDirectories()[0]; - if (targetPackageDir['unpackagedMetadata']) - targetPackageDir['unpackagedMetadata'] = { path: path.join(this.workingDirectory, 'unpackagedMetadata') }; - - let result = await PackageVersion.create( - { - connection: this.devhubOrg.getConnection(), - project: sfProject, - installationkey: this.packageCreationParams.installationkey, - installationkeybypass: this.packageCreationParams.installationkeybypass, - tag: sfpPackage.tag, - skipvalidation: - this.packageCreationParams.isSkipValidation && !this.isOrgDependentPackage ? true : false, - codecoverage: - this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage ? true : false, - versionnumber: sfpPackage.versionNumber, - definitionfile: path.join(this.workingDirectory, this.params.configFilePath), - packageId: this.sfpPackage.packageName, - }, - { timeout: Duration.minutes(0), frequency: Duration.seconds(30) } - ); - - SFPLogger.log(`Package creation for ${this.sfpPackage.packageName} Initiated`, LoggerLevel.INFO, this.logger); - //Poll for package creation every 30 seconds - let currentPackageCreationStatus: PackageVersionCreateRequestResult; - while (true) { - await delay(30000); //Poll every 30 seconds - currentPackageCreationStatus = await PackageVersion.getCreateStatus( - result.Id, - this.devhubOrg.getConnection() - ); - - //Too Verbose when reading errors.. use only for debug - SFPLogger.log( - `Status: ${COLOR_KEY_MESSAGE(currentPackageCreationStatus.Status)}, Next Status check in 30 seconds`, - LoggerLevel.DEBUG, - this.logger - ); - if (currentPackageCreationStatus.Status === `Success`) { - break; - } else if (currentPackageCreationStatus.Status === 'Error') { - let errorMessage = ''; - const errors = currentPackageCreationStatus?.Error; - if (errors?.length) { - errorMessage = 'Creation errors: '; - for (let i = 0; i < errors.length; i++) { - errorMessage += `\n${i + 1}) ${errors[i]}`; - } - } - throw new Error(`Unable to create ${this.sfpPackage.packageName} due to \n` + errorMessage); - } - } - - SFPLogger.log(`Package Result:${JSON.stringify(currentPackageCreationStatus)}`, LoggerLevel.TRACE, this.logger); - - //Get the full details on the package and throw an error if the result is null, usually when the comamnd is timed out - if (currentPackageCreationStatus.SubscriberPackageVersionId) { - sfpPackage.package_version_id = currentPackageCreationStatus.SubscriberPackageVersionId; - await this.getPackageInfo(sfpPackage); - } else { - throw new Error( - `The build for ${this.sfpPackage.packageName} was not completed in the wait time ${this.packageCreationParams.waitTime} provided.${EOL} - You might want to increase the wait time or better check the dependencies or convert to different package type ${EOL} - Read more about it here https://docs.flxblio.io/development-practices/types-of-packaging/unlocked-packages#build-options-with-unlocked-packages` - ); - } - - //Break if coverage is low - if (this.packageCreationParams.isCoverageEnabled && !this.isOrgDependentPackage) { - if (!sfpPackage.has_passed_coverage_check) - throw new Error('This package has not meet the minimum coverage requirement of 75%'); - } - } - - postCreatePackage(sfpPackage: SfpPackage) { - //copy the original config back as existing one would have cleaned up - fs.copyFileSync( - path.join(this.workingDirectory, 'sfdx-project-bak.json'), - path.join(this.workingDirectory, 'sfdx-project.json') - ); - fs.unlinkSync(path.join(this.workingDirectory, 'sfdx-project-bak.json')); - if (sfpPackage.isDependencyValidated) { - SFPStatsSender.logGauge('package.testcoverage', sfpPackage.test_coverage, { - package: sfpPackage.package_name, - from: 'createpackage', - }); - } - } - - isEmptyPackage(projectDirectory: string, packageDirectory: string) { - return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory); - } - - printAdditionalPackageSpecificHeaders() {} - - private deletesfpAdditionsToProjectConfig(workingDirectory: string) { - let projectManifestFromWorkingDirectory = ProjectConfig.getSFDXProjectConfig(workingDirectory); - let packageDescriptorInWorkingDirectory = ProjectConfig.getPackageDescriptorFromConfig( - this.sfpPackage.packageName, - projectManifestFromWorkingDirectory - ); - - fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project-bak.json'), projectManifestFromWorkingDirectory); - - //Cleanup sfp constructs - if (this.isOrgDependentPackage) delete packageDescriptorInWorkingDirectory['dependencies']; - - delete packageDescriptorInWorkingDirectory['type']; - delete packageDescriptorInWorkingDirectory['assignPermSetsPreDeployment']; - delete packageDescriptorInWorkingDirectory['assignPermSetsPostDeployment']; - delete packageDescriptorInWorkingDirectory['skipDeployOnOrgs']; - delete packageDescriptorInWorkingDirectory['skipTesting']; - delete packageDescriptorInWorkingDirectory['skipCoverageValidation']; - delete packageDescriptorInWorkingDirectory['ignoreOnStages']; - delete packageDescriptorInWorkingDirectory['ignoreDeploymentErrors']; - delete packageDescriptorInWorkingDirectory['preDeploymentScript']; - delete packageDescriptorInWorkingDirectory['postDeploymentScript']; - delete packageDescriptorInWorkingDirectory['aliasfy']; - delete packageDescriptorInWorkingDirectory['checkpointForPrepare']; - delete packageDescriptorInWorkingDirectory['testSynchronous']; - delete packageDescriptorInWorkingDirectory['tags']; - - fs.writeJsonSync(path.join(workingDirectory, 'sfdx-project.json'), projectManifestFromWorkingDirectory); - } - - private async getPackageInfo(sfpPackage: SfpPackage) { - let packageVersionCoverage: PackageVersionCoverage = new PackageVersionCoverage(this.connection, this.logger); - let count = 0; - while (count < 10) { - count++; - try { - SFPLogger.log('Fetching Version Number and Coverage details', LoggerLevel.INFO, this.logger); - - let pkgInfoResult = await packageVersionCoverage.getCoverage(sfpPackage.package_version_id); - - sfpPackage.isDependencyValidated = !this.packageCreationParams.isSkipValidation; - sfpPackage.package_version_number = pkgInfoResult.packageVersionNumber; - sfpPackage.test_coverage = pkgInfoResult.coverage; - sfpPackage.has_passed_coverage_check = pkgInfoResult.HasPassedCodeCoverageCheck; - break; - } catch (error) { - SFPLogger.log( - `Unable to fetch package version info due to ${error.message}`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log('Retrying...', LoggerLevel.INFO, this.logger); - await delay(2000); - continue; - } - } - } - - private async getPackageTypeInfos() { - if (CreateUnlockedPackageImpl.packageTypeInfos == null) { - CreateUnlockedPackageImpl.packageTypeInfos = await this.devhubOrg.listAllPackages(); - } - return CreateUnlockedPackageImpl.packageTypeInfos; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts b/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts deleted file mode 100644 index c58e992d7..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; -import path from 'path'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class SourceToMDAPIConvertor { - public constructor( - private projectDirectory: string, - private sourceDirectory: string, - private sourceApiVersion: string, - private logger?: Logger - ) {} - - public async convert() { - let mdapiDir = `.sfp/${this.makefolderid(5)}_mdapi`; - //Create destination directory - if (this.projectDirectory != null) mdapiDir = path.resolve(this.projectDirectory, mdapiDir); - - //Source Directory is nested inside project directory when used with artifacts - //TODO: projectDirectory nomenclature is incorrect, should be parentDirectory perhaps? - let resolvedSourceDirectory = this.sourceDirectory; - if (this.projectDirectory != null) - resolvedSourceDirectory = path.resolve(this.projectDirectory, this.sourceDirectory); - - //Build component set from provided source directory - let componentSet = ComponentSet.fromSource({ - fsPaths: [resolvedSourceDirectory], - }); - - if (this.sourceApiVersion) componentSet.sourceApiVersion = this.sourceApiVersion; - - const converter = new MetadataConverter(); - let convertResult = await converter.convert(componentSet, 'metadata', { - type: 'directory', - outputDirectory: mdapiDir, - }); - SFPLogger.log(`Source converted successfully to ${mdapiDir}`, LoggerLevel.TRACE, this.logger); - SFPLogger.log(`ConvertResult:` + JSON.stringify(convertResult), LoggerLevel.TRACE, this.logger); - - return convertResult; - } - - private makefolderid(length): string { - var result = ''; - var characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts deleted file mode 100644 index 9d4af0579..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallDataPackageImpl.ts +++ /dev/null @@ -1,104 +0,0 @@ -const fs = require('fs-extra'); -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import SFDMURunImpl from '../../sfdmuwrapper/SFDMURunImpl'; -import VlocityPackDeployImpl from '../../vlocitywrapper/VlocityPackDeployImpl'; -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -const path = require('path'); -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; - -export default class InstallDataPackageImpl extends InstallPackage { - public constructor( - sfpPackage: SfpPackage, - targetOrg:SFPOrg, - logger: Logger, - options: SfpPackageInstallationOptions, - ) { - super(sfpPackage, targetOrg, logger,options); - } - - public async install() { - try { - //Fetch the sfdxcommand executor for the type - let dataPackageDeployer: SFDXCommand = await this.getSFDXCommand( - this.sfpPackage.sourceDir, - this.packageDirectory - ); - - SFPLogger.log(`Executing installation command: ${dataPackageDeployer.getGeneratedSFDXCommandWithParams()}`,LoggerLevel.INFO,this.logger); - let result = await dataPackageDeployer.exec(false); - - SFPLogger.log(result, LoggerLevel.INFO, this.logger); - } catch (error) { - let csvIssuesReportFilepath: string = path.join( - this.sfpPackage.sourceDir, - this.packageDirectory, - `CSVIssuesReport.csv` - ); - if (fs.existsSync(csvIssuesReportFilepath)) { - SFPLogger.log( - `\n---------------------WARNING: SFDMU detected CSV issues, verify the following files -------------------------------`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log(fs.readFileSync(csvIssuesReportFilepath, 'utf8'), LoggerLevel.INFO, this.logger); - } - throw error; - } - } - private async getSFDXCommand(sourceDirectory: string, packageDirectory: string): Promise { - //Determine package type - let packageType: string = this.determinePackageType(path.join(sourceDirectory, packageDirectory)); - - //Pick the type of SFDX command to use - let dataPackageDeployer: SFDXCommand; - if (packageType === 'sfdmu') { - let orgDomainUrl = await new OrgDetailsFetcher( this.sfpOrg.getUsername()).getOrgDomainUrl(); - - dataPackageDeployer = new SFDMURunImpl( - sourceDirectory, - this.sfpOrg.getUsername(), - orgDomainUrl, - packageDirectory, - this.logger, - LoggerLevel.INFO - ); - } else if (packageType === 'vlocity') { - dataPackageDeployer = new VlocityPackDeployImpl( - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - packageDirectory, - null, - null - ); - } else { - throw new Error('Unsupported package type'); - } - - return dataPackageDeployer; - } - - private determinePackageType(packageDirectory: string): string { - if (fs.pathExistsSync(path.join(packageDirectory, 'export.json'))) { - SFPLogger.log( - `Found export.json in ${packageDirectory}.. Utilizing it as data package and will be deployed using sfdmu`, - LoggerLevel.INFO, - this.logger - ); - return 'sfdmu'; - } else if (fs.pathExistsSync(path.join(packageDirectory, 'VlocityComponents.yaml'))) { - SFPLogger.log( - `Found VlocityComponents.yaml in ${packageDirectory}.. Utilizing it as data package and will be deployed using vbt`, - LoggerLevel.INFO, - this.logger - ); - return 'vlocity'; - } else { - throw new Error( - `Could not find export.json or VlocityComponents.yaml in ${packageDirectory}. sfp only support vlocity or sfdmu based data packages` - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts deleted file mode 100644 index 304a5e2bd..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallPackage.ts +++ /dev/null @@ -1,497 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { PackageInstallationResult, PackageInstallationStatus } from './PackageInstallationResult'; -import ProjectConfig from '../../project/ProjectConfig'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import AssignPermissionSets from '../../permsets/AssignPermissionSets'; -import ScriptExecutor from '../../scriptExecutor/ScriptExecutorHelpers'; -import { Connection } from '@salesforce/core'; -import * as fs from 'fs-extra'; -import FileSystem from '../../utils/FileSystem'; -import OrgDetailsFetcher, { OrgDetails } from '../../org/OrgDetailsFetcher'; -import path = require('path'); -import PermissionSetGroupUpdateAwaiter from '../../permsets/PermissionSetGroupUpdateAwaiter'; -import SfpOrg from '../../org/SFPOrg'; -import SfpPackage, { PackageType } from '../SfpPackage'; -import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; -import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import getFormattedTime from '../../utils/GetFormattedTime'; -import { TestLevel } from '../../apextest/TestOptions'; -import { PostDeployersRegistry } from '../deploymentCustomizers/PostDeployersRegistry'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import PackageComponentPrinter from '../../display/PackageComponentPrinter'; -import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; -import { PreDeployersRegistry } from '../deploymentCustomizers/PreDeployersRegistry'; -import { AnalyzerRegistry } from '../../package/analyser/AnalyzerRegistry'; - -export class SfpPackageInstallationOptions { - installationkey?: string; - apexcompile?: string = 'package'; - securitytype?: string = 'none'; - upgradetype?: string = 'mixed-mode'; - waitTime?: string; - apiVersion?: string; - publishWaitTime?: number = 60; - skipTesting?: boolean; - optimizeDeployment?: boolean; - deploymentType?: DeploymentType; - disableArtifactCommit?: boolean = false; - isInstallingForValidation?: boolean; - skipIfPackageInstalled: boolean; - isDryRun?: boolean = false; - pathToReplacementForceIgnore?: string; -} - -export abstract class InstallPackage { - protected connection: Connection; - protected packageDescriptor; - protected packageDirectory; - - private _isArtifactToBeCommittedInOrg: boolean = true; - - public constructor( - protected sfpPackage: SfpPackage, - protected sfpOrg: SfpOrg, - protected logger: Logger, - protected options: SfpPackageInstallationOptions - ) { } - - public async exec(): Promise { - let startTime = Date.now(); - let elapsedTime: number; - try { - this.packageDescriptor = ProjectConfig.getSFDXPackageDescriptor( - this.sfpPackage.sourceDir, - this.sfpPackage.packageName - ); - - this.connection = this.sfpOrg.getConnection(); - - if (await this.isPackageToBeInstalled(this.options.skipIfPackageInstalled)) { - if (!this.options.isDryRun) { - await this.waitTillAllPermissionSetGroupIsUpdated(); - await this.assignPermsetsPreDeployment(); - await this.executePreDeploymentScripts(); - await this.setPackageDirectoryForPackage(); - await this.executePreDeployers(); - await this.checkPackageDirectoryExists(); - await this.install(); - await this.assignPermsetsPostDeployment(); - await this.executePostDeployers(); - await this.executePostDeploymentScript(); - await this.commitPackageInstallationStatus(); - - elapsedTime = Date.now() - startTime; - this.sendMetricsWhenSuccessfullyInstalled(elapsedTime); - } - return { result: PackageInstallationStatus.Succeeded, elapsedTime: elapsedTime }; - } else { - SFPLogger.log('Skipping Package Installation', LoggerLevel.INFO, this.logger); - return { result: PackageInstallationStatus.Skipped }; - } - } catch (error) { - elapsedTime = Date.now() - startTime; - this.sendMetricsWhenFailed(elapsedTime); - return { - result: PackageInstallationStatus.Failed, - message: error.message, - elapsedTime: elapsedTime, - }; - } - } - - checkPackageDirectoryExists() { - let absPackageDirectory: string = path.join(this.sfpPackage.sourceDir, this.packageDirectory); - if (!fs.existsSync(absPackageDirectory)) { - throw new Error(`Package directory ${absPackageDirectory} does not exist`); - } - } - - private async waitTillAllPermissionSetGroupIsUpdated() { - try { - //Package Has Permission Set Group - let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( - this.connection, - this.logger - ); - await permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated(); - } catch (error) { - //Ignore error - // Lets try proceeding - SFPLogger.log( - `Unable to check the status of Permission Set Groups due to ${error}`, - LoggerLevel.WARN, - this.logger - ); - } - } - - protected async setPackageDirectoryForPackage() { - if (this.packageDescriptor.aliasfy) { - const searchDirectory = path.join(this.sfpPackage.sourceDir, this.packageDescriptor.path); - const files = FileSystem.readdirRecursive(searchDirectory, true); - - let aliasDir: string; - - let alias = await this.sfpOrg.getAlias(); - aliasDir = files.find( - (file) => path.basename(file) === alias && fs.lstatSync(path.join(searchDirectory, file)).isDirectory() - ); - - SFPLogger.log(`Using alias directory ${aliasDir ? aliasDir : 'default'}`, LoggerLevel.INFO, this.logger); - - if (!aliasDir) { - const orgDetails = await new OrgDetailsFetcher(this.sfpOrg.getUsername()).getOrgDetails(); - - if (orgDetails.isSandbox) { - // If the target org is a sandbox, find a 'default' directory to use as package directory - aliasDir = files.find( - (file) => - path.basename(file) === 'default' && - fs.lstatSync(path.join(searchDirectory, file)).isDirectory() - ); - } - } - - if (!aliasDir) { - throw new Error( - `Aliasfied package '${this.sfpPackage.packageName}' does not have an alias with '${alias}' or 'default' directory` - ); - } - - this.packageDirectory = path.join(this.packageDescriptor.path, aliasDir); - } - else { - this.packageDirectory = path.join(this.packageDescriptor['path']); - } - - } - - private sendMetricsWhenFailed(elapsedTime: number) { - SFPLogger.log( - `Package ${COLOR_KEY_MESSAGE( - this.sfpPackage.package_name - )} installation attempt failed,it took ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` - ); - SFPStatsSender.logCount('package.installation.failure', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - } - - private sendMetricsWhenSuccessfullyInstalled(elapsedTime: number) { - SFPLogger.log( - `Package ${COLOR_KEY_MESSAGE(this.sfpPackage.package_name)} installation took ${COLOR_KEY_MESSAGE( - getFormattedTime(elapsedTime) - )}`, - LoggerLevel.INFO, - this.logger - ); - SFPStatsSender.logElapsedTime('package.installation.elapsed_time', elapsedTime, { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - SFPStatsSender.logCount('package.installation', { - package: this.sfpPackage.package_name, - type: this.sfpPackage.package_type, - target_org: this.sfpOrg.getUsername(), - }); - } - - //Set this to disable whethere info about the artifact has to be recorded in the org - public set isArtifactToBeCommittedInOrg(toCommit: boolean) { - this._isArtifactToBeCommittedInOrg = toCommit; - } - - private async commitPackageInstallationStatus() { - if (this._isArtifactToBeCommittedInOrg) { - try { - await this.sfpOrg.updateArtifactInOrg(this.logger, this.sfpPackage); - } catch (error) { - SFPLogger.log( - 'Unable to commit information about the package into org..Check whether prerequisities are installed', - LoggerLevel.WARN, - this.logger - ); - } - } - } - - protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { - if (skipIfPackageInstalled) { - let installationStatus = await this.sfpOrg.isArtifactInstalledInOrg(this.logger, this.sfpPackage); - return !installationStatus.isInstalled; - } else if(this.sfpPackage.packageType == PackageType.Diff) - { - // If diff package, check if there are any changes to be deployed, else skip - if(!this.sfpPackage.destructiveChanges && this.sfpPackage.metadataCount==0) - { - return false; - } - } - - return true; // Always install packages if skipIfPackageInstalled is false - } - - private async assignPermsetsPreDeployment() { - try { - if (this.sfpPackage.assignPermSetsPreDeployment) { - SFPLogger.log('Assigning permission sets before deployment:', LoggerLevel.INFO, this.logger); - - await AssignPermissionSets.applyPermsets( - this.sfpPackage.assignPermSetsPreDeployment, - this.connection, - this.sfpPackage.sourceDir, - this.logger - ); - } - } catch (error) { - //Proceed ahead not a critical error to break installation - SFPLogger.log(`Unable to assign permsets (Pre Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public async executePreDeploymentScripts() { - let preDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `preDeployment`); - if (fs.existsSync(preDeploymentScript)) { - let alias = await this.sfpOrg.getAlias(); - SFPLogger.log('Executing preDeployment script', LoggerLevel.INFO, this.logger); - await ScriptExecutor.executeScript( - this.logger, - preDeploymentScript, - this.sfpPackage.packageName, - this.sfpOrg.getUsername(), - alias ? alias : this.sfpOrg.getUsername(), - this.sfpPackage.sourceDir, - this.sfpPackage.packageDirectory - ); - } - } - - abstract install(); - - private async assignPermsetsPostDeployment() { - try { - if (this.sfpPackage.assignPermSetsPostDeployment) { - SFPLogger.log('Assigning permission sets after deployment:', LoggerLevel.INFO, this.logger); - - await AssignPermissionSets.applyPermsets( - this.sfpPackage.assignPermSetsPostDeployment, - this.connection, - this.sfpPackage.sourceDir, - this.logger - ); - } - } catch (error) { - //Proceed ahead not a critical error to break installation - SFPLogger.log(`Unable to assign permsets (Post Deployment) due to ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public async executePostDeploymentScript() { - let postDeploymentScript: string = path.join(this.sfpPackage.sourceDir, `scripts`, `postDeployment`); - if (fs.existsSync(postDeploymentScript)) { - SFPLogger.log('Executing postDeployment script', LoggerLevel.INFO, this.logger); - let alias = await this.sfpOrg.getAlias(); - await ScriptExecutor.executeScript( - this.logger, - postDeploymentScript, - this.sfpPackage.packageName, - this.sfpOrg.getUsername(), - alias ? alias : this.sfpOrg.getUsername(), - this.sfpPackage.sourceDir, - this.sfpPackage.packageDirectory - ); - } - } - - private async executePostDeployers() { - SFPLogger.log(`Executing Post Deployers`, LoggerLevel.INFO, this.logger); - - //Gather componentSet - let componentSet = ComponentSet.fromSource( - path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) - ); - - for (const postDeployer of PostDeployersRegistry.getPostDeployers()) { - try { - if (await postDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { - SFPLogger.log( - `Executing Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, - LoggerLevel.INFO, - this.logger - ); - - await postDeployer.execute( - this.sfpPackage, - componentSet, - this.sfpOrg, - this.logger, - {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} - ); - - } else { - SFPLogger.log( - `Post Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped or not enabled`, - LoggerLevel.INFO, - this.logger - ); - } - } catch (error) { - SFPLogger.log( - `Unable to process post deploy for ${postDeployer.getName()} due to ${error.message}`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())} skipped due to error`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - private async executePreDeployers() { - SFPLogger.log(`Executing Pre Deployers`, LoggerLevel.INFO, this.logger); - - //Gather componentSet - let componentSet = ComponentSet.fromSource( - path.join(this.sfpPackage.projectDirectory, this.sfpPackage.packageDirectory) - ); - - let analyzers = AnalyzerRegistry.getAnalyzers(); - for (const analyzer of analyzers) { - if(await analyzer.isEnabled(this.sfpPackage, this.logger)) - { - SFPLogger.log(`Executing ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); - this.sfpPackage = await analyzer.analyze(this.sfpPackage,componentSet, this.logger); - } - else - { - SFPLogger.log(`Skipped ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); - } - } - - for (const preDeployer of PreDeployersRegistry.getPreDeployers()) { - try { - if (await preDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { - SFPLogger.log( - `Executing Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())}`, - LoggerLevel.INFO, - this.logger - ); - - await preDeployer.execute( - this.sfpPackage, - componentSet, - this.sfpOrg, - this.logger, - {apiVersion:this.options.apiVersion,waitTime:this.options.waitTime} - ); - - } else { - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped or not enabled`, - LoggerLevel.INFO, - this.logger - ); - } - } catch (error) { - SFPLogger.log( - `Unable to process pre deploy for ${preDeployer.getName()} due to ${error.message}`, - LoggerLevel.WARN, - this.logger - ); - SFPLogger.log( - `Pre Deployer ${COLOR_KEY_MESSAGE(preDeployer.getName())} skipped due to error`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - protected async generateDeploymentOptions( - waitTime: string, - optimizeDeployment: boolean, - skipTest: boolean, - target_org: string, - apiVersion: string - ): Promise { - let deploymentOptions: DeploymentOptions = { - ignoreWarnings: true, - waitTime: waitTime, - }; - deploymentOptions.ignoreWarnings = true; - deploymentOptions.waitTime = waitTime; - deploymentOptions.apiVersion = apiVersion; - - //Find Org Type - let orgDetails: OrgDetails; - try { - orgDetails = await new OrgDetailsFetcher(target_org).getOrgDetails(); - } catch (err) { - SFPLogger.log(`Unable to fetch org details,assuming it is production`, LoggerLevel.WARN, this.logger); - orgDetails = { - instanceUrl: undefined, - isScratchOrg: false, - isSandbox: false, - organizationType: undefined, - sfdxAuthUrl: undefined, - status: undefined, - }; - } - - - if (this.options.deploymentType == DeploymentType.MDAPI_DEPLOY && this.sfpPackage.isApexFound && this.options.isInstallingForValidation == false) { - if (orgDetails.isSandbox) { - //enforce during selective deployment - if (skipTest) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( - this.sfpPackage.apexTestClassses - ); - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } else { - if (this.sfpPackage.apexTestClassses.length > 0 && optimizeDeployment) { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = this.getAStringOfSpecificTestClasses( - this.sfpPackage.apexTestClassses - ); - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } - } - // #Issue 1417 - // Handle the use-cases of a not optimized source package validating - else if (this.sfpPackage.packageType == PackageType.Source && this.sfpPackage.isApexFound && this.options.isInstallingForValidation && !optimizeDeployment ) { - if (skipTest) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else { - deploymentOptions.testLevel = TestLevel.RunLocalTests; - } - } else { - if (orgDetails.isSandbox) { - deploymentOptions.testLevel = TestLevel.RunNoTests; - } else { - deploymentOptions.testLevel = TestLevel.RunSpecifiedTests; - deploymentOptions.specifiedTests = 'skip'; - } - } - - deploymentOptions.rollBackOnError = true; - return deploymentOptions; - } - - private getAStringOfSpecificTestClasses(apexTestClassses: string[]) { - let specifedTests = apexTestClassses.join(); - return specifedTests; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts deleted file mode 100644 index dee64cf99..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallSourcePackageImpl.ts +++ /dev/null @@ -1,397 +0,0 @@ -import DeploymentExecutor, { DeploySourceResult, DeploymentType } from '../../deployers/DeploymentExecutor'; -import ReconcileProfileAgainstOrgImpl from '../components/ReconcileProfileAgainstOrgImpl'; -import DeployDestructiveManifestToOrgImpl from '../components/DeployDestructiveManifestToOrgImpl'; -import SFPLogger, { COLOR_SUCCESS, COLOR_WARNING, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import * as fs from 'fs-extra'; -const path = require('path'); -const tmp = require('tmp'); -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import DeploySourceToOrgImpl, { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import PackageEmptyChecker from '../validators/PackageEmptyChecker'; -import { TestLevel } from '../../apextest/TestOptions'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import ProjectConfig from '../../project/ProjectConfig'; -import { DeploymentFilterRegistry } from '../deploymentFilters/DeploymentFilterRegistry'; -import DeploymentOptionDisplayer from '../../display/DeploymentOptionDisplayer'; -import PackageComponentPrinter from '../../display/PackageComponentPrinter'; -import DeployErrorDisplayer from '../../display/DeployErrorDisplayer'; -import { COLOR_ERROR } from '@flxblio/sfp-logger'; -import { globSync } from 'glob'; - -export default class InstallSourcePackageImpl extends InstallPackage { - private pathToReplacementForceIgnore: string; - private deploymentType: DeploymentType; - - - - public constructor( - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - options: SfpPackageInstallationOptions, - logger: Logger - ) { - super(sfpPackage, targetOrg, logger, options); - this.options = options; - this.pathToReplacementForceIgnore = options.pathToReplacementForceIgnore; - this.deploymentType = options.deploymentType; - } - - public async install() { - let tmpDirObj = tmp.dirSync({ unsafeCleanup: true }); - let tempDir = tmpDirObj.name; - - try { - //Handle the right force ignore file - this.handleForceIgnores(); - - // Apply Destructive Manifest - await this.applyDestructiveChanges(); - - - //Apply Reconcile if Profiles are found - //To Reconcile we have to go for multiple deploys, first we have to reconcile profiles and deploy the metadata - let isReconcileActivated = false; - let isReconcileErrored = false; - let profileFolders; - ({ - profileFolders, - isReconcileActivated, - isReconcileErrored, - } = await this.reconcileProfilesBeforeDeployment( - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - tempDir - )); - - let deploymentOptions: DeploymentOptions; - let result: DeploySourceResult; - //Construct Deploy Command for actual payload - deploymentOptions = await this.generateDeploymentOptions( - this.options.waitTime, - this.options.optimizeDeployment, - this.options.skipTesting, - this.sfpOrg.getUsername(), - this.options.apiVersion - ); - - //enable source tracking - if (this.deploymentType === DeploymentType.SOURCE_PUSH) { - deploymentOptions.sourceTracking = true; - } - - //Make a copy.. dont mutate sourceDirectory - let resolvedSourceDirectory = this.sfpPackage.sourceDir; - - let emptyCheck = this.handleEmptyPackage(resolvedSourceDirectory, this.packageDirectory); - - if (emptyCheck.isToSkip == true) { - SFPLogger.log( - `${COLOR_SUCCESS(`Skipping the package as there is nothing to be deployed`)}`, - LoggerLevel.INFO, - this.logger - ); - return { - deploy_id: `000000`, - result: true, - message: `Package is empty, nothing to install,skipped`, - }; - } else if (emptyCheck.isToSkip == false) { - - //Create componentSet To Be Deployed - let componentSet = ComponentSet.fromSource( - path.resolve(emptyCheck.resolvedSourceDirectory, this.packageDirectory) - ); - - //Apply Filters - let deploymentFilters = DeploymentFilterRegistry.getImplementations(); - - for (const deploymentFilter of deploymentFilters) { - if ( - deploymentFilter.isToApply( - ProjectConfig.getSFDXProjectConfig(emptyCheck.resolvedSourceDirectory), - this.sfpPackage.packageType - ) - ) - componentSet = await deploymentFilter.apply(this.sfpOrg, componentSet, this.logger); - } - - //Check if there are components to be deployed after filtering - //Assume its successfully deployed - if (componentSet.size == 0) { - return { - deploy_id: `000000`, - result: true, - message: `Package contents were filtered out, nothing to install`, - }; - } - - //Print components inside Component Set - let components = componentSet.getSourceComponents(); - PackageComponentPrinter.printComponentTable(components, this.logger); - - - if (!this.options.isInstallingForValidation) { - DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); - } - - let deploySourceToOrgImpl: DeploymentExecutor = new DeploySourceToOrgImpl( - this.sfpOrg, - this.sfpPackage.sourceDir, - componentSet, - deploymentOptions, - this.logger - ); - - result = await deploySourceToOrgImpl.exec(); - - if (result.result) { - //Apply PostDeployment Activities - try { - if (isReconcileActivated) { - //Bring back the original profiles, reconcile and redeploy again - await this.reconcileAndRedeployProfiles( - profileFolders, - this.sfpPackage.sourceDir, - this.sfpOrg.getUsername(), - this.packageDirectory, - tempDir, - deploymentOptions - ); - } - } catch (error) { - - SFPLogger.log( - 'Failed to apply reconcile the second time, Partial Metadata applied', - LoggerLevel.INFO, - this.logger - ); - } - } else if (result.result === false) { - DeployErrorDisplayer.displayErrors(result.response, this.logger); - throw new Error(result.message); - } - } - //} - } catch (error) { - tmpDirObj.removeCallback(); - throw error; - } - } - - private handleEmptyPackage( - sourceDirectory: string, - packageDirectory: string - ): { isToSkip: boolean; resolvedSourceDirectory: string } { - //Check empty conditions - let status = PackageEmptyChecker.isToBreakBuildForEmptyDirectory(sourceDirectory, packageDirectory, false); - - - if (status.result == 'break') { - throw new Error('No components in the package, Please check your build again'); - } else if (status.result == 'skip') { - return { - isToSkip: true, - resolvedSourceDirectory: sourceDirectory, - }; - } else { - return { - isToSkip: false, - resolvedSourceDirectory: sourceDirectory, - }; - } - } - - private handleForceIgnores() { - if (this.pathToReplacementForceIgnore) { - this.replaceForceIgnoreInSourceDirectory(this.sfpPackage.sourceDir, this.pathToReplacementForceIgnore); - - - //Handle Diff condition - // if (this.isDiffFolderAvailable) - // this.replaceForceIgnoreInSourceDirectory( - // path.join(this.sfpPackage.sourceDir, 'diff'), - // this.pathToReplacementForceIgnore - // ); - } - } - - private async applyDestructiveChanges() { - - if(this.sfpPackage.destructiveChanges) - { - try { - SFPLogger.log( - 'Attempt to delete components mentioned in destructive manifest', - LoggerLevel.INFO, - this.logger - ); - let deployDestructiveManifestToOrg = new DeployDestructiveManifestToOrgImpl( - this.sfpOrg, - path.join(this.sfpPackage.sourceDir, 'destructive', 'destructiveChanges.xml') - ); - - await deployDestructiveManifestToOrg.exec(); - } catch (error) { - SFPLogger.log( - `We attempted a deletion of components, However we are not successful. \ - Either the components are already deleted or there are components which \ - have dependency to components in the manifest. \ - Please check whether this manifest works! \ - Actual Error Observed: \ - -------------------------------------- \ - ${COLOR_ERROR(error.message)}`, - LoggerLevel.INFO, - this.logger - ); - } - } - } - - private async reconcileProfilesBeforeDeployment(sourceDirectoryPath: string, target_org: string, tempDir: string) { - let profileFolders: any; - let isReconcileActivated: boolean = false; - let isReconcileErrored: boolean = false; - try { - //Hard exit.. no reconcile set in orchestrator - if (this.sfpPackage.reconcileProfiles == false) return { isReconcileActivated: false }; - - //Handle diff for fastfeedback - if (this.sfpPackage.isProfilesFound) { - } else { - return { isReconcileActivated: false }; - } - - SFPLogger.log( - 'Attempting reconcile to profiles as payload contain profiles', - LoggerLevel.INFO, - this.logger - ); - //copy the original profiles to temporary location - profileFolders = globSync('**/profiles', { - cwd: path.join(sourceDirectoryPath), - }); - if (profileFolders.length > 0) { - profileFolders.forEach((folder) => { - fs.copySync(path.join(sourceDirectoryPath, folder), path.join(tempDir, folder)); - }); - } - //Now Reconcile - let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( - this.sfpOrg, - path.join(sourceDirectoryPath), - this.logger - ); - await reconcileProfileAgainstOrg.exec(); - isReconcileActivated = true; - } catch (err) { - SFPLogger.log('Failed to reconcile profiles:' + err, LoggerLevel.INFO, this.logger); - isReconcileErrored = true; - if (profileFolders.length > 0) { - SFPLogger.log('Restoring original profiles as preprocessing failed', LoggerLevel.INFO, this.logger); - profileFolders.forEach((folder) => { - fs.copySync(path.join(tempDir, folder), path.join(this.sfpPackage.sourceDir, folder)); - }); - } - } - return { profileFolders, isReconcileActivated, isReconcileErrored }; - } - - private async reconcileAndRedeployProfiles( - profileFolders: string[], - sourceDirectoryPath: string, - target_org: string, - sourceDirectory: string, - tmpdir: string, - deploymentOptions: any - ) { - //if no profile supported metadata, no point in - //doing a reconcile - if (this.sfpPackage.isProfilesFound == false) return; - if (this.sfpPackage.isPayLoadContainTypesSupportedByProfiles == false) return; - - - if (profileFolders.length > 0) { - SFPLogger.log(`Restoring original profiles for reconcile and deploy`, LoggerLevel.INFO, this.logger); - profileFolders.forEach((folder) => { - fs.copySync(path.join(tmpdir, folder), path.join(sourceDirectoryPath, folder)); - }); - - //Now Reconcile - let reconcileProfileAgainstOrg: ReconcileProfileAgainstOrgImpl = new ReconcileProfileAgainstOrgImpl( - this.sfpOrg, - sourceDirectoryPath, - this.logger - ); - await reconcileProfileAgainstOrg.exec(); - - //Now deploy the profiles alone - - const profilesDirs = globSync('**/profiles/', { - cwd: path.join(sourceDirectoryPath, sourceDirectory), - absolute: true, - }); - - const profileDeploymentStagingDirectory = path.join( - sourceDirectoryPath, - 'ProfileDeploymentStagingDirectory' - ); - fs.mkdirpSync(path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); - - for (const dir of profilesDirs) { - // Duplicate profiles are overwritten - fs.copySync(dir, path.join(profileDeploymentStagingDirectory, sourceDirectory, 'profiles')); - } - - fs.copySync( - path.join(sourceDirectoryPath, 'sfdx-project.json'), - path.join(profileDeploymentStagingDirectory, 'sfdx-project.json') - ); - fs.copySync( - path.join(sourceDirectoryPath, '.forceignore'), - path.join(profileDeploymentStagingDirectory, '.forceignore') - ); - - //Create componentSet To Be Deployed - let componentSet = ComponentSet.fromSource( - path.resolve(profileDeploymentStagingDirectory, sourceDirectory) - ); - - DeploymentOptionDisplayer.printDeploymentOptions(deploymentOptions, this.logger); - let deploySourceToOrgImpl: DeploySourceToOrgImpl = new DeploySourceToOrgImpl( - this.sfpOrg, - this.sfpPackage.sourceDir, - componentSet, - deploymentOptions, - this.logger - ); - let profileReconcile: DeploySourceResult = await deploySourceToOrgImpl.exec(); - - if (!profileReconcile.result) { - DeployErrorDisplayer.displayErrors(profileReconcile.response, this.logger); - SFPLogger.log('Unable to deploy reconciled profiles', LoggerLevel.INFO, this.logger); - } - } - } - - - - /** - * Replaces forceignore in source directory with provided forceignore - * @param sourceDirectory - * @param pathToReplacementForceIgnore - */ - private replaceForceIgnoreInSourceDirectory(sourceDirectory: string, pathToReplacementForceIgnore: string): void { - if (fs.existsSync(pathToReplacementForceIgnore)) - fs.copySync(pathToReplacementForceIgnore, path.join(sourceDirectory, '.forceignore')); - else { - SFPLogger.log(`${pathToReplacementForceIgnore} does not exist`, LoggerLevel.INFO, this.logger); - SFPLogger.log( - 'Package installation will continue using the unchanged forceignore in the source directory', - null, - this.logger - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts deleted file mode 100644 index 6635b61e8..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackage.ts +++ /dev/null @@ -1,91 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; -import { InstallPackage, SfpPackageInstallationOptions } from './InstallPackage'; -import SfpPackage from '../SfpPackage'; -import SFPOrg from '../../org/SFPOrg'; -import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; - -export default class InstallUnlockedPackage extends InstallPackage { - private packageVersionId; - - public constructor( - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - options: SfpPackageInstallationOptions, - logger: Logger - ) { - super(sfpPackage, targetOrg, logger, options); - this.packageVersionId = sfpPackage.package_version_id; - this.options = options; - } - - public async install() { - let installUnlockedPackageWrapper: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( - this.logger, - this.sfpOrg.getUsername(), - this.packageVersionId, - this.options, - this.sfpPackage.packageName - ); - await installUnlockedPackageWrapper.install(this.sfpPackage.payload); - } - - /** - * Checks whether unlocked package version is installed in org. - * Overrides base class method. - * @param skipIfPackageInstalled - * @returns - */ - protected async isPackageToBeInstalled(skipIfPackageInstalled: boolean): Promise { - try { - if (skipIfPackageInstalled) { - SFPLogger.log( - `${EOL}Checking whether package ${COLOR_KEY_MESSAGE( - this.sfpPackage.package_name - )} with ID ${COLOR_KEY_MESSAGE( - this.packageVersionId - )} is installed in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - let installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); - - let packageFound = installedPackages.find((installedPackage) => { - return installedPackage.subscriberPackageVersionId.substring(0,14) === this.packageVersionId.substring(0,14); - }); - - if (packageFound) { - SFPLogger.log( - `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - return false; - } else { - SFPLogger.log( - `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, - LoggerLevel.INFO, - this.logger - ); - return true; - } - } else { - SFPLogger.log( - 'Skip if package to be installed is false, Proceeding with installation', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } catch (error) { - SFPLogger.log( - 'Unable to check whether this package is installed in the target org', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts deleted file mode 100644 index 34af33f68..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageCollection.ts +++ /dev/null @@ -1,134 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import Package2Detail from '../Package2Detail'; -import InstallUnlockedPackageImpl from './InstallUnlockedPackageImpl'; -import SFPOrg from '../../org/SFPOrg'; -import { SfpPackageInstallationOptions } from './InstallPackage'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; - -export default class InstallUnlockedPackageCollection { - private installedPackages: Package2Detail[]; - constructor(private sfpOrg: SFPOrg, private logger: Logger,private dryRun:boolean=false) {} - - public async install( - package2s: Package2Detail[], - skipIfInstalled: boolean, - ignoreErrorIfAHigherVersionPackageIsInstalled: boolean = true - ) { - this.installedPackages = await this.sfpOrg.getAllInstalled2GPPackages(); - - SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); - - for (const package2 of package2s) { - if ( - package2.subscriberPackageVersionId && - this.isPackageToBeInstalled(skipIfInstalled, package2.subscriberPackageVersionId, package2.name) - ) { - SFPLogger.log( - `Installing Package ${package2.name} in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - let installUnlockedPackageImpl: InstallUnlockedPackageImpl = new InstallUnlockedPackageImpl( - this.logger, - this.sfpOrg.getUsername(), - package2.subscriberPackageVersionId, - new SfpPackageInstallationOptions(), - package2.name - ); - if (package2.key) installUnlockedPackageImpl.setInstallationKey(package2.key); - try { - if(!this.dryRun) - await installUnlockedPackageImpl.install(); - } catch (error) { - let message: string = error.message; - if ( - message.includes(`A newer version of this package is currently installed`) && - ignoreErrorIfAHigherVersionPackageIsInstalled - ) { - SFPLogger.log( - `A higher version of this package is already installed and cant be dowgraded,skipping`, - LoggerLevel.WARN, - this.logger - ); - continue; - } else { - SFPLogger.log( - `Unable to install ${package2.name} in ${this.sfpOrg.getUsername()} due to ${message}`, - LoggerLevel.ERROR, - this.logger - ); - throw error; - } - } - } else { - SFPLogger.log( - `Skipping Installing of package ${COLOR_KEY_MESSAGE( - package2.name - )} in ${this.sfpOrg.getUsername()}`, - LoggerLevel.WARN, - this.logger - ); - } - } - - SFPLogger.log(`${EOL}`, LoggerLevel.INFO, this.logger); - } - - /** - * Checks whether unlocked package version is installed in org. - * Overrides base class method. - * @param skipIfPackageInstalled - * @returns - */ - protected isPackageToBeInstalled( - skipIfPackageInstalled: boolean, - packageVersionId: string, - pacakgeName?: string - ): boolean { - try { - if (skipIfPackageInstalled) { - SFPLogger.log( - `${EOL}Checking whether package ${COLOR_KEY_MESSAGE(pacakgeName)} with ID ${COLOR_KEY_MESSAGE( - packageVersionId)}is installed in ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - - let packageFound = this.installedPackages.find((installedPackage) => { - return installedPackage.subscriberPackageVersionId.substring(0,15) === packageVersionId.substring(0,15); - }); - - if (packageFound) { - SFPLogger.log( - `Package to be installed was found in the target org ${this.sfpOrg.getUsername()}`, - LoggerLevel.INFO, - this.logger - ); - return false; - } else { - SFPLogger.log( - `Package to be installed was not found in the target org ${this.sfpOrg.getUsername()}, Proceeding to install.. `, - LoggerLevel.INFO, - this.logger - ); - return true; - } - } else { - SFPLogger.log( - 'Skip if package to be installed is false, Proceeding with installation', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } catch (error) { - SFPLogger.log( - 'Unable to check whether this package is installed in the target org', - LoggerLevel.INFO, - this.logger - ); - return true; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts deleted file mode 100644 index 41574d826..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/InstallUnlockedPackageImpl.ts +++ /dev/null @@ -1,96 +0,0 @@ -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_SUCCESS, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import PackageMetadataPrinter from '../../display/PackageMetadataPrinter'; -import SFPOrg from '../../org/SFPOrg'; -import { PackageInstallCreateRequest, PackagingSObjects, SubscriberPackageVersion } from '@salesforce/packaging'; -import { delay } from '../../utils/Delay'; -import { SfpPackageInstallationOptions } from './InstallPackage'; - - - -export default class InstallUnlockedPackageImpl { - public constructor( - private logger: Logger, - private targetUserName: string, - private packageId: string, - private installationOptions: SfpPackageInstallationOptions, - private packageName?:string - ) { - } - - public setInstallationKey(installationKey: string) { - this.installationOptions.installationkey = installationKey; - } - - public async install(payloadToDisplay?: any): Promise { - let connection = (await SFPOrg.create({ aliasOrUsername: this.targetUserName })).getConnection(); - //Print Metadata carried in the package - if (payloadToDisplay) PackageMetadataPrinter.printMetadataToDeploy(payloadToDisplay, this.logger); - - const subscriberPackageVersion = new SubscriberPackageVersion({ - connection, - aliasOrId: this.packageId, - password: this.installationOptions.installationkey, - }); - - const request: PackageInstallCreateRequest = { - SubscriberPackageVersionKey: await subscriberPackageVersion.getId(), - Password: this.installationOptions.installationkey as PackageInstallCreateRequest['Password'], - ApexCompileType: 'package' as PackageInstallCreateRequest['ApexCompileType'], - SecurityType: this.installationOptions.securitytype as PackageInstallCreateRequest['SecurityType'], - UpgradeType: this.installationOptions.upgradetype as PackageInstallCreateRequest['UpgradeType'], - EnableRss: true, - }; - - //Fire a package installation - let pkgInstallRequest = await subscriberPackageVersion.install(request, {}); - let status = this.parseStatus( - pkgInstallRequest, - this.targetUserName, - this.packageName ? this.packageName : this.packageId, - this.logger - ); - while (status == 'IN_PROGRESS') { - pkgInstallRequest = await SubscriberPackageVersion.getInstallRequest(pkgInstallRequest.Id, connection); - status = this.parseStatus( - pkgInstallRequest, - this.targetUserName, - this.packageName ? this.packageName : this.packageId, - this.logger - ); - await delay(30000); //Poll every 30 seconds - } - } - public parseStatus( - request: PackagingSObjects.PackageInstallRequest, - username: string, - pkgName: string, - logger: Logger - ): 'IN_PROGRESS' | 'SUCCESS' { - const { Status } = request; - if (Status === 'SUCCESS') { - SFPLogger.log( - `Status: ${COLOR_SUCCESS(`Succesfully Installed`)} ${pkgName} to ${username} with Id ${request.Id}`, - LoggerLevel.INFO, - logger - ); - return Status; - } else if (['IN_PROGRESS', 'UNKNOWN'].includes(Status)) { - SFPLogger.log( - `Status: ${COLOR_KEY_MESSAGE(`In Progress`)} Installing ${pkgName} to ${username} with Id ${request.Id}`, - LoggerLevel.INFO, - logger - ); - return 'IN_PROGRESS'; - } else { - let errorMessage = ''; - const errors = request?.Errors?.errors; - if (errors?.length) { - errorMessage = 'Installation errors: '; - for (let i = 0; i < errors.length; i++) { - errorMessage += `\n${i + 1}) ${errors[i].message}`; - } - } - throw new Error(`Unable to install ${pkgName} due to \n` + errorMessage); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts b/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts deleted file mode 100644 index 584155ed1..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageInstallers/PackageInstallationResult.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type PackageInstallationResult = { - result: PackageInstallationStatus; - deploy_id?: string; - message?: string; - elapsedTime?:number; - isPreScriptExecutionSuceeded?: boolean; - isPostScriptExecutionSuceeeded?:boolean; - numberOfComponentsDeployed?:number; -}; - -export enum PackageInstallationStatus { - Skipped, - Succeeded, - Failed, -} diff --git a/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts b/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts deleted file mode 100644 index cdf3ac4b2..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/packageMerger/PackageMergeManager.ts +++ /dev/null @@ -1,160 +0,0 @@ -import SfpPackage, { PackageType } from '../SfpPackage'; -import SfpPackageBuilder from '../../package/SfpPackageBuilder'; -const tmp = require('tmp'); -import * as fs from 'fs-extra'; -const path = require('path'); -import { ComponentSet, MetadataConverter } from '@salesforce/source-deploy-retrieve'; -import { Logger } from '@flxblio/sfp-logger'; - -export default class PackageMergeManager { - public constructor(private sfpPackages: SfpPackage[], private logger?: Logger) {} - - public async mergePackages(targetOrAlias?: string): Promise { - let mergeResult: MergeResult = new MergeResult(); - mergeResult.skippedPackages = []; - mergeResult.unlockedPackages = []; - mergeResult.mergedPackages = []; - - mergeResult.requestedMergeOrder = this.sfpPackages; - - //Use the .sfp directory - let tmpDir = tmp.dirSync({ unsafeCleanup: true }); - let locationOfCopiedDirectory = tmpDir.name; - //Create a temporary folder - let mergedProjectDir = path.join(locationOfCopiedDirectory, `${this.makefolderid(5)}_merged`); - mergeResult.mergedProjectDirectory = mergedProjectDir; - - let mergedPackageDir = path.join(mergedProjectDir, 'force-app'); - fs.mkdirpSync(mergedPackageDir); - - //Create sfdx project.json - fs.writeJSONSync(path.join(mergedProjectDir, 'sfdx-project.json'), this.getMergedProjectManifest(), { - spaces: 4, - }); - - const converter = new MetadataConverter(); - - for (const sfpPackage of this.sfpPackages) { - let componentSet: ComponentSet; - - if (sfpPackage.packageType == PackageType.Data) { - mergeResult.skippedPackages.push(sfpPackage); - continue; - } else if (sfpPackage.packageType == PackageType.Unlocked) { - //Push for now - mergeResult.skippedPackages.push(sfpPackage); - mergeResult.unlockedPackages.push(sfpPackage); - continue; - } else { - //handle alaisfy directory - if (sfpPackage.packageDescriptor.aliasfy) { - let aliasFolder = path.join( - process.cwd(), - sfpPackage.projectDirectory, - sfpPackage.packageDirectory, - targetOrAlias ? targetOrAlias : 'default' - ); - if (fs.existsSync(aliasFolder)) { - componentSet = ComponentSet.fromSource(aliasFolder); - } else { - continue; - } - } else { - componentSet = ComponentSet.fromSource( - path.join(process.cwd(), sfpPackage.projectDirectory, sfpPackage.packageDirectory) - ); - } - - fs.copyFileSync( - path.join(sfpPackage.projectDirectory, 'forceignores', '.buildignore'), - path.join(mergedProjectDir, '.forceignore') - ); - console.log('copied file'); - - //Merge - let results = await converter.convert(componentSet, 'source', { - type: 'merge', - mergeWith: ComponentSet.fromSource(mergedPackageDir).getSourceComponents(), - defaultDirectory: mergedPackageDir, - - forceIgnoredPaths: new Set([ - path.join(process.cwd(), sfpPackage.projectDirectory, 'forceignores', '.buildignore'), - ]), - }); - - for (const component of results.converted) { - if (this.isXmlFileSuffixDuped(component.xml)) { - this.dedupeXmlFileSuffix(component.xml); - } - } - mergeResult.mergedPackages.push(sfpPackage); - } - } - - //Build SfpPackage - if (mergeResult.mergedPackages.length > 0) { - let mergedSfPPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - this.logger, - mergeResult.mergedProjectDirectory, - 'merged', - { - branch: 'temp', - packageVersionNumber: '1.0.0.0', - sourceVersion: '00000000', - }, - null - ); - mergeResult.mergedPackage = mergedSfPPackage; - } - - tmpDir.removeCallback(); - return mergeResult; - } - - private isXmlFileSuffixDuped(xmlFile: string): boolean { - return xmlFile.match(/-meta\.xml/g)?.length === 2; - } - - private dedupeXmlFileSuffix(xmlFile: string): string { - let deduped = xmlFile.replace(/-meta\.xml/, ''); - fs.renameSync(xmlFile, deduped); - - return deduped; - } - - private getMergedProjectManifest() { - let projectManifest = { - packageDirectories: [ - { - path: 'force-app', - package: 'merged', - versionNumber: '2.0.0.0', - default: true, - }, - ], - namespace: '', - sourceApiVersion: '53.0', - }; - return projectManifest; - } - - private makefolderid(length): string { - var result = ''; - var characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} - -export class MergeResult { - mergedProjectDirectory: string; - mergedPackage: SfpPackage; - mergedPackages: SfpPackage[]; - skippedPackages?: SfpPackage[]; - unlockedPackages?: SfpPackage[]; - requestedMergeOrder: SfpPackage[]; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts b/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts deleted file mode 100644 index 91ea99cef..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/promote/PromoteUnlockedPackageImpl.ts +++ /dev/null @@ -1,34 +0,0 @@ -import SFPLogger from '@flxblio/sfp-logger'; -import { SfProject } from '@salesforce/core'; -import { PackageSaveResult, PackageVersion } from '@salesforce/packaging'; -import SFPOrg from '../../org/SFPOrg'; - -export default class PromoteUnlockedPackageImpl { - public constructor( - private project_directory: string, - private package_version_id: string, - private devhub_alias: string - ) {} - - public async promote(): Promise { - let hubOrg = await SFPOrg.create({ aliasOrUsername: this.devhub_alias }); - let project = await SfProject.resolve(this.project_directory); - - const packageVersion = new PackageVersion({ - connection: hubOrg.getConnection(), - project: project, - idOrAlias: this.package_version_id, - }); - const packageVersionData = await packageVersion.getData(); - - let result: PackageSaveResult; - try { - result = await packageVersion.promote(); - result.id = packageVersionData.SubscriberPackageVersionId; - } catch (e) { - if (e.message.includes('previously released')) { - SFPLogger.log(`Package ${this.package_version_id} is already promoted, Ignoring`); - } else throw e; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts deleted file mode 100644 index 079f78469..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/AssignPermissionSetFetcher.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Logger } from '@flxblio/sfp-logger'; -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; - -export default class AssignPermissionSetFetcher implements PropertyFetcher { - public getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { - if (packageContents.packageDescriptor.assignPermSetsPreDeployment) { - if (packageContents.packageDescriptor.assignPermSetsPreDeployment instanceof Array) { - packageContents.assignPermSetsPreDeployment = - packageContents.packageDescriptor.assignPermSetsPreDeployment; - } else throw new Error("Property 'assignPermSetsPreDeployment' must be of type array"); - } - - if (packageContents.packageDescriptor.assignPermSetsPostDeployment) { - if (packageContents.packageDescriptor.assignPermSetsPostDeployment instanceof Array) { - packageContents.assignPermSetsPostDeployment = - packageContents.packageDescriptor.assignPermSetsPostDeployment; - } else throw new Error("Property 'assignPermSetsPostDeployment' must be of type array"); - } - - return packageContents; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts deleted file mode 100644 index c4b05c5de..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/DestructiveManifestPathFetcher.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as fs from 'fs-extra'; -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; -import xml2json from '../../utils/xml2json'; -import { Logger } from '@flxblio/sfp-logger'; - -export default class DestructiveManifestPathFetcher implements PropertyFetcher { - public async getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger) { - let destructiveChangesPath: string; - - if (packageContents.packageDescriptor === null || packageContents.packageDescriptor === undefined) { - throw new Error('Project Config (sfdx-project.json) is null'); - } - - if (packageContents.packageDescriptor['destructiveChangePath']) { - destructiveChangesPath = packageContents.packageDescriptor['destructiveChangePath']; - packageContents.destructiveChangesPath = destructiveChangesPath; - } - - try { - if (destructiveChangesPath != null) { - packageContents.destructiveChanges = await xml2json(fs.readFileSync(destructiveChangesPath, 'utf8')); - } - } catch (error) { - throw new Error('Unable to process destructive Manifest specified in the path or in the project manifest'); - } - return packageContents; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts deleted file mode 100644 index fbe6c4f8e..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/PropertyFetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Logger } from '@flxblio/sfp-logger'; -import SfpPackage from '../SfpPackage'; - -export default interface PropertyFetcher { - /** - * Retrieves property from packageDescriptor and adds its to SfpPackage by reference - * @param packageContents - * @param packageLogger - */ - getsfpProperties(packageContents: SfpPackage, packageLogger?: Logger); -} diff --git a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts deleted file mode 100644 index 0e2bc06a0..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import SfpPackage from '../SfpPackage'; -import PropertyFetcher from './PropertyFetcher'; - -export default class ReconcilePropertyFetcher implements PropertyFetcher { - getsfpProperties(packageContents: SfpPackage, packageLogger?: any) { - if (packageContents.packageDescriptor.hasOwnProperty('reconcileProfiles')) { - packageContents.reconcileProfiles = packageContents.packageDescriptor.reconcileProfiles; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts b/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts deleted file mode 100644 index 8d05ba782..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/validators/PackageEmptyChecker.ts +++ /dev/null @@ -1,85 +0,0 @@ -import path from 'path'; -import { readFileSync, existsSync } from 'fs'; -import FileSystem from '../../utils/FileSystem'; -import ignore from 'ignore'; - -export default class PackageEmptyChecker { - public static isToBreakBuildForEmptyDirectory( - projectDir: string, - sourceDirectory: string, - isToBreakBuildIfEmpty: boolean - ): { - message: string; - result: string; - } { - let directoryToCheck; - let status: { message: string; result: string } = { - message: '', - result: '', - }; - - if (projectDir != null) { - directoryToCheck = path.join(projectDir, sourceDirectory); - } else directoryToCheck = sourceDirectory; - - try { - if (!existsSync(directoryToCheck)) { - //Folder do not exists, break build - if (isToBreakBuildIfEmpty) { - status.message = `Folder not Found , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'break'; - } else { - status.message = `Folder not Found , Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'skip'; - } - return status; - } else if (PackageEmptyChecker.isEmptyFolder(projectDir, sourceDirectory)) { - if (isToBreakBuildIfEmpty) { - status.message = `Folder is Empty , Stopping build as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'break'; - } else { - status.message = `Folder is Empty, Skipping task as isToBreakBuildIfEmpty is ${isToBreakBuildIfEmpty}`; - status.result = 'skip'; - } - return status; - } else { - status.result = 'continue'; - return status; - } - } catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`No such file or directory ${err.path}`); // Re-throw error if .forceignore does not exist - } else if (!isToBreakBuildIfEmpty) { - status.message = `Something wrong with the path provided ${directoryToCheck}, but skipping, The exception is ${err}`; - status.result = 'skip'; - return status; - } else throw err; - } - } - - public static isEmptyFolder(projectDirectory: string, sourceDirectory: string): boolean { - let dirToCheck; - - if (projectDirectory != null) { - dirToCheck = path.join(projectDirectory, sourceDirectory); - } else { - dirToCheck = sourceDirectory; - } - - let files: string[] = FileSystem.readdirRecursive(dirToCheck, false, false); - // Include source directory in filepaths, as it can be a pattern in forceignore - files = files.map((file) => path.join(sourceDirectory, file)); - - let forceignorePath; - if (projectDirectory != null) forceignorePath = path.join(projectDirectory, '.forceignore'); - else forceignorePath = path.join(process.cwd(), '.forceignore'); - - // Ignore files that are listed in .forceignore - files = ignore() - .add(readFileSync(forceignorePath).toString()) // Add ignore patterns from '.forceignore'. - .filter(files); - - if (files == null || files.length === 0) return true; - else return false; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts deleted file mode 100644 index 879b84971..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionFetcher.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import semver from 'semver'; - -/** - * Fetcher for second-generation package version in Dev Hub - */ -export default class Package2VersionFetcher { - private readonly query: string = - 'Select SubscriberPackageVersionId, Package2Id, Package2.Name, IsPasswordProtected, IsReleased, MajorVersion, MinorVersion, PatchVersion, BuildNumber, CodeCoverage, HasPassedCodeCoverageCheck, Branch from Package2Version '; - - constructor(private conn: Connection) {} - - /** - * Fetch Package2 versions by Package2 Id - * Sorts by semantic version, in descending order - * @param package2Id - * @param versionNumber - * @param isValidatedPackages - * @returns - */ - async fetchByPackage2Id( - package2Id: string, - versionNumber?: string, - isValidatedPackages?: boolean - ): Promise { - let query = this.query; - - let whereClause: string = `where Package2Id='${package2Id}' `; - - if (versionNumber) { - // TODO: validate version number - const versions = versionNumber.split('.'); - - if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; - if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; - if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; - if (versions[3]) whereClause += `and BuildNumber=${versions[3]} `; - } - - if (isValidatedPackages) whereClause += `and ValidationSkipped = false `; - - whereClause += `and IsDeprecated = false `; - query += whereClause; - - - const records = await QueryHelper.query(query, this.conn, true); - - - if (records.length > 1) { - return records.sort((a, b) => { - const v1 = `${a.MajorVersion}.${a.MinorVersion}.${a.PatchVersion}-${a.BuildNumber}`; - const v2 = `${b.MajorVersion}.${b.MinorVersion}.${b.PatchVersion}-${b.BuildNumber}`; - return semver.rcompare(v1, v2); - }); - } else return records; - } - - async fetchBySubscriberPackageVersionId(subscriberPackageVersionId: string): Promise { - let query = this.query; - - let whereClause: string = `where SubscriberPackageVersionId='${subscriberPackageVersionId}'`; - query += whereClause; - - const records = await QueryHelper.query(query, this.conn, true); - return records[0]; - } - - async fetchByPackageBranchAndName( - packageBranch: string, - packageName: string, - versionNumber?: string, - ): Promise { - - let query = this.query; - - let whereClause: string = `where Branch='${packageBranch}' and Package2.Name ='${packageName}' `; - if (versionNumber) { - // TODO: validate version number - const versions = versionNumber.split('.'); - if (versions[0]) whereClause += `and MajorVersion=${versions[0]} `; - if (versions[1]) whereClause += `and MinorVersion=${versions[1]} `; - if (versions[2]) whereClause += `and PatchVersion=${versions[2]} `; - } - query += whereClause; - - let orderByClause: string = `order by CreatedDate desc`; - query += orderByClause; - - const records = await QueryHelper.query(query, this.conn, true); - return records; - - } -} - -export interface Package2Version { - SubscriberPackageVersionId: string; - Package2Id: string; - Package2: { Name: string }; - IsPasswordProtected: boolean; - IsReleased: boolean; - MajorVersion: number; - MinorVersion: number; - PatchVersion: number; - BuildNumber: number; - CodeCoverage: { apexCodeCoveragePercentage: number }; - HasPassedCodeCoverageCheck: boolean; - Branch: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts b/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts deleted file mode 100644 index 906bb37d0..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/version/Package2VersionInstaller.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class Package2VersionInstaller { - public constructor( - logger: Logger, - logLevel: LoggerLevel, - working_directory: string, - private targetUserName: string, - private packageId: string, - private waitTime: string, - private publishWaitTime?: string, - private installationkey?: string, - private securityType?: string, - private upgradeType?: string, - private apiVersion?: string, - private apexCompile: string = 'package' - ) {} - - public setInstallationKey(installationKey: string) { - this.installationkey = installationKey; - } - - - - -} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts deleted file mode 100644 index 9075d5292..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionLister.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { SfProject } from '@salesforce/core'; -import { Package } from '@salesforce/packaging'; -import SFPOrg from '../../org/SFPOrg'; - -export default class PackageVersionLister { - - constructor(private hubOrg:SFPOrg) - { - - } - - public async listAllReleasedVersions(projectDir: string) { - - const sfProject = await SfProject.resolve(projectDir); - - const records = await Package.listVersions(this.hubOrg.getConnection(), sfProject, { - createdLastDays: undefined, - concise: true, - modifiedLastDays: undefined, - packages: [], - isReleased: true, - orderBy: undefined, - verbose: false, - }); - - const results: any[] = []; - - if (records?.length > 0) { - records.forEach((record) => { - results.push({ - Package2Id: record.Package2Id, - Branch: record.Branch, - Tag: record.Tag, - MajorVersion: record.MajorVersion, - MinorVersion: record.MinorVersion, - PatchVersion: record.PatchVersion, - BuildNumber: record.BuildNumber, - Id: record.Id, - SubscriberPackageVersionId: record.SubscriberPackageVersionId, - ConvertedFromVersionId: record.ConvertedFromVersionId, - Name: record.Name, - NamespacePrefix: record.Package2.NamespacePrefix, - Package2Name: record.Package2.Name, - Version: [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join( - '.' - ), - IsReleased: record.IsReleased, - CreatedDate: new Date(record.CreatedDate).toISOString().replace('T', ' ').substring(0, 16), - LastModifiedDate: new Date(record.LastModifiedDate) - .toISOString() - .replace('T', ' ') - .substring(0, 16), - ReleaseVersion: - record.ReleaseVersion == null ? '' : Number.parseFloat(record.ReleaseVersion).toFixed(1), - BuildDurationInSeconds: record.BuildDurationInSeconds == null ? '' : record.BuildDurationInSeconds, - }); - }); - } - - return results; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts b/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts deleted file mode 100644 index 55786d1b1..000000000 --- a/packages/sfpowerscripts-cli/src/core/package/version/PackageVersionUpdater.ts +++ /dev/null @@ -1,18 +0,0 @@ -import SfpPackage from '../SfpPackage'; - -export default class PackageVersionUpdater { - public constructor() {} - - public substituteBuildNumber(sfpPackage: SfpPackage, buildNumber: string):string { - if (!sfpPackage.versionNumber) { - throw new Error('The package doesnt have a version attribute, Please check your definition'); - } else { - let segments = sfpPackage.versionNumber.split('.'); - let numberToBeAppended = parseInt(buildNumber); - - if (isNaN(numberToBeAppended)) throw new Error('BuildNumber should be a number'); - else segments[3] = buildNumber; - return `${segments[0]}.${segments[1]}.${segments[2]}.${segments[3]}`; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts deleted file mode 100644 index 2ff6a45e1..000000000 --- a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSets.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Connection } from '@salesforce/core'; -import { Logger } from '@flxblio/sfp-logger'; -import AssignPermissionSetsImpl from './AssignPermissionSetsImpl'; - -export default class AssignPermissionSets { - static async applyPermsets(permsets: string[], conn: Connection, sourceDirectory: string, logger: Logger) { - let assignPermissionSetsImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - conn, - permsets, - sourceDirectory, - logger - ); - - let results = await assignPermissionSetsImpl.exec(); - if (results.failedAssignments.length > 0) throw new Error('Unable to assign permsets'); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts b/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts deleted file mode 100644 index ba0049e0f..000000000 --- a/packages/sfpowerscripts-cli/src/core/permsets/AssignPermissionSetsImpl.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Connection } from '@salesforce/core'; -import child_process = require('child_process'); -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import PermissionSetFetcher from './PermissionSetFetcher'; -import { ZERO_BORDER_TABLE } from '../display/TableConstants'; -const Table = require('cli-table'); - -export default class AssignPermissionSetsImpl { - constructor( - private conn: Connection, - private permSets: string[], - private project_directory: string, - private packageLogger: Logger - ) {} - - public async exec(): Promise<{ - successfullAssignments: { - username: string; - permset: string; - }[]; - failedAssignments: { - username: string; - permset: string; - }[]; - }> { - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(this.conn.getUsername(), this.conn); - let assignedPermSets = await permsetListImpl.fetchAllPermsetAssignment(); - - let failedAssignments: { - username: string; - permset: string; - }[] = []; - let successfullAssignments: { - username: string; - permset: string; - }[] = []; - - for (let permSet of this.permSets) { - let permSetAssignmentMatch = assignedPermSets.find((record) => { - return record.PermissionSet.Name === permSet; - }); - - if (permSetAssignmentMatch !== undefined) { - // Treat permsets that have already been assigned as successes - successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - continue; - } - - try { - let permsetAssignmentJson: string = child_process.execSync( - `sf org assign permset -n ${permSet} -o ${this.conn.getUsername()} --json`, - { - cwd: this.project_directory, - encoding: 'utf8', - stdio: ['pipe', 'pipe', 'inherit'], - } - ); - - let permsetAssignment = JSON.parse(permsetAssignmentJson); - if (permsetAssignment.status === 0) - successfullAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - else failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - } catch (err) { - failedAssignments.push({ username: this.conn.getUsername(), permset: permSet }); - } - } - - if (successfullAssignments.length > 0) { - SFPLogger.log('Successful PermSet Assignments:', LoggerLevel.INFO, this.packageLogger); - this.printPermsetAssignments(successfullAssignments); - } - - if (failedAssignments.length > 0) { - SFPLogger.log('Failed PermSet Assignments', LoggerLevel.INFO, this.packageLogger); - this.printPermsetAssignments(failedAssignments); - } - - return { successfullAssignments, failedAssignments }; - } - - private printPermsetAssignments(assignments: { username: string; permset: string }[]) { - let table = new Table({ - head: ['Username', 'Permission Set Assignment'], - chars: ZERO_BORDER_TABLE - }); - - assignments.forEach((assignment) => { - table.push([assignment.username, assignment.permset]); - }); - - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.packageLogger); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts deleted file mode 100644 index 5133d9958..000000000 --- a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetFetcher.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Connection } from '@salesforce/core'; -import QueryHelper from '../queryHelper/QueryHelper'; - -/* - * Retrieve Permsets for a user from a target org - */ -export default class PermissionSetFetcher { - constructor(private username: string, private conn: Connection) {} - - public async fetchAllPermsetAssignment() { - const query = `SELECT Id, PermissionSet.Name, Assignee.Username FROM PermissionSetAssignment WHERE Assignee.Username = '${this.username}'`; - - return QueryHelper.query(query, this.conn, false); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts b/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts deleted file mode 100644 index 87d04b6d7..000000000 --- a/packages/sfpowerscripts-cli/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Connection } from '@salesforce/core'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import QueryHelper from '../queryHelper/QueryHelper'; -import { delay } from '../utils/Delay'; - -const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status = 'Updating'`; - -export default class PermissionSetGroupUpdateAwaiter { - constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 30000) {} - - async waitTillAllPermissionSetGroupIsUpdated() { - SFPLogger.log( - `Checking status of permission sets group..`, - LoggerLevel.INFO, - this.logger - ); - while (true) { - try { - let records = await QueryHelper.query(psGroupQuery, this.connection, false); - if (records.length > 0) { - SFPLogger.log( - `Pausing deployment as ${records.length} PermissionSetGroups are being updated`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log( - `Retrying for status in next ${this.intervalBetweenRepeats / 1000} seconds`, - LoggerLevel.INFO, - this.logger - ); - await delay(this.intervalBetweenRepeats); - } else { - SFPLogger.log( - `Proceeding with deployment, as no PermissionSetGroups are being updated`, - LoggerLevel.INFO, - this.logger - ); - break; - } - } catch (error) { - SFPLogger.log(`Unable to fetch permission group status ${error}`, LoggerLevel.TRACE, this.logger); - throw error; - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts b/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts deleted file mode 100644 index ebd7e1e20..000000000 --- a/packages/sfpowerscripts-cli/src/core/project/ProjectConfig.ts +++ /dev/null @@ -1,281 +0,0 @@ -const fs = require('fs-extra'); -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import _ from 'lodash'; -import { PackageType } from '../package/SfpPackage'; -let path = require('path'); - -/** - * Helper functions for retrieving info from project config - */ -export default class ProjectConfig { - /** - * Returns 0H Id of package from project config - * @param projectConfig - * @param sfdxPackage - */ - public static getPackageId(projectConfig: any, sfdxPackage: string) { - if (projectConfig['packageAliases']?.[sfdxPackage]) { - return projectConfig['packageAliases'][sfdxPackage]; - } else { - throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); - } - } - - /** - * Returns package names, as an array of strings - * @param projectDirectory - */ - public static getAllPackages(projectDirectory: string): string[] { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let sfdxpackages = []; - projectConfig['packageDirectories'].forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); - }); - return sfdxpackages; - } - - public static getAllExternalPackages( - projectConfig: any - ): { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] { - let externalPackages: { alias: string; Package2IdOrSubscriberPackageVersionId: string }[] = []; - let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); - const packageAliases = projectConfig.packageAliases || {}; - Object.entries(packageAliases).forEach(([key, value]) => { - if ( - !_.find( - packagesInCurrentDirectory, - (elem) => { - return elem.package == key; - }, - 0 - ) - ) - externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value as string }); - }); - return externalPackages; - } - - /** - * Returns package names from projectConfig, as an array of strings - * @param projectDirectory - */ - public static getAllPackagesFromProjectConfig(projectConfig: any): string[] { - let sfdxpackages = []; - projectConfig.packageDirectories.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg.package); - }); - return sfdxpackages; - } - - public static getAllPackagesAndItsDependencies( - projectConfig: any - ): Map { - let pkgWithDependencies = new Map(); - let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig); - for (let pkg of packages) { - if (pkg.dependencies) { - pkgWithDependencies.set(pkg.package, pkg.dependencies); - } - } - return pkgWithDependencies; - } - - public static getAllPackageDirectoriesFromDirectory(projectDirectory?: string): any[] { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let sfdxpackages = []; - projectConfig.packageDirectories?.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); - }); - return sfdxpackages; - } - - public static getAllPackageDirectoriesFromConfig(projectConfig: any): any[] { - let sfdxpackages = []; - projectConfig.packageDirectories?.forEach((pkg) => { - //Only push packages that have package and versionNumber, ignore everything else - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg); - }); - return sfdxpackages; - } - - /** - * Returns package manifest as JSON object - * @param projectDirectory - */ - public static getSFDXProjectConfig(projectDirectory: string): any { - let projectConfigJSON: string; - - if (projectDirectory) { - projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json'); - } else { - projectConfigJSON = 'sfdx-project.json'; - } - - try { - return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8')); - } catch (error) { - throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`); - } - } - - /** - * Returns type of package - * @param projectConfig - * @param sfdxPackage - */ - public static getPackageType( - projectConfig: any, - sfdxPackage: string - ): PackageType.Unlocked | PackageType.Data | PackageType.Source | PackageType.Diff { - let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); - - if (projectConfig['packageAliases']?.[sfdxPackage]) { - return PackageType.Unlocked; - } else { - if (packageDescriptor.type?.toLowerCase() === PackageType.Data) return PackageType.Data; - else if(packageDescriptor.type?.toLowerCase() === PackageType.Diff) return PackageType.Diff - else - return PackageType.Source; - } - } - - /** - * Returns package descriptor from package manifest at project directory - * @param projectDirectory - * @param sfdxPackage - */ - public static getSFDXPackageDescriptor(projectDirectory: string, sfdxPackage: string): any { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - - let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig); - - return sfdxPackageDescriptor; - } - - /** - * Returns package descriptor from project config JSON object - * @param sfdxPackage - * @param projectConfig - */ - public static getPackageDescriptorFromConfig(sfdxPackage: string, projectConfig: any) { - let sfdxPackageDescriptor: any; - - if (sfdxPackage) { - projectConfig['packageDirectories'].forEach((pkg) => { - if (sfdxPackage == pkg['package']) { - sfdxPackageDescriptor = pkg; - } - }); - } - - if (sfdxPackageDescriptor == null) throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`); - - return sfdxPackageDescriptor; - } - - /** - * Returns descriptor of default package - * @param projectDirectory - */ - public static getDefaultSFDXPackageDescriptor(projectDirectory: string): any { - let packageDirectory: string; - let sfdxPackageDescriptor: any; - - let projectConfig = this.getSFDXProjectConfig(projectDirectory); - - //Return the default package directory - projectConfig['packageDirectories'].forEach((pkg) => { - if (pkg['default'] == true) { - packageDirectory = pkg['path']; - sfdxPackageDescriptor = pkg; - } - }); - - if (packageDirectory == null) throw new Error('Package or package directory not exist'); - else return sfdxPackageDescriptor; - } - - /** - * Returns pruned package manifest, containing sfdxPackage only - * @param projectDirectory - * @param sfdxPackage - */ - public static cleanupMPDFromProjectDirectory(projectDirectory: string, sfdxPackage: string): any { - const projectConfig = this.getSFDXProjectConfig(projectDirectory); - - return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage); - } - - /** - * Returns pruned package manifest, containing sfdxPackage only - * @param projectConfig - * @param sfdxPackage - */ - public static cleanupMPDFromProjectConfig(projectConfig: any, sfdxPackage: string): any { - if (sfdxPackage) { - let i = projectConfig['packageDirectories'].length; - while (i--) { - if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) { - projectConfig['packageDirectories'].splice(i, 1); - } - } - } else { - let i = projectConfig['packageDirectories'].length; - while (i--) { - if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) { - projectConfig['packageDirectories'].splice(i, 1); - } - } - } - projectConfig['packageDirectories'][0]['default'] = true; //add default = true - return projectConfig; - } - - /** - * Returns pruned package manifest, containing sfdxPackages only - * @param projectConfig - * @param sfdxPackages - */ - public static cleanupPackagesFromProjectConfig(projectConfig: any, sfdxPackages: string[]): any { - let revisedPackageDirectory = []; - let originalPackageDirectory = projectConfig['packageDirectories']; - for (let pkg of originalPackageDirectory) { - for (const sfdxPackage of sfdxPackages) { - if (pkg.name == sfdxPackage) { - pkg.default = false; - revisedPackageDirectory.push(pkg); - } - } - } - projectConfig['packageDirectories'][0]['default'] = true; //add default = true - projectConfig.packageDirectories = revisedPackageDirectory; - return projectConfig; - } - - /** - * Returns pruned package manifest, containing sfdxPackages only - * @param projectConfig - * @param sfdxPackages - */ - public static cleanupPackagesFromProjectDirectory(projectDirectory: string, sfdxPackages: string[]): any { - const projectConfig = this.getSFDXProjectConfig(projectDirectory); - return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages); - } - - - - public static async updateProjectConfigWithDependencies( - projectConfig: any, - dependencyMap: Map - ) { - let updatedprojectConfig = await _.cloneDeep(projectConfig); - updatedprojectConfig.packageDirectories.map((pkg) => { - return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) }); - }); - - return updatedprojectConfig; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts b/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts deleted file mode 100644 index a56301ad5..000000000 --- a/packages/sfpowerscripts-cli/src/core/project/UserDefinedExternalDependency.ts +++ /dev/null @@ -1,61 +0,0 @@ -import SFPLogger from '@flxblio/sfp-logger'; -import { Connection, LoggerLevel } from '@salesforce/core'; -import _ from 'lodash'; -import ExternalPackage2DependencyResolver from '../package/dependencies/ExternalPackage2DependencyResolver'; - -/** - * Functions to deal with externalDependencyMap supplied by the user - * to aid in resolving transitive dependencies - */ -export default class UserDefinedExternalDependencyMap { - - - public fetchDependencyEntries(projectConfig: any) { - if (projectConfig.plugins?.sfp?.externalDependencyMap) { - let externalDependencyMap = projectConfig.plugins.sfp.externalDependencyMap; - SFPLogger.log(JSON.stringify(externalDependencyMap), LoggerLevel.DEBUG); - return externalDependencyMap; - } - else - return {}; - } - - public async addDependencyEntries(projectConfig: any, connToDevHub: Connection) { - let externalDependencies = []; - let updatedProjectConfig = await _.cloneDeep(projectConfig); - let externalPackageResolver = new ExternalPackage2DependencyResolver(connToDevHub, projectConfig, null); - - let externalDependencyMap = this.fetchDependencyEntries(projectConfig); - - let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); - - for (let externalPackage2 of externalPackage2s) { - externalDependencies.push(externalPackage2.name); - } - for (let dependency of externalDependencies) { - if (!Object.keys(externalDependencyMap).includes(dependency)) { - externalDependencyMap[dependency] = [{ package: '', versionNumber: '' }]; - } - } - updatedProjectConfig.plugins.sfp.externalDependencyMap = externalDependencyMap; - return updatedProjectConfig; - } - - public async cleanupEntries(projectConfig: any) { - let updatedProjectConfig = await _.cloneDeep(projectConfig); - if (updatedProjectConfig?.plugins?.sfp?.externalDependencyMap) { - const externalDependencyMap = updatedProjectConfig.plugins.sfp.externalDependencyMap; - for (let externalPackage of Object.keys(externalDependencyMap)) { - if (externalDependencyMap[externalPackage][0].package == '') { - delete externalDependencyMap[externalPackage]; - } else if ( - externalDependencyMap[externalPackage][0].package != '' && - externalDependencyMap[externalPackage][0].versionNumber == '' - ) { - delete externalDependencyMap[externalPackage][0].versionNumber; - } - } - } - return updatedProjectConfig; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts b/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts deleted file mode 100644 index c6a6c9b7d..000000000 --- a/packages/sfpowerscripts-cli/src/core/queryHelper/ChunkCollection.ts +++ /dev/null @@ -1,38 +0,0 @@ - - -/** - * Split values in SOQL WHERE clause into chunks to avoid exceeding max. URI length (16,000 chars) or max. WHERE clause length (4000 chars) - * @param collection values in SOQL WHERE clause - * @param chunkSize default is 4000 - * @param offset offset to account for keywords, fields, operators and literals in the query. Default is 1000 - */ -export default function chunkCollection(collection: string[], chunkSize: number = 4000, offset: number = 1000): string[][] { - const result: string[][] = []; - chunkSize = chunkSize - offset; - - let chunk: string[] = []; - let numberOfCharsInChunk: number = 0; - for (const elem of collection) { - if (elem.length + 2 > chunkSize) { - throw new Error(`Single value cannot exceed chunk size limit of ${chunkSize}`); - } - - const commasAndQuotes = 2*(chunk.length+1) + chunk.length; - if (numberOfCharsInChunk + elem.length + commasAndQuotes <= chunkSize) { - chunk.push(elem); - numberOfCharsInChunk += elem.length; - } else { - result.push(chunk); - - // Create new chunk - chunk = []; - numberOfCharsInChunk = 0; - chunk.push(elem); - numberOfCharsInChunk += elem.length; - } - } - - result.push(chunk); - - return result; -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts b/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts deleted file mode 100644 index 9b077895c..000000000 --- a/packages/sfpowerscripts-cli/src/core/queryHelper/QueryHelper.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Connection } from '@salesforce/core'; - -const retry = require('async-retry'); - -export default class QueryHelper { - static async query(query: string, conn: Connection, isTooling: boolean): Promise { - return retry( - async (bail) => { - let records; - if (isTooling) records = (await conn.tooling.query(query)).records; - else records = (await conn.query(query)).records; - - return records; - }, - { retries: 3, minTimeout: 2000 } - ); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts deleted file mode 100644 index 482d5d529..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/PasswordGenerator.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Connection, User, AuthInfo, LoggerLevel } from '@salesforce/core'; -import SFPLogger from '@flxblio/sfp-logger'; - -export default class PasswordGenerator { - public async exec(userName: string) { - const query = `SELECT id FROM User WHERE username = '${userName}'`; - - const authInfo = await AuthInfo.create({ username: userName }); - const userConnection = await Connection.create({ authInfo: authInfo }); - let userRecord = (await userConnection.query(query)).records as any; - let passwordBuffer = User.generatePasswordUtf8(); - let pwd; - - await passwordBuffer.value(async (buffer: Buffer) => { - try { - pwd = buffer.toString('utf8'); - - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - // @ts-ignore TODO: expose `soap` on Connection however appropriate - const soap = userConnection.soap; - await soap.setPassword(userRecord[0].Id, pwd); - } catch (e) { - console.log(e); - pwd = undefined; - if (e.message === 'INSUFFICIENT_ACCESS: Cannot set password for self') { - SFPLogger.log( - `${e.message}. Incase of scratch org, Add "features": ["EnableSetPasswordInApi"] in your project-scratch-def.json then create your scratch org.`, - LoggerLevel.WARN - ); - } else { - SFPLogger.log(`${e.message}`, LoggerLevel.WARN); - } - } - }); - - return { - username: userName, - password: pwd, - }; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts deleted file mode 100644 index 8c700d757..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrg.ts +++ /dev/null @@ -1,18 +0,0 @@ -export default interface ScratchOrg { - failureMessage?: string; - tag?: string; - recordId?: string; - orgId?: string; - loginURL?: string; - signupEmail?: string; - username?: string; - alias?: string; - password?: string; - isScriptExecuted?: boolean; - expiryDate?: string; - accessToken?: string; - instanceURL?: string; - status?: string; - sfdxAuthUrl?: string; - elapsedTime?:number -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts deleted file mode 100644 index f354fbbd8..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/ScratchOrgOperator.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { AuthInfo, Org, StateAggregator } from '@salesforce/core'; -import ScratchOrg from './ScratchOrg'; -import PasswordGenerator from './PasswordGenerator'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import { Duration } from '@salesforce/kit'; -import { ScratchOrgRequest } from '@salesforce/core'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import getFormattedTime from '../utils/GetFormattedTime'; -import SFPStatsSender from '../stats/SFPStatsSender'; -const retry = require('async-retry'); - -export default class ScratchOrgOperator { - constructor(private hubOrg: Org) {} - - public async create( - alias: string, - config_file_path: string, - expiry: number, - waitTime: number = 6 - ): Promise { - SFPLogger.log('Parameters: ' + alias + ' ' + config_file_path + ' ' + expiry + ' ', LoggerLevel.TRACE); - - let startTime = Date.now(); - SFPLogger.log(`Requesting Scratch Org ${alias}..`, LoggerLevel.INFO); - let scatchOrgResult = await this.requestAScratchOrg( - alias, - config_file_path, - Duration.days(expiry), - Duration.minutes(waitTime) - ); - SFPLogger.log(JSON.stringify(scatchOrgResult), LoggerLevel.TRACE); - - //create scratchOrg object - let scratchOrg: ScratchOrg = { - alias: alias, - orgId: scatchOrgResult.orgId, - username: scatchOrgResult.username, - loginURL: scatchOrgResult.loginURL, - elapsedTime: Date.now() - startTime, - }; - - try { - //Get Sfdx Auth URL - const authInfo = await AuthInfo.create({ username: scratchOrg.username }); - scratchOrg.sfdxAuthUrl = authInfo.getSfdxAuthUrl(); - } catch (error) { - throw new Error( - `Unable to set auth URL, Ignoring this scratch org, as its not suitable for pool due to ${error.message}` - ); - } - - //Generate Password - let passwordData = await new PasswordGenerator().exec(scratchOrg.username); - - scratchOrg.password = passwordData.password; - - if (!passwordData.password) { - throw new Error('Unable to setup password to scratch org'); - } else { - SFPLogger.log(`Password successfully set for ${scratchOrg.alias}`, LoggerLevel.DEBUG); - } - - SFPLogger.log( - `Creation request for Scratch Org ${scratchOrg.alias} is completed successfully in ${COLOR_KEY_MESSAGE( - getFormattedTime(scratchOrg.elapsedTime) - )}`, - LoggerLevel.INFO - ); - SFPStatsSender.logElapsedTime(`scratchorg.creation.time`,scratchOrg.elapsedTime) - return scratchOrg; - } - - public async delete(scratchOrgIds: string[]) { - let hubConn = this.hubOrg.getConnection(); - - await retry( - async (bail) => { - let result = await hubConn.del('ActiveScratchOrg', scratchOrgIds); - }, - { retries: 3, minTimeout: 3000 } - ); - } - - private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration) { - const createCommandOptions: ScratchOrgRequest = { - durationDays: expireIn.days, - nonamespace: false, - noancestors: false, - wait: waitTime, - retry: 3, - definitionfile: definitionFile, - }; - - const { username, scratchOrgInfo, authFields, warnings } = await this.hubOrg.scratchOrgCreate( - createCommandOptions - ); - - await this.setAliasForUsername(username, alias); - - return { - username: username, - loginURL: scratchOrgInfo.LoginUrl, - warnings, - orgId: authFields.orgId, - }; - } - - public async shareScratchOrgThroughEmail(emailId: string, scratchOrg: ScratchOrg) { - let hubOrgUserName = this.hubOrg.getUsername(); - let apiVersion = this.hubOrg.getConnection().retrieveMaxApiVersion(); - let body = `${hubOrgUserName} has fetched a new scratch org from the Scratch Org Pool!\n - All the post scratch org scripts have been succesfully completed in this org!\n - The Login url for this org is : ${scratchOrg.loginURL}\n - Username: ${scratchOrg.username}\n - Password: ${scratchOrg.password}\n - Please use sfdx force:auth:web:login -r ${scratchOrg.loginURL} -a command to authenticate against this Scratch org

- Thank you for using SFPLogger!`; - - const options = { - method: 'POST', - body: JSON.stringify({ - inputs: [ - { - emailBody: body, - emailAddresses: emailId, - emailSubject: `${hubOrgUserName} created you a new Salesforce org`, - senderType: 'CurrentUser', - }, - ], - }), - url: `/services/data/v${apiVersion}actions/standard/emailSimple`, - }; - - await retry( - async (bail) => { - await this.hubOrg.getConnection().requestPost(options.url, options.body); - }, - { retries: 3, minTimeout: 30000 } - ); - - SFPLogger.log(`Succesfully send email to ${emailId} for ${scratchOrg.username}`, LoggerLevel.INFO); - } - - private async setAliasForUsername(username: string, aliasToSet: string): Promise { - const stateAggregator = await StateAggregator.getInstance(); - stateAggregator.aliases.set(aliasToSet, { username: username }); - await stateAggregator.aliases.write(); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts deleted file mode 100644 index 806dd2de1..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/ClientSourceTracking.ts +++ /dev/null @@ -1,205 +0,0 @@ -const path = require('path'); -import * as fs from 'fs-extra'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { Connection, SfProject } from '@salesforce/core'; -import SFPOrg from '../../org/SFPOrg'; -import { SourceTracking } from '@salesforce/source-tracking'; -import ProjectConfig from '../../project/ProjectConfig'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import { EOL } from 'os'; -import { PackageType } from '../../package/SfpPackage'; -import Git from '../../git/Git'; - -const tmp = require('tmp'); - -export default class ClientSourceTracking { - private conn: Connection; - private org: SFPOrg; - private logger: Logger; - - private sfdxOrgIdDir; - - private constructor() {} - - static async create(conn: Connection, logger: Logger) { - const clientSourceTracking = new ClientSourceTracking(); - - clientSourceTracking.conn = conn; - - clientSourceTracking.org = await SFPOrg.create({ connection: clientSourceTracking.conn }); - clientSourceTracking.logger = logger; - - clientSourceTracking.sfdxOrgIdDir = `.sf/orgs/${clientSourceTracking.org.getOrgId()}`; - - return clientSourceTracking; - } - - async creatSourceTrackingFiles(): Promise { - await this.createRemoteSourceTracking(); - await this.createLocalSourceTracking(); - } - - private async createRemoteSourceTracking() { - const project = await SfProject.resolve(); - const tracking = await SourceTracking.create({ - org: this.org, - project: project, - }); - - tracking.resetRemoteTracking(); - } - - /** - * Create local source tracking from sfp artifacts installed in scratch org - */ - private async createLocalSourceTracking() { - - let git; - try { - git = await Git.initiateRepoAtTempLocation(this.logger); - - const sfpArtifacts = await this.org.getInstalledArtifacts(); - - if(sfpArtifacts.length==0) - throw new Error(`Unable to find any artifacts in the org`); - - //clean up MPD to just one package, so that source tracking lib - //does do a full scan and break - this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), sfpArtifacts[0].Name); - - const project = await SfProject.resolve(git.getRepositoryPath()); - - // Create local source tracking files in temp repo - const tracking = await SourceTracking.create({ - org: this.org, - project: project, - }); - - - - SFPLogger.log( - `Total Artifacts to Analyze: ${sfpArtifacts.length}`, - LoggerLevel.INFO, - this.logger - ); - - let count = 1; - for (const artifact of sfpArtifacts) { - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log( - COLOR_HEADER(`Package ${count} of ${sfpArtifacts.length}`), - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log(`Analyzing package ${COLOR_KEY_MESSAGE(artifact.Name)}`, LoggerLevel.INFO, this.logger); - // Checkout version of source code from which artifact was created - await git.checkout(artifact.CommitId__c,true) - - SFPLogger.log( - `Version pushed while preparing this org is ${artifact.Version__c} with SHA ${artifact.CommitId__c}`, - LoggerLevel.INFO, - this.logger - ); - - //clean up MPD to per package, to speed up - this.cleanupSFDXProjectJsonTonOnePackage(git.getRepositoryPath(), artifact.Name); - - const projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); - - try { - const packageType = ProjectConfig.getPackageType(projectConfig, artifact.Name); - if (packageType === PackageType.Unlocked || packageType === PackageType.Source) { - let componentSet = ComponentSet.fromSource( - path.join( - git.getRepositoryPath(), - ProjectConfig.getPackageDescriptorFromConfig(artifact.Name, projectConfig).path - ) - ); - let components = componentSet.getSourceComponents(); - - //Get all components in the directory - //Count for logging purposes. dont have to waste processing convering - //a lazy collection to array once again - let componentCount = 1; - let componentPaths: string[] = []; - for (const component of components) { - componentCount++; - componentPaths.push(component.xml); - if (component.content) componentPaths.push(component.content); - } - - await tracking.updateLocalTracking({ - files: componentPaths, - }); - SFPLogger.log( - `Updated source tracking for package: ${artifact.Name} with ${componentCount} items`, - LoggerLevel.INFO, - this.logger - ); - } else SFPLogger.log(`Encountered data package... skipping`, LoggerLevel.INFO, this.logger); - } catch (error) { - if(error.message.includes) - { - SFPLogger.log( - ` sfp is unable to sync the package ${artifact.name}${EOL}, - as it not able to find the find equivalent git references`, - LoggerLevel.ERROR, - this.logger); - } - else - SFPLogger.log( - `Unable to update local source tracking due to ${error.message}`, - LoggerLevel.INFO, - this.logger - ); - SFPLogger.log(`Skipping package.. ${artifact.Name}`, LoggerLevel.WARN, this.logger); - } - count++; - } - - SFPLogger.log(EOL, LoggerLevel.INFO, this.logger); - SFPLogger.log(`Copying the temporary repository over to original location`, LoggerLevel.INFO, this.logger); - // Copy source tracking files from temp repo to actual repo - fs.mkdirpSync(path.join(this.sfdxOrgIdDir, 'localSourceTracking')); - fs.copySync( - path.join(git.getRepositoryPath(), this.sfdxOrgIdDir, 'localSourceTracking'), - path.join(this.sfdxOrgIdDir, 'localSourceTracking') - ); - } catch (error) { - - if(error.message.includes(`reference is not a tree`)) - { - SFPLogger.log( - `sfp is unable to sync this repository, - as it not able to find the matching git references${EOL} - Are you sure this pool was created from the same repository?`, - LoggerLevel.ERROR, - this.logger); - } - else - SFPLogger.log( - `Unable to update local source tracking due to ${error.message}`, - LoggerLevel.ERROR, - this.logger - ); - } finally { - if(git) - git.deleteTempoRepoIfAny(); - } - } - - private cleanupSFDXProjectJsonTonOnePackage(projectDir: string, packageName: string) { - try { - let cleanedUpProjectManifest = ProjectConfig.cleanupMPDFromProjectDirectory(projectDir, packageName); - fs.writeJSONSync(path.join(projectDir, 'sfdx-project.json'), cleanedUpProjectManifest, { - spaces: 4, - }); - } catch (error) { - SFPLogger.log( - `sfdx-project.json not found/unable to write, skipping..` + error.message, - LoggerLevel.DEBUG, - this.logger - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts deleted file mode 100644 index d21987759..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/OrphanedOrgsDeleteImpl.ts +++ /dev/null @@ -1,47 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class OrphanedOrgsDeleteImpl extends PoolBaseImpl { - public constructor(hubOrg: Org, private logger:Logger) { - super(hubOrg); - this.hubOrg = hubOrg; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getOrphanedScratchOrgs()) as any; - - let scratchOrgToDelete: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - let scrathOrgIds: string[] = []; - for (let element of results.records) { - if (element.Description?.includes(`"requestedBy":"sfp"`)) { - let soDetail: ScratchOrg = {}; - soDetail.orgId = element.ScratchOrg; - soDetail.username = element.SignupUsername; - soDetail.status = 'recovered'; - scratchOrgToDelete.push(soDetail); - scrathOrgIds.push(`'${element.Id}'`); - } - } - - if (scrathOrgIds.length > 0) { - let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( - scrathOrgIds.join(',') - ); - - if (activeScrathOrgs.records.length > 0) { - for (let scratchOrg of activeScrathOrgs.records) { - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); - SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is recovered`,LoggerLevel.TRACE,this.logger); - } - } - } - } - - return scratchOrgToDelete; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts deleted file mode 100644 index ba7ef6c41..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolBaseImpl.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Org } from '@salesforce/core'; -import { Result } from 'neverthrow'; -import ScratchOrg from '../ScratchOrg'; -import { PoolConfig } from './PoolConfig'; -import { PoolError } from './PoolError'; -import PreRequisiteCheck from './prequisitecheck/PreRequisiteCheck'; - -export abstract class PoolBaseImpl { - protected hubOrg: Org; - - constructor(hubOrg: Org) { - this.hubOrg = hubOrg; - } - - public async execute(): Promise|void> { - let prerequisiteCheck: PreRequisiteCheck = new PreRequisiteCheck(this.hubOrg); - await prerequisiteCheck.checkForPrerequisites(); - return this.onExec(); - } - - protected abstract onExec(): Promise|void>; -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts deleted file mode 100644 index b18fc05f2..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolConfig.ts +++ /dev/null @@ -1,40 +0,0 @@ -import ScratchOrg from '../ScratchOrg'; - -export interface PoolConfig { - tag: string; - maxAllocation: number; - waitTime?: number; - expiry?: number; - batchSize?: number; - configFilePath: string; - releaseConfigFile?:string; - succeedOnDeploymentErrors?: boolean; - keys?: string; - installAll: boolean; - enableSourceTracking: boolean; - relaxAllIPRanges?: boolean; - ipRangesToBeRelaxed?: []; - retryOnFailure?: boolean; - fetchArtifacts: { - artifactFetchScript?: string; - npm?: { - npmrcPath?: string; - scope: string; - }; - }; - disableSourcePackageOverride?:boolean; - snapshotPool?:string; - postDeploymentScriptPath: string; - preDependencyInstallationScriptPath: string; - enableVlocity?: boolean; - min_allocation?: number; - current_allocation?: number; - to_allocate?: number; - to_satisfy_min?: number; - to_satisfy_max?: number; - scratchOrgs?: ScratchOrg[]; - failedToCreate?: number; - maxRetryCount?:number; - - -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts deleted file mode 100644 index 12c0bcadf..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolCreateImpl.ts +++ /dev/null @@ -1,432 +0,0 @@ -import { Org } from '@salesforce/core'; -import Bottleneck from 'bottleneck'; -import { PoolConfig } from './PoolConfig'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgLimitsFetcher from './services/fetchers/ScratchOrgLimitsFetcher'; -import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; -import * as rimraf from 'rimraf'; -import * as fs from 'fs-extra'; -import PoolJobExecutor, { ScriptExecutionResult } from './PoolJobExecutor'; -import { PoolError, PoolErrorCodes } from './PoolError'; -import SFPLogger, { COLOR_KEY_MESSAGE, LoggerLevel } from '@flxblio/sfp-logger'; -import { Result, ok, err } from 'neverthrow'; -import SFPStatsSender from '../../stats/SFPStatsSender'; -import { EOL } from 'os'; -import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; -import PoolFetchImpl from './PoolFetchImpl'; -import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; -import { COLOR_ERROR } from '@flxblio/sfp-logger'; -import getFormattedTime from '../../utils/GetFormattedTime'; -import path from 'path'; - -export default class PoolCreateImpl extends PoolBaseImpl { - private limiter; - private scriptExecutorWrappedForBottleneck; - private limits: any; - private scratchOrgInfoFetcher: ScratchOrgInfoFetcher; - private scratchOrgInfoAssigner: ScratchOrgInfoAssigner; - private scratchOrgOperator: ScratchOrgOperator; - private totalToBeAllocated: number; - private totalAllocated: number = 0; - - public constructor( - hubOrg: Org, - private pool: PoolConfig, - private poolScriptExecutor: PoolJobExecutor, - private logLevel: LoggerLevel - ) { - super(hubOrg); - this.limiter = new Bottleneck({ - maxConcurrent: this.pool.batchSize, - }); - - this.scriptExecutorWrappedForBottleneck = this.limiter.wrap(this.scriptExecutor); - } - - protected async onExec(): Promise> { - await this.hubOrg.refreshAuth(); - - const scriptExecPromises: Array> = []; - - - //fetch current status limits - this.limits = await new ScratchOrgLimitsFetcher(this.hubOrg).getScratchOrgLimits(); - - //Create Service classes - this.scratchOrgInfoFetcher = new ScratchOrgInfoFetcher(this.hubOrg); - this.scratchOrgInfoAssigner = new ScratchOrgInfoAssigner(this.hubOrg); - - //Create Operator - this.scratchOrgOperator = new ScratchOrgOperator(this.hubOrg); - - // Setup Logging Directory - rimraf.sync('script_exec_outputs'); - fs.mkdirpSync('script_exec_outputs'); - - //Compute allocation - try { - if (!this.pool.snapshotPool) { - SFPLogger.log(COLOR_KEY_MESSAGE('Computing Allocation..'), LoggerLevel.INFO); - try { - this.totalToBeAllocated = await this.computeAllocation(); - } catch (error) { - return err({ - success: 0, - failed: 0, - message: `Unable to access fields on ScratchOrgInfo, Please check the profile being used`, - errorCode: PoolErrorCodes.PrerequisiteMissing, - }); - } - - if (this.totalToBeAllocated === 0) { - if (this.limits.ActiveScratchOrgs.Remaining > 0) { - return err({ - success: 0, - failed: 0, - message: `The tag provided ${this.pool.tag} is currently at the maximum capacity , No scratch orgs will be allocated`, - errorCode: PoolErrorCodes.Max_Capacity, - }); - } else { - return err({ - success: 0, - failed: 0, - message: `There is no capacity to create a pool at this time, Please try again later`, - errorCode: PoolErrorCodes.No_Capacity, - }); - } - } - - //Generate Scratch Orgs - this.pool.scratchOrgs = await this.generateScratchOrgs( - this.pool, - this.scratchOrgOperator, - this.scratchOrgInfoAssigner - ); - } else { - this.pool.scratchOrgs = await this.fetchScratchOrgsFromSnapshotPool( - this.pool, - this.scratchOrgInfoFetcher, - this.scratchOrgInfoAssigner - ); - } - } catch (error) { - return err({ - success: 0, - failed: this.pool.failedToCreate, - message: `All requested scratch orgs failed to provision, Please check your code or config \n Failed with ${error.message}`, - errorCode: PoolErrorCodes.UnableToProvisionAny, - }); - } - - // Assign workers to executed scripts - for (const scratchOrg of this.pool.scratchOrgs) { - const result = this.scriptExecutorWrappedForBottleneck(scratchOrg, this.hubOrg.getUsername()); - scriptExecPromises.push(result); - } - - await Promise.all(scriptExecPromises); - - this.pool = await this.finalizeGeneratedScratchOrgs( - this.pool, - this.scratchOrgOperator, - this.scratchOrgInfoFetcher - ); - - if (!this.pool.scratchOrgs || this.pool.scratchOrgs.length == 0) { - return err({ - success: 0, - failed: this.pool.failedToCreate, - message: `All requested scratch orgs failed to provision, Please check your code or config`, - errorCode: PoolErrorCodes.UnableToProvisionAny, - }); - } - return ok(this.pool); - - - } - - private async computeAllocation(): Promise { - //Compute current pool requirement - const activeCount = await this.scratchOrgInfoFetcher.getCountOfActiveScratchOrgsByTag(this.pool.tag); - return this.allocateScratchOrgsPerTag(this.limits.ActiveScratchOrgs.Remaining, activeCount, this.pool); - } - - private allocateScratchOrgsPerTag( - remainingScratchOrgs: number, - countOfActiveScratchOrgs: number, - pool: PoolConfig - ) { - pool.current_allocation = countOfActiveScratchOrgs; - pool.to_allocate = 0; - pool.to_satisfy_max = - pool.maxAllocation - pool.current_allocation > 0 ? pool.maxAllocation - pool.current_allocation : 0; - - if (pool.to_satisfy_max > 0 && pool.to_satisfy_max <= remainingScratchOrgs) { - pool.to_allocate = pool.to_satisfy_max; - } else if (pool.to_satisfy_max > 0 && pool.to_satisfy_max > remainingScratchOrgs) { - pool.to_allocate = remainingScratchOrgs; - } - - SFPLogger.log( - `${EOL}Current Allocation of ScratchOrgs in the pool ${this.pool.tag}: ` + pool.current_allocation, - LoggerLevel.INFO - ); - SFPLogger.log('Remaining Active scratchOrgs in the org: ' + remainingScratchOrgs, LoggerLevel.INFO); - SFPLogger.log('ScratchOrgs to be allocated: ' + pool.to_allocate, LoggerLevel.INFO); - return pool.to_allocate; - } - - private async generateScratchOrgs( - pool: PoolConfig, - scratchOrgOperator: ScratchOrgOperator, - scratchOrgInfoAssigner: ScratchOrgInfoAssigner - ) { - //Generate Scratch Orgs - SFPLogger.log(COLOR_KEY_MESSAGE('Generate Scratch Orgs..'), LoggerLevel.INFO); - - const scratchOrgPromises = new Array>(); - - const scratchOrgCreationLimiter = new Bottleneck({ - maxConcurrent: pool.batchSize, - }); - - addDescriptionToScratchOrg(pool); - - const startTime = Date.now(); - for (let i = 1; i <= pool.to_allocate; i++) { - const scratchOrgPromise: Promise = scratchOrgCreationLimiter.schedule(() => - scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime) - ); - scratchOrgPromises.push(scratchOrgPromise); - } - - SFPLogger.log(`Waiting for all scratch org request to complete, Please wait`); - //Wait for all orgs to be created - const scratchOrgCreationResults = await Promise.allSettled(scratchOrgPromises); - //Only worry about scrath orgs that have suceeded - const isFulfilled = (p: PromiseSettledResult): p is PromiseFulfilledResult => p.status === 'fulfilled'; - const isRejected = (p: PromiseSettledResult): p is PromiseRejectedResult => p.status === 'rejected'; - - let scratchOrgs = scratchOrgCreationResults.filter(isFulfilled).map((p) => p.value); - const rejectedScratchOrgs = scratchOrgCreationResults.filter(isRejected).map((p) => p.reason); - for (const reason of rejectedScratchOrgs) { - if (reason.message.includes(`The client has timed out`)) { - //Log how many we were able to create - const elapsedTime = Date.now() - startTime; - SFPLogger.log( - `A scratch org creation was rejected due to saleforce not responding within the set wait time of ${pool.waitTime} mins \n` + - `Time elasped so far ${COLOR_KEY_MESSAGE( - getFormattedTime(elapsedTime) - )},You might need to inrease the wait time further and rety ` - ); - } else SFPLogger.log(`A scratch org creation was rejected due to ${reason.message}`); - } - - //Log how many we were able to create - const elapsedTime = Date.now() - startTime; - SFPLogger.log( - `Created ${COLOR_SUCCESS(scratchOrgs.length)} of ${pool.to_allocate} successfully with ${COLOR_ERROR( - rejectedScratchOrgs.length - )} failures in ${COLOR_KEY_MESSAGE(getFormattedTime(elapsedTime))}` - ); - - SFPStatsSender.logElapsedTime(`pool.scratchorg.creation.time`, elapsedTime, { pool: pool.tag }); - if (scratchOrgs && scratchOrgs.length > 0) { - //Splice scratchorgs that are having incorrect status of deleted , Why salesforce why?? - let index = scratchOrgs.length; - while (index--) { - try { - const orgDetails = await new OrgDetailsFetcher(scratchOrgs[index].username).getOrgDetails(); - if (orgDetails.status === 'Deleted') { - throw new Error( - `Throwing away scratch org ${this.pool.scratchOrgs[index].alias} as it has a status of deleted` - ); - } - } catch (error) { - scratchOrgs.splice(index, 1); - } - } - - scratchOrgs = await this.scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); - - const scratchOrgInprogress = []; - - scratchOrgs.forEach((scratchOrg) => { - scratchOrgInprogress.push({ - Id: scratchOrg.recordId, - Pooltag__c: this.pool.tag, - Password__c: scratchOrg.password, - SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, - Allocation_status__c: 'In Progress', - }); - }); - - if (scratchOrgInprogress.length > 0) { - //set pool tag - await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); - } - return scratchOrgs; - } else throw new Error(`No scratch orgs were sucesfully generated`); - - function addDescriptionToScratchOrg(pool: PoolConfig) { - - const configClonePath = path.join('.sfp','scratchorg-configs',`${ makeFileId(8)}.json`); - fs.mkdirpSync('.sfp/scratchorg-configs'); - fs.copyFileSync(pool.configFilePath,configClonePath); - - const scratchOrgDefn = fs.readJSONSync(configClonePath); - if (!scratchOrgDefn.description) - scratchOrgDefn.description = JSON.stringify({ - requestedBy: 'sfp', - pool: pool.tag, - requestedAt: new Date().toISOString(), - }); - else - scratchOrgDefn.description = scratchOrgDefn.description.concat( - ' ', - JSON.stringify({ - requestedBy: 'sfp', - pool: pool.tag, - requestedAt: new Date().toISOString(), - }) - ); - fs.writeJSONSync(configClonePath, scratchOrgDefn, { spaces: 4 }); - pool.configFilePath = configClonePath; - } - - function makeFileId(length): string { - let result = ''; - const characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } - } - - private async fetchScratchOrgsFromSnapshotPool( - pool: PoolConfig, - scratchOrgInfoFetcher: ScratchOrgInfoFetcher, - scratchOrgInfoAssigner: ScratchOrgInfoAssigner - ) { - //Generate Scratch Orgs - SFPLogger.log( - COLOR_KEY_MESSAGE(`Fetching Scratch Orgs from snapshot pool ${this.pool.snapshotPool}`), - LoggerLevel.INFO - ); - - let scratchOrgs = (await new PoolFetchImpl( - this.hubOrg, - this.pool.snapshotPool, - false, - true, - undefined, - undefined, - undefined, - true, - this.pool.maxAllocation - ).execute()) as ScratchOrg[]; - scratchOrgs = await scratchOrgInfoFetcher.getScratchOrgRecordId(scratchOrgs); - - const scratchOrgInprogress = []; - - if (scratchOrgs && scratchOrgs.length > 0) { - scratchOrgs.forEach((scratchOrg) => { - scratchOrgInprogress.push({ - Id: scratchOrg.recordId, - Pooltag__c: this.pool.tag, - Password__c: scratchOrg.password, - SfdxAuthUrl__c: scratchOrg.sfdxAuthUrl, - Allocation_status__c: 'In Progress', - }); - }); - - if (scratchOrgInprogress.length > 0) { - //set pool tag - await scratchOrgInfoAssigner.setScratchOrgInfo(scratchOrgInprogress); - } - return scratchOrgs; - } else { - throw new Error('No scratch orgs were found to be fetched'); - } - } - - private async finalizeGeneratedScratchOrgs( - pool: PoolConfig, - scratchOrgOperator: ScratchOrgOperator, - scratchOrgInfoFetcher: ScratchOrgInfoFetcher - ) { - pool.failedToCreate = 0; - for (let i = pool.scratchOrgs.length - 1; i >= 0; i--) { - const scratchOrg = pool.scratchOrgs[i]; - if (scratchOrg.isScriptExecuted) { - continue; - } - - SFPLogger.log( - `Failed to execute scripts for ${scratchOrg.username} with alias ${scratchOrg.alias} due to ${scratchOrg.failureMessage}`, - LoggerLevel.ERROR - ); - - try { - //Delete scratchorgs that failed to execute script - - const activeScratchOrgRecordId = await scratchOrgInfoFetcher.getActiveScratchOrgRecordIdGivenScratchOrg( - scratchOrg.orgId - ); - - await scratchOrgOperator.delete([activeScratchOrgRecordId]); - console.log(`Succesfully deleted scratchorg ${scratchOrg.username}`); - } catch (error) { - SFPLogger.log( - `Unable to delete the scratchorg ${scratchOrg.username}.. due to\n` + error, - LoggerLevel.ERROR - ); - } - - pool.failedToCreate += 1; - pool.scratchOrgs.splice(i, 1); - } - return pool; - } - - private async scriptExecutor(scratchOrg: ScratchOrg): Promise { - SFPLogger.log( - `Executing Preparation Job ${scratchOrg.alias} with username: ${scratchOrg.username}`, - LoggerLevel.INFO - ); - - const startTime = Date.now(); - const result = await this.poolScriptExecutor.execute(scratchOrg, this.hubOrg, this.logLevel); - - if (result.isOk()) { - scratchOrg.isScriptExecuted = true; - const submitInfoToPool = await this.scratchOrgInfoAssigner.setScratchOrgInfo({ - Id: scratchOrg.recordId, - Allocation_status__c: 'Available', - }); - if (!submitInfoToPool) { - scratchOrg.isScriptExecuted = false; - scratchOrg.failureMessage = 'Unable to set the scratch org record in Pool'; - SFPStatsSender.logCount('prepare.org.failed'); - } else { - SFPStatsSender.logCount('prepare.org.succeeded'); - } - - SFPStatsSender.logElapsedTime('prepare.org.singlejob.elapsed_time', Date.now() - startTime, { - poolname: this.pool.tag, - }); - } else { - scratchOrg.isScriptExecuted = false; - scratchOrg.failureMessage = result.error.message; - SFPStatsSender.logCount('prepare.org.failed'); - } - - return scratchOrg; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts deleted file mode 100644 index 1a6768542..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolDeleteImpl.ts +++ /dev/null @@ -1,65 +0,0 @@ -import SFPLogger from '@flxblio/sfp-logger'; -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; -import { Logger } from '@flxblio/sfp-logger'; -import { LoggerLevel } from '@flxblio/sfp-logger'; - -export default class PoolDeleteImpl extends PoolBaseImpl { - private tag: string; - private mypool: boolean; - private allScratchOrgs: boolean; - private inprogressonly: boolean; - - public constructor(hubOrg: Org, tag: string, mypool: boolean, allScratchOrgs: boolean, inprogressonly: boolean,private logger:Logger) { - super(hubOrg); - this.hubOrg = hubOrg; - this.tag = tag; - this.mypool = mypool; - this.allScratchOrgs = allScratchOrgs; - this.inprogressonly = inprogressonly; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - this.mypool, - !this.allScratchOrgs - )) as any; - - let scratchOrgToDelete: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - let scrathOrgIds: string[] = []; - for (let element of results.records) { - if (!this.inprogressonly || element.Allocation_status__c === 'In Progress') { - let soDetail: ScratchOrg = {}; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.expiryDate = element.ExpirationDate; - soDetail.status = 'Deleted'; - - scratchOrgToDelete.push(soDetail); - scrathOrgIds.push(`'${element.Id}'`); - } - } - - if (scrathOrgIds.length > 0) { - let activeScrathOrgs = await new ScratchOrgInfoFetcher(this.hubOrg).getActiveScratchOrgsByInfoId( - scrathOrgIds.join(',') - ); - - if (activeScrathOrgs.records.length > 0) { - for (let scratchOrg of activeScrathOrgs.records) { - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrg.Id); - SFPLogger.log(`Scratch org with username ${scratchOrg.SignupUsername} is deleted successfully`,LoggerLevel.TRACE,this.logger); - } - } - } - } - - return scratchOrgToDelete; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts deleted file mode 100644 index 820346576..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolError.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface PoolError { - success: number; - failed: number; - errorCode: PoolErrorCodes; - message?: string; -} - -export enum PoolErrorCodes { - Max_Capacity = 'MaxCapacity', - No_Capacity = 'NoCapacity', - PrerequisiteMissing = 'PrerequisitesMissing', - UnableToProvisionAny = 'UnableToProvisionAny', -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts deleted file mode 100644 index 77a2c3566..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolFetchImpl.ts +++ /dev/null @@ -1,244 +0,0 @@ -import SFPLogger from '@flxblio/sfp-logger'; -import { AuthInfo, LoggerLevel, Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import { getUserEmail } from './services/fetchers/GetUserEmail'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgInfoAssigner from './services/updaters/ScratchOrgInfoAssigner'; -import ClientSourceTracking from './ClientSourceTracking'; -import isValidSfdxAuthUrl from './prequisitecheck/IsValidSfdxAuthUrl'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class PoolFetchImpl extends PoolBaseImpl { - private tag: string; - private mypool: boolean; - private sendToUser: string; - private alias: string; - private setdefaultusername: boolean; - private authURLEnabledScratchOrg: boolean; - private isSourceTrackingToBeSet: boolean = false; - - public constructor( - hubOrg: Org, - tag: string, - mypool: boolean, - authURLEnabledScratchOrg: boolean, - sendToUser?: string, - alias?: string, - setdefaultusername?: boolean, - private fetchAllScratchOrgs?: boolean, - private limitBy?:number - ) { - super(hubOrg); - this.tag = tag; - this.mypool = mypool; - this.authURLEnabledScratchOrg = authURLEnabledScratchOrg; - this.sendToUser = sendToUser; - this.alias = alias; - this.setdefaultusername = setdefaultusername; - } - - public setSourceTrackingOnFetch() { - this.isSourceTrackingToBeSet = true; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - this.mypool, - true - )) as any; - - let availableSo = []; - if (results.records.length > 0) { - availableSo = results.records.filter((soInfo) => soInfo.Allocation_status__c === 'Available'); - } - if (availableSo.length == 0) { - throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); - } - - if (this.fetchAllScratchOrgs) { - return this.fetchAllScratchOrg(availableSo,this.limitBy); - } else return this.fetchSingleScratchOrg(availableSo); - } - - private async fetchAllScratchOrg(availableSo: any[],limitBy?:number): Promise { - let fetchedSOs: ScratchOrg[] = []; - - if (availableSo.length > 0) { - SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); - - let count = 1; - for (let element of availableSo) { - if (this.authURLEnabledScratchOrg) { - if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { - SFPLogger.log( - `Iterating through pool to find a scratch org with valid authURL`, - LoggerLevel.TRACE - ); - continue; - } - } - - - - SFPLogger.log( - `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, - LoggerLevel.TRACE - ); - let soDetail: any = {}; - soDetail['Id'] = element.Id; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; - soDetail.status = 'Available'; - soDetail.alias = `SO` + count; - fetchedSOs.push(soDetail); - - - if(limitBy && count==limitBy) - break; - - count++; - } - } - - for (const soDetail of fetchedSOs) { - //Login to the org - let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); - if (!isLoginSuccessFull) { - SFPLogger.log(`Unable to login to scratchorg ${soDetail.username}}`, LoggerLevel.ERROR); - fetchedSOs = fetchedSOs.filter((item) => item.username !== soDetail.username); - } - } - - return fetchedSOs; - } - - private async fetchSingleScratchOrg(availableSo: any[]): Promise { - let soDetail: ScratchOrg; - - if (availableSo.length > 0) { - SFPLogger.log(`${this.tag} pool has ${availableSo.length} Scratch orgs available`, LoggerLevel.TRACE); - - for (let element of availableSo) { - if (this.authURLEnabledScratchOrg) { - if (element.SfdxAuthUrl__c && !isValidSfdxAuthUrl(element.SfdxAuthUrl__c)) { - SFPLogger.log( - `Iterating through pool to find a scratch org with valid authURL`, - LoggerLevel.TRACE - ); - continue; - } - } - - let allocateSO = await new ScratchOrgInfoAssigner(this.hubOrg).setScratchOrgInfo({ - Id: element.Id, - Allocation_status__c: 'Allocate', - }); - if (allocateSO === true) { - SFPLogger.log( - `Scratch org ${element.SignupUsername} is allocated from the pool. Expiry date is ${element.ExpirationDate}`, - LoggerLevel.TRACE - ); - soDetail = {}; - soDetail['Id'] = element.Id; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - soDetail.sfdxAuthUrl = element.SfdxAuthUrl__c; - soDetail.status = 'Assigned'; - - break; - } else { - SFPLogger.log( - `Scratch org ${element.SignupUsername} allocation failed. trying to get another Scratch org from ${this.tag} pool`, - LoggerLevel.TRACE - ); - } - } - } - - if (availableSo.length == 0 || !soDetail) { - throw new Error(`No scratch org available at the moment for ${this.tag}, try again in sometime.`); - } - - if (this.sendToUser) { - //Fetch the email for user id - let emailId; - try { - emailId = await getUserEmail(this.sendToUser, this.hubOrg); - } catch (error) { - SFPLogger.log( - 'Unable to fetch details of the specified user, Check whether the user exists in the org ', - LoggerLevel.ERROR - ); - throw new Error('Failed to fetch user details'); - } - - try { - //Send an email for username - await new ScratchOrgOperator(this.hubOrg).shareScratchOrgThroughEmail(emailId, soDetail); - } catch (error) { - SFPLogger.log( - 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org', - LoggerLevel.ERROR - ); - throw new Error( - 'Unable to send the scratchorg details to specified user. Check whether the user exists in the org' - ); - } - } else { - //Login to the org - let isLoginSuccessFull = await this.loginToScratchOrgIfSfdxAuthURLExists(soDetail); - //Attempt to Fetch Source Tracking Files and silently continue if it fails - if (isLoginSuccessFull && this.isSourceTrackingToBeSet) { - try { - const conn = (await Org.create({ aliasOrUsername: soDetail.username })).getConnection(); - const clientSourceTracking = await ClientSourceTracking.create(conn, null); - await clientSourceTracking.creatSourceTrackingFiles(); - } catch (error) { - SFPLogger.log('Retriveing Source Tracking skipped.. ' + error.message, LoggerLevel.TRACE); - } - } - } - return soDetail; - } - - private async loginToScratchOrgIfSfdxAuthURLExists(soDetail: ScratchOrg): Promise { - try { - if (soDetail.sfdxAuthUrl && isValidSfdxAuthUrl(soDetail.sfdxAuthUrl)) { - - - const oauth2Options = AuthInfo.parseSfdxAuthUrl(soDetail.sfdxAuthUrl); - const authInfo = await AuthInfo.create({ oauth2Options }); - await authInfo.save({...authInfo.getFields(),isScratch:true,devHubUsername:this.hubOrg.getUsername(),expirationDate:soDetail.expiryDate}); - - await authInfo.handleAliasAndDefaultSettings({ - alias: this.alias?this.alias:soDetail.alias, - setDefault: true, - setDefaultDevHub: false, - }); - - const result = authInfo.getFields(true); - // ensure the clientSecret field... even if it is empty - // as per https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/auth/sfdxurl/store.ts - result.clientSecret = result.clientSecret ?? ''; - await AuthInfo.identifyPossibleScratchOrgs(result, authInfo); - - return true; - } else { - SFPLogger.log('Unable to autenticate to the scratch org', LoggerLevel.INFO); - return false; - } - } catch (error) { - SFPLogger.log('Unable to autenticate to the scratch org due ' + error.message, LoggerLevel.ERROR); - return false; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts deleted file mode 100644 index 1d70e4aff..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolJobExecutor.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolConfig } from './PoolConfig'; -import ScratchOrg from '../ScratchOrg'; -import { Result } from 'neverthrow'; -import * as fs from 'fs-extra'; -import { EOL } from 'os'; -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; - -export default abstract class PoolJobExecutor { - protected logToFilePath: string; - - constructor(protected pool: PoolConfig) {} - - async execute( - scratchOrg: ScratchOrg, - hubOrg: Org, - logLevel: LoggerLevel - ): Promise> { - this.logToFilePath = `.sfp/prepare_logs/${scratchOrg.alias}.log`; - //Create file logger - fs.outputFileSync(this.logToFilePath, `sfp--log${EOL}`); - SFPLogger.log(`Preparation Log files for ${scratchOrg.username} written to ${this.logToFilePath}`); - return this.executeJob(scratchOrg, hubOrg, this.logToFilePath, logLevel); - } - - abstract executeJob( - scratchOrg: ScratchOrg, - hubOrg: Org, - logToFilePath: string, - logLevel: LoggerLevel - ): Promise>; -} - -export interface ScriptExecutionResult { - scratchOrgUsername: string; -} - -export interface JobError { - message: string; - scratchOrgUsername: string; -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts deleted file mode 100644 index bf5ad0d64..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolListImpl.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrg from '../ScratchOrg'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; - -export default class PoolListImpl extends PoolBaseImpl { - private tag: string; - private allScratchOrgs: boolean; - - public constructor(hubOrg: Org, tag: string, allScratchOrgs: boolean) { - super(hubOrg); - this.hubOrg = hubOrg; - this.tag = tag; - this.allScratchOrgs = allScratchOrgs; - } - - protected async onExec(): Promise { - const results = (await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgsByTag( - this.tag, - null, - !this.allScratchOrgs - )) as any; - - let scratchOrgList: ScratchOrg[] = new Array(); - if (results.records.length > 0) { - for (let element of results.records) { - let soDetail: ScratchOrg = {}; - soDetail.tag = element.Pooltag__c; - soDetail.orgId = element.ScratchOrg; - soDetail.loginURL = element.LoginUrl; - soDetail.username = element.SignupUsername; - soDetail.password = element.Password__c; - soDetail.expiryDate = element.ExpirationDate; - if (element.Allocation_status__c === 'Assigned') { - soDetail.status = 'In use'; - } else if (element.Allocation_status__c === 'Available') { - soDetail.status = 'Available'; - } else { - soDetail.status = 'Provisioning in progress'; - } - - scratchOrgList.push(soDetail); - } - } - - return scratchOrgList; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts deleted file mode 100644 index 435d6fac7..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/PoolOrgDeleteImpl.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolBaseImpl } from './PoolBaseImpl'; -import ScratchOrgInfoFetcher from './services/fetchers/ScratchOrgInfoFetcher'; -import ScratchOrgOperator from '../ScratchOrgOperator'; - -export default class PoolOrgDeleteImpl extends PoolBaseImpl { - username: string; - - public constructor(hubOrg: Org, username: string) { - super(hubOrg); - this.hubOrg = hubOrg; - this.username = username; - } - - protected async onExec(): Promise { - try { - let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgIdGivenUserName(this.username); - await new ScratchOrgOperator(this.hubOrg).delete(scratchOrgId); - } catch (err) { - throw new Error( - `Either the scratch org doesn't exist or you do not have the correct permissions, Failed with ` + - err.message - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts deleted file mode 100644 index 9cd50260a..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl.ts +++ /dev/null @@ -1,19 +0,0 @@ -export default function isValidSfdxAuthUrl(sfdxAuthUrl: string): boolean { - if (sfdxAuthUrl.match(/force:\/\/(?[a-zA-Z0-9._]+)@.+/)) { - return true; - } else { - let match = sfdxAuthUrl.match( - /force:\/\/(?[a-zA-Z0-9._=]+):(?[a-zA-Z0-9]*):(?[a-zA-Z0-9._=]+)@.+/ - ); - - if (match !== null) { - if (match.groups.refreshToken === 'undefined') { - return false; - } else { - return true; - } - } else { - return false; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts deleted file mode 100644 index 18da896a9..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/prequisitecheck/PreRequisiteCheck.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Org } from '@salesforce/core'; -const retry = require('async-retry'); -import { Result, ok, err } from 'neverthrow'; -import { PoolConfig } from '../PoolConfig'; -import { PoolError, PoolErrorCodes } from '../PoolError'; - -export default class PreRequisiteCheck { - private static isPrerequisiteChecked: boolean = false; - private static isPrerequisiteMet = false; - private static describeResult; - - private hubOrg: Org; - - constructor(hubOrg: Org) { - this.hubOrg = hubOrg; - } - - public async checkForPrerequisites(): Promise { - let sfdxAuthUrlFieldExists = false; - let conn = this.hubOrg.getConnection(); - let expectedValues = ['In Progress', 'Available', 'Allocate', 'Assigned','Return']; - let availableValues: string[] = []; - if (!PreRequisiteCheck.isPrerequisiteChecked) { - await retry( - async (bail) => { - PreRequisiteCheck.describeResult = await conn.sobject('ScratchOrgInfo').describe(); - if (PreRequisiteCheck.describeResult) { - for (const field of PreRequisiteCheck.describeResult.fields) { - if (field.name === 'SfdxAuthUrl__c') { - sfdxAuthUrlFieldExists = true; - } - - if (field.name === 'Allocation_status__c' && field.picklistValues.length >= 4) { - for (let picklistValue of field.picklistValues) { - if (picklistValue.active) { - availableValues.push(picklistValue.value); - } - } - } - } - } - }, - { retries: 3, minTimeout: 30000 } - ); - - PreRequisiteCheck.isPrerequisiteChecked = true; - //If there are values returned, its not compatible - let statusValuesAvailable = - expectedValues.filter((item) => { - return !availableValues.includes(item); - }).length <= 1 - ? true - : false; - - if (sfdxAuthUrlFieldExists && statusValuesAvailable) PreRequisiteCheck.isPrerequisiteMet = true; - } - - if (!PreRequisiteCheck.isPrerequisiteMet) { - throw new Error( `Required Prerequisite values in ScratchOrgInfo is missing in the DevHub` + - `For more information Please refer https://sfp.flxblio.io/getting-started/prerequisites \n`); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts deleted file mode 100644 index e0c34bf9e..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/GetUserEmail.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LoggerLevel, Org } from '@salesforce/core'; - -let retry = require('async-retry'); -import SFPLogger from '@flxblio/sfp-logger'; - -export async function getUserEmail(username: string, hubOrg: Org) { - let hubConn = hubOrg.getConnection(); - - return retry( - async (bail) => { - if (!username) { - bail(new Error('username cannot be null. provide a valid username')); - return; - } - let query = `SELECT email FROM user WHERE username='${username}'`; - - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - - if (results.records.size < 1) { - bail(new Error(`No user found with username ${username} in devhub.`)); - return; - } - return results.records[0].Email; - }, - { retries: 3, minTimeout: 3000 } - ); -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts deleted file mode 100644 index a89ad737a..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher.ts +++ /dev/null @@ -1,187 +0,0 @@ -import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; -import { Org } from '@salesforce/core'; -import ScratchOrg from '../../../ScratchOrg'; -const retry = require('async-retry'); -const ORDER_BY_FILTER = ' ORDER BY CreatedDate DESC'; - -export default class ScratchOrgInfoFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgRecordId(scratchOrgs: ScratchOrg[]) { - if (scratchOrgs == undefined || scratchOrgs.length == 0) return; - - let hubConn = this.hubOrg.getConnection(); - - let scratchOrgIds = scratchOrgs - .map(function (scratchOrg) { - scratchOrg.orgId = scratchOrg.orgId.slice(0, 15); - return `'${scratchOrg.orgId}'`; - }) - .join(','); - - let query = `SELECT Id, ScratchOrg FROM ScratchOrgInfo WHERE ScratchOrg IN ( ${scratchOrgIds} )`; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - - return retry( - async (bail) => { - const results = (await hubConn.query(query)) as any; - let resultAsObject = this.arrayToObject(results.records, 'ScratchOrg'); - - SFPLogger.log(JSON.stringify(resultAsObject), LoggerLevel.TRACE); - - scratchOrgs.forEach((scratchOrg) => { - scratchOrg.recordId = resultAsObject[scratchOrg.orgId]['Id']; - }); - - return scratchOrgs; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getScratchOrgsByTag(tag: string, isMyPool: boolean, unAssigned: boolean) { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query; - - if (tag) - query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - else - query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c != null AND Status = 'Active' `; - - if (isMyPool) { - query = query + ` AND createdby.username = '${this.hubOrg.getUsername()}' `; - } - if (unAssigned) { - // if new version compatible get Available / In progress - query = - query + `AND ( Allocation_status__c ='Available' OR Allocation_status__c = 'In Progress' ) `; - } - query = query + ORDER_BY_FILTER; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getOrphanedScratchOrgs() { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query; - query = `SELECT Id, Pooltag__c, SignupUsername, Description, ScratchOrg FROM ScratchOrgInfo WHERE Pooltag__c = null AND Status = 'Active'`; - query = query + ORDER_BY_FILTER; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgsByInfoId(scrathOrgIds: string) { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, SignupUsername FROM ActiveScratchOrg WHERE ScratchOrgInfoId IN (${scrathOrgIds}) `; - - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getCountOfActiveScratchOrgsByTag(tag: string): Promise { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - SFPLogger.log('RESULT:' + JSON.stringify(results), LoggerLevel.TRACE); - return results.totalSize; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getCountOfActiveScratchOrgsByTagAndUsername(tag: string): Promise { - let hubConn = this.hubOrg.getConnection(); - - return retry( - async (bail) => { - let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await hubConn.query(query)) as any; - return results.totalSize; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgRecordIdGivenScratchOrg(scratchOrgId: string): Promise { - let hubConn = this.hubOrg.getConnection(); - return retry( - async (bail) => { - let query = `SELECT Id FROM ActiveScratchOrg WHERE ScratchOrg = '${scratchOrgId}'`; - let records = (await hubConn.query(query)).records; - - SFPLogger.log('Retrieve Active ScratchOrg Id:' + JSON.stringify(records), LoggerLevel.TRACE); - return records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getActiveScratchOrgRecordsAsMapByUser(hubOrg: Org) { - let conn = this.hubOrg.getConnection(); - let query = - 'SELECT count(id) In_Use, SignupEmail FROM ActiveScratchOrg GROUP BY SignupEmail ORDER BY count(id) DESC'; - const results = (await conn.query(query)) as any; - SFPLogger.log(`Info Fetched: ${JSON.stringify(results)}`, LoggerLevel.DEBUG); - - let scratchOrgRecordAsMapByUser = this.arrayToObject(results.records, 'SignupEmail'); - return scratchOrgRecordAsMapByUser; - } - - public async getScratchOrgIdGivenUserName(username: string) { - let conn = this.hubOrg.getConnection(); - let query = `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername = '${username}'`; - return retry( - async (bail) => { - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await conn.query(query)) as any; - return results.records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - public async getScratchOrgInfoIdGivenUserName(username: string) { - let conn = this.hubOrg.getConnection(); - let query = `SELECT Id FROM ScratchOrgInfo WHERE SignupUsername = '${username}'`; - return retry( - async (bail) => { - SFPLogger.log('QUERY:' + query, LoggerLevel.TRACE); - const results = (await conn.query(query)) as any; - return results.records[0].Id; - }, - { retries: 3, minTimeout: 3000 } - ); - } - - private arrayToObject = (array, keyfield) => - array.reduce((obj, item) => { - obj[item[keyfield]] = item; - return obj; - }, {}); -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts deleted file mode 100644 index d8d54a45e..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/fetchers/ScratchOrgLimitsFetcher.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Org } from '@salesforce/core'; - -export default class ScratchOrgLimitsFetcher { - constructor(private hubOrg: Org) {} - - public async getScratchOrgLimits(): Promise { - let conn = this.hubOrg.getConnection(); - let apiVersion = await conn.retrieveMaxApiVersion(); - let query_uri = `${conn.instanceUrl}/services/data/v${apiVersion}/limits`; - const result = await conn.request(query_uri); - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts b/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts deleted file mode 100644 index 5055b8cc3..000000000 --- a/packages/sfpowerscripts-cli/src/core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { LoggerLevel, Org } from '@salesforce/core'; -let retry = require('async-retry'); -import SFPLogger from '@flxblio/sfp-logger'; -import ScratchOrgInfoFetcher from '../fetchers/ScratchOrgInfoFetcher'; -import ObjectCRUDHelper from '../../../../utils/ObjectCRUDHelper'; - -export default class ScratchOrgInfoAssigner { - constructor(private hubOrg: Org) {} - - public async setScratchOrgInfo(soInfo: any): Promise { - let hubConn = this.hubOrg.getConnection(); - let result = await ObjectCRUDHelper.updateRecord(hubConn,'ScratchOrgInfo',soInfo); - if(result) return true; - } - - public async setScratchOrgStatus(username: string, status: 'Allocate' | 'InProgress' | 'Return'): Promise { - let scratchOrgId = await new ScratchOrgInfoFetcher(this.hubOrg).getScratchOrgInfoIdGivenUserName(username); - - return this.setScratchOrgInfo({ - Id: scratchOrgId, - Allocation_status__c: status, - }); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts b/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts deleted file mode 100644 index 0c7f92965..000000000 --- a/packages/sfpowerscripts-cli/src/core/scriptExecutor/ScriptExecutorHelpers.ts +++ /dev/null @@ -1,19 +0,0 @@ -import ExecuteCommand from '@flxblio/sfdx-process-wrapper/lib/commandExecutor/ExecuteCommand'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import defaultShell from '../utils/DefaultShell'; - -export default class scriptExecutorHelpers { - static async executeScript(logger: Logger, ...args: string[]) { - let cmd: string; - let argStr =args.join(' '); - if (process.platform !== 'win32') { - cmd = `${defaultShell()} -e ${argStr}`; - } else { - cmd = `cmd.exe /c ${argStr}`; - } - - SFPLogger.log(`Executing command.. ${cmd}`,LoggerLevel.INFO,logger); - let scriptExecutor: ExecuteCommand = new ExecuteCommand(logger, LoggerLevel.INFO, true); - let result = await scriptExecutor.execCommand(cmd, null); - } - } diff --git a/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts b/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts deleted file mode 100644 index 4df46887d..000000000 --- a/packages/sfpowerscripts-cli/src/core/sfdmuwrapper/SFDMURunImpl.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class SFDMURunImpl extends SFDXCommand { - public constructor( - working_directory: string, - target_org: string, - private targetOrgDomain: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, working_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'sf sfdmu run'; - } - getCommandName(): string { - return 'sfdmu run'; - } - - getGeneratedParams(): string { - let command = `--path ${this.packageDirectory} -s csvfile -u ${this.target_org} --noprompt --canmodify ${this.targetOrgDomain}`; - if (this.logLevel) command += ` --loglevel ${LoggerLevel[this.logLevel]}`; - return command; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts deleted file mode 100644 index b68631635..000000000 --- a/packages/sfpowerscripts-cli/src/core/stats/NativeMetricSender.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Logger } from '@flxblio/sfp-logger'; - -export abstract class NativeMetricSender { - constructor(protected logger: Logger) {} - - abstract initialize(apiHost: string, apiKey: string): void; - - abstract sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }): void; - - abstract sendCountMetric(metric: string, tags: string[] | { [key: string]: string }): void; - - protected transformTagsToStringArray(tags: { [key: string]: string } | string[]): string[] { - if (tags != null && !Array.isArray(tags)) { - let transformedTagArray: string[] = []; - for (const [key, value] of Object.entries(tags)) { - transformedTagArray.push(`${key}:${value}`); - } - return transformedTagArray; - } - return tags as string[]; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts b/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts deleted file mode 100644 index 24e0bd165..000000000 --- a/packages/sfpowerscripts-cli/src/core/stats/SFPStatsSender.ts +++ /dev/null @@ -1,114 +0,0 @@ -import StatsDClient, { ClientOptions, StatsD } from 'hot-shots'; -import * as fs from 'fs-extra'; -import { EOL } from 'os'; -import { NativeMetricSender } from './NativeMetricSender'; -import { DataDogMetricsSender } from './nativeMetricSenderImpl/DataDogMetricSender'; -import { Logger } from '@flxblio/sfp-logger'; -import { NewRelicMetricSender } from './nativeMetricSenderImpl/NewRelicMetricSender'; -import { SplunkMetricSender } from './nativeMetricSenderImpl/SplunkMetricSender'; - -export default class SFPStatsSender { - private static client: StatsD; - private static metricsLogger; - private static nativeMetricsSender: NativeMetricSender; - - static initialize(port: string, host: string, protocol: string) { - let options: ClientOptions = { - host: host, - port: port == null ? 8125 : Number(port), - protocol: protocol == 'tcp' ? 'tcp' : 'udp', - prefix: 'sfp.', - }; - SFPStatsSender.client = new StatsDClient(options); - } - - static initializeNativeMetrics(type: string, apiHost: string, apiKey: string, logger?: Logger) { - switch (type) { - case 'DataDog': - this.nativeMetricsSender = new DataDogMetricsSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - case 'NewRelic': - this.nativeMetricsSender = new NewRelicMetricSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - case 'Splunk': - this.nativeMetricsSender = new SplunkMetricSender(logger); - this.nativeMetricsSender.initialize(apiHost, apiKey); - break; - - default: - throw new Error('Invalid Metric Type'); - } - } - - static initializeLogBasedMetrics() { - try { - fs.mkdirpSync('.sfp/logs'); - SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`; - } catch (error) { - console.log('Unable to initiate Log based metrics', error); - } - } - - static logElapsedTime(metric: string, elapsedMilliSeconds: number, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.timing(metric, elapsedMilliSeconds, tags); - - //Native Datadog integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, elapsedMilliSeconds, tags); - } - - let metrics = { - metric: `sfp.${metric}`, - type: `timers`, - value: elapsedMilliSeconds, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logGauge(metric: string, value: number, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.gauge(metric, value, tags); - - //Native Metrics integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendGaugeMetric(metric, value, tags); - } - - let metrics = { - metric: `sfp.${metric}`, - type: `guage`, - value: value, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logCount(metric: string, tags?: { [key: string]: string } | string[]) { - if (SFPStatsSender.client != null) SFPStatsSender.client.increment(metric, tags); - - //Native Metrics integration - if (SFPStatsSender.nativeMetricsSender != null) { - SFPStatsSender.nativeMetricsSender.sendCountMetric(metric, tags); - } - - let metrics = { - metric: `sfp.${metric}`, - type: `count`, - timestamp: Date.now(), - tags: tags, - }; - SFPStatsSender.logMetrics(metrics, SFPStatsSender.metricsLogger); - } - - static logMetrics(key: any, logger?: any) { - if (logger) { - fs.appendFileSync(logger, `${JSON.stringify(key)}${EOL}`, 'utf8'); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts deleted file mode 100644 index b1e6cb574..000000000 --- a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { BufferedMetricsLogger } from 'datadog-metrics'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { NativeMetricSender } from '../NativeMetricSender'; - -export class DataDogMetricsSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private nativeDataDogMetricsLogger: BufferedMetricsLogger; - - public initialize(apiHost: string, apiKey: string) { - try { - this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({ - apiHost: apiHost, - apiKey: apiKey, - prefix: 'sfp.', - flushIntervalSeconds: 0, - }); - } catch (error) { - SFPLogger.log('Unable to intialize native datadog logger' + error, LoggerLevel.TRACE, this.logger); - } - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - try { - let transformedTags = this.transformTagsToStringArray(tags); - this.nativeDataDogMetricsLogger.gauge(metric, value, transformedTags); - this.nativeDataDogMetricsLogger.flush(); - } catch (error) { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.TRACE, - this.logger - ); - } - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - try { - let transformedTags = this.transformTagsToStringArray(tags); - this.nativeDataDogMetricsLogger.increment(metric, 1, transformedTags); - this.nativeDataDogMetricsLogger.flush(); - } catch (error) { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.TRACE, - this.logger - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts deleted file mode 100644 index bc6d6130d..000000000 --- a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { NativeMetricSender } from '../NativeMetricSender'; -import { telemetry } from '@newrelic/telemetry-sdk'; -import { - CountMetric, - GaugeMetric, - MetricBatch, - MetricClient, -} from '@newrelic/telemetry-sdk/dist/src/telemetry/metrics'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export class NewRelicMetricSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private nrMetricClient: telemetry.metrics.MetricClient; - - //Ignore API Host, as newrelic sdk doesnt need it - public initialize(apiHost: string, apiKey: string) { - try { - this.nrMetricClient = new MetricClient({ apiKey: apiKey }); - } catch (error) { - SFPLogger.log(`Unable to intialize native newrelic metric logger ${error}`, LoggerLevel.WARN, this.logger); - } - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; - const guageMetric = new GaugeMetric(metric, value); - guageMetric.attributes = tags as { [key: string]: string }; - const batch = new MetricBatch({}, Date.now(), 1); - batch.addMetric(guageMetric); - this.nrMetricClient.send(batch, (error, response, body) => { - if (response) { - SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); - } - if (error) - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; - const countMetric = new CountMetric(metric); - countMetric.record(1); - countMetric.attributes = tags as { [key: string]: string }; - const batch = new MetricBatch({}, Date.now(), 1); - batch.addMetric(countMetric); - - this.nrMetricClient.send(batch, (error, response, body) => { - if (response) { - SFPLogger.log(`Transmitted metric ${metric} ${response.statusCode}`, LoggerLevel.TRACE, this.logger); - } - if (error) - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts b/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts deleted file mode 100644 index f92a5f5d8..000000000 --- a/packages/sfpowerscripts-cli/src/core/stats/nativeMetricSenderImpl/SplunkMetricSender.ts +++ /dev/null @@ -1,49 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { NativeMetricSender } from '../NativeMetricSender'; -import axios ,{AxiosInstance} from 'axios'; - - - -export class SplunkMetricSender extends NativeMetricSender { - constructor(logger: Logger) { - super(logger); - } - - private instance: AxiosInstance; - - public initialize(apiHost: string, apiKey: string) { - this.instance = axios.create({ - baseURL: apiHost, - headers: {'Authorization': apiKey, 'Content-Type': 'application/json'} - }); - } - - public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; - const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'guage', value: value,tags: tags as { [key: string]: string },timestamp: Date.now()}}; - this.instance.post('', JSON.stringify(payload)) - .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) - .catch((error) => { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } - - public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; - const payload = {source: "sfp",sourcetype: "metrics",event: {metric: metric, type: 'count', tags: tags as { [key: string]: string },timestamp: Date.now()}}; - this.instance.post('', JSON.stringify(payload)) - .then((response) => {SFPLogger.log(`Transmitted metric ${metric} ${response.status}`, LoggerLevel.TRACE, this.logger)}) - .catch((error) => { - SFPLogger.log( - `Unable to transmit metrics for metric ${metric} due to` + error, - LoggerLevel.WARN, - this.logger - ); - }); - } -} - diff --git a/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts b/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts deleted file mode 100644 index f7d41dbb3..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/AliasList.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { StateAggregator } from '@salesforce/core'; - - -export async function convertAliasToUsername(alias: string) { - const stateAggregator = await StateAggregator.getInstance(); - await stateAggregator.orgs.readAll(); - return await stateAggregator.aliases.resolveUsername(alias) -} - -export async function convertUsernameToAlias(username: string) { - - const stateAggregator = await StateAggregator.getInstance(); - await stateAggregator.orgs.readAll(); - return await stateAggregator.aliases.resolveAlias(username) - -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts b/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts deleted file mode 100644 index 7cd6fa0d8..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/ChunkArray.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function chunkArray(perChunk: number, inputArray: any[]): Array { - let chunks = [], - i = 0, - n = inputArray.length; - - while (i < n) { - chunks.push(inputArray.slice(i, (i += perChunk))); - } - - return chunks; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts b/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts deleted file mode 100644 index d8b4ae16a..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/DefaultShell.ts +++ /dev/null @@ -1,7 +0,0 @@ -const sfp_DEFAULT_SHELL = `sh`; - -export default function defaultShell(): string { - return process.env.sfp_DEFAULT_SHELL - ? process.env.sfp_DEFAULT_SHELL - : sfp_DEFAULT_SHELL; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/Delay.ts b/packages/sfpowerscripts-cli/src/core/utils/Delay.ts deleted file mode 100644 index 80eb87107..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/Delay.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function delay(ms: number = 0) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts b/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts deleted file mode 100644 index d77a7744d..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/FileSystem.ts +++ /dev/null @@ -1,52 +0,0 @@ -import fs = require('fs-extra'); -import path = require('path'); - -export default class FileSystem { - /** - * List nested files within a directory - * @param directory - * @param includeDirectories - * @returns - */ - static readdirRecursive( - searchDirectory: string, - includeDirectories: boolean = false, - isAbsolute: boolean = false - ): string[] { - const result: string[] = []; - - if (!fs.lstatSync(searchDirectory).isDirectory()) throw new Error(`${searchDirectory} is not a directory`); - - (function readdirRecursiveHandler(directory: string): void { - const files: string[] = fs.readdirSync(directory); - - files.forEach((file) => { - let filepath: string; - if (isAbsolute) { - filepath = path.resolve(directory, file); - } else { - filepath = path.join(directory, file); - } - - if (fs.lstatSync(filepath).isDirectory()) { - if (includeDirectories) { - if (isAbsolute) { - result.push(path.resolve(filepath)); - } else { - result.push(path.relative(searchDirectory, filepath)); - } - } - readdirRecursiveHandler(filepath); - } else { - if (isAbsolute) { - result.push(path.resolve(filepath)); - } else { - result.push(path.relative(searchDirectory, filepath)); - } - } - }); - })(searchDirectory); - - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts b/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts deleted file mode 100644 index b121332b0..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/Fileutils.ts +++ /dev/null @@ -1,204 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const _ = require('lodash'); -const os = require('os'); - -const SEP = /\/|\\/; - -export const PLUGIN_CACHE_FOLDER = 'sfpowerkit'; - -export default class FileUtils { - /** - * Delete file or directories recursively from the project - * @param deletedComponents Files or directories to delete - */ - public static deleteComponents(deletedComponents: string[]) { - deletedComponents.forEach((component) => { - if (fs.existsSync(component)) { - if (fs.lstatSync(component).isDirectory()) { - FileUtils.deleteFolderRecursive(component); - } else { - fs.unlinkSync(component); - } - } - }); - } - /** - * Load all files from the given folder with the given extension - * @param folder the folder from which files wille be loaded - * @param extension File extension to load. - */ - public static getAllFilesSync(folder: string, extension: string = '.xml'): string[] { - let result: string[] = []; - let pathExists = fs.existsSync(folder); - let folderName = path.basename(folder); - if (!pathExists) { - console.log('Folder does not exist:', folderName); - return result; - } - let content: string[] = fs.readdirSync(folder); - content.forEach((file) => { - let curFile = path.join(folder, file); - let stats = fs.statSync(curFile); - if (stats.isFile()) { - if (extension.indexOf(path.extname(curFile)) != -1 || extension === '') { - result.push(curFile); - } - } else if (stats.isDirectory()) { - let files: string[] = this.getAllFilesSync(curFile, extension); - result = _.concat(result, files); - } - }); - return result; - } - - public static getGlobalCacheDir() { - let homedir = os.homedir(); - let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; - if (!fs.existsSync(configDir)) { - console.log('Config folder does not exists, Creating Folder'); - fs.mkdirSync(configDir); - } - - return configDir; - } - - /** - * Get the cache path for the given cache file name - * @param fileName - */ - public static getGlobalCachePath(fileName: string) { - let homedir = os.homedir(); - let configDir = homedir + path.sep + PLUGIN_CACHE_FOLDER; - if (!fs.existsSync(configDir)) { - console.log('Config folder does not exists, Creating Folder'); - fs.mkdirSync(configDir); - } - return configDir + path.sep + fileName; - } - - /** - * Create a folder path recursively - * @param targetDir - * @param param1 - */ - public static mkDirByPathSync(targetDir: string, { isRelativeToScript = false } = {}) { - const sep = path.sep; - const initDir = path.isAbsolute(targetDir) ? sep : ''; - const baseDir = isRelativeToScript ? __dirname : '.'; - - targetDir.split(sep).reduce((parentDir, childDir) => { - const curDir = path.resolve(baseDir, parentDir, childDir); - try { - fs.mkdirSync(curDir); - } catch (err) { - if (err.code !== 'EEXIST' && err.code !== 'EPERM' && err.code !== 'EISDIR') { - throw err; - } - } - return curDir; - }, initDir); - } - /** - * Get the file name withoud extension - * @param filePath file path - * @param extension extension - */ - public static getFileNameWithoutExtension(filePath: string, extension?: string): string { - let fileParts = filePath.split(SEP); - let fileName = fileParts[fileParts.length - 1]; - if (extension) { - fileName = fileName.substr(0, fileName.lastIndexOf(extension)); - } else { - fileName = fileName.substr(0, fileName.indexOf('.')); - } - return fileName; - } - - /** - * Copu folder recursively - * @param src source folder to copy - * @param dest destination folder - */ - public static copyRecursiveSync(src, dest) { - let exists = fs.existsSync(src); - if (exists) { - let stats = fs.statSync(src); - let isDirectory = stats.isDirectory(); - if (isDirectory) { - exists = fs.existsSync(dest); - if (!exists) { - fs.mkdirSync(dest); - } - fs.readdirSync(src).forEach(function (childItemName) { - FileUtils.copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); - }); - } else { - fs.copyFileSync(src, dest); - } - } - } - /** - * Get path to a given folder base on the parent folder - * @param src Parent folder - * @param foldername folder to build the path to - */ - public static getFolderPath(src, foldername) { - let exists = fs.existsSync(src); - let toReturn = ''; - if (exists) { - let stats = fs.statSync(src); - let isDirectory = stats.isDirectory(); - if (isDirectory) { - let childs = fs.readdirSync(src); - for (let i = 0; i < childs.length; i++) { - let childItemName = childs[i]; - if (childItemName === foldername) { - toReturn = path.join(src, childItemName); - } else { - let childStat = fs.statSync(path.join(src, childItemName)); - if (childStat.isDirectory()) { - toReturn = FileUtils.getFolderPath(path.join(src, childItemName), foldername); - } - } - if (toReturn !== '') { - break; - } - } - } - } - return toReturn; - } - - /** - * Delete a folder and its content recursively - * @param folder folder to delete - */ - public static deleteFolderRecursive(folder) { - if (fs.existsSync(folder)) { - fs.readdirSync(folder).forEach(function (file, index) { - let curPath = path.join(folder, file); - if (fs.lstatSync(curPath).isDirectory()) { - // recurse - //console.log("Delete recursively"); - FileUtils.deleteFolderRecursive(curPath); - } else { - // delete file - //console.log("Delete file "+ curPath); - fs.unlinkSync(curPath); - } - }); - //console.log("delete folder "+ folder); - fs.rmdirSync(folder); - } - } - public static makefolderid(length): string { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts b/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts deleted file mode 100644 index 0c4fd9057..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/GetFormattedTime.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default function getFormattedTime(milliseconds: number): string { - let date = new Date(0); - date.setMilliseconds(milliseconds); - let timeString = date.toISOString().substr(11, 12); - return timeString; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts b/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts deleted file mode 100644 index e4db23cc5..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/ObjectCRUDHelper.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Connection } from '@salesforce/core'; -import { Record, SaveResult } from 'jsforce'; -import { isArray } from 'lodash'; - -const retry = require('async-retry'); - -export default class ObjectCRUDHelper { - static async updateRecord(conn: Connection, sObject: string, record: Record): Promise { - return retry( - async (bail) => { - let result = await conn.update(sObject, record); - if (isArray(result)) { - let isAllRecordsSucceeded = true; - for (const individualResult of result as SaveResult[]) { - if (!individualResult.success) { - isAllRecordsSucceeded = false; - } - } - if (isAllRecordsSucceeded) return 'All records updated'; - else throw new Error('Some records have been failed to update'); - } else if ((result as SaveResult).success) return (result as SaveResult).id; - else bail(); - }, - { retries: 3, minTimeout: 2000 } - ); - } - - static async createRecord(conn: Connection, sObject: string, record: Record): Promise { - return retry( - async (bail) => { - let result = await conn.create(sObject, record); - if (result.success) return result.id; - else bail(); - }, - { retries: 3, minTimeout: 2000 } - ); - } -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts b/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts deleted file mode 100644 index 5daeff556..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/OnExit.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ChildProcess } from 'child_process'; - -export async function onExit(childProcess: ChildProcess, message?: string): Promise<{}> { - return new Promise((resolve, reject) => { - childProcess.once('close', (code: number, signal: string) => { - if (code === 0 || (code === null && signal === 'SIGTERM')) { - resolve(undefined); - } else { - reject(new Error(message ? message : `Exit with error code ${code}`)); - } - }); - - childProcess.once('error', (err: Error) => { - reject(new Error(message ? message : err.message)); - }); - }); -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts b/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts deleted file mode 100644 index 36d0d7272..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/RandomId.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function makeRandomId(length): string { - let result = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts b/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts deleted file mode 100644 index b86c233eb..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/VersionNumberConverter.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Converts build-number dot delimeter to hyphen - * If dot delimeter does not exist, returns input - * @param version - */ -export default function convertBuildNumDotDelimToHyphen(version: string) { - let convertedVersion = version; - - let indexOfBuildNumDelimiter = getIndexOfBuildNumDelimeter(version); - if (version[indexOfBuildNumDelimiter] === '.') { - convertedVersion = - version.substring(0, indexOfBuildNumDelimiter) + '-' + version.substring(indexOfBuildNumDelimiter + 1); - } - return convertedVersion; -} - -/** - * Get the index of the build-number delimeter - * Returns null if unable to find index of delimeter - * @param version - */ -function getIndexOfBuildNumDelimeter(version: string) { - let numOfDelimetersTraversed: number = 0; - for (let i = 0; i < version.length; i++) { - if (!Number.isInteger(parseInt(version[i], 10))) { - numOfDelimetersTraversed++; - } - if (numOfDelimetersTraversed === 3) { - return i; - } - } - return null; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts b/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts deleted file mode 100644 index 1f7844797..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/extractDomainFromUrl.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Extracts domain name from full URL string - * @param url - * @returns - */ -export default function extractDomainFromUrl(url: string): string { - if (!url) return url; - const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); - return matches && matches[1]; -} diff --git a/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts b/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts deleted file mode 100644 index 9fdeb2d78..000000000 --- a/packages/sfpowerscripts-cli/src/core/utils/xml2json.ts +++ /dev/null @@ -1,10 +0,0 @@ -const xmlParser = require('xml2js').Parser({ explicitArray: false }); - -export default function xml2json(xml) { - return new Promise((resolve, reject) => { - xmlParser.parseString(xml, function (err, json) { - if (err) reject(err); - else resolve(json); - }); - }); -} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts deleted file mode 100644 index 981f942a5..000000000 --- a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityInitialInstall.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class VlocityInitialInstall extends SFDXCommand { - public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packUpdateSettings'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} --nojob installVlocityInitial`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts deleted file mode 100644 index 2cdc70087..000000000 --- a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackDeployImpl.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'path'; -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class VlocityPackDeployImpl extends SFDXCommand { - public constructor( - project_directory: string, - target_org: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packDeploy'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} -job ${path.join( - this.packageDirectory, - 'VlocityComponents.yaml' - )} packDeploy`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts deleted file mode 100644 index 6d4f6584c..000000000 --- a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityPackUpdateSettings.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class VlocityPackUpdateSettings extends SFDXCommand { - public constructor(project_directory: string, target_org: string, logger: Logger, logLevel: LoggerLevel) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:packUpdateSettings'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} --nojob packUpdateSettings`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts b/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts deleted file mode 100644 index b31df3640..000000000 --- a/packages/sfpowerscripts-cli/src/core/vlocitywrapper/VlocityRefreshBase.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'path'; -import { SFDXCommand } from '@flxblio/sfdx-process-wrapper/lib/SFDXCommand'; -import { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class VlocityRefreshBase extends SFDXCommand { - public constructor( - project_directory: string, - target_org: string, - private packageDirectory: string, - logger: Logger, - logLevel: LoggerLevel - ) { - super(target_org, project_directory, logger, logLevel); - } - - getSFDXCommand(): string { - return 'vlocity'; - } - getCommandName(): string { - return 'vlocity:refreshVlocityBase'; - } - - getGeneratedParams(): string { - let command = `-sfdx.username ${this.target_org} -job ${path.join( - this.packageDirectory, - 'VlocityComponents.yaml' - )} refreshVlocityBase`; - if (this.logLevel) command += ` -verbose`; - return command; - } -} diff --git a/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts b/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts deleted file mode 100644 index 334f3c552..000000000 --- a/packages/sfpowerscripts-cli/src/errors/ReleaseError.ts +++ /dev/null @@ -1,22 +0,0 @@ -import SfpError from './SfpError'; - -import { ReleaseResult } from '../impl/release/ReleaseImpl'; - -export default class ReleaseError extends SfpError { - /** - * Payload for the results of the release - */ - readonly data: ReleaseResult; - - /** - * The underlying error that caused this error to be raised - */ - readonly cause: Error; - - constructor(message: string, data: ReleaseResult, cause?: Error) { - super(message); - - this.data = data; - this.cause = cause; - } -} diff --git a/packages/sfpowerscripts-cli/src/errors/SfpError.ts b/packages/sfpowerscripts-cli/src/errors/SfpError.ts deleted file mode 100644 index 2665ed5c3..000000000 --- a/packages/sfpowerscripts-cli/src/errors/SfpError.ts +++ /dev/null @@ -1,20 +0,0 @@ -export default abstract class SfpError extends Error { - readonly message: string; - readonly code: string; - /** - * The underlying error that caused this error to be raised - */ - readonly cause: Error; - /** - * Additional payload for the error - */ - abstract data: unknown; - - constructor(message: string, code?: string, cause?: Error) { - super(message); - - this.message = message; - this.code = code; - this.cause = cause; - } -} diff --git a/packages/sfpowerscripts-cli/src/errors/ValidateError.ts b/packages/sfpowerscripts-cli/src/errors/ValidateError.ts deleted file mode 100644 index 5890a1ec6..000000000 --- a/packages/sfpowerscripts-cli/src/errors/ValidateError.ts +++ /dev/null @@ -1,21 +0,0 @@ -import SfpError from './SfpError'; -import ValidateResult from '../impl/validate/ValidateResult'; - -export default class ValidateError extends SfpError { - /** - * Payload for the results of the release - */ - readonly data: ValidateResult; - - /** - * The underlying error that caused this error to be raised - */ - readonly cause: Error; - - constructor(message: string, data: ValidateResult, cause?: Error) { - super(message); - - this.data = data; - this.cause = cause; - } -} diff --git a/packages/sfpowerscripts-cli/src/flags/duration.ts b/packages/sfpowerscripts-cli/src/flags/duration.ts deleted file mode 100644 index af0994e29..000000000 --- a/packages/sfpowerscripts-cli/src/flags/duration.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 - */ -import { Flags } from '@oclif/core'; -import { Messages } from '@salesforce/core'; -import { Duration } from '@salesforce/kit'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); - -type DurationUnit = Lowercase; - -export type DurationFlagConfig = { - unit: Required; - defaultValue?: number; - min?: number; - max?: number; -}; - -/** - * Duration flag with built-in default and min/max validation - * You must specify a unit - * Defaults to undefined if you don't specify a default - * - * @example - * - * ``` - * import { Flags } from '@salesforce/sf-plugins-core'; - * public static flags = { - * wait: Flags.duration({ - * min: 1, - * unit: 'minutes' - * defaultValue: 33, - * char: 'w', - * description: 'Wait time in minutes' - * }), - * } - * ``` - */ -export const durationFlag = Flags.custom({ - // eslint-disable-next-line @typescript-eslint/require-await - parse: async (input, _, opts) => validate(input, opts), - // eslint-disable-next-line @typescript-eslint/require-await - default: async (context) => - context.options.defaultValue ? toDuration(context.options.defaultValue, context.options.unit) : undefined, -}); - -const validate = (input: string, config: DurationFlagConfig): Duration => { - const { min, max, unit } = config || {}; - let parsedInput: number; - - try { - parsedInput = parseInt(input, 10); - if (typeof parsedInput !== 'number' || isNaN(parsedInput)) { - throw messages.createError('errors.InvalidDuration'); - } - } catch (e) { - throw messages.createError('errors.InvalidDuration'); - } - - if (min && max && (parsedInput < min || parsedInput > max)) { - throw messages.createError('errors.DurationBounds', [min, max]); - } else if (min && parsedInput < min) { - throw messages.createError('errors.DurationBoundsMin', [min]); - } else if (max && parsedInput > max) { - throw messages.createError('errors.DurationBoundsMax', [max]); - } - - return toDuration(parsedInput, unit); -}; - -const toDuration = (parsedInput: number, unit: DurationUnit): Duration => Duration[unit](parsedInput); diff --git a/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts b/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts deleted file mode 100644 index 92ca9ac74..000000000 --- a/packages/sfpowerscripts-cli/src/flags/orgApiVersion.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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 - */ -import { Flags } from '@oclif/core'; -import { Messages, Lifecycle, OrgConfigProperties, validateApiVersion } from '@salesforce/core'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); - -// versions below this are retired -export const minValidApiVersion = 21; -// this and all un-retired versions below it are deprecated -export const maxDeprecated = 30; -export const maxDeprecatedUrl = 'https://help.salesforce.com/s/articleView?id=000354473&type=1;'; - -/**const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); - * apiVersion for a salesforce org's rest api. - * Will validate format and that the api version is still supported. - * Will default to the version specified in Config, if it exists (and will provide an override warning) - * - * CAVEAT: unlike the apiversion flag on sfdxCommand, this does not set the version on the org/connection - * We leave this up to the plugins to implement - * - * @example - * - * ``` - * import { Flags } from '@salesforce/sf-plugins-core'; - * public static flags = { - * 'api-version': Flags.orgApiVersion({ - * char: 'a', - * description: 'api version for the org' - * }), - * } - * ``` - */ -export const orgApiVersionFlag = Flags.custom({ - aliases: ['apiversion'], - parse: async (input) => validate(input), - default: async () => getDefaultFromConfig(), - description: messages.getMessage('flags.apiVersion.description'), -}); - -const getDefaultFromConfig = async (): Promise => { - // (perf) only import ConfigAggregator if necessary - const { ConfigAggregator } = await import('@salesforce/core'); - const config = await ConfigAggregator.create(); - const apiVersionFromConfig = config.getInfo(OrgConfigProperties.ORG_API_VERSION)?.value as string; - if (apiVersionFromConfig) { - await Lifecycle.getInstance().emitWarning( - messages.getMessage('flags.apiVersion.overrideWarning', [apiVersionFromConfig]) - ); - return validate(apiVersionFromConfig); - } -}; - -const validate = async (input: string): Promise => { - // basic format check - if (!validateApiVersion(input)) { - throw messages.createError('errors.InvalidApiVersion', [input]); - } - const requestedVersion = parseInt(input, 10); - if (requestedVersion < minValidApiVersion) { - throw messages.createError('errors.RetiredApiVersion', [minValidApiVersion]); - } - if (requestedVersion <= maxDeprecated) { - await Lifecycle.getInstance().emitWarning( - messages.getMessage('flags.apiVersion.warning.deprecated', [maxDeprecated, maxDeprecatedUrl]) - ); - } - return input; -}; diff --git a/packages/sfpowerscripts-cli/src/flags/salesforceId.ts b/packages/sfpowerscripts-cli/src/flags/salesforceId.ts deleted file mode 100644 index 1c5695372..000000000 --- a/packages/sfpowerscripts-cli/src/flags/salesforceId.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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 - */ -import { Flags } from '@oclif/core'; -import { Messages, validateSalesforceId } from '@salesforce/core'; - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@salesforce/sf-plugins-core', 'messages'); - -export type IdFlagConfig = { - /** - * Can specify if the version must be 15 or 18 characters long or 'both'. Leave blank to allow either 15 or 18. - */ - length?: 15 | 18 | 'both'; - /** - * If the ID belongs to a certain sobject type, specify the 3 character prefix. - */ - startsWith?: string; -}; - -/** - * Id flag with built-in validation. Short character is `i` - * - * @example - * - * ``` - * import { Flags } from '@salesforce/sf-plugins-core'; - * public static flags = { - * // set length or prefix - * 'flag-name': salesforceId({ length: 15, startsWith: '00D' }), - * // add flag properties - * 'flag2': salesforceId({ - * required: true, - * description: 'flag2 description', - * }), - * // override the character i - * 'flag3': salesforceId({ - * char: 'j', - * }), - * } - * ``` - */ -export const salesforceIdFlag = Flags.custom({ - // eslint-disable-next-line @typescript-eslint/require-await - parse: async (input, _ctx, opts) => validate(input, opts), - char: 'i', -}); - -const validate = (input: string, config?: IdFlagConfig): string => { - const { length, startsWith } = config ?? {}; - - // If the flag doesn't specify a length or specifies "both", then let it accept both 15 or 18. - const allowedIdLength = !length || length === 'both' ? [15, 18] : [length]; - - if (!allowedIdLength.includes(input.length)) { - throw messages.createError('errors.InvalidIdLength', [ - allowedIdLength.join(` ${messages.getMessage('errors.InvalidIdLength.or')} `), - ]); - } - if (!validateSalesforceId(input)) { - throw messages.createError('errors.InvalidId'); - } - if (startsWith && !input.startsWith(startsWith)) { - throw messages.createError('errors.InvalidPrefix', [startsWith]); - } - return input; -}; diff --git a/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts b/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts deleted file mode 100644 index 9d73f98da..000000000 --- a/packages/sfpowerscripts-cli/src/flags/sfdxflags.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Modified from sfdx-plugins-core to meet sfp requirment - * sfp is not moving to the new style immediately - * to reduce migration efforts in pipelines - * - * - * Original Copyright - * 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 - */ - -import { Flags } from '@oclif/core'; -import { Lifecycle, Messages, Org, OrgConfigProperties } from '@salesforce/core'; -import { orgApiVersionFlag } from './orgApiVersion'; -import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; - -/** - * Adds an alias for the orgApiVersionFlag - - */ -export const orgApiVersionFlagSfdxStyle = orgApiVersionFlag({ - aliases: ['apiversion'], -}); - -Messages.importMessagesDirectory(__dirname); -const messages = Messages.loadMessages('@flxblio/sfp', 'core-messages'); - -export const loglevel = Flags.string({ - description: 'logging level for this command invocation', - default: 'info', - required: false, - options: [ - 'trace', - 'debug', - 'info', - 'warn', - 'error', - 'fatal', - 'TRACE', - 'DEBUG', - 'INFO', - 'WARN', - 'ERROR', - 'FATAL', - ], -}); - -const orgAliases = { - aliases: ['targetusername', 'u'], -}; - - - - -const userNameFlag = Flags.custom({ - ...orgAliases, - char: 'u', - summary: messages.getMessage('flags.targetOrg.summary'), - parse: async (input: string | undefined) => { - let aliasAccessor = (await AliasAccessor.create()); - if(aliasAccessor.resolveAlias(input)) - return aliasAccessor.resolveAlias(input); - else - return aliasAccessor.resolveUsername(input); - - }, -}); - -export const optionalUserNameFlag = userNameFlag({ - aliases: ['targetusername', 'u'], - char: 'u', -}); - -export const requiredUserNameFlag = userNameFlag({ - aliases: ['targetusername', 'u'], - char: 'u', - required: true, -}); - -const devhubFlag = Flags.custom({ - char: 'v', - summary: messages.getMessage('flags.targetDevHubOrg.summary'), - parse: async (input: string | undefined) => { - let aliasAccessor = (await AliasAccessor.create()); - let resolvedAliasOrUserName; - if(aliasAccessor.resolveAlias(input)) - resolvedAliasOrUserName=aliasAccessor.resolveAlias(input); - else - resolvedAliasOrUserName=aliasAccessor.resolveUsername(input); - //Check if its devhub - const org = await Org.create({ aliasOrUsername: resolvedAliasOrUserName, isDevHub: true }); - return resolvedAliasOrUserName; - }, -}); - - -export const targetdevhubusername = devhubFlag({ - aliases: ['targetdevhubusername'], - required: true, -}); - - -export const optionalDevHubFlag = devhubFlag({ - aliases: ['targetdevhubusername'], - required: false, -}); - -export type ArrayWithOptions = { - // prevent invalid options from being passed - multiple?: true; - // parse is disallowed because we have to overwrite it - parse?: undefined; -}; -/** - */ -export const arrayFlagSfdxStyle = Flags.custom({ - multiple: true, - delimiter: ',', - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error parse expects to return string[] but we need to return string. - // This is a weird consequence of implementing an array flag. The oclif parser splits the input (e.g. "thing1,thing2") - // on the delimiter and passes each value individually to the parse function. However, the return type needs to be - // string[] so that upstream consumers have the correct flag typings. - parse: async (input, ctx) => { - const inputParts = ctx.token.input.split(',').map((i) => i.trim()); - if (inputParts.length > 1) { - await Lifecycle.getInstance().emitWarning(messages.getMessage('warning.arrayInputFormat')); - } - - return input; - }, -}); - -export const logsgroupsymbol = arrayFlagSfdxStyle({ - char: 'g', - description: messages.getMessage('flags.logsgroupsymbol.summary'), -}); \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/impl/Stage.ts b/packages/sfpowerscripts-cli/src/impl/Stage.ts deleted file mode 100644 index cf47a3e53..000000000 --- a/packages/sfpowerscripts-cli/src/impl/Stage.ts +++ /dev/null @@ -1,10 +0,0 @@ -export enum Stage { - ANALYZE = 'analyze', - PREPARE = 'prepare', - VALIDATE = 'validate', - QUICKBUILD = 'quickbuild', - BUILD = 'build', - DEPLOY = 'deploy', - PROMOTE = 'promote', - PUBLISH = 'publish' -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifact.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifact.ts deleted file mode 100644 index 6378564c0..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifact.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default interface FetchAnArtifact { - fetchArtifact( - packageName: string, - artifactDirectory: string, - version: string, - isToContinueOnMissingArtifact: boolean - ): void; -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts deleted file mode 100644 index 8e5cead2d..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as fs from 'fs-extra'; -import child_process = require('child_process'); -import path = require('path'); -import FetchAnArtifact from './FetchAnArtifact'; -import SFPLogger, { COLOR_WARNING } from '@flxblio/sfp-logger'; - -export class FetchAnArtifactFromNPM implements FetchAnArtifact { - constructor(private scope: string, private npmrcPath: string) { - - //Check whether the user has already passed in @, and remove it - this.scope= this.scope.replace(/@/g, '').toLowerCase(); - - - if (this.npmrcPath) { - try { - fs.copyFileSync(this.npmrcPath, path.resolve('.npmrc')); - } catch (error) { - throw new Error('We were unable to find or copy the .npmrc file as provided due to ' + error.message); - } - - if (!fs.existsSync('package.json')) { - // package json is required in the same directory as .npmrc - fs.writeFileSync('package.json', '{}'); - } - } else { - if (fs.existsSync('.npmrc') && !fs.existsSync('package.json')) { - fs.writeFileSync('package.json', '{}'); - } - } - } - - public fetchArtifact( - packageName: string, - artifactDirectory: string, - version: string, - isToContinueOnMissingArtifact: boolean - ) { - try { - // NPM package names must be lowercase - packageName = packageName.toLowerCase(); - - let cmd: string; - if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfp_artifact`; - else cmd = `npm pack ${packageName}_sfp_artifact`; - - cmd += `@${version}`; - - console.log(`Fetching ${packageName} using ${cmd}`); - - child_process.execSync(cmd, { - cwd: artifactDirectory, - stdio: 'pipe', - }); - } catch (error) { - if (!isToContinueOnMissingArtifact) throw error; - else - SFPLogger.log( - COLOR_WARNING( - `Artifact for ${packageName} missing in NPM Registry provided, This might result in deployment failures` - ) - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts deleted file mode 100644 index abd9fd714..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchAnArtifactUsingScript.ts +++ /dev/null @@ -1,58 +0,0 @@ -import SFPLogger, { COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; -const fs = require('fs-extra'); -import child_process = require('child_process'); -import FetchAnArtifact from './FetchAnArtifact'; -import defaultShell from '../../core/utils/DefaultShell'; - -export class FetchAnArtifactUsingScript implements FetchAnArtifact { - constructor(private scriptPath: string) {} - - public fetchArtifact( - packageName: string, - artifactDirectory: string, - version: string, - isToContinueOnMissingArtifact: boolean - ) { - try { - let cmd: string; - - //Create artifact Directory if it doesnt exist - if (!fs.existsSync(artifactDirectory)) fs.mkdirpSync(artifactDirectory); - - if (version) { - if (process.platform !== 'win32') { - cmd = `${defaultShell()} -e "${ - this.scriptPath - }" "${packageName}" "${version}" "${artifactDirectory}"`; - } else { - cmd = `cmd.exe /c "${this.scriptPath}" "${packageName}" "${version}" "${artifactDirectory}"`; - } - } else { - if (process.platform !== 'win32') { - cmd = `${defaultShell()} -e ${this.scriptPath} ${packageName} ${artifactDirectory}`; - } else { - cmd = `cmd.exe /c ${this.scriptPath} ${packageName} ${artifactDirectory}`; - } - } - - SFPLogger.log(`Fetching ${packageName} using ${cmd}`, LoggerLevel.INFO); - - child_process.execSync(cmd, { - cwd: process.cwd(), - stdio: 'pipe', - }); - - SFPLogger.log(`Successfully Fetched ${packageName}`, LoggerLevel.INFO); - } catch (error) { - if (!isToContinueOnMissingArtifact) throw error; - else { - SFPLogger.log(`Failed to execute script due to ${error.message}`, LoggerLevel.WARN); - SFPLogger.log( - COLOR_WARNING( - `Artifact for ${packageName} missing in Registry provided, This might result in deployment failures` - ) - ); - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactSelector.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactSelector.ts deleted file mode 100644 index 0c2472630..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactSelector.ts +++ /dev/null @@ -1,17 +0,0 @@ -import FetchAnArtifact from './FetchAnArtifact'; -import { FetchAnArtifactFromNPM } from './FetchAnArtifactFromNPM'; -import { FetchAnArtifactUsingScript } from './FetchAnArtifactUsingScript'; - -export default class FetchArtifactSelector { - constructor(private fetchArtifactScript?: string, private scope?: string, private npmrcPath?: string) {} - - public getArtifactFetcher(): FetchAnArtifact { - if (this.fetchArtifactScript) { - return new FetchAnArtifactUsingScript(this.fetchArtifactScript); - } else if (this.scope) { - return new FetchAnArtifactFromNPM(this.scope, this.npmrcPath); - } else { - throw new Error('Unable to determine artifact fetcher'); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts deleted file mode 100644 index dcf60ac28..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchArtifactsError.ts +++ /dev/null @@ -1,26 +0,0 @@ - -import SfpError from '../../errors/SfpError'; -import { ArtifactVersion } from './FetchImpl'; - - -export default class FetchArtifactsError extends SfpError { - /** - * Payload consisting of artifacts that succeeded and failed to fetch - */ - readonly data: { - success: ArtifactVersion[]; - failed: ArtifactVersion[]; - }; - - /** - * The underlying error that caused this error to be raised - */ - readonly cause: Error; - - constructor(message: string, data: { success:ArtifactVersion[]; failed: ArtifactVersion[] }, cause: Error) { - super(message); - - this.data = data; - this.cause = cause; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts b/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts deleted file mode 100644 index 33df9a75c..000000000 --- a/packages/sfpowerscripts-cli/src/impl/artifacts/FetchImpl.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as fs from 'fs-extra'; -import Git from '../../core/git/Git'; -import GitTags from '../../core/git/GitTags'; -import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; -import FetchArtifactsError from './FetchArtifactsError'; -import * as rimraf from 'rimraf'; -import FetchArtifactSelector from './FetchArtifactSelector'; -import _ from 'lodash'; -import path from 'path'; -import FileUtils from '../../core/utils/Fileutils'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - -export default class FetchImpl { - constructor( - private artifactDirectory: string, - private scriptPath: string, - private scope: string, - private npmrcPath: string, - private logger:Logger - ) { - if (!fs.existsSync(artifactDirectory)) fs.mkdirpSync(artifactDirectory); - } - - public async fetchArtifacts( - releaseDefinitions: ReleaseDefinitionSchema[] - ): Promise<{ - success: ArtifactVersion[]; - failed: ArtifactVersion[]; - }> { - const git: Git = await Git.initiateRepo(); - - let fetchedArtifacts: { success: ArtifactVersion[]; failed: ArtifactVersion[] } = { - success: [], - failed: [], - }; - - let allArtifacts: { name: string; version: string }[] = []; - - - for (const releaseDefinition of releaseDefinitions) { - //Each release will be downloaded to specific subfolder inside the provided artifact directory - //As each release is a collection of artifacts - let revisedArtifactDirectory = path.join( - this.artifactDirectory, - releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') - ); - - rimraf.sync(revisedArtifactDirectory); - fs.mkdirpSync(revisedArtifactDirectory); - - let artifactsToDownload: { name: string; version: string }[] = []; - //additional sanity to not repeat download - for (let artifactEntry of Object.entries(releaseDefinition.artifacts)) { - if (!_.includes(allArtifacts, { name: artifactEntry[0], version: artifactEntry[1] }, 0)) { - allArtifacts.push({ name: artifactEntry[0], version: artifactEntry[1] }); - artifactsToDownload.push({ name: artifactEntry[0], version: artifactEntry[1] }); - } - } - - for (let artifact of artifactsToDownload) { - try { - await this.fetchAnArtifact( - artifact, - git, - this.scriptPath, - this.scope, - this.npmrcPath, - revisedArtifactDirectory - ); - - fetchedArtifacts.success.push(artifact); - } catch (error) { - SFPLogger.log(error.message,LoggerLevel.DEBUG,this.logger); - fetchedArtifacts.failed.push(artifact); - } - } - } - - return fetchedArtifacts; - } - - public async fetchArtifactsProvidedVersion( - artifactVersions: ArtifactVersion[] - ): Promise<{ - success: ArtifactVersion[]; - failed: ArtifactVersion[]; - }> { - const git: Git = await Git.initiateRepo(); - - let fetchedArtifacts: { success: ArtifactVersion[]; failed: ArtifactVersion[] } = { - success: [], - failed: [], - }; - - let allArtifacts: ArtifactVersion[] = _.clone(artifactVersions); - let revisedArtifactDirectory = path.join(this.artifactDirectory, FileUtils.makefolderid(8)); - rimraf.sync(revisedArtifactDirectory); - fs.mkdirpSync(revisedArtifactDirectory); - - let i: number; - - for (const artifactVersion of artifactVersions) { - try { - await this.fetchAnArtifact( - artifactVersion, - git, - this.scriptPath, - this.scope, - this.npmrcPath, - revisedArtifactDirectory - ); - - fetchedArtifacts.success.push(artifactVersion); - } catch (error) { - SFPLogger.log(error.message,LoggerLevel.DEBUG,this.logger); - fetchedArtifacts.failed.push(artifactVersion); - } - } - - return fetchedArtifacts; - } - - private async fetchAnArtifact( - artifact: ArtifactVersion, - git: Git, - scriptPath: string, - scope: string, - npmrcPath: string, - revisedArtifactDirectory: string - ) { - let version: string; - if (artifact.version === 'LATEST_TAG' || artifact.version === 'LATEST_GIT_TAG') { - let latestGitTagVersion: GitTags = new GitTags(git, artifact.name); - version = await latestGitTagVersion.getVersionFromLatestTag(); - } else version = artifact.version; - - let artifactFetcher = new FetchArtifactSelector(scriptPath, scope, npmrcPath).getArtifactFetcher(); - artifactFetcher.fetchArtifact(artifact.name, revisedArtifactDirectory, version, false); - } -} -export type ArtifactVersion = { - name: string; - version: string; -}; diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts deleted file mode 100644 index 1326bec90..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogImpl.ts +++ /dev/null @@ -1,194 +0,0 @@ -import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; -import { ReleaseChangelog } from './ReleaseChangelog'; -import ChangelogMarkdownGenerator from './ChangelogMarkdownGenerator'; -import ReleaseChangelogUpdater from './ReleaseChangelogUpdater'; -import * as fs from 'fs-extra'; -import path = require('path'); -import { marked } from 'marked'; -const TerminalRenderer = require('marked-terminal'); -const retry = require('async-retry'); -import { GitError } from 'simple-git'; -import SfpPackage from '../../core/package/SfpPackage'; -import SFPLogger, { LoggerLevel, ConsoleLogger, Logger } from '@flxblio/sfp-logger'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import Git from '../../core/git/Git'; -import FileOutputHandler from '../../outputs/FileOutputHandler'; - - - -marked.setOptions({ - // Define custom renderer - renderer: new TerminalRenderer(), -}); - -export default class ChangelogImpl { - constructor( - private logger:Logger, - private artifactDir: string, - private releaseName: string, - private workItemFilters: string[], - private limit: number, - private workItemUrl: string, - private showAllArtifacts: boolean, - private directory:string, - private forcePush: boolean, - private branch: string, - private nopush:boolean, - private isDryRun: boolean, - private org?: string - ) { - this.org = org?.toLowerCase(); - } - - async exec(): Promise { - return retry( - async (bail, retryNum) => { - try { - return await this.execHandler(); - } catch (err) { - if (err instanceof GitError) { - if (!err.message.includes('failed to push some refs')) { - // Do not retry for Git errors that are not related to push - bail(err); - } else { - SFPLogger.log('Failed to push changelog',LoggerLevel.WARN,this.logger); - SFPLogger.log(`Retrying...(${retryNum})`,LoggerLevel.WARN,this.logger); - throw err; - } - } else { - // Do not retry for non-Git errors - bail(err); - } - } - }, - { - retries: 10, - minTimeout: 5, - randomize: true, - } - ); - } - - private async execHandler() { - - let git:Git; - try { - let artifactFilePaths: Artifact[] = ArtifactFetcher.fetchArtifacts(this.artifactDir); - - if (artifactFilePaths.length === 0) { - throw new Error(`No artifacts found at ${path.resolve(process.cwd(), this.artifactDir)}`); - } - - let artifactsToSfpPackage: { [p: string]: SfpPackage } = {}; - let packagesToChangelogFilePaths: { [p: string]: string } = {}; - let artifactSourceBranch: string; - for (let artifactFilepath of artifactFilePaths) { - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromArtifact( - artifactFilepath, - new ConsoleLogger() - ); - - artifactsToSfpPackage[sfpPackage.packageName] = sfpPackage; - packagesToChangelogFilePaths[sfpPackage.packageName] = sfpPackage.changelogFilePath; - - if (artifactSourceBranch == null) { - if (sfpPackage.branch) { - artifactSourceBranch = sfpPackage.branch; - } else { - console.log(`${sfpPackage.packageName} artifact is missing branch information`); - console.log( - `This will cause an error in the future. Re-create the artifact using the latest version of sfp to maintain compatibility.` - ); - } - } - } - - if (!artifactSourceBranch) throw new Error('Atleast one artifact must carry branch information'); - - - - //duplicate repo - let git=await Git.initiateRepoAtTempLocation(this.logger,null,this.branch); - SFPLogger.log(`Checking out branch ${this.branch}`,LoggerLevel.INFO,this.logger); - - let pathToChangelogDirectory = this.createDirectory(this.directory, git.getRepositoryPath()); - - let releaseChangelog: ReleaseChangelog; - if (fs.existsSync(path.join(pathToChangelogDirectory, `releasechangelog.json`))) { - releaseChangelog = JSON.parse(fs.readFileSync(path.join(pathToChangelogDirectory, `releasechangelog.json`), 'utf8')); - } else { - releaseChangelog = { - orgs: [], - releases: [], - }; - } - - SFPLogger.log('Generating changelog...',LoggerLevel.INFO,this.logger); - - releaseChangelog = new ReleaseChangelogUpdater( - releaseChangelog, - this.releaseName, - artifactsToSfpPackage, - packagesToChangelogFilePaths, - this.workItemFilters, - this.org - ).update(); - - // Preview changelog in console - SFPLogger.log( - marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false).generate()), - LoggerLevel.INFO, - this.logger - ); - - - if(this.isDryRun) - { - const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,true).generate())); - } - - - fs.writeFileSync( - path.join(pathToChangelogDirectory, `releasechangelog.json`), - JSON.stringify(releaseChangelog, null, 4) - ); - - let payload: string = new ChangelogMarkdownGenerator( - releaseChangelog, - this.workItemUrl, - this.limit, - this.showAllArtifacts - ).generate(); - - fs.writeFileSync(path.join(pathToChangelogDirectory, `Release-Changelog.md`), payload); - - if (!this.isDryRun) - { - await git.commitFile([path.join(pathToChangelogDirectory, `releasechangelog.json`),path.join(pathToChangelogDirectory, `Release-Changelog.md`)]); - if(!this.nopush) - await git.pushToRemote(this.branch,this.forcePush) - } - - SFPLogger.log(`Successfully generated changelog`,LoggerLevel.INFO,this.logger); - return releaseChangelog; - } finally { - if(git) - git.deleteTempoRepoIfAny(); - } - } - - - - private createDirectory(directory: string, repoDir: string): string { - if (this.directory) { - if (!fs.pathExistsSync(path.join(repoDir, directory))) { - fs.mkdirpSync(path.join(repoDir, directory)); - } - repoDir = path.join(repoDir, this.directory); - } - return repoDir; - } - - -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts deleted file mode 100644 index 4c1b487e3..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { ReleaseChangelog, Release, org } from './ReleaseChangelog'; -import { URL } from 'url'; -import { EOL } from 'os'; -const markdownTable = require('markdown-table'); - -export default class ChangelogMarkdownGenerator { - constructor( - private releaseChangelog: ReleaseChangelog, - private workItemURL: string, - private limit: number, - private showAllArtifacts: boolean, - private isForWorkItemOnlyOutput:boolean=false - ) {} - - /** - * Generate markdown from ReleaseChangelog - * @returns - */ - generate(): string { - let payload: string = ''; - - if (this.releaseChangelog.orgs && ! this.isForWorkItemOnlyOutput ) { - payload = this.generateOrgs(this.releaseChangelog.orgs, payload); - } - - payload = this.generateReleases(payload); - - return payload; - } - - private generateReleases(payload: string): string { - let limitReleases: number; - if (this.limit <= this.releaseChangelog.releases.length) - limitReleases = this.releaseChangelog.releases.length - this.limit; - else limitReleases = 0; // no limit - - // Generate in descending order, starting from latest release - for (let releaseNum = this.releaseChangelog.releases.length - 1; releaseNum >= limitReleases; releaseNum--) { - let release: Release = this.releaseChangelog.releases[releaseNum]; - - if (!release.names) { - payload += `\n\n `; // Create anchor from release hash Id - payload += `# ${release['name']}\n`; - } else { - payload += `\n\n`; // Create anchor from release hash Id - payload += `# ${release.names.join(`/`)}\n `; - payload += `Cumulative Release Number: ${release.buildNumber} \n\n`; - if(release.date && !this.isForWorkItemOnlyOutput) - payload += `Matching defintion first created or deployed to an org on: ${release.date}\n ` - - } - - if(!this.isForWorkItemOnlyOutput) - payload = this.generateArtifacts(payload, release); - - payload = this.generateWorkItems(payload, release); - - if(!this.isForWorkItemOnlyOutput) - { - let versionChangeOnly: string[] = []; - let noChangeInVersion: string[] = []; - payload = this.generateCommits(payload, release, versionChangeOnly, noChangeInVersion); - - if (versionChangeOnly.length > 0) { - payload += '\n### Additional Information\n'; - payload += `The following artifacts' version may have changed due to an update in the scratch org definition file, `; - payload += `incremented package version in SFDX project configuration, or build all packages:\n`; - - versionChangeOnly.forEach((artifactName) => (payload += ` - ${artifactName}\n`)); - } - - if (noChangeInVersion.length > 0 && this.showAllArtifacts) { - payload += '\nArtifacts with no changes:\n'; - noChangeInVersion.forEach((artifactName) => (payload += ` - ${artifactName}\n`)); - } - } - } - return payload; - } - - private generateCommits( - payload: string, - release: Release, - versionChangeOnly: string[], - noChangeInVersion: string[] - ) { - let isCommitsSectionEmpty: boolean = true; - - payload += '\n### Commits :book:\n'; - for (let artifact of release.artifacts) { - if (artifact.from !== artifact.to) { - if (artifact.commits.length > 0) { - isCommitsSectionEmpty = false; - payload += `\n#### ${artifact.name}\n`; - - let tableOfCommits = [['Date', 'Time', 'Commit ID', 'Commit Message']]; - for (let commit of artifact.commits) { - let commitDate: Date = new Date(commit.date); - tableOfCommits.push([ - this.getDate(commitDate), - this.getTime(commitDate), - commit.commitId, - commit.message, - ]); - } - payload += markdownTable(tableOfCommits) + '\n'; - } else { - versionChangeOnly.push(artifact.name); - } - } else if (artifact.from === artifact.to) { - noChangeInVersion.push(artifact.name); - } - } - - if (isCommitsSectionEmpty) { - payload += `N/A\n`; - } - return payload; - } - - private generateWorkItems(payload: string, release: Release) { - payload += '### Work Items :gem:\n'; - if (Object.keys(release.workItems).length > 0) { - for (let workItem in release.workItems) { - let specificWorkItemURL: string; - if (this.workItemURL != null) { - if (this.workItemURL.endsWith('/')) { - specificWorkItemURL = this.workItemURL.concat(workItem); - } else { - specificWorkItemURL = this.workItemURL.concat(`/${workItem}`); - } - } - payload += `[${workItem}](${specificWorkItemURL})\n`; - } - } else { - payload += `N/A\n`; - } - return payload; - } - - private generateArtifacts(payload: string, release: Release) { - payload += '### Artifacts :package:\n'; - for (let artifactNum = 0; artifactNum < release.artifacts.length; artifactNum++) { - if (release.artifacts[artifactNum].from !== release.artifacts[artifactNum].to || this.showAllArtifacts) - payload += `- **${release.artifacts[artifactNum].name}** v${release.artifacts[artifactNum].version} (${release.artifacts[artifactNum].to})\n\n`; - } - return payload; - } - - private generateOrgs(orgs: org[], payload: string) { - const baseAddr = 'https://img.shields.io/static/v1'; - for (let org of orgs) { - let url = new URL( - `?label=${org.name}&message=${org.latestRelease.names[org.latestRelease.names.length - 1]}-${ - org.latestRelease.buildNumber - }(${org.retryCount})&color=green`, - baseAddr - ); - payload += `[![${org.name}-${org.latestRelease.names[org.latestRelease.names.length - 1]}-${ - org.latestRelease.buildNumber - }(${org.retryCount})-green](${url.toString()})](#${org.latestRelease.hashId}) `; - } - return payload; - } - - - private getDate(date: Date): string { - let day: number = date.getDate(); - let month: number = date.getMonth(); - let year: number = date.getFullYear(); - let pad = (n) => (n < 10 ? '0' + n : n); - - return pad(day) + '/' + pad(month + 1) + '/' + year; - } - - private getTime(date: Date): string { - let hours: number = date.getHours(); - let minutes: number = date.getMinutes(); - let seconds: number = date.getSeconds(); - let pad = (n) => (n < 10 ? '0' + n : n); - - return pad(hours) + ':' + pad(minutes) + ':' + pad(seconds); - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts deleted file mode 100644 index e20879963..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/CommitUpdater.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Release } from './ReleaseChangelog'; -import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; -import ReadPackageChangelog from './ReadPackageChangelog'; - -export default class CommitUpdater { - constructor( - private latestRelease: Release, - private artifactsToLatestCommitId: { [p: string]: string }, - private packagesToChangelogFilePaths: { [p: string]: string }, - private readPackageChangelog: ReadPackageChangelog - ) {} - - /** - * Generate commits in latest release, for each artifact - * Also sets new latestCommitId for artifacts - * @returns - */ - update(): void { - for (let artifact of this.latestRelease['artifacts']) { - let packageChangelog: PackageChangelog = this.readPackageChangelog( - this.packagesToChangelogFilePaths[artifact.name] - ); - - // Set new latestCommitId - artifact['latestCommitId'] = packageChangelog['commits'][0]['commitId']; - - let indexOfLatestCommitId; - if (this.artifactsToLatestCommitId?.[artifact.name]) { - indexOfLatestCommitId = packageChangelog['commits'].findIndex( - (commit) => commit['commitId'] === this.artifactsToLatestCommitId[artifact.name] - ); - if (indexOfLatestCommitId === -1) { - console.log( - `Cannot find commit Id ${this.artifactsToLatestCommitId[artifact.name]} in ${ - artifact.name - } changelog` - ); - console.log('Assuming that there are no changes...'); - artifact['commits'] = []; - continue; - } - } - - if (indexOfLatestCommitId > 0) { - artifact['commits'] = packageChangelog['commits'].slice(0, indexOfLatestCommitId); - } else if (indexOfLatestCommitId === 0) { - // Artifact verison has not changed - artifact['commits'] = []; - // Skip to next artifact - continue; - } else if (indexOfLatestCommitId === undefined) { - // Artifact was not in previous release - artifact['commits'] = packageChangelog['commits']; - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts deleted file mode 100644 index 4e9549f05..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/OrgsUpdater.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { ReleaseChangelog, Release, ReleaseId } from './ReleaseChangelog'; -import lodash = require('lodash'); - -export default class OrgsUpdater { - private latestReleaseId: ReleaseId; - private idOfReleaseWithMatchingHashId: ReleaseId; - - constructor( - private releaseChangelog: ReleaseChangelog, - private latestRelease: Release, - private org: string, - private releaseWithMatchingHashId: Release - ) { - this.latestReleaseId = this.convertReleaseToId(this.latestRelease); - - if (this.releaseWithMatchingHashId) { - this.idOfReleaseWithMatchingHashId = this.convertReleaseToId(this.releaseWithMatchingHashId); - } - } - - update(): void { - if (!this.idOfReleaseWithMatchingHashId) { - if (this.releaseChangelog.orgs) { - let org = this.releaseChangelog.orgs.find((org) => org.name === this.org); - - if (org) { - org.releases.push(this.latestReleaseId); - org.latestRelease = org.releases[org.releases.length - 1]; - org.retryCount = 0; - } else { - this.releaseChangelog.orgs.push({ - name: this.org, - releases: [this.latestReleaseId], - latestRelease: this.latestReleaseId, - retryCount: 0, - }); - } - } else { - // for backwards-compatibility with pre-existing changelogs - this.releaseChangelog.orgs = [ - { - name: this.org, - releases: [this.latestReleaseId], - latestRelease: this.latestReleaseId, - retryCount: 0, - }, - ]; - } - console.log( - `Updating ${this.org} org with`, - this.latestRelease.names[this.latestRelease.names.length - 1] + - '-' + - this.latestRelease.buildNumber + - `(0)` - ); - } else { - // Update orgs - let org = this.releaseChangelog.orgs.find((org) => org.name === this.org); - - if (org) { - let indexOfReleaseToOrg = org.releases.findIndex( - (orgRelease) => orgRelease.hashId === this.idOfReleaseWithMatchingHashId.hashId - ); - if (org.latestRelease.hashId !== this.idOfReleaseWithMatchingHashId.hashId) { - if (indexOfReleaseToOrg >= 0) { - // Update release names in releases to org - org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId; - org.releases[indexOfReleaseToOrg].date = new Date().toUTCString(); - } else { - // Add releaseId in releases to org - org.releases.push(this.idOfReleaseWithMatchingHashId); - } - - // Update latest release - org.latestRelease = this.idOfReleaseWithMatchingHashId; - org.retryCount = 0; - } else { - if (lodash.isEqual(org.releases[indexOfReleaseToOrg], this.idOfReleaseWithMatchingHashId)) { - org.retryCount++; - } else { - org.retryCount = 0; - } - - // Update releases names in releases to org & latestRelease - org.releases[indexOfReleaseToOrg] = this.idOfReleaseWithMatchingHashId; - org.latestRelease = this.idOfReleaseWithMatchingHashId; - } - - console.log( - `Updating ${this.org} org with`, - org.latestRelease.names[org.latestRelease.names.length - 1] + - '-' + - org.latestRelease.buildNumber + - `(${org.retryCount})` - ); - } else { - // new org - this.releaseChangelog.orgs.push({ - name: this.org, - releases: [this.idOfReleaseWithMatchingHashId], - latestRelease: this.idOfReleaseWithMatchingHashId, - retryCount: 0, - }); - console.log( - `Updating ${this.org} org with`, - `${this.idOfReleaseWithMatchingHashId.names[this.idOfReleaseWithMatchingHashId.names.length - 1]}-${ - this.idOfReleaseWithMatchingHashId.buildNumber - }(0)` - ); - } - } - } - - /** - * Convert Release to Release Id - * @param release - * @returns - */ - private convertReleaseToId(release: Release): ReleaseId { - let releaseNames = [...release.names]; // Shallow copy - return { - names: releaseNames, - buildNumber: release.buildNumber, - hashId: release.hashId, - }; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts deleted file mode 100644 index 2fa69ae3c..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReadPackageChangelog.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Changelog as PackageChangelog } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; - -export default interface ReadPackageChangelog { - (changelogFilePath: string): PackageChangelog; -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts deleted file mode 100644 index 456d8544f..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelog.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Changelog, Commit } from '../../core/changelog/interfaces/GenericChangelogInterfaces'; - -export class ReleaseChangelog { - releases: Release[]; - orgs?: org[]; -} - -export class org { - /** - * Name of the org - */ - name: string; - - /** - * History of releases to the org - */ - releases: ReleaseId[]; - - /** - * Latest release deployed to org - */ - latestRelease: ReleaseId; - - /** - * Number of consecutive deployments of the latest release to the org - */ - retryCount: number; -} - -export class ReleaseId { - names: string[]; - buildNumber: number; - hashId: string; - date?:string; -} - -export interface Release extends ReleaseId { - workItems: any; - artifacts: Artifact[]; -} - -export interface Artifact extends Changelog { - /** - * Name of the artifact - */ - name: string; - - /** - * Commit Id from which previous artifact was created - */ - from: string; - - /** - * Commit Id from which current artifact was created - */ - to: string; - - /** - * Package version number - */ - version: string; - - /** - * Latest commit Id in the package changelog - */ - latestCommitId: string; - - /** - * Commits between previous artifact's package changelog and current artifact's package changelog - */ - commits: Commit[]; -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts deleted file mode 100644 index 4a8808c4b..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/ReleaseChangelogUpdater.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { ReleaseChangelog, Release, Artifact } from './ReleaseChangelog'; -import CommitUpdater from './CommitUpdater'; -import WorkItemUpdater from './WorkItemUpdater'; -import OrgsUpdater from './OrgsUpdater'; -import ReadPackageChangelog from './ReadPackageChangelog'; -import * as fs from 'fs-extra'; -import SfpPackage from '../../core/package/SfpPackage'; -var hash = require('object-hash'); - -export default class ReleaseChangelogUpdater { - constructor( - private releaseChangelog: ReleaseChangelog, - private releaseName: string, - private artifactsToSfpPackage: { [p: string]: SfpPackage }, - private packagesToChangelogFilePaths: { [p: string]: string }, - private workItemFilters: string[], - private org: string - ) { } - - update(): ReleaseChangelog { - let buildNumber: number; - if (this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1]?.buildNumber) { - buildNumber = this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1].buildNumber + 1; - } else { - buildNumber = 1; - } - - let latestRelease: Release = this.initLatestRelease(this.releaseName, buildNumber, this.artifactsToSfpPackage); - - let releaseWithMatchingHashId = this.findRelease(this.releaseChangelog.releases, latestRelease); - if (!releaseWithMatchingHashId) { - - - - let artifactsToLatestCommitId: { [P: string]: string }; - if (this.releaseChangelog.releases.length > 0) { - artifactsToLatestCommitId = this.getArtifactsToLatestCommitId(this.releaseChangelog, latestRelease); - } - - let readPackageChangelog: ReadPackageChangelog = (changelogFilePath: string) => { - return JSON.parse(fs.readFileSync(changelogFilePath, 'utf8')); - }; - - new CommitUpdater( - latestRelease, - artifactsToLatestCommitId, - this.packagesToChangelogFilePaths, - readPackageChangelog - ).update(); - - new WorkItemUpdater(latestRelease, this.workItemFilters).update(); - - this.releaseChangelog.releases.push(latestRelease); - } else { - if (!this.containsLatestReleaseName(releaseWithMatchingHashId.names, latestRelease.names[0])) { - // append latestReleaseName - releaseWithMatchingHashId.names.push(latestRelease.names[0]); - } - } - - if (this.org) { - new OrgsUpdater(this.releaseChangelog, latestRelease, this.org, releaseWithMatchingHashId).update(); - } - - return this.releaseChangelog; - } - - /** - * Get map of artifacts to the latest commit Id in past releases - * Also sets artifact "from" property - * @param releaseChangelog - * @param latestRelease - * @returns - */ - private getArtifactsToLatestCommitId(releaseChangelog: ReleaseChangelog, latestRelease: Release) { - let artifactsToLatestCommitId: { [P: string]: string } = {}; - - for (let latestReleaseArtifact of latestRelease.artifacts) { - loopThroughReleases: for (let i = releaseChangelog.releases.length - 1; i >= 0; i--) { - for (let artifact of releaseChangelog.releases[i].artifacts) { - if (artifact.name === latestReleaseArtifact.name) { - latestReleaseArtifact.from = artifact.to; - artifactsToLatestCommitId[latestReleaseArtifact.name] = artifact.latestCommitId; - break loopThroughReleases; - } - } - } - } - - return artifactsToLatestCommitId; - } - - /** - * Finds release with matching hash Id - * Returns null if match cannot be found - * @param releaseChangelog - * @param latestRelease - * @returns - */ - private findRelease(releases: Release[], latestRelease: Release): Release | null { - let foundRelease: Release | null = null; - - if (releases.length > 0) { - // First level matching with hashId - foundRelease = releases.find(release => release.hashId === latestRelease.hashId); - - // If not found by hashId, proceed to next level matching with names and artifacts - if (foundRelease == null) { - // Create a map for constant time lookup of all release's artifacts - const allArtifacts = new Map(); - for (let release of releases) { - for (let artifact of release.artifacts) { - if (allArtifacts.has(artifact.name)) { - allArtifacts.get(artifact.name).push(artifact.version); - } else { - allArtifacts.set(artifact.name, [artifact.version]); - } - } - } - - // Check if all artifacts in the latest release exist in previous releases - let isAllArtifactsAlreadyAvailablePreviously: boolean = true; - for (let artifact of latestRelease.artifacts) { - if (!allArtifacts.has(artifact.name) || !allArtifacts.get(artifact.name).includes(artifact.version)) { - isAllArtifactsAlreadyAvailablePreviously = false; - break; - } - } - - // If all artifacts match, check for names - if (isAllArtifactsAlreadyAvailablePreviously) { - for (let release of releases) { - if (release.names.includes(latestRelease.names[0])) { - foundRelease = release; - break; - } - } - } - } - } - - return foundRelease; - } - - - /** - * Initalise latest release - * @param releaseName - * @param artifactsToSfpPackage - * @returns - */ - private initLatestRelease( - releaseName: string, - buildNumber: number, - artifactsToSfpPackage: { [p: string]: SfpPackage } - ): Release { - let latestRelease: Release = { - names: [releaseName], - buildNumber: buildNumber, - workItems: {}, - artifacts: [], - hashId: undefined, - }; - - for (let sfpPackage of Object.values(artifactsToSfpPackage)) { - let artifact: Artifact = { - name: sfpPackage.packageName, - from: undefined, - to: sfpPackage.sourceVersion?.slice(0, 8), - version: sfpPackage.package_version_number, - latestCommitId: undefined, - commits: undefined, - }; - - latestRelease['artifacts'].push(artifact); - } - - latestRelease.hashId = hash(latestRelease.artifacts); - latestRelease.date = new Date().toString(); - - return latestRelease; - } - - private containsLatestReleaseName(releaseNames: string[], latestReleaseName: string): boolean { - return releaseNames.find((name) => name.toLowerCase() === latestReleaseName.toLowerCase()) ? true : false; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts b/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts deleted file mode 100644 index 71c9eec7e..000000000 --- a/packages/sfpowerscripts-cli/src/impl/changelog/WorkItemUpdater.ts +++ /dev/null @@ -1,41 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { Release } from './ReleaseChangelog'; - - -export default class WorkItemUpdater { - constructor(private latestRelease: Release, private workItemFilters: string[],private logger?:Logger) {} - - /** - * Generate work items in latest release - */ - update(): void { - for (const workItemFilter of this.workItemFilters) { - - let workItemFilterRegex: RegExp = RegExp(workItemFilter, 'gi'); - SFPLogger.log(`Matching...${workItemFilterRegex}`,LoggerLevel.INFO,this.logger); - - for (let artifact of this.latestRelease['artifacts']) { - for (let commit of artifact['commits']) { - let commitMessage: String = commit['message'] + '\n' + commit['body']; - let workItems: RegExpMatchArray = commitMessage.match(workItemFilterRegex); - if (workItems) { - for (let item of workItems) { - if (this.latestRelease['workItems'][item] == null) { - this.latestRelease['workItems'][item] = new Set(); - this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8)); - } else { - this.latestRelease['workItems'][item].add(commit['commitId'].slice(0, 8)); - } - } - } - } - } - } - - // Convert each work item Set to Array - // Enables JSON stringification of work item - for (let key in this.latestRelease['workItems']) { - this.latestRelease.workItems[key] = Array.from(this.latestRelease.workItems[key]); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts b/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts deleted file mode 100644 index daf033582..000000000 --- a/packages/sfpowerscripts-cli/src/impl/demoreelplayer/DemoReelPlayer.ts +++ /dev/null @@ -1,61 +0,0 @@ -import path = require('path'); -import * as fs from 'fs-extra'; -import { marked } from 'marked'; -const TerminalRenderer = require('marked-terminal'); -import { delay } from '../../core/utils/Delay'; - -export default class DemoReelPlayer { - public async execute(demoReelFolderPath: string) { - //Define renderer - marked.setOptions({ - // Define custom renderer - renderer: new TerminalRenderer(), - }); - - let demoReel: demoReel = fs.readJSONSync(path.join(demoReelFolderPath, 'demo.json'), { - encoding: 'UTF-8', - }); - for (let response of demoReel.sequence) { - let ext = path.extname(path.resolve(demoReelFolderPath, response.filepath)); - let data = fs.readFileSync(path.resolve(demoReelFolderPath, response.filepath), 'utf8'); - - if (response.data) { - Object.entries(response.data).forEach((entry) => { - data = data.replace(`\$\{\{${entry[0]}\}\}`, entry[1]); - }); - } - - if (response.repeat) { - let count = 0; - while (count <= response.repeat) { - await delay(response.preDelay); - if (ext === '.md') { - console.log(marked(data)); - } else { - console.log(data); - } - count++; - await delay(response.postDelay); - } - } else { - await delay(response.preDelay); - if (ext === '.md') { - console.log(marked(data)); - } else { - console.log(data); - } - await delay(response.postDelay); - } - } - } -} - -interface demoReel { - sequence: { - filepath: string; - preDelay: number; - postDelay: number; - repeat: number; - data: { [p: string]: string }; - }[]; -} diff --git a/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts b/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts deleted file mode 100644 index cf58a7187..000000000 --- a/packages/sfpowerscripts-cli/src/impl/dependency/ShrinkImpl.ts +++ /dev/null @@ -1,81 +0,0 @@ -import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; -import { COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_SUCCESS, COLOR_ERROR } from '@flxblio/sfp-logger'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; -import _ from 'lodash'; -import { Connection } from '@salesforce/core'; -const Table = require('cli-table'); -import UserDefinedExternalDependency from '../../core/project/UserDefinedExternalDependency'; - -export default class ShrinkImpl { - private dependencyMap; - private updatedprojectConfig: any; - - - constructor(private connToDevHub:Connection, private logger?: Logger) {} - public async shrinkDependencies(sfdxProjectConfig: any): Promise { - SFPLogger.log('Shrinking Project Dependencies...', LoggerLevel.INFO, this.logger); - - this.updatedprojectConfig = _.cloneDeep(sfdxProjectConfig); - - const transitiveDependencyResolver = new TransitiveDependencyResolver( - sfdxProjectConfig - ); - - this.dependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies(); - await this.resolveAndShrinkDependencies(this.dependencyMap); - - this.updatedprojectConfig = new UserDefinedExternalDependency().addDependencyEntries( this.updatedprojectConfig, this.connToDevHub); - - return this.updatedprojectConfig; - } - - private async resolveAndShrinkDependencies(dependencyMap: any) { - let pkgs = [...dependencyMap.keys()]; - - for (let pkg of pkgs) { - SFPLogger.log( - COLOR_HEADER(`cleaning up dependencies for package:`) + COLOR_KEY_MESSAGE(pkg), - LoggerLevel.TRACE, - this.logger - ); - let dependenencies = dependencyMap.get(pkg); - let updatedDependencies = _.cloneDeep(dependenencies); - for (let dependency of dependencyMap.get(pkg)) { - if (dependencyMap.get(dependency.package)) { - SFPLogger.log( - `Shrinking ${dependencyMap.get(dependency.package).length} dependencies from package ${ - dependency.package - }`, - LoggerLevel.TRACE, - this.logger - ); - for (let temp of dependencyMap.get(dependency.package)) { - for (let i = 0; i < updatedDependencies.length; i++) { - if (updatedDependencies[i].package == temp.package) { - updatedDependencies.splice(i, 1); - } - } - } - } else { - SFPLogger.log( - `no dependency found for ${dependency.package} in the map`, - LoggerLevel.TRACE, - this.logger - ); - } - } - //Update project config - await this.updateProjectConfig(pkg, updatedDependencies); - } - - } - - private async updateProjectConfig(packageName: string, fixedDependencies: any) { - this.updatedprojectConfig.packageDirectories.map((pkg) => { - if (pkg.package == packageName) { - return Object.assign(pkg, { dependencies: fixedDependencies }); - } - }); - } -} - diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts b/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts deleted file mode 100644 index 98851aaad..000000000 --- a/packages/sfpowerscripts-cli/src/impl/deploy/DeployImpl.ts +++ /dev/null @@ -1,851 +0,0 @@ -import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; -import SFPLogger, { COLOR_ERROR, COLOR_SUCCESS, FileLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; -import { Stage } from '../Stage'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import semver = require('semver'); -import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl'; -import { DeploymentType } from '../../core/deployers/DeploymentExecutor'; -import { COLOR_KEY_MESSAGE,COLOR_KEY_VALUE,COLOR_HEADER } from '@flxblio/sfp-logger'; -import { - PackageInstallationResult, - PackageInstallationStatus, -} from '../../core/package/packageInstallers/PackageInstallationResult'; -import SFPOrg from '../../core/org/SFPOrg'; -import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; -import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; -import { PostDeployHook } from './PostDeployHook'; -import { PreDeployHook } from './PreDeployHook'; -import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; -import SfpPackageInstaller from '../../core/package/SfpPackageInstaller'; -import { SfpPackageInstallationOptions } from '../../core/package/packageInstallers/InstallPackage'; -import * as _ from 'lodash'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import convertBuildNumDotDelimToHyphen from '../../core/utils/VersionNumberConverter'; -import ReleaseConfig from '../release/ReleaseConfig'; -import fs from 'fs-extra'; -import { Align, getMarkdownTable } from 'markdown-table-ts'; -import FileOutputHandler from '../../outputs/FileOutputHandler'; - - -const Table = require('cli-table'); -const retry = require('async-retry'); - -export enum DeploymentMode { - NORMAL, - SOURCEPACKAGES, - SOURCEPACKAGES_PUSH, -} - -export interface DeployProps { - targetUsername: string; - artifactDir: string; - deploymentMode: DeploymentMode; - isTestsToBeTriggered: boolean; - skipIfPackageInstalled: boolean; - logsGroupSymbol?: string[]; - waitTime: number; - tags?: any; - logger?: Logger; - currentStage?: Stage; - baselineOrg?: string; - isDryRun?: boolean; - isRetryOnFailure?: boolean; - promotePackagesBeforeDeploymentToOrg?: string; - devhubUserName?: string; - disableArtifactCommit?: boolean; - selectiveComponentDeployment?: boolean; - maxRetryCount?:number; - releaseConfigPath?:string; -} - -export default class DeployImpl { - private _postDeployHook: PostDeployHook; - private _preDeployHook: PreDeployHook; - private targetOrg: SFPOrg; - - constructor(private props: DeployProps) { - - //Set defaults - if(!this.props.maxRetryCount) - this.props.maxRetryCount = 1; - } - - public set postDeployHook(hook: PostDeployHook) { - this._postDeployHook = hook; - } - - public set preDeployHook(hook: PreDeployHook) { - this._preDeployHook = hook; - } - - public async exec(): Promise { - let deployed: PackageInfo[] = []; - let failed: PackageInfo[] = []; - let queue: SfpPackage[]; - let packagesToPackageInfo: { [p: string]: PackageInfo }; - try { - //Create Org - this.targetOrg = await SFPOrg.create({ aliasOrUsername: this.props.targetUsername }); - - let artifacts = ArtifactFetcher.fetchArtifacts(this.props.artifactDir, null, this.props.logger); - - if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${this.props.artifactDir}`); - - //Convert artifacts to SfpPackages - let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts); - - - - //Filter artifacts based on release config - sfpPackages = this.filterSfPPackagesBasedOnReleaseConfig(sfpPackages,this.props.releaseConfigPath,this.props.logger); - - //Grab the latest projectConfig from Packages - let sfpPackageInquirer: SfpPackageInquirer = new SfpPackageInquirer(sfpPackages, this.props.logger); - let sfdxProjectConfig = sfpPackageInquirer.getLatestProjectConfig(); - if (sfdxProjectConfig == null) { - // If unable to find latest package manifest in artifacts, use package manifest in project directory - sfdxProjectConfig = ProjectConfig.getSFDXProjectConfig(null); - } - - SFPLogger.log('Packages' + sfpPackages.length, LoggerLevel.TRACE, this.props.logger); - - packagesToPackageInfo = await this.getPackagesToPackageInfo(sfpPackages); - - SFPLogger.log( - 'Packages' + JSON.stringify(packagesToPackageInfo), - LoggerLevel.TRACE, - this.props.logger - ); - - queue = this.getPackagesToDeploy(sfdxProjectConfig, packagesToPackageInfo); - - SFPLogger.log('queue:' + JSON.stringify(queue), LoggerLevel.TRACE, this.props.logger); - - if (this.props.skipIfPackageInstalled) { - //Filter the queue based on what is deployed in the target org - let isBaselinOrgModeActivated: boolean; - if (this.props.baselineOrg) { - isBaselinOrgModeActivated = true; - } else { - isBaselinOrgModeActivated = false; - this.props.baselineOrg = this.props.targetUsername; //Change baseline to the target one itself - } - - let filteredDeploymentQueue = await this.filterByPackagesInstalledInTheOrg( - sfdxProjectConfig, - queue, - packagesToPackageInfo, - this.props.baselineOrg - ); - SFPLogger.log( - 'filtered queue:' + JSON.stringify(filteredDeploymentQueue), - LoggerLevel.TRACE, - this.props.logger - ); - this.printArtifactVersionsWhenSkipped(queue, packagesToPackageInfo, isBaselinOrgModeActivated,this.props); - queue = filteredDeploymentQueue; - } else { - this.printArtifactVersions(queue, packagesToPackageInfo); - } - - for (let i = 0; i < queue.length; i++) { - let packageInfo = packagesToPackageInfo[queue[i].packageName]; - let sfpPackage: SfpPackage = packageInfo.sfpPackage; - - let packageType: string = sfpPackage.packageType; - - let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig( - queue[i].packageName, - sfdxProjectConfig - ); - - let groupSection; - if (this.props.currentStage == Stage.VALIDATE) { - groupSection = new GroupConsoleLogs( - `Validating: ${i + 1}/${queue.length} ${queue[i].packageName}`, - this.props.logger - ).begin(); - } else - groupSection = new GroupConsoleLogs( - `Installing: ${i + 1}/${queue.length} ${queue[i].packageName}`, - this.props.logger - ).begin(); - - //Display Header - this.displayHeader(sfpPackage, pkgDescriptor, queue[i].packageName); - - let preHookStatus = await this._preDeployHook?.preDeployPackage( - sfpPackage, - this.props.targetUsername, - sfpPackages, - this.props.devhubUserName, - this.props.logger - ); - if (preHookStatus?.isToFailDeployment) { - failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); - throw new Error( - preHookStatus.message - ? preHookStatus.message - : 'Hook Failed to execute, but didnt provide proper message' - ); - } - - let isToBeRetried: boolean = this.props.isRetryOnFailure; - let packageInstallationResult: PackageInstallationResult = await retry( - async (bail, attemptCount) => { - try { - try { - await this.promotePackagesBeforeInstallation(packageInfo.sourceDirectory, sfpPackage); - } catch (error) { - //skip packages already promoted - SFPLogger.log(`Package already promoted .. skipping`,LoggerLevel.WARN); - } - - this.displayRetryHeader(isToBeRetried, attemptCount); - - let installPackageResult = await this.installPackage( - packageType, - queue[i], - this.targetOrg, - queue[i].packageDescriptor.skipTesting, - this.props.waitTime.toString(), - pkgDescriptor, - false, //Queue already filtered by deploy, there is no further need for individual - //commands to decide the skip logic. TODO: fix this incorrect pattern - sfpPackage.apiVersion || sfpPackage.payload?.Package?.version // Use package.xml version for backwards compat with old artifacts - ); - - //Handle specific error condition which need a retry, overriding the set value - isToBeRetried = handleRetryOnSpecificConditions(isToBeRetried, installPackageResult, attemptCount,this.props.maxRetryCount); - - if (isToBeRetried) { - throw new Error(installPackageResult.message); - } else return installPackageResult; - } catch (error) { - if (isToBeRetried) { - throw error; - } else { - // Any other exception, in regular cases dont retry, just bail out - let failedPackageInstallationResult: PackageInstallationResult = { - result: PackageInstallationStatus.Failed, - message: error, - }; - - - FileOutputHandler.getInstance().writeOutput(`deployment-error.md`,`### 💣 Deployment Failed 💣`); - FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`Package Installation failed for **${queue[i].packageName}**`); - FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`Reasons:`); - FileOutputHandler.getInstance().appendOutput(`deployment-error.md`,`${error}`); - - return failedPackageInstallationResult; - } - } - - function handleRetryOnSpecificConditions( - isToBeRetried: boolean, - installPackageResult: PackageInstallationResult, - retryCount: number, - maxRetryCount:number - ): boolean { - //override current value when encountering such issue - if (installPackageResult.result === PackageInstallationStatus.Failed) { - if (installPackageResult.message?.includes('ongoing background job')) - return true; - else if (isToBeRetried && retryCount <= maxRetryCount ) - return true; - else - return false; - } else return false; - } - }, - { retries: 10, minTimeout: 30000 } - ); - - if (packageInstallationResult.result === PackageInstallationStatus.Succeeded) { - deployed.push(packageInfo); - } else if (packageInstallationResult.result === PackageInstallationStatus.Skipped) { - continue; - } else if (packageInstallationResult.result === PackageInstallationStatus.Failed) { - failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); - } - - // Only deploy post hook when package installation is successful - if(packageInstallationResult.result === PackageInstallationStatus.Succeeded) { - let postHookStatus = await this._postDeployHook?.postDeployPackage( - sfpPackage, - packageInstallationResult, - this.props.targetUsername, - sfpPackages, - this.props.devhubUserName, - this.props.logger - ); - - if (postHookStatus?.isToFailDeployment) { - failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); - throw new Error( - postHookStatus.message - ? postHookStatus.message - : 'Hook Failed to execute, but didnt provide proper message' - ); - } - } - - if (packageInstallationResult.result === PackageInstallationStatus.Failed) { - failed = queue.slice(i).map((pkg) => packagesToPackageInfo[pkg.packageName]); - throw new Error(packageInstallationResult.message); - } - - groupSection.end(); - } - - return { - scheduled: queue.length, - deployed: deployed, - failed: failed, - queue: queue, - packagesToPackageInfo: packagesToPackageInfo, - error: null - }; - } catch (err) { - SFPLogger.log(err, LoggerLevel.ERROR, this.props.logger); - - return { - scheduled: queue?.length ? queue.length : 0, - deployed: deployed, - failed: failed, - queue: queue, - packagesToPackageInfo: packagesToPackageInfo, - error: err.message, - }; - } - } - private filterSfPPackagesBasedOnReleaseConfig(sfpPackages: SfpPackage[], releaseConfigPath: string,logger:Logger): SfpPackage[] { - if(!releaseConfigPath) - return sfpPackages; - else - { - SFPLogger.log(COLOR_KEY_MESSAGE(`Filtering packages to be deployed based on release config ${COLOR_KEY_VALUE(releaseConfigPath)}`),LoggerLevel.INFO,logger); - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger,releaseConfigPath); - let packages = releaseConfig.getPackagesAsPerReleaseConfig(); - //Filter artifacts based on packages - let filteredSfPPackages:SfpPackage[] = []; - - for (const sfpPackage of sfpPackages) { - if (packages.includes(sfpPackage.packageName)) { - filteredSfPPackages.push(sfpPackage); - } - } - return filteredSfPPackages; - } - - } - - - private async generateSfpPackageFromArtifacts(artifacts: Artifact[]): Promise { - let sfpPackages: SfpPackage[] = []; - for (const artifact of artifacts) { - let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, this.props.logger); - sfpPackages.push(sfpPackage); - } - return sfpPackages; - } - - private async promotePackagesBeforeInstallation(sourceDirectory: string, sfpPackage: SfpPackage) { - if (this.props.promotePackagesBeforeDeploymentToOrg === this.props.targetUsername) { - if (sfpPackage.packageType === PackageType.Unlocked) { - console.log( - COLOR_KEY_MESSAGE(`Attempting to promote package ${sfpPackage.packageName} before installation`) - ); - if(!this.props.isDryRun) - { - let promoteUnlockedPackageImpl: PromoteUnlockedPackageImpl = new PromoteUnlockedPackageImpl( - sourceDirectory, - sfpPackage.package_version_id, - this.props.devhubUserName - ); - await promoteUnlockedPackageImpl.promote(); - } - } - } - } - - private displayRetryHeader(isRetryOnFailure: boolean, count: number) { - if (isRetryOnFailure && count > 1) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log(`Retrying On Failure Attempt: ${count}`, LoggerLevel.INFO, this.props.logger); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - } - - private displayHeader(sfpPackage: SfpPackage, pkgDescriptor: any, pkg: string) { - let alwaysDeployMessage: string; - - if (this.props.skipIfPackageInstalled) { - if (pkgDescriptor.alwaysDeploy) alwaysDeployMessage = `Always Deploy: ${COLOR_KEY_MESSAGE(`True`)}`; - else alwaysDeployMessage = `Always Deploy: ${COLOR_KEY_MESSAGE(`False`)}`; - } else alwaysDeployMessage = undefined; - - //Display header - SFPLogger.printHeaderLine('Installing Package',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log(COLOR_HEADER(`Name: ${COLOR_KEY_MESSAGE(pkg)}`), LoggerLevel.INFO, this.props.logger); - SFPLogger.log(`Type: ${COLOR_KEY_MESSAGE(sfpPackage.packageType)}`, LoggerLevel.INFO, this.props.logger); - SFPLogger.log( - `Version Number: ${COLOR_KEY_MESSAGE(sfpPackage.versionNumber)}`, - LoggerLevel.INFO, - this.props.logger - ); - this.displayTestInfoHeader(sfpPackage); - if (pkgDescriptor.aliasfy) - SFPLogger.log( - `Aliasified Package: ${COLOR_KEY_MESSAGE(`True`)}`, - LoggerLevel.INFO, - this.props.logger - ); - if(sfpPackage.isApexFound) - SFPLogger.log( - `Contains Apex Classes/Triggers: ${COLOR_KEY_MESSAGE(sfpPackage.isApexFound)}`, - LoggerLevel.INFO, - this.props.logger - ); - if (sfpPackage.packageType == PackageType.Source || sfpPackage.packageType == PackageType.Unlocked) { - if (!pkgDescriptor.aliasfy) { - SFPLogger.log( - `Metadata to be deployed: ${COLOR_KEY_MESSAGE(sfpPackage.metadataCount)}`, - LoggerLevel.INFO, - this.props.logger - ); - } - } - - if (pkgDescriptor.skipTesting) { - SFPLogger.log( - `Skip Testing: ${COLOR_KEY_MESSAGE(pkgDescriptor.skipTesting ? 'true' : 'false')}`, - LoggerLevel.INFO, - this.props.logger - ); - } - - if (alwaysDeployMessage) SFPLogger.log(alwaysDeployMessage, LoggerLevel.INFO, this.props.logger); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - - private displayTestInfoHeader(sfpPackage: SfpPackage) { - if (sfpPackage.packageType == PackageType.Source) { - if (!sfpPackage.isTriggerAllTests) - SFPLogger.log( - `Optimized Deployment: ${COLOR_KEY_MESSAGE( - this.isOptimizedDeploymentForSourcePackage(sfpPackage.packageDescriptor) - )}`, - LoggerLevel.INFO, - this.props.logger - ); - else - SFPLogger.log( - `Trigger All Tests: ${COLOR_KEY_MESSAGE(`true`)}`, - LoggerLevel.INFO, - this.props.logger - ); - } - } - - private printArtifactVersionsWhenSkipped( - queue: SfpPackage[], - packagesToPackageInfo: { [p: string]: PackageInfo }, - isBaselinOrgModeActivated: boolean, - props:DeployProps - ) { - let groupSection = new GroupConsoleLogs(`Full Deployment Breakdown`, this.props.logger).begin(); - let maxTable = new Table({ - head: [ - 'Package', - 'Incoming Version', - isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', - 'To be installed?', - ], - chars: ZERO_BORDER_TABLE, - }); - - queue.forEach((pkg) => { - maxTable.push(processColoursForAllPackages(pkg)); - }); - - SFPLogger.log(maxTable.toString(), LoggerLevel.INFO, this.props.logger); - - - //Insane Hack - //TODO: Export the value to the caller - printDeploymentBreakDownInMarkdown(); - - groupSection.end(); - - groupSection = new GroupConsoleLogs(`Packages to be deployed`, this.props.logger).begin(); - let minTable = new Table({ - head: [ - 'Package', - 'Incoming Version', - isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', - ], - chars: ZERO_BORDER_TABLE, - }); - - queue.forEach((pkg) => { - if (!packagesToPackageInfo[pkg.packageName].isPackageInstalled) - minTable.push([ - COLOR_KEY_MESSAGE(pkg.packageName), - COLOR_KEY_MESSAGE(pkg.versionNumber), - packagesToPackageInfo[pkg.packageName].versionInstalledInOrg - ? COLOR_KEY_MESSAGE(packagesToPackageInfo[pkg.packageName].versionInstalledInOrg) - : COLOR_KEY_MESSAGE('N/A'), - ]); - }); - SFPLogger.log(minTable.toString(), LoggerLevel.INFO, this.props.logger); - groupSection.end(); - - - - function printDeploymentBreakDownInMarkdown() { - let tableData = { - table: { - head: [ - 'Package', - 'Incoming Version', - isBaselinOrgModeActivated ? 'Version in baseline org' : 'Version in org', - 'To be installed?', - 'Promotion Status' - ], - body: [] - }, - alignment: [Align.Left, Align.Left, Align.Left,Align.Right], - }; - for (const pkg of queue) { - tableData.table.body.push(getRowForMarkdownTable(pkg,props)); - } - const table = getMarkdownTable(tableData); - const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('deployment-breakdown.md',table) ; - } - - function processColoursForAllPackages(pkg) { - const pkgInfo = packagesToPackageInfo[pkg.packageName]; - - let packageName = pkg.packageName; - let versionNumber = pkg.versionNumber; - let versionInstalledInOrg = pkgInfo.versionInstalledInOrg ? pkgInfo.versionInstalledInOrg : 'N/A'; - let isPackageInstalled = pkgInfo.isPackageInstalled ? 'No' : 'Yes'; - - if (pkgInfo.isPackageInstalled) { - packageName = COLOR_SUCCESS(packageName); - versionNumber = COLOR_SUCCESS(versionNumber); - versionInstalledInOrg = COLOR_SUCCESS(versionInstalledInOrg); - isPackageInstalled = COLOR_SUCCESS(isPackageInstalled); - } - else - { - packageName = COLOR_ERROR(packageName); - versionNumber = COLOR_ERROR(versionNumber); - versionInstalledInOrg = COLOR_ERROR(versionInstalledInOrg); - isPackageInstalled = COLOR_ERROR(isPackageInstalled); - - } - - return [packageName, versionNumber, versionInstalledInOrg, isPackageInstalled]; - } - - - function getRowForMarkdownTable(pkg:SfpPackage, props:DeployProps) { - const pkgInfo = packagesToPackageInfo[pkg.packageName]; - - let packageName = pkg.packageName; - let versionNumber = pkg.versionNumber; - let versionInstalledInOrg = pkgInfo.versionInstalledInOrg ? pkgInfo.versionInstalledInOrg : 'N/A'; - let isPackageToBeInstalled = pkgInfo.isPackageInstalled ? 'No' : 'Yes'; - let promotionStatus = 'N/A'; - - if(isPackageToBeInstalled=="Yes") - { - isPackageToBeInstalled = `![Yes](https://img.shields.io/badge/Yes-green.svg)`; - packageName = `**${packageName}**`; - if(pkg.packageType==PackageType.Unlocked) - { - if (props.promotePackagesBeforeDeploymentToOrg == props.targetUsername && versionInstalledInOrg == "N/A") { - promotionStatus = '![Pending](https://img.shields.io/badge/Pending-yellow.svg)'; - } - else if(props.promotePackagesBeforeDeploymentToOrg == props.targetUsername ) { - let versionInstalledInOrgConvertedToSemver = convertBuildNumDotDelimToHyphen(versionInstalledInOrg); - let versionNumberConvertedToSemver = convertBuildNumDotDelimToHyphen(versionNumber); - if (semver.diff(versionInstalledInOrgConvertedToSemver, versionNumberConvertedToSemver) == 'prerelease') { - promotionStatus = '![Already Promoted](https://img.shields.io/badge/Already%20Promoted-red.svg)'; - } - else { - promotionStatus = '![Pending](https://img.shields.io/badge/Pending-yellow.svg)'; - } - } - else - { - promotionStatus = 'N/A'; - } - } - - versionNumber = `**${versionNumber}**`; - versionInstalledInOrg = `**${versionInstalledInOrg}**`; - } - else - { - versionNumber = `**${versionNumber}**`; - versionInstalledInOrg = `**${versionInstalledInOrg}**`; - } - - return [packageName, versionNumber, versionInstalledInOrg, isPackageToBeInstalled,promotionStatus]; - } - } - - private printArtifactVersions(queue: SfpPackage[], packagesToPackageInfo: { [p: string]: PackageInfo }) { - let groupSection = new GroupConsoleLogs(`Packages to be deployed`, this.props.logger).begin(); - let table = new Table({ - head: ['Package', 'Version to be installed'], - chars: ZERO_BORDER_TABLE, - }); - - queue.forEach((pkg) => { - table.push([pkg.packageName, pkg.versionNumber]); - }); - SFPLogger.log(table.toString(), LoggerLevel.INFO, this.props.logger); - groupSection.end(); - - printDeploymentBreakDownInMarkdown(); - - - function printDeploymentBreakDownInMarkdown() { - let tableData = { - table: { - head: [ - 'Package', - 'Version to be installed' - ], - body: [] - }, - alignment: [Align.Left, Align.Left, Align.Left,Align.Right], - }; - for (const pkg of queue) { - tableData.table.body.push(getRowForMarkdownTable(pkg)); - } - - const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('deployment-breakdown.md',`Please find the packages that will be deployed below`); - outputHandler.appendOutput('deployment-breakdown.md',`\n\n${getMarkdownTable(tableData)}`) ; - } - - function getRowForMarkdownTable(pkg:SfpPackage) { - let packageName = pkg.packageName; - let versionNumber = pkg.versionNumber; - return [packageName, versionNumber]; - } - } - - private async filterByPackagesInstalledInTheOrg( - packageManifest: any, - queue: SfpPackage[], - packagesToPackageInfo: { [p: string]: PackageInfo }, - targetUsername: string - ): Promise { - let targetOrg = await SFPOrg.create({ aliasOrUsername: targetUsername }); - - const clonedQueue = _.clone(queue); - - for (let i = queue.length - 1; i >= 0; i--) { - let packageInfo = packagesToPackageInfo[clonedQueue[i].packageName]; - let sfpPackage: SfpPackage = packageInfo.sfpPackage; - let pkgDescriptor = ProjectConfig.getPackageDescriptorFromConfig( - clonedQueue[i].packageName, - packageManifest - ); - let packageInstalledInTheOrg = await targetOrg.isArtifactInstalledInOrg( - this.props.logger, - sfpPackage - ); - if (packageInstalledInTheOrg.versionNumber) - packageInfo.versionInstalledInOrg = packageInstalledInTheOrg.versionNumber; - if (packageInstalledInTheOrg.isInstalled) { - if (!pkgDescriptor.alwaysDeploy) { - packageInfo.isPackageInstalled = true; - clonedQueue.splice(i, 1); - } - } - } - - return clonedQueue; - } - - /** - * Returns map of package name to package info - * @param artifacts - */ - private async getPackagesToPackageInfo(sfpPackages: SfpPackage[]): Promise<{ [p: string]: PackageInfo }> { - let packagesToPackageInfo: { [p: string]: PackageInfo } = {}; - - for (let sfpPackage of sfpPackages) { - if (packagesToPackageInfo[sfpPackage.packageName]) { - let previousVersionNumber = convertBuildNumDotDelimToHyphen( - packagesToPackageInfo[sfpPackage.packageName].sfpPackage.versionNumber - ); - let currentVersionNumber = convertBuildNumDotDelimToHyphen(sfpPackage.versionNumber); - - // replace existing packageInfo if package version number is newer - if (semver.gt(currentVersionNumber, previousVersionNumber)) { - packagesToPackageInfo[sfpPackage.packageName] = { - sourceDirectory: sfpPackage.sourceDir, - sfpPackage: sfpPackage, - }; - } - } else { - packagesToPackageInfo[sfpPackage.packageName] = { - sourceDirectory: sfpPackage.sourceDir, - sfpPackage: sfpPackage, - }; - } - } - return packagesToPackageInfo; - } - - /** - * Decider for which package installation type to run - */ - private async installPackage( - packageType: string, - sfpPackage: SfpPackage, - targetOrg: SFPOrg, - skipTesting: boolean, - waitTime: string, - pkgDescriptor: any, - skipIfPackageInstalled: boolean, - apiVersion: string - ): Promise { - //Compute Deployment Type - let deploymentType = - this.props.deploymentMode === DeploymentMode.SOURCEPACKAGES_PUSH - ? DeploymentType.SOURCE_PUSH : DeploymentType.MDAPI_DEPLOY; - - //Add Installation Options - let installationOptions = new SfpPackageInstallationOptions(); - installationOptions.installationkey = null, - installationOptions.apexcompile = 'package'; - installationOptions.waitTime = waitTime; - installationOptions.apiVersion = apiVersion; - installationOptions.publishWaitTime = 60; - installationOptions.isInstallingForValidation = - this.props.deploymentMode != DeploymentMode.NORMAL && - (this.props.currentStage === Stage.PREPARE || this.props.currentStage === Stage.VALIDATE); - installationOptions.optimizeDeployment = this.isOptimizedDeploymentForSourcePackage(pkgDescriptor); - installationOptions.skipTesting = skipTesting; - installationOptions.deploymentType = deploymentType; - installationOptions.disableArtifactCommit = this.props.disableArtifactCommit; - - //During validate, if optimizeDeploymentMode is false, use full local tests to validate - //but respect skipTesting #issue 1075 - //During Prepare (push), dont trigger tests - if (this.props.currentStage == Stage.VALIDATE) { - //Always enable skipTest as the default installation option during validate - //as test are run subsequently - installationOptions.skipTesting = true; - if (!this.isOptimizedDeploymentForSourcePackage(pkgDescriptor)) { - if (sfpPackage.packageDescriptor.skipTesting) - installationOptions.skipTesting = sfpPackage.packageDescriptor.skipTesting; - else installationOptions.skipTesting = false; - } - } else if (this.props.currentStage === Stage.PREPARE) { - installationOptions.optimizeDeployment = false; - installationOptions.skipTesting = true; - } - - installationOptions.skipIfPackageInstalled = skipIfPackageInstalled; - installationOptions.isDryRun = this.props.isDryRun; - - return SfpPackageInstaller.installPackage( - this.props.logger, - sfpPackage, - targetOrg, - installationOptions, - { - currentStage: this.props.currentStage, - }, - sfpPackage.packageType == PackageType.Unlocked && installationOptions.isInstallingForValidation - ? PackageType.Source - : undefined //Override to source - ); - } - - /** - * Checks if package should be installed to target username - * @param packageDescriptor - */ - private isSkipDeployment(packageDescriptor: any, targetUsername: string): boolean { - let skipDeployOnOrgs: string[] = packageDescriptor.skipDeployOnOrgs; - if (skipDeployOnOrgs) { - if (!(skipDeployOnOrgs instanceof Array)) - throw new Error(`Property 'skipDeployOnOrgs' must be of type Array`); - else return skipDeployOnOrgs.includes(targetUsername); - } else return false; - } - - // Allow individual packages to use non optimized path - private isOptimizedDeploymentForSourcePackage(pkgDescriptor: any): boolean { - if (pkgDescriptor.isOptimizedDeployment == null) return true; - else return pkgDescriptor.isOptimizedDeployment; - } - - /** - * Returns the packages in the project config that have an artifact - */ - private getPackagesToDeploy( - sfdxProjectConfig: any, - packagesToPackageInfo: { [p: string]: PackageInfo } - ): SfpPackage[] { - let packagesToDeploy: SfpPackage[] = []; - - let packages = sfdxProjectConfig['packageDirectories']; - - // Filter package manifest by whats available in artifacts - for (const pkg of packages) { - if (packagesToPackageInfo[pkg.package]) - packagesToDeploy.push(packagesToPackageInfo[pkg.package].sfpPackage); - } - - // Filter out packages that are to be skipped on the target org - packagesToDeploy = packagesToDeploy.filter( - (sfpPackage) => !this.isSkipDeployment(sfpPackage.packageDescriptor, this.props.targetUsername) - ); - - //Ignore packages based on stage - packagesToDeploy = packagesToDeploy.filter((pkg) => { - if ( - pkg.packageDescriptor.ignoreOnStage?.find((stage) => { - stage = stage.toLowerCase(); - return stage === this.props.currentStage; - }) - ) - return false; - else return true; - }); - - if (packagesToDeploy.length === 0) throw new Error(`No artifacts from project config to be deployed`); - else return packagesToDeploy; - } -} - -export interface PackageInfo { - sourceDirectory: string; - sfpPackage: SfpPackage; - versionInstalledInOrg?: string; - isPackageInstalled?: boolean; -} - -export interface DeploymentResult { - scheduled: number; - queue: any[]; - packagesToPackageInfo: { [p: string]: PackageInfo }; - deployed: PackageInfo[]; - failed: PackageInfo[]; - error: any; -} diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts b/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts deleted file mode 100644 index 7f73cf3ba..000000000 --- a/packages/sfpowerscripts-cli/src/impl/deploy/PostDeployHook.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Logger } from '@flxblio/sfp-logger'; -import { PackageInstallationResult } from '../../core/package/packageInstallers/PackageInstallationResult'; -import SfpPackage from '../../core/package/SfpPackage'; - -export interface PostDeployHook { - postDeployPackage( - sfpPackage: SfpPackage, - packageInstallationResult: PackageInstallationResult, - targetUsername: string, - deployedPackages?:SfpPackage[], - devhubUserName?: string, - logger?:Logger - ): Promise<{ isToFailDeployment: boolean; message?: string }>; -} diff --git a/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts b/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts deleted file mode 100644 index 58294b363..000000000 --- a/packages/sfpowerscripts-cli/src/impl/deploy/PreDeployHook.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Logger } from '@flxblio/sfp-logger'; -import SfpPackage from '../../core/package/SfpPackage'; - -export interface PreDeployHook { - preDeployPackage( - sfpPackage: SfpPackage, - targetUsername: string, - deployedPackages?:SfpPackage[], - devhubUserName?: string, - logger?:Logger, - ): Promise<{ isToFailDeployment: boolean; message?: string }>; -} diff --git a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts b/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts deleted file mode 100644 index 0d00338bb..000000000 --- a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedPackagesResolver.ts +++ /dev/null @@ -1,140 +0,0 @@ -import PackageDiffImpl, { PackageDiffOptions } from '../../core/package/diff/PackageDiffImpl'; -import { Stage } from '../Stage'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import { PackageType } from '../../core/package/SfpPackage'; -import * as fs from 'fs-extra'; -import { Logger } from '@flxblio/sfp-logger'; -import BuildCollections from '../parallelBuilder/BuildCollections'; - -export interface ImpactedPackageProps { - projectDirectory?: string; - branch?: string; - configFilePath?: string; - currentStage: Stage; - baseBranch?: string; - diffOptions?: PackageDiffOptions; - includeOnlyPackages?: string[]; -} - -export default class ImpactedPackageResolver { - - - constructor(private props: ImpactedPackageProps, private logger: Logger) { - } - - async getImpactedPackages(): Promise> { - let projectConfig = ProjectConfig.getSFDXProjectConfig(this.props.projectDirectory); - let packagesToBeBuilt = this.getPackagesToBeBuilt(this.props.projectDirectory); - let packagesToBeBuiltWithReasons = await this.filterPackagesToBeBuiltByChanged( - this.props.projectDirectory, - projectConfig, - packagesToBeBuilt - ); - - return packagesToBeBuiltWithReasons; - } - - /** - * 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 - */ - private getPathToForceIgnoreForCurrentStage(projectConfig: any, currentStage: Stage): string { - let stageForceIgnorePath: string; - - let ignoreFiles: { [key in Stage]: string } = 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; - } - - private async filterPackagesToBeBuiltByChanged(projectDirectory: string,projectConfig:any, allPackagesInRepo: any) { - let packagesToBeBuilt = new Map(); - let buildCollections = new BuildCollections(projectDirectory); - if (this.props.diffOptions) - this.props.diffOptions.pathToReplacementForceIgnore = this.getPathToForceIgnoreForCurrentStage( - projectConfig, - this.props.currentStage - ); - - for await (const pkg of allPackagesInRepo) { - let diffImpl: PackageDiffImpl = new PackageDiffImpl( - this.logger, - pkg, - this.props.projectDirectory, - this.props.diffOptions - ); - let packageDiffCheck = await diffImpl.exec(); - - if (packageDiffCheck.isToBeBuilt) { - packagesToBeBuilt.set(pkg, { - reason: 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; - } - - private getPackagesToBeBuilt(projectDirectory: string, includeOnlyPackages?: string[]): string[] { - let projectConfig = ProjectConfig.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) { - 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 !== PackageType.Data); - }); - - for (const pkg of packageDescriptors) { - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg['package']); - } - return sfdxpackages; - } - -} diff --git a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfpowerscripts-cli/src/impl/impact/ImpactedReleaseConfig.ts deleted file mode 100644 index 1af8798bc..000000000 --- a/packages/sfpowerscripts-cli/src/impl/impact/ImpactedReleaseConfig.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as fs from 'fs-extra'; -const yaml = require('js-yaml'); -import path from 'path'; - -export default class ImpactedRelaseConfigResolver { - - public getImpactedReleaseConfigs(impactedPackages, configDir,isExplicitDependencyCheckEnabled:boolean=false, filterBy?: string) { - const impactedReleaseDefs = []; - - fs.readdirSync(configDir).forEach((file) => { - const filePath = path.join(configDir, file); - const fileContent = fs.readFileSync(filePath, 'utf8'); - const releaseConfig = yaml.load(fileContent); - - if (releaseConfig.releaseName) { - let releaseImpactedPackages = []; - //Its a releasedefn, - if (releaseConfig.includeOnlyArtifacts) { - releaseImpactedPackages = releaseConfig.includeOnlyArtifacts.filter((artifact) => - impactedPackages.includes(artifact) - ); - } else if (releaseConfig.excludeArtifacts) { - releaseImpactedPackages = impactedPackages.filter( - (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) - ); - } - - - // handle dependencyOn, only do impact if there is atleast one package that is impacted - if (releaseImpactedPackages.length>0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { - releaseImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => - impactedPackages.includes(artifact) - ); - } - - - if (releaseImpactedPackages.length > 0) { - if (filterBy) { - if (releaseConfig.releaseName.includes(filterBy)) { - impactedReleaseDefs.push({ - releaseName: releaseConfig.releaseName, - pool: releaseConfig.pool - ? releaseConfig.pool - : releaseConfig.releaseName, - filePath: filePath, - impactedPackages: releaseImpactedPackages, // Including the impacted packages - }); - } - } else { - impactedReleaseDefs.push({ - releaseName: releaseConfig.releaseName, - pool: releaseConfig.pool - ? releaseConfig.pool - : releaseConfig.releaseName, - filePath: filePath, - impactedPackages: releaseImpactedPackages, // Including the impacted packages - }); - } - } - } - }); - - const sortedImpactedReleaseDefs = impactedReleaseDefs.sort((a, b) => { - if (!a.impactedPackages.length && !b.impactedPackages.length) return 0; - if (!a.impactedPackages.length) return 1; // Move releases with no impacted packages to the end - if (!b.impactedPackages.length) return -1; // Same as above - - const indexA = impactedPackages.indexOf(a.impactedPackages[0]); - const indexB = impactedPackages.indexOf(b.impactedPackages[0]); - - if (indexA === -1 && indexB === -1) return 0; // Neither package is in impactedPackages - if (indexA === -1) return 1; // Move releases with unknown impacted packages to the end - if (indexB === -1) return -1; // Same as above - - return indexA - indexB; // Sort based on index in impactedPackages - }); - - const output = { - include: sortedImpactedReleaseDefs, - }; - return output; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BatchingTopoSort.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BatchingTopoSort.ts deleted file mode 100644 index 88c61f847..000000000 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BatchingTopoSort.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AdjacentList } from './DependencyHelper'; - -export default class BatchingTopoSort { - public sort(dag: AdjacentList) { - try { - const indegrees = this.countInDegrees(dag); - let sorted = []; - let roots = this.getRoots(indegrees); - while (roots.length) { - sorted.push(roots); - let newRoots = []; - roots.forEach((root) => { - dag[root].forEach((dependents) => { - indegrees[dependents]--; - if (indegrees[dependents] == 0) newRoots.push(dependents); - }); - }); - - roots = newRoots; - } - - if (this.getNonRoots(indegrees).length) { - throw Error('Cycle(s) detected; toposort only works on acyclic graphs'); - } - - return sorted; - } catch (error) { - throw Error('Missing package in adjacency list or cycles detected' + error); - } - } - - private countInDegrees(dag: AdjacentList): DAGDegrees { - let counts: DAGDegrees = {}; - Object.entries(dag).forEach(([key, dependents]) => { - counts[key] = counts[key] || 0; - dependents.forEach((dependent) => { - counts[dependent] = counts[dependent] || 0; - counts[dependent]++; - }); - }); - return counts; - } - - private getRoots(counts: DAGDegrees) { - return Object.entries(counts) - .filter(([key, degree]) => { - if (degree == 0) return true; - }) - .map(([key, degree]) => key); - } - - private getNonRoots(counts: DAGDegrees) { - return Object.entries(counts) - .filter(([key, degree]) => { - if (degree != 0) return true; - }) - .map(([key, degree]) => key); - } -} - -type DAGDegrees = { - [key: string]: number; -}; diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts deleted file mode 100644 index 7d3e3b5dc..000000000 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildCollections.ts +++ /dev/null @@ -1,65 +0,0 @@ -import UndirectedGraph from './UndirectedGraph'; -import ProjectConfig from '../../core/project/ProjectConfig'; - -/** - * Class for the manipulation of package build collections - */ -export default class BuildCollections { - // Disconnected undirected graph is used to represent collections and their packages - private _graph: UndirectedGraph; - - constructor(projectDirectory: string) { - this.createGraphOfBuildCollections(projectDirectory); - } - - get graph(): UndirectedGraph { - return this._graph; - } - - /** - * Constructs graph representation of collections - * @param projectDirectory - */ - private createGraphOfBuildCollections(projectDirectory: string) { - this._graph = new UndirectedGraph(); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - for (let pkg of projectConfig.packageDirectories) { - if (pkg.buildCollection) { - if (pkg.buildCollection instanceof Array) { - if (!this._graph.adjacencyList[pkg.package]) this._graph.addVertex(pkg.package); - - pkg.buildCollection.forEach((packageInCollection) => { - // Create vertex for package in collection if it doesn't exist yet - if (!this._graph.adjacencyList[packageInCollection]) { - // Verify that the package in collection is a valid package, before adding to adj. list - if (projectConfig.packageDirectories.find((elem) => elem.package === packageInCollection)) { - this._graph.addVertex(packageInCollection); - } else - throw new Error( - `Package '${packageInCollection}' in collection ${pkg.buildCollection} is not a valid package` - ); - } - - this._graph.addEdge(pkg.package, packageInCollection); - }); - } else - throw new Error( - `Property 'buildCollection' must be of type Array. Received ${pkg.buildCollection}` - ); - } - } - } - - /** - * Returns list of packages contained in the same collection as the package - * @param pkg - */ - listPackagesInCollection(pkg: string): string[] { - return this._graph.dfs(pkg); - } - - isPackageInACollection(pkg: string): boolean { - return this._graph.adjacencyList[pkg] ? true : false; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts deleted file mode 100644 index 5bc6a3e82..000000000 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/BuildImpl.ts +++ /dev/null @@ -1,879 +0,0 @@ -import BatchingTopoSort from "./BatchingTopoSort"; -import DependencyHelper from "./DependencyHelper"; -import Bottleneck from "bottleneck"; -import PackageDiffImpl, { - PackageDiffOptions, -} from "../../core/package/diff/PackageDiffImpl"; -import { EOL } from "os"; -import SFPStatsSender from "../../core/stats/SFPStatsSender"; -import { Stage } from "../Stage"; -import * as fs from "fs-extra"; -import ProjectConfig from "../../core/project/ProjectConfig"; -import BuildCollections from "./BuildCollections"; -const Table = require("cli-table"); -import SFPLogger, { - COLOR_KEY_VALUE, - ConsoleLogger, - FileLogger, - LoggerLevel, - VoidLogger, -} from "@flxblio/sfp-logger"; -import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; -import { COLOR_HEADER } from "@flxblio/sfp-logger"; -import { COLOR_ERROR } from "@flxblio/sfp-logger"; -import SfpPackage, { - PackageType, -} from "../../core/package/SfpPackage"; -import SfpPackageBuilder from "../../core/package/SfpPackageBuilder"; -import getFormattedTime from "../../core/utils/GetFormattedTime"; -import { - COLON_MIDDLE_BORDER_TABLE, - ZERO_BORDER_TABLE, -} from "../../ui/TableConstants"; -import PackageDependencyResolver from "../../core/package/dependencies/PackageDependencyResolver"; -import SFPOrg from "../../core/org/SFPOrg"; -import Git from "../../core/git/Git"; -import TransitiveDependencyResolver from "../../core/package/dependencies/TransitiveDependencyResolver"; -import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; -import UserDefinedExternalDependency from "../../core/project/UserDefinedExternalDependency"; -import PackageDependencyDisplayer from "../../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; - -export interface BuildProps { - overridePackageTypes?: { [key: string]: PackageType }; - configFilePath?: string; - projectDirectory?: string; - devhubAlias?: string; - repourl?: string; - waitTime: number; - isQuickBuild: boolean; - isDiffCheckEnabled: boolean; - buildNumber: number; - executorcount: number; - isBuildAllAsSourcePackages: boolean; - branch?: string; - currentStage: Stage; - baseBranch?: string; - diffOptions?: PackageDiffOptions; - includeOnlyPackages?: string[]; -} -export default class BuildImpl { - private limiter: Bottleneck; - private parentsToBeFulfilled; - private childs; - private packagesToBeBuilt: string[]; - private packageCreationPromises: Array>; - private projectConfig; - private parents: any; - private packagesInQueue: string[]; - private packagesBuilt: string[]; - private failedPackages: string[]; - private generatedPackages: SfpPackage[]; - private sfpOrg: SFPOrg; - private scratchOrgDefinitions: { [key: string]: any }[]; - private isMultiConfigFilesEnabled: boolean; - - private repository_url: string; - private commit_id: string; - - private logger = new ConsoleLogger(); - private recursiveAll = (a) => - Promise.all(a).then((r) => - r.length == a.length ? r : this.recursiveAll(a), - ); - - public constructor(private props: BuildProps) { - this.limiter = new Bottleneck({ - maxConcurrent: this.props.executorcount, - }); - - this.packagesBuilt = []; - this.failedPackages = []; - this.generatedPackages = []; - this.packageCreationPromises = new Array(); - } - - public async exec(): Promise<{ - generatedPackages: SfpPackage[]; - failedPackages: string[]; - }> { - if (this.props.devhubAlias) - this.sfpOrg = await SFPOrg.create({ - aliasOrUsername: this.props.devhubAlias, - }); - - - let git = await Git.initiateRepo(new ConsoleLogger()); - this.repository_url = await git.getRemoteOriginUrl(this.props.repourl); - this.commit_id = await git.getHeadCommit(); - - this.packagesToBeBuilt = this.getPackagesToBeBuilt( - this.props.projectDirectory, - this.props.includeOnlyPackages, - ); - - // Read Manifest - this.projectConfig = ProjectConfig.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, - ); - 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 - SFPLogger.log(COLOR_KEY_MESSAGE("Packages scheduled for build")); - SFPLogger.log(table.toString()); - - //Fix transitive dependency gap - let groupDependencyResolutionLogs = new GroupConsoleLogs( - "Resolving dependencies", - this.logger, - ).begin(); - this.projectConfig = await this.resolvePackageDependencies( - this.projectConfig, - ); - groupDependencyResolutionLogs.end(); - - let buildPackagesLogs = new GroupConsoleLogs( - "Building Packages", - this.logger, - ).begin(); - - for await (const pkg of this.packagesToBeBuilt) { - let type = this.getPriorityandTypeOfAPackage( - this.projectConfig, - pkg, - ).type; - SFPStatsSender.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.getChildsOfAllPackages( - this.props.projectDirectory, - this.packagesToBeBuilt, - ); - - this.parents = DependencyHelper.getParentsOfAllPackages( - this.props.projectDirectory, - this.packagesToBeBuilt, - ); - - this.parentsToBeFulfilled = DependencyHelper.getParentsToBeFullFilled( - this.parents, - this.packagesToBeBuilt, - ); - - let sortedBatch = new BatchingTopoSort().sort(this.childs); - - if (!this.props.isQuickBuild && this.sfpOrg) { - const packageDependencyResolver = new PackageDependencyResolver( - 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: Promise = this.limiter - .schedule({ id: pkg, priority: priority }, () => - this.createPackage(type, pkg, this.props.isBuildAllAsSourcePackages), - ) - .then( - (sfpPackage: SfpPackage) => { - this.generatedPackages.push(sfpPackage); - SFPStatsSender.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: any) => 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, - }; - } - - private createDiffPackageScheduledDisplayedAsATable( - packagesToBeBuilt: Map, - ) { - let tableHead = ["Package", "Reason to be built", "Last Known Tag"]; - if ( - this.isMultiConfigFilesEnabled && - this.props.currentStage == Stage.BUILD - ) { - tableHead.push("Scratch Org Config File"); - } - let table = new Table({ - head: tableHead, - chars: 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.BUILD - ) { - item.push( - this.scratchOrgDefinitions[pkg] - ? this.scratchOrgDefinitions[pkg] - : this.props.configFilePath, - ); - } - - table.push(item); - } - return table; - } - - private createAllPackageScheduledDisplayedAsATable() { - let tableHead = ["Package", "Reason to be built"]; - if ( - this.isMultiConfigFilesEnabled && - this.props.currentStage == Stage.BUILD - ) { - tableHead.push("Scratch Org Config File"); - } - let table = new Table({ - head: tableHead, - chars: 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.BUILD - ) { - item.push( - this.scratchOrgDefinitions[pkg] - ? this.scratchOrgDefinitions[pkg] - : this.props.configFilePath, - ); - } - table.push(item); - } - return table; - } - - private async filterPackagesToBeBuiltByChanged( - projectDirectory: string, - allPackagesInRepo: any, - ) { - let packagesToBeBuilt = new Map(); - let buildCollections = new BuildCollections(projectDirectory); - if (this.props.diffOptions) - this.props.diffOptions.pathToReplacementForceIgnore = - this.getPathToForceIgnoreForCurrentStage( - this.projectConfig, - this.props.currentStage, - ); - - for await (const pkg of allPackagesInRepo) { - let diffImpl: PackageDiffImpl = new PackageDiffImpl( - new ConsoleLogger(), - pkg, - this.props.projectDirectory, - this.props.diffOptions, - ); - let packageDiffCheck = await diffImpl.exec(); - - if (packageDiffCheck.isToBeBuilt) { - packagesToBeBuilt.set(pkg, { - reason: 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; - } - - private getPackagesToBeBuilt( - projectDirectory: string, - includeOnlyPackages?: string[], - ): string[] { - let projectConfig = ProjectConfig.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 - 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 !== PackageType.Data - ); - }); - - for (const pkg of packageDescriptors) { - if (pkg.package && pkg.versionNumber) sfdxpackages.push(pkg["package"]); - } - return sfdxpackages; - - function printIncludeOnlyPackages() { - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Build will include the below packages as per inclusive filter`, - ), - LoggerLevel.TRACE, - ); - SFPLogger.log( - COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), - LoggerLevel.TRACE, - ); - } - } - - private printQueueDetails() { - SFPLogger.log( - `${EOL}Packages currently processed:{${this.packagesInQueue.length}} + ${this.packagesInQueue}`, - ); - SFPLogger.log( - `Awaiting Dependencies to be resolved:{${this.packagesToBeBuilt.length}} + ${this.packagesToBeBuilt}`, - ); - } - - private handlePackageError(reason: any, pkg: string): any { - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - SFPLogger.log(COLOR_ERROR(`Package Creation Failed for ${pkg}, Here are the details:`)); - try { - // Append error to log file - fs.appendFileSync(`.sfp/logs/${pkg}`, reason.message, "utf8"); - let data = fs.readFileSync(`.sfp/logs/${pkg}`, "utf8"); - - const pathToMarkDownFile = `.sfp/outputs/build-error-info.md`; - fs.mkdirpSync(".sfp/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); - - - SFPLogger.log(data); - } catch (e) { - SFPLogger.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.logCount("build.failed.packages", { package: pkg }); - this.packagesToBeBuilt = this.packagesToBeBuilt.filter((pkgBuild) => { - if (this.childs[pkg].includes(pkgBuild)) { - SFPStatsSender.logCount("build.failed.packages", { - package: pkgBuild, - }); - this.failedPackages.push(pkgBuild); - return false; - } - return true - }); - SFPLogger.log( - COLOR_KEY_MESSAGE(`${EOL}Removed all childs of ${pkg} from queue`), - ); - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - } - - private queueChildPackages(sfpPackage: SfpPackage): any { - 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: Promise = this.limiter - .schedule({ id: pkg, priority: priority }, () => - this.createPackage( - type, - pkg, - this.props.isBuildAllAsSourcePackages, - ), - ) - .then( - (sfpPackage: SfpPackage) => { - SFPStatsSender.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: any) => this.handlePackageError(reason, pkg), - ); - pushedPackages.push(pkg); - this.packagesInQueue.push(pkg); - this.packageCreationPromises.push(packagePromise); - } - }); - - if (pushedPackages.length > 0) { - SFPLogger.log( - COLOR_KEY_MESSAGE( - `${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, - ); - } - - private resolveDependenciesOnCompletedPackage( - dependentPackage: string, - completedPackage: SfpPackage, - ) { - const pkgDescriptor = ProjectConfig.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); - SFPLogger.log(`New branched package is created for dependency: ${packageName}, update the package version id`, LoggerLevel.INFO); - dependency.package = `${packageName}@${completedPackage.package_version_number}-${branch}`; - this.projectConfig.packageAliases[dependency.package] = completedPackage.package_version_id; - } - } else { - dependency.versionNumber = completedPackage.versionNumber; - } - - } - - private getPriorityandTypeOfAPackage(projectConfig: any, pkg: string) { - let priority = 0; - let childs = DependencyHelper.getChildsOfAllPackages( - this.props.projectDirectory, - this.packagesToBeBuilt, - ); - let type = ProjectConfig.getPackageType(projectConfig, pkg); - if (type === PackageType.Unlocked) { - if (childs[pkg].length > 0) - priority = PRIORITY_UNLOCKED_PKG_WITH_DEPENDENCY; - else priority = PRIORITY_UNLOCKED_PKG_WITHOUT_DEPENDENCY; - } else if (type === PackageType.Source) { - priority = PRIORITY_SOURCE_PKG; - } else if (type === PackageType.Data) { - priority = PRIORITY_DATA_PKG; - } else if (type === PackageType.Diff) { - priority = PRIORITY_SOURCE_PKG; - } else { - throw new Error(`Unknown package type ${type}`); - } - - return { priority, type }; - } - - private printPackageDetails(sfpPackage: SfpPackage) { - SFPLogger.log( - COLOR_HEADER( - `${EOL}${sfpPackage.packageName} package created in ${getFormattedTime( - sfpPackage.creation_details.creation_time, - )}`, - ), - ); - - SFPLogger.log(COLOR_HEADER(`-- Package Details:--`)); - const table = new Table({ - chars: COLON_MIDDLE_BORDER_TABLE, - style: { "padding-left": 2 }, - }); - table.push([ - COLOR_HEADER(`Package Type`), - COLOR_KEY_MESSAGE(sfpPackage.package_type), - ]); - table.push([ - COLOR_HEADER(`Package Version Number`), - COLOR_KEY_MESSAGE(sfpPackage.package_version_number), - ]); - - if (sfpPackage.package_type !== PackageType.Data) { - if (sfpPackage.package_type == PackageType.Unlocked) { - if (sfpPackage.package_version_id) - table.push([ - COLOR_HEADER(`Package Version Id`), - COLOR_KEY_MESSAGE(sfpPackage.package_version_id), - ]); - if (sfpPackage.test_coverage) - table.push([ - COLOR_HEADER(`Package Test Coverage`), - COLOR_KEY_MESSAGE(sfpPackage.test_coverage), - ]); - if (sfpPackage.has_passed_coverage_check) - table.push([ - COLOR_HEADER(`Package Coverage Check Passed`), - COLOR_KEY_MESSAGE(sfpPackage.has_passed_coverage_check), - ]); - } - - table.push([ - COLOR_HEADER(`Metadata Count`), - COLOR_KEY_MESSAGE(sfpPackage.metadataCount), - ]); - table.push([ - COLOR_HEADER(`Apex In Package`), - COLOR_KEY_MESSAGE(sfpPackage.isApexFound ? "Yes" : "No"), - ]); - table.push([ - COLOR_HEADER(`Profiles In Package`), - COLOR_KEY_MESSAGE(sfpPackage.isProfilesFound ? "Yes" : "No"), - ]); - - if (sfpPackage.packageType == PackageType.Diff) { - table.push([ - COLOR_HEADER(`Source Version From`), - COLOR_KEY_MESSAGE(sfpPackage.commitSHAFrom), - ]); - table.push([ - COLOR_HEADER(`Source Version To`), - COLOR_KEY_MESSAGE(sfpPackage.commitSHATo), - ]); - - table.push([ - COLOR_HEADER(`Invalidated Test Classes`), - COLOR_KEY_MESSAGE( - sfpPackage.apexTestClassses?.length, - ), - ]); - } - table.push([ - COLOR_HEADER(`Source Version`), - COLOR_KEY_MESSAGE(sfpPackage.sourceVersion), - ]); - - SFPLogger.log(table.toString()); - - const packageDependencies = this.projectConfig.packageDirectories.find( - (dir) => dir.package === sfpPackage.package_name, - ).dependencies; - if ( - packageDependencies && - Array.isArray(packageDependencies) && - packageDependencies.length > 0 - ) { - SFPLogger.log(COLOR_HEADER(` Resolved package dependencies:`)); - PackageDependencyDisplayer.printPackageDependencies( - packageDependencies, - this.projectConfig, - new ConsoleLogger(), - ); - } - } - } - - private async createPackage( - packageType: string, - sfdx_package: string, - isValidateMode: boolean, - ): Promise { - SFPLogger.log( - 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]; - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Matched scratch org definition file found for ${sfdx_package}: ${configFilePath}`, - ), - ); - } - } - - //Compute revision from and revision to - let revisionFrom: string; - let revisionTo: string; - - //let package itself create revisions - if (packageType == 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; - } - - - - - return SfpPackageBuilder.buildPackageFromProjectDirectory( - new FileLogger(`.sfp/logs/${sfdx_package}`), - this.props.projectDirectory, - sfdx_package, - { - overridePackageTypeWith: this.props.overridePackageTypes ? this.props.overridePackageTypes[sfdx_package] : undefined, - branch: this.props.branch, - sourceVersion: this.commit_id, - repositoryUrl: this.repository_url, - configFilePath: configFilePath, - pathToReplacementForceIgnore: this.getPathToForceIgnoreForCurrentStage( - this.projectConfig, - this.props.currentStage, - ), - revisionFrom: revisionFrom, - revisionTo: revisionTo - }, - { - devHub: this.props.devhubAlias, - 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 - */ - private getPathToForceIgnoreForCurrentStage( - projectConfig: any, - currentStage: Stage, - ): string { - let stageForceIgnorePath: string; - - let ignoreFiles: { [key in Stage]: string } = - 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; - } - - private getMultiScratchOrgDefinitionFileMap( - projectConfig: any, - ): { [key: string]: any }[] { - this.isMultiConfigFilesEnabled = - this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles; - let configFiles: { [key: string]: any }[]; - if (this.isMultiConfigFilesEnabled) { - configFiles = - this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths - ?.packages; - } - return configFiles; - } - - private async resolvePackageDependencies(projectConfig: any) { - let isDependencyResolverEnabled = - !projectConfig?.plugins?.sfp - ?.disableTransitiveDependencyResolver; - - if (isDependencyResolverEnabled) { - const transitiveDependencyResolver = new TransitiveDependencyResolver( - projectConfig, - this.logger, - ); - let resolvedDependencyMap = - await transitiveDependencyResolver.resolveTransitiveDependencies(); - projectConfig = await ProjectConfig.updateProjectConfigWithDependencies( - projectConfig, - resolvedDependencyMap, - ); - projectConfig = await new UserDefinedExternalDependency().cleanupEntries( - projectConfig, - ); - return projectConfig; - } else { - return projectConfig; - } - } - - private extractPackageVersionAndBranch(packageAlias: string): [string, string, string] { - 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 ['', '', '']; - } - -} diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts deleted file mode 100644 index 9e2164912..000000000 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/DependencyHelper.ts +++ /dev/null @@ -1,80 +0,0 @@ -import ProjectConfig from '../../core/project/ProjectConfig'; -export default class DependencyHelper { - static getParentsToBeFullFilled(packagesWithParents: AdjacentList, packages: string[]): any { - for (let [pkgName, parents] of Object.entries(packagesWithParents)) { - const fulfilledParents = parents.filter((pkg_name) => packages.includes(pkg_name)); - packagesWithParents[pkgName] = fulfilledParents; - } - - return packagesWithParents; - } - - public static getChildsOfAllPackages(projectDirectory: string, filterByPackages?: string[]): AdjacentList { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let dag: AdjacentList = {}; - - for (const sfdx_package of projectConfig['packageDirectories']) { - if (filterByPackages && !filterByPackages.includes(sfdx_package['package'])) { - continue; - } - let dependents: string[] = []; - - for (const pkg of projectConfig['packageDirectories']) { - if (pkg['dependencies'] != null) { - for (const dependent of pkg['dependencies']) { - if ( - dependent['package'] == sfdx_package['package'] && - filterByPackages && - filterByPackages.includes(pkg['package']) - ) { - dependents.push(pkg['package']); - } - } - } - } - dag[sfdx_package['package']] = dependents; - } - return dag; - } - - public static getParentsOfAllPackages(projectDirectory: string, filterByPackages?: string[]): AdjacentList { - let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory); - let dag: AdjacentList = {}; - - //Get The packages in the project directory - let packagesInTheProjectDirectoryOnlyByNames: string[] = []; - projectConfig['packageDirectories'].forEach((pkg) => { - packagesInTheProjectDirectoryOnlyByNames.push(pkg['package']); - }); - - for (const sfdx_package of projectConfig['packageDirectories']) { - if (filterByPackages && !filterByPackages.includes(sfdx_package['package'])) { - continue; - } - - let parents: string[] = []; - if (sfdx_package['dependencies'] != null) { - for (const dependent of sfdx_package['dependencies']) { - //See the dependents are a package in the project directory - if ( - packagesInTheProjectDirectoryOnlyByNames.includes(dependent['package']) && - !parents.includes(dependent['package']) && - filterByPackages && - filterByPackages.includes(dependent['package']) - ) - parents.push(dependent['package']); - } - } - dag[sfdx_package['package']] = parents; - } - - return dag; - } - - public static getParentsOfAPackage(packageList: AdjacentList, sfdx_package: string) { - return packageList[sfdx_package]; - } -} -export type AdjacentList = { - [key: string]: string[]; -}; diff --git a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts b/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts deleted file mode 100644 index 7d3e855fe..000000000 --- a/packages/sfpowerscripts-cli/src/impl/parallelBuilder/UndirectedGraph.ts +++ /dev/null @@ -1,49 +0,0 @@ -export default class UndirectedGraph { - private _adjacencyList: { [p: string]: string[] }; - - constructor() { - this._adjacencyList = {}; - } - - get adjacencyList() { - return this._adjacencyList; - } - - addVertex(name: string) { - if (!this._adjacencyList[name]) this._adjacencyList[name] = []; - else throw new Error(`Vertex with name '${name}' already exists`); - } - - addEdge(vertexA: string, vertexB: string): void { - if (vertexA === vertexB) throw new Error('Cannot add an edge to a single vertex'); - if (!this._adjacencyList[vertexA]) throw new Error(`Vertex with name ${vertexA} does not exist`); - if (!this._adjacencyList[vertexB]) throw new Error(`Vertex with name ${vertexB} does not exist`); - - if (!this._adjacencyList[vertexA].includes(vertexB)) this._adjacencyList[vertexA].push(vertexB); - if (!this._adjacencyList[vertexB].includes(vertexA)) this._adjacencyList[vertexB].push(vertexA); - } - - /** - * Returns vertices in graph, using depth-first search from the starting vertex - * @param start - */ - dfs(start: string): string[] { - const vertices: string[] = []; - const visited: { [p: string]: boolean } = {}; - const adjacencyList = this._adjacencyList; - - (function dfsHandler(vertex) { - if (!vertex) return null; - if (!adjacencyList[vertex]) throw new Error(`Vertex '${vertex}' does not exist`); - visited[vertex] = true; - vertices.push(vertex); - adjacencyList[vertex].forEach((neighbor) => { - if (!visited[neighbor]) { - return dfsHandler(neighbor); - } - }); - })(start); - - return vertices; - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts deleted file mode 100644 index 1087c6367..000000000 --- a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareImpl.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { Org } from '@salesforce/core'; -import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; -import isValidSfdxAuthUrl from '../../core/scratchorg/pool/prequisitecheck/IsValidSfdxAuthUrl'; -import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import ArtifactGenerator from '../../core/artifacts/generators/ArtifactGenerator'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import { Result } from 'neverthrow'; -import FetchAnArtifact from '../artifacts/FetchAnArtifact'; -import FetchArtifactSelector from '../artifacts/FetchArtifactSelector'; -import BuildImpl, { BuildProps } from '../parallelBuilder/BuildImpl'; -import PoolCreateImpl from '../../core/scratchorg/pool/PoolCreateImpl'; -import { PoolError } from '../../core/scratchorg/pool/PoolError'; -import { Stage } from '../Stage'; -import PrepareOrgJob from './PrepareOrgJob'; -import * as rimraf from 'rimraf'; -import * as fs from 'fs-extra'; -import Git from '../../core/git/Git'; -import GitTags from '../../core/git/GitTags'; -import OrgDetailsFetcher from '../../core/org/OrgDetailsFetcher'; -import SFPOrg from '../../core/org/SFPOrg'; -import { EOL } from 'os'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; -import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; -import ReleaseDefinitionGenerator from '../release/ReleaseDefinitionGenerator'; -import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; -import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import ReleaseConfig from '../release/ReleaseConfig'; -import { COLOR_KEY_VALUE } from '@flxblio/sfp-logger'; - -const Table = require('cli-table'); - -export default class PrepareImpl { - private artifactFetchedCount: number = 0; - - public constructor(private hubOrg: SFPOrg, private pool: PoolConfig, private logLevel: LoggerLevel) { - // set defaults - if (!this.pool.expiry) this.pool.expiry = 2; - - if (!this.pool.batchSize) this.pool.batchSize = 5; - - if (this.pool.succeedOnDeploymentErrors === undefined) this.pool.succeedOnDeploymentErrors = true; - - if (!this.pool.waitTime) this.pool.waitTime = 6; - - if (!this.pool.maxRetryCount) this.pool.maxRetryCount = 2; - } - - public async exec() { - SFPLogger.log(COLOR_KEY_MESSAGE('Validating Org Authentication Mechanism..'), LoggerLevel.INFO); - let orgDisplayResult = await new OrgDetailsFetcher(this.hubOrg.getUsername()).getOrgDetails(); - - if (!(orgDisplayResult.sfdxAuthUrl && isValidSfdxAuthUrl(orgDisplayResult.sfdxAuthUrl))) - throw new Error( - `Pools have to be created using a DevHub authenticated with auth:web or auth:store or auth:accesstoken:store` - ); - - return this.poolScratchOrgs(); - } - - private async poolScratchOrgs(): Promise> { - //Create Artifact Directory - rimraf.sync('artifacts'); - fs.mkdirpSync('artifacts'); - - let restrictedPackages = null; - let projectConfig = ProjectConfig.getSFDXProjectConfig(null); - - if (this.pool.releaseConfigFile) { - restrictedPackages = await getArtifactsByGeneratingReleaseDefinitionFromConfig(this.pool.releaseConfigFile); - projectConfig = ProjectConfig.cleanupPackagesFromProjectDirectory(null, restrictedPackages); - } - - if (this.pool.installAll) { - await this.getPackageArtifacts(restrictedPackages); - } - - let checkpointPackages = this.getcheckPointPackages(new ConsoleLogger(), projectConfig); - - let externalPackageResolver = new ExternalPackage2DependencyResolver( - this.hubOrg.getConnection(), - projectConfig, - this.pool.keys - ); - let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions(); - - //Display resolved dependencies - let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, new ConsoleLogger()); - externalDependencyDisplayer.display(); - - let prepareASingleOrgImpl: PrepareOrgJob = new PrepareOrgJob(this.pool, checkpointPackages, externalPackage2s); - - let createPool: PoolCreateImpl = new PoolCreateImpl( - this.hubOrg, - this.pool, - prepareASingleOrgImpl, - this.logLevel - ); - let pool = (await createPool.execute()) as Result; - - if (pool.isOk()) { - await this.displayPoolSummary(pool.value); - } - - return pool; - - async function getArtifactsByGeneratingReleaseDefinitionFromConfig(releaseConfigFile: string) { - let releaseDefinitionGenerator: ReleaseDefinitionGenerator = new ReleaseDefinitionGenerator( - new ConsoleLogger(), - 'HEAD', - releaseConfigFile, - 'prepare', - 'test', - undefined, - true, - false, - true - ); - let releaseDefinition = (await releaseDefinitionGenerator.exec()) as ReleaseDefinitionSchema; - return Object.keys(releaseDefinition.artifacts); - } - } - - //Fetch all checkpoints - private getcheckPointPackages(projectConfig: any, logger: Logger) { - SFPLogger.log('Fetching checkpoints for prepare if any.....', LoggerLevel.INFO, logger); - - let checkPointPackages = []; - - ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig).forEach((pkg) => { - if (pkg.checkpointForPrepare) checkPointPackages.push(pkg['package']); - }); - - return checkPointPackages; - } - - private async displayPoolSummary(pool: PoolConfig) { - let table = new Table({ - head: [ - 'Scratch Org Alias Id', - 'Scratch Org Username', - 'Installed/Requested Count', - 'Last Installed Package', - ], - chars: ZERO_BORDER_TABLE - }); - - for (const scratchOrg of pool.scratchOrgs) { - try { - let scratchOrgAsSFPOrg = await SFPOrg.create({ aliasOrUsername: scratchOrg.username }); - let installedArtifacts = await scratchOrgAsSFPOrg.getInstalledArtifacts(); - if (installedArtifacts && installedArtifacts.length >= 1) { - let installationCount = installedArtifacts.length; - let lastInstalledArifact = installedArtifacts[installedArtifacts.length - 1]; - table.push([ - scratchOrg.alias, - scratchOrg.username, - `${installationCount}/${this.artifactFetchedCount}`, - lastInstalledArifact.Name, - ]); - SFPStatsSender.logGauge(`so.packages.requested`, this.artifactFetchedCount, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - SFPStatsSender.logGauge(`so.packages.installed`, installationCount, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - } else { - table.push([scratchOrg.alias, scratchOrg.username, `NA`, `NA`]); - SFPStatsSender.logGauge(`so.packages.requested`, 0, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - SFPStatsSender.logGauge(`so.packages.installed`, 0, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - } - } catch (error) { - SFPStatsSender.logGauge(`so.packages.requested`, 0, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - SFPStatsSender.logGauge(`so.packages.installed`, 0, { - pool: this.pool.tag, - scratchOrg: scratchOrg.alias, - }); - table.push([scratchOrg.alias, scratchOrg.username, `Unable to compute`, `Unable to fetch`]); - } - } - - if (table.length >= 1) { - SFPLogger.log(EOL, LoggerLevel.INFO); - SFPLogger.log(COLOR_KEY_MESSAGE('Pool Summary:'), LoggerLevel.INFO); - SFPLogger.log(table.toString(), LoggerLevel.INFO); - } - } - - private async getPackageArtifacts(restrictedPackages?: string[]) { - //Filter Packages to be ignored from prepare to be fetched - let packages = ProjectConfig.getAllPackageDirectoriesFromDirectory(null).filter((pkg) => { - return isPkgToBeInstalled(pkg, restrictedPackages); - }); - - let artifactFetcher: FetchAnArtifact; - if (this.pool.fetchArtifacts) { - - let fetchArtifactsLogGroup = new GroupConsoleLogs(`Fetching Artifacts`); - fetchArtifactsLogGroup.begin(); - artifactFetcher = new FetchArtifactSelector( - this.pool.fetchArtifacts.artifactFetchScript, - this.pool.fetchArtifacts.npm?.scope, - this.pool.fetchArtifacts.npm?.npmrcPath - ).getArtifactFetcher(); - - const git: Git = await Git.initiateRepo(); - - //During Prepare, there could be a race condition where a main is merged with a new package - //but the package is not yet available in the validated package list and can cause prepare to fail - for (const pkg of packages) { - try { - let latestGitTagVersion: GitTags = new GitTags(git, pkg.package); - let version = await latestGitTagVersion.getVersionFromLatestTag(); - artifactFetcher.fetchArtifact(pkg.package, 'artifacts', version, true); - this.artifactFetchedCount++; - } catch (error) { - SFPLogger.log( - COLOR_WARNING(`Git Tag for ${pkg.package} missing, This might result in deployment failures`) - ); - } - } - fetchArtifactsLogGroup.end(); - } else { - let buildArtifactsLogGroup = new GroupConsoleLogs(`Building Artifacts`); - buildArtifactsLogGroup.begin(); - //Build All Artifacts - SFPLogger.log(`${EOL}`); - SFPLogger.printHeaderLine('WARNING!!!',COLOR_WARNING,LoggerLevel.INFO); - SFPLogger.log('Building packages, as script to fetch artifacts was not provided',LoggerLevel.WARN); - SFPLogger.log('This is not ideal, as the artifacts are built from the current head of the provided branch',LoggerLevel.WARN); - SFPLogger.log('Pools should be prepared with previously validated packages',LoggerLevel.WARN); - SFPLogger.printHeaderLine('',COLOR_WARNING,LoggerLevel.INFO); - - let buildProps: BuildProps = { - configFilePath: this.pool.configFilePath, - devhubAlias: this.hubOrg.getUsername(), - waitTime: 120, - isQuickBuild: true, - isDiffCheckEnabled: false, - buildNumber: 1, - executorcount: 10, - isBuildAllAsSourcePackages: this.pool.disableSourcePackageOverride?false:true, - branch: null, - currentStage: Stage.PREPARE, - }; - - buildProps = includeOnlyPackagesAsPerReleaseConfig(this.pool.releaseConfigFile, buildProps); - - let buildImpl = new BuildImpl(buildProps); - let { generatedPackages, failedPackages } = await buildImpl.exec(); - - if (failedPackages.length > 0) - throw new Error('Unable to build packages, Following packages failed to build' + failedPackages); - - for (let generatedPackage of generatedPackages) { - await ArtifactGenerator.generateArtifact(generatedPackage, process.cwd(), 'artifacts'); - this.artifactFetchedCount++; - } - buildArtifactsLogGroup.end(); - } - - function isPkgToBeInstalled(pkg, restrictedPackages?: string[]): boolean { - let ignoreOnStageFound = pkg.ignoreOnStage?.find((stage) => { - stage = stage.toLowerCase(); - if (stage === 'prepare') return true; - }); - - //if ignored .. skip - if (ignoreOnStageFound) return false; - - if (restrictedPackages) return restrictedPackages.includes(pkg.package); - else return true; - } - - - function includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { - if (releaseConfigFilePath) { - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); - buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); - printIncludeOnlyPackages(buildProps.includeOnlyPackages); - } - return buildProps; - - - function printIncludeOnlyPackages(includeOnlyPackages: string[]) { - SFPLogger.log( - COLOR_KEY_MESSAGE(`Build will include the below packages as per inclusive filter`), - LoggerLevel.INFO - ); - SFPLogger.log(COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), LoggerLevel.INFO); - } - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts b/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts deleted file mode 100644 index eae028d18..000000000 --- a/packages/sfpowerscripts-cli/src/impl/prepare/PrepareOrgJob.ts +++ /dev/null @@ -1,416 +0,0 @@ -import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../deploy/DeployImpl'; -import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; -import { Stage } from '../Stage'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import ScratchOrg from '../../core/scratchorg/ScratchOrg'; -import { Result, ok, err } from 'neverthrow'; -import PoolJobExecutor, { - JobError, - ScriptExecutionResult, -} from '../../core/scratchorg/pool/PoolJobExecutor'; -import { Connection, Org } from '@salesforce/core'; -import { PoolConfig } from '../../core/scratchorg/pool/PoolConfig'; -import VlocityPackUpdateSettings from '../../core/vlocitywrapper/VlocityPackUpdateSettings'; -import VlocityInitialInstall from '../../core/vlocitywrapper/VlocityInitialInstall'; -import ScriptExecutor from '../../core/scriptExecutor/ScriptExecutorHelpers'; -import DeploymentSettingsService from '../../core/deployers/DeploymentSettingsService'; -import PackageDetails from '../../core/package/Package2Detail'; -import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; -import SFPOrg from '../../core/org/SFPOrg'; -import { PreDeployHook } from '../deploy/PreDeployHook'; -import SfpPackage from '../../core/package/SfpPackage'; -import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; -import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import { FileLogger } from '@flxblio/sfp-logger'; -const fs = require('fs-extra'); - -const sfp_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; -export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployHook { - public constructor( - protected pool: PoolConfig, - private checkPointPackages: PackageDetails[], - private externalPackage2s?: PackageDetails[] - ) { - super(pool); - } - - async executeJob( - scratchOrg: ScratchOrg, - hubOrg: SFPOrg, - logToFilePath: string, - logLevel: LoggerLevel - ): Promise> { - try { - let scratchOrgAsSfPOrg = await SFPOrg.create({ aliasOrUsername: scratchOrg.username }); - let individualSODeploymentActivityLogger = new FileLogger(logToFilePath); - let packageCollectionInstaller = new InstallUnlockedPackageCollection( - scratchOrgAsSfPOrg, - individualSODeploymentActivityLogger - ); - - //Relax IP ranges on Scractch Org - await this.relaxIPRanges( - scratchOrgAsSfPOrg.getConnection(), - this.pool.relaxAllIPRanges, - this.pool.ipRangesToBeRelaxed, - individualSODeploymentActivityLogger - ); - - //Install sfp package - await this.installsfpArtifactPackage( - scratchOrg, - individualSODeploymentActivityLogger, - packageCollectionInstaller - ); - - //Execute pre installs script - await this.preInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger); - - //Install all external dependencies for non release config type - if (!this.pool.releaseConfigFile) - await this.installAllExternalPackageDependencies( - individualSODeploymentActivityLogger, - scratchOrgAsSfPOrg, - this.externalPackage2s - ); - - //Hook Velocity Deployment - await this.prepareVlocityDataPacks(scratchOrg, individualSODeploymentActivityLogger, logLevel); - - //Deploy All Packages - let deploymentStatus = await this.deployAllPackages( - scratchOrg, - hubOrg, - individualSODeploymentActivityLogger - ); - - //Execute Post Install Script - await this.postInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger, deploymentStatus); - - return ok({ scratchOrgUsername: scratchOrg.username }); - } catch (error) { - return err({ - message: error.message, - scratchOrgUsername: scratchOrg.username, - }); - } - } - - private async deployAllPackages(scratchOrg: ScratchOrg, hubOrg: Org, logger: FileLogger) { - let deploymentSucceed: string; - if (this.pool.installAll) { - let deploymentResult: DeploymentResult; - - let deploymentMode: DeploymentMode; - if (this.pool.enableSourceTracking || this.pool.enableSourceTracking === undefined) { - deploymentMode = DeploymentMode.SOURCEPACKAGES_PUSH; - } else { - deploymentMode = DeploymentMode.SOURCEPACKAGES; - } - - - if(this.pool.disableSourcePackageOverride) - { - deploymentMode = DeploymentMode.NORMAL - } - - deploymentResult = await this.invokeDeployImpl(scratchOrg, hubOrg, logger, deploymentMode); - - SFPStatsSender.logGauge('prepare.packages.scheduled', deploymentResult.scheduled, { - poolName: this.pool.tag, - }); - - SFPStatsSender.logGauge('prepare.packages.succeeded', deploymentResult.deployed.length, { - poolName: this.pool.tag, - }); - - SFPStatsSender.logGauge('prepare.packages.failed', deploymentResult.failed.length, { - poolName: this.pool.tag, - }); - - if (deploymentResult.failed.length > 0 || deploymentResult.error) { - this.pool.succeedOnDeploymentErrors - ? this.handleDeploymentErrorsForPartialDeployment(scratchOrg, deploymentResult, logger) - : this.handleDeploymentErrorsForFullDeployment(scratchOrg, deploymentResult, logger); - deploymentSucceed = 'failed'; - } - deploymentSucceed = 'succeed'; - } - return deploymentSucceed; - } - - private async installsfpArtifactPackage( - scratchOrg: ScratchOrg, - logger: Logger, - packageCollectionInstaller: InstallUnlockedPackageCollection - ) { - SFPLogger.log(`Installing sfp_artifact package to the ${scratchOrg.alias}`, null, logger); - - //Install sfp artifact package - await packageCollectionInstaller.install( - [ - { - name: 'sfp_artifact2', - subscriberPackageVersionId: process.env.sfp_ARTIFACT_PACKAGE - ? process.env.sfp_ARTIFACT_PACKAGE - : sfp_ARTIFACT_PACKAGE, - }, - ], - true - ); - - SFPLogger.log(`Suscessfully Installed sfp_artifact package to the ${scratchOrg.alias}`, null, logger); - } - - private async invokeDeployImpl( - scratchOrg: ScratchOrg, - hubOrg: Org, - logger: FileLogger, - deploymentMode: DeploymentMode - ) { - SFPLogger.log(`Deploying packages to ${scratchOrg.alias}`); - SFPLogger.log(`Deploying packages to ${scratchOrg.alias}`, LoggerLevel.INFO, logger); - - let deployProps: DeployProps = { - targetUsername: scratchOrg.username, - artifactDir: 'artifacts', - waitTime: 120, - currentStage: Stage.PREPARE, - logger: logger, - isTestsToBeTriggered: false, - skipIfPackageInstalled: true, - deploymentMode: deploymentMode, - isRetryOnFailure: this.pool.retryOnFailure, - devhubUserName: hubOrg.getUsername(), - }; - - //Deploy the fetched artifacts to the org - let deployImpl: DeployImpl = new DeployImpl(deployProps); - deployImpl.preDeployHook = this; - let deploymentResult = await deployImpl.exec(); - - return deploymentResult; - } - - //Install external dependencies before installing package - async preDeployPackage( - sfpPackage: SfpPackage, - targetUsername: string, - deployedPackages?:SfpPackage[], - devhubUserName?: string, - logger?: Logger - ): Promise<{ isToFailDeployment: boolean; message?: string }> { - //Install dependencies per package if release config is provided - if (this.pool.releaseConfigFile) { - let sfpOrg = await SFPOrg.create({ aliasOrUsername: targetUsername }); - let hubOrg = await SFPOrg.create({ aliasOrUsername: devhubUserName }); - await this.installExternalPackageDependenciesPerPackage(logger, sfpOrg, hubOrg, this.pool.keys, sfpPackage); - } - return { isToFailDeployment: false }; - } - - private async installAllExternalPackageDependencies( - logger: Logger, - scratchOrgAsSFPOrg: SFPOrg, - externalPackage2s: PackageDetails[] - ) { - SFPLogger.log( - `Installing all external package dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - logger - ); - let packageCollectionInstaller = new InstallUnlockedPackageCollection(scratchOrgAsSFPOrg, logger); - await packageCollectionInstaller.install(externalPackage2s, true, true); - - SFPLogger.log( - `Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - logger - ); - } - - private async installExternalPackageDependenciesPerPackage( - logger: Logger, - scratchOrgAsSFPOrg: SFPOrg, - hubOrg: SFPOrg, - keys: string, - sfpPackage: SfpPackage - ) { - //Resolve external package dependencies - let externalPackageResolver = new ExternalPackage2DependencyResolver( - hubOrg.getConnection(), - ProjectConfig.getSFDXProjectConfig(null), - keys - ); - let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions( - [sfpPackage?.packageName] - ); - - if (sfpPackage) { - SFPLogger.log( - `Installing package dependencies of this ${ - sfpPackage.packageName - } in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - logger - ); - //Display resolved dependenencies - let externalDependencyDisplayer = new ExternalDependencyDisplayer(externalPackage2s, logger); - externalDependencyDisplayer.display(); - } - - let packageCollectionInstaller = new InstallUnlockedPackageCollection(scratchOrgAsSFPOrg, logger); - await packageCollectionInstaller.install(externalPackage2s, true, true); - - if (sfpPackage) { - SFPLogger.log( - `Successfully completed external dependencies of this ${ - sfpPackage.packageName - } in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - logger - ); - } else { - SFPLogger.log( - `Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - logger - ); - } - } - - private handleDeploymentErrorsForFullDeployment( - scratchOrg: ScratchOrg, - deploymentResult: DeploymentResult, - logger: Logger - ) { - //Write to Scratch Org Logs - SFPLogger.log(`Following Packages failed to deploy in ${scratchOrg.alias}`, LoggerLevel.INFO, logger); - SFPLogger.log( - JSON.stringify(deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName)), - LoggerLevel.INFO, - logger - ); - SFPLogger.log( - `Deployment of packages failed in ${scratchOrg.alias}, this scratch org will be deleted`, - LoggerLevel.INFO, - logger - ); - throw new Error( - 'Following Packages failed to deploy:' + - deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName) - ); - } - - private handleDeploymentErrorsForPartialDeployment( - scratchOrg: ScratchOrg, - deploymentResult: DeploymentResult, - logger: Logger - ) { - if (this.checkPointPackages.length > 0) { - let isCheckPointSucceded = this.checkPointPackages.some((pkg) => - deploymentResult.deployed.map((packageInfo) => packageInfo.sfpPackage.packageName).includes(pkg.name) - ); - if (!isCheckPointSucceded) { - SFPStatsSender.logCount('prepare.org.checkpointfailed'); - SFPLogger.log( - `One or some of the check point packages failed to deploy, Deleting ${scratchOrg.alias}`, - LoggerLevel.INFO, - logger - ); - throw new Error(`One or some of the check point Packagesfailed to deploy`); - } - } else { - SFPStatsSender.logCount('prepare.org.partial'); - SFPLogger.log( - `Cancelling any further packages to be deployed, Adding the scratchorg ${scratchOrg.alias} to the pool`, - LoggerLevel.INFO, - logger - ); - } - } - - private async relaxIPRanges( - conn: Connection, - isRelaxAllIPRanges: boolean, - relaxIPRanges: string[], - logger: Logger - ): Promise { - if (isRelaxAllIPRanges || relaxIPRanges) { - if (isRelaxAllIPRanges) { - SFPLogger.log( - `Relaxing all IP ranges for scratchOrg with user ${conn.getUsername()}`, - LoggerLevel.INFO - ); - relaxIPRanges = []; - return new DeploymentSettingsService(conn).relaxAllIPRanges(logger); - } else { - SFPLogger.log(`Relaxing IP ranges for scratchOrg with user ${conn.getUsername()}`, LoggerLevel.INFO); - return new DeploymentSettingsService(conn).relaxAllIPRanges(logger, relaxIPRanges); - } - } - } - - //Prepare for vlocity - private async prepareVlocityDataPacks(scratchOrg: ScratchOrg, logger: Logger, logLevel: LoggerLevel) { - if (this.pool.enableVlocity) { - SFPLogger.log(COLOR_KEY_MESSAGE('Installing Vlocity Configurations..'), LoggerLevel.INFO, logger); - let vlocityPackSettingsUpdate: VlocityPackUpdateSettings = new VlocityPackUpdateSettings( - null, - scratchOrg.username, - logger, - logLevel - ); - await vlocityPackSettingsUpdate.exec(false); - - let vlocityInitialInstall: VlocityInitialInstall = new VlocityInitialInstall( - null, - scratchOrg.username, - logger, - logLevel - ); - await vlocityInitialInstall.exec(false); - SFPLogger.log( - COLOR_KEY_MESSAGE('Succesfully completed all vlocity config installation'), - LoggerLevel.INFO, - logger - ); - } - } - - //execute global pre install script - public async preInstallScript(scratchOrg: ScratchOrg, hubOrg: Org, logger: Logger) { - if (fs.existsSync(this.pool.preDependencyInstallationScriptPath)) { - SFPLogger.log( - `Executing pre script for ` + - scratchOrg.alias + - ', script path:' + - this.pool.preDependencyInstallationScriptPath, - LoggerLevel.INFO - ); - await ScriptExecutor.executeScript( - logger, - this.pool.preDependencyInstallationScriptPath, - scratchOrg.username, - hubOrg.getUsername() - ); - } - } - - public async postInstallScript(scratchOrg: ScratchOrg, hubOrg: Org, logger: Logger, deploymentStatus: string) { - if (fs.existsSync(this.pool.postDeploymentScriptPath)) { - SFPLogger.log( - `Executing post script for ` + scratchOrg.alias + ', script path:' + this.pool.postDeploymentScriptPath, - LoggerLevel.INFO - ); - await ScriptExecutor.executeScript( - logger, - this.pool.postDeploymentScriptPath, - scratchOrg.username, - hubOrg.getUsername(), - deploymentStatus - ); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts deleted file mode 100644 index dfa6f13cf..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseConfig.ts +++ /dev/null @@ -1,115 +0,0 @@ -import * as fs from 'fs-extra'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import Ajv, { _ } from 'ajv'; -import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; -import lodash = require('lodash'); -const yaml = require('js-yaml'); -import { Logger } from '@flxblio/sfp-logger'; -const path = require('path'); - -export default class ReleaseConfig { - private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; - - get releaseDefinitionGeneratorConfigSchema() { - // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); - } - - public constructor(private logger: Logger, pathToReleaseDefinition: string, private isExplicitDependencyCheckEnabled:boolean=false) { - this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); - this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); - - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && - this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts - ) { - throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); - } - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && - this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies - ) { - throw new Error( - 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' - ); - } - - // Workaround for jsonschema not supporting validation based on dependency value - if ( - this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && - !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled - ) - throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); - } - - public getPackagesAsPerReleaseConfig(directory?: string): string[] { - let packages: string[] = []; - let projectConfig = ProjectConfig.getSFDXProjectConfig(directory); - //Read sfdx project json - let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); - for (const sfdxPackage of sfdxPackages) { - if (this.getArtifactPredicate(sfdxPackage)) { - packages.push(sfdxPackage); - } - } - - if(packages.length>0) - { - for (const sfdxPackage of sfdxPackages) { - if (this.getPackageDependencyPredicate(sfdxPackage)) { - packages.push(sfdxPackage); - } - } - } - - - return packages; - } - - private validateReleaseDefinitionGeneratorConfig( - releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema - ): void { - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), - { encoding: 'UTF-8' } - ); - - let validator = new Ajv({ allErrors: true }).compile(schema); - let validationResult = validator(releaseDefinitionGeneratorSchema); - - if (!validationResult) { - let errorMsg: string = - `Release definition generation config does not meet schema requirements, ` + - `found ${validator.errors.length} validation errors:\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } - - private getArtifactPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { - return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); - } else if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { - return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); - } - else return true; - } - - private getPackageDependencyPredicate(artifact: string): boolean { - if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { - return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts deleted file mode 100644 index accfb708b..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinition.ts +++ /dev/null @@ -1,79 +0,0 @@ -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; -import Ajv from 'ajv'; -const yaml = require('js-yaml'); -import lodash = require('lodash'); -import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId'; -import Git from '../../core/git/Git'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -const fs = require('fs-extra'); -const path = require('path'); - -export default class ReleaseDefinition { - get releaseDefinition() { - // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionSchema); - } - private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) { - this.validateReleaseDefinition(this._releaseDefinitionSchema); - - // Workaround for jsonschema not supporting validation based on dependency value - if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled) - throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); - - if (this._releaseDefinitionSchema.packageDependencies) { - this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies); - } - } - - public static async loadReleaseDefinition(pathToReleaseDefinition: string) { - //Check whether path contains gitRef - let releaseDefinitionSchema: ReleaseDefinitionSchema; - try { - if (pathToReleaseDefinition.includes(':')) { - let git = await Git.initiateRepo(); - await git.fetch(); - let releaseFile = await git.show([pathToReleaseDefinition]); - releaseDefinitionSchema = yaml.load(releaseFile); - } else { - releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8')); - } - } catch (error) { - throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`); - } - - let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema); - return releaseDefinition; - } - - private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) { - for (let pkg in packageDependencies) { - packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]); - } - } - - private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void { - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'), - { encoding: 'UTF-8' } - ); - - let validator = new Ajv({ allErrors: true }).compile(schema); - let validationResult = validator(releaseDefinition); - - if (!validationResult) { - let errorMsg: string = - `Release definition does not meet schema requirements, ` + - `found ${validator.errors.length} validation errors:\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } -} diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts deleted file mode 100644 index 1b283240b..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { GitError } from 'simple-git'; -import * as fs from 'fs-extra'; -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import Ajv, { _ } from 'ajv'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger } from '@flxblio/sfp-logger'; -import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; -import lodash = require('lodash'); -import { LoggerLevel } from '@flxblio/sfp-logger'; -import Git from '../../core/git/Git'; -import GitTags from '../../core/git/GitTags'; -const retry = require('async-retry'); -const yaml = require('js-yaml'); -const path = require('path'); - -export default class ReleaseDefinitionGenerator { - private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; - - get releaseDefinitionGeneratorConfigSchema() { - // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); - } - - public constructor( - private logger: Logger, - private gitRef: string, - pathToReleaseDefinition: string, - private releaseName: string, - private branch: string, - private directory?: string, - private noPush: boolean = false, - private forcePush: boolean = false, - private inMemoryMode:boolean = false - ) { - this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); - this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); - - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && - this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts - ) { - throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); - } - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && - this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies - ) { - throw new Error( - 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' - ); - } - - // Workaround for jsonschema not supporting validation based on dependency value - if ( - this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && - !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled - ) - throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); - } - - async exec(): Promise { - return retry( - async (bail, retryNum) => { - try { - return await this.execHandler(); - } catch (err) { - if (err instanceof GitError) { - if (!err.message.includes('failed to push some refs')) { - // Do not retry for Git errors that are not related to push - bail(err); - } else { - SFPLogger.log('Failed to push definition', LoggerLevel.WARN, this.logger); - SFPLogger.log(`Retrying...(${retryNum})`, LoggerLevel.WARN, this.logger); - throw err; - } - } else { - // Do not retry for non-Git errors - bail(err); - } - } - }, - { - retries: 10, - minTimeout: 5, - randomize: true, - } - ); - } - - private async execHandler(): Promise { - let repoDir: string; - let git; - try { - SFPLogger.log(`Processing Artifacts from reference.. ${this.gitRef}`, LoggerLevel.INFO, this.logger); - git = await Git.initiateRepoAtTempLocation(this.logger); - repoDir = git.getRepositoryPath(); - let fetchedArtifacts = await this.fetchFromGitRef(git); - - let releaseDefiniton = await this.generateReleaseDefintion( - fetchedArtifacts.artifacts, - fetchedArtifacts.packageDependencies, - git - ); - return releaseDefiniton; - } catch (error) { - SFPLogger.log(error, LoggerLevel.ERROR, this.logger); - } finally { - git.deleteTempoRepoIfAny(); - } - } - - private async fetchFromGitRef(git: Git) { - let artifacts = {}; - let packageDependencies = {}; - //Create A copy of repository to a particular commit - //If already a duplicate directory switch to the passed git ref - //then switch it back - let headCommit = await git.getCurrentCommitId(); - await git.checkout(this.gitRef, true); - - let projectConfig = ProjectConfig.getSFDXProjectConfig(git.getRepositoryPath()); - //Read sfdx project json - let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); - for (const sfdxPackage of sfdxPackages) { - let latestGitTagVersion = new GitTags(git, sfdxPackage); - try { - let version = await latestGitTagVersion.getVersionFromLatestTag(); - - if (this.getArtifactPredicate(sfdxPackage)) { - artifacts[sfdxPackage] = version; - } - } catch (error) { - SFPLogger.log( - `Unable to capture version of ${sfdxPackage} due to ${error}`, - LoggerLevel.WARN, - this.logger - ); - } - } - - if (!this.releaseDefinitionGeneratorConfigSchema.excludeAllPackageDependencies) { - let allExternalPackages = ProjectConfig.getAllExternalPackages(projectConfig); - for (const externalPackage of allExternalPackages) { - if ( - this.getDependencyPredicate(externalPackage.alias) && - externalPackage.Package2IdOrSubscriberPackageVersionId.startsWith('04t') - ) { - packageDependencies[externalPackage.alias] = externalPackage.Package2IdOrSubscriberPackageVersionId; - } - } - } - - return { artifacts, packageDependencies }; - } - - private async generateReleaseDefintion(artifacts: any, packageDependencies: any, git: Git): Promise { - artifacts = Object.keys(artifacts) - .sort() - .reduce((obj, key) => { - obj[key] = artifacts[key]; - return obj; - }, {}); - - packageDependencies = Object.keys(packageDependencies) - .sort() - .reduce((obj, key) => { - obj[key] = packageDependencies[key]; - return obj; - }, {}); - - let releaseDefinition: ReleaseDefinitionSchema = { - release: this.releaseName, - skipIfAlreadyInstalled: true, - skipArtifactUpdate:false, - artifacts: artifacts, - }; - - //Add package dependencies - if (Object.keys(packageDependencies).length > 0) releaseDefinition.packageDependencies = packageDependencies; - - //add promotePackagesBeforeDeploymentToOrg - releaseDefinition.promotePackagesBeforeDeploymentToOrg = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.promotePackagesBeforeDeploymentToOrg; - - //override skip if already installed - if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled) - releaseDefinition.skipIfAlreadyInstalled = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled; - - //override skip artifact update - if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate) - releaseDefinition.skipArtifactUpdate = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate; - - //Add changelog info - releaseDefinition.changelog = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.changelog; - - if(this.inMemoryMode) - return releaseDefinition; - - let releaseDefinitonYAML = yaml.dump(releaseDefinition, { - styles: { - '!!null': 'canonical', // dump null as ~ - }, - sortKeys: false, // sort object keys - }); - - SFPLogger.log(COLOR_HEADER(`------------Generated Release Definition for ${this.releaseName}----------------`)); - SFPLogger.log(``); - SFPLogger.log(COLOR_KEY_MESSAGE(releaseDefinitonYAML)); - - let pathToReleaseDefnDirectory = this.createDirectory(this.directory, git.getRepositoryPath()); - fs.writeFileSync(path.join(pathToReleaseDefnDirectory, `${this.releaseName}.yml`), releaseDefinitonYAML); - if (this.branch) { - SFPLogger.log(`Checking out branch ${this.branch}`); - await git.createBranch(this.branch); - await git.commitFile([path.join(pathToReleaseDefnDirectory, `${this.releaseName}.yml`)]); - if (!this.noPush) await git.pushToRemote(this.branch, this.forcePush); - } - - return { releaseDefinitonYAML, pathToReleaseDefnDirectory }; - } - - private createDirectory(directory: string, repoDir: string): string { - if (this.directory) { - if (!fs.pathExistsSync(path.join(repoDir, directory))) { - fs.mkdirpSync(path.join(repoDir, directory)); - } - repoDir = path.join(repoDir, this.directory); - } - return repoDir; - } - - private validateReleaseDefinitionGeneratorConfig( - releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema - ): void { - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), - { encoding: 'UTF-8' } - ); - - let validator = new Ajv({ allErrors: true }).compile(schema); - let validationResult = validator(releaseDefinitionGeneratorSchema); - - if (!validationResult) { - let errorMsg: string = - `Release definition generation config does not meet schema requirements, ` + - `found ${validator.errors.length} validation errors:\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } - - private getArtifactPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { - return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); - } else return true; - } - - private getDependencyPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies) { - return !this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies?.includes(artifact); - } else return true; - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts deleted file mode 100644 index 05d3d8ab9..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default interface ReleaseDefinitionGeneratorSchema { - includeOnlyArtifacts?: string[]; - excludeArtifacts?: string[]; - excludeArtifactsWithTag?: string[]; - excludeAllPackageDependencies?:boolean; - excludePackageDependencies?: string[]; - includeOnlyPackageDependencies?: string[]; - releasedefinitionProperties?: { - skipIfAlreadyInstalled: boolean; - skipArtifactUpdate:boolean; - baselineOrg?: string; - promotePackagesBeforeDeploymentToOrg?: string; - changelog?: { - repoUrl?: string; - workItemFilters?: string[]; - workItemUrl?: string; - limit?: number; - showAllArtifacts?: boolean; - }; - }; -} diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionSchema.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionSchema.ts deleted file mode 100644 index b8f221291..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionSchema.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default interface ReleaseDefinitionSchema { - release: string; - skipIfAlreadyInstalled: boolean; - skipArtifactUpdate:boolean; - baselineOrg?: string; - artifacts: { - [p: string]: string; - }; - packageDependencies?: { - [p: string]: string; - }; - promotePackagesBeforeDeploymentToOrg?: string; - changelog?: { - repoUrl?: string; - workItemFilter?:string; - workItemFilters?: string[]; - workItemUrl?: string; - limit?: number; - showAllArtifacts?: boolean; - }; -} diff --git a/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts b/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts deleted file mode 100644 index c2d7c7fd5..000000000 --- a/packages/sfpowerscripts-cli/src/impl/release/ReleaseImpl.ts +++ /dev/null @@ -1,358 +0,0 @@ -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; -import DeployImpl, { DeployProps, DeploymentMode, DeploymentResult } from '../deploy/DeployImpl'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { Stage } from '../Stage'; -import ReleaseError from '../../errors/ReleaseError'; -import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; -import SFPStatsSender from '../../core/stats/SFPStatsSender'; -import { Release } from '../changelog/ReleaseChangelog'; -import SFPOrg from '../../core/org/SFPOrg'; -import path = require('path'); -import { EOL } from 'os'; -import Package2Detail from '../../core/package/Package2Detail'; -import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; -import FetchImpl from '../artifacts/FetchImpl'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; - -export interface ReleaseProps { - releaseDefinitions: ReleaseDefinitionSchema[]; - targetOrg: string; - fetchArtifactScript: string; - isNpm: boolean; - scope: string; - npmrcPath: string; - logsGroupSymbol: string[]; - tags: any; - isDryRun: boolean; - waitTime: number; - keys: string; - isGenerateChangelog: boolean; - devhubUserName: string; - branch: string; - directory: string; -} - -export default class ReleaseImpl { - constructor(private props: ReleaseProps, private logger?: Logger) {} - - public async exec(): Promise { - let groupSection = new GroupConsoleLogs('Fetching artifacts').begin(); - let fetchImpl: FetchImpl = new FetchImpl( - 'artifacts', - this.props.fetchArtifactScript, - this.props.scope, - this.props.npmrcPath, - this.logger - ); - await fetchImpl.fetchArtifacts(this.props.releaseDefinitions); - groupSection.end(); - - let installDependenciesResult: InstallDependenciesResult; - installDependenciesResult = await this.installPackageDependencies( - this.props.releaseDefinitions, - this.props.targetOrg, - this.props.keys, - this.props.waitTime - ); - - let deploymentResults = await this.deployArtifacts(this.props.releaseDefinitions); - - //Get all suceeded deploys - let succeededDeploymentResults = []; - let failedDeploymentResults = []; - for (const deploymentResult of deploymentResults) { - if (deploymentResult.result.failed.length === 0) succeededDeploymentResults.push(deploymentResult); - else failedDeploymentResults.push(deploymentResult); - } - - //Compute Changelog - - //There is atleast one succeeded result, so changelog is required - if (succeededDeploymentResults.length > 0) { - //ReleaseName combines all the release together .. even if failed - //Combine all release defns to create release attributes - let releaseName: string = ''; - let workitemFilters = []; - let limit = 30; - let workItemUrl: string; - let showAllArtifacts: boolean = false; - for (const releaseDefinition of this.props.releaseDefinitions) { - releaseName = releaseName.concat(releaseDefinition.release, '-'); - if (releaseDefinition.changelog) { - if(releaseDefinition.changelog.workItemFilters) { - workitemFilters.push(...releaseDefinition.changelog?.workItemFilters); - } - if (releaseDefinition.changelog.limit > limit) limit = releaseDefinition.changelog.limit; - workItemUrl = releaseDefinition.changelog.workItemUrl; - showAllArtifacts = releaseDefinition.changelog.showAllArtifacts; - } - } - //Remove the last '-' from the name - releaseName = releaseName.slice(0, -1); - if (this.props.isGenerateChangelog) { - let groupSection = new GroupConsoleLogs('Release changelog').begin(); - try { - let changelogImpl: ChangelogImpl = new ChangelogImpl( - this.logger, - 'artifacts', - releaseName, - workitemFilters, - limit, - workItemUrl, - showAllArtifacts, - this.props.directory, - false, - this.props.branch, - false, - this.props.isDryRun, - this.props.targetOrg - ); - - let releaseChangelog = await changelogImpl.exec(); - - const aggregatedNumberOfWorkItemsInRelease = this.getAggregatedNumberOfWorkItemsInRelease( - releaseName, - releaseChangelog.releases - ); - - SFPStatsSender.logGauge('release.workitems', aggregatedNumberOfWorkItemsInRelease, { - releaseName: releaseName, - }); - - const aggregatedNumberOfCommitsInRelease = this.getAggregatedNumberOfCommitsInRelease( - releaseName, - releaseChangelog.releases - ); - - SFPStatsSender.logGauge('release.commits', aggregatedNumberOfCommitsInRelease, { - releaseName: releaseName, - }); - } catch (error) { - SFPLogger.log(`Unable to push changelog`, LoggerLevel.WARN, this.logger); - } - - groupSection.end(); - } - } - - if (failedDeploymentResults.length > 0) { - throw new ReleaseError('Release failed', { - succeededDeployments: succeededDeploymentResults, - failedDeployments: failedDeploymentResults, - installDependenciesResult: installDependenciesResult, - }); - } - - return { - succeededDeployments: succeededDeploymentResults, - failedDeployments: failedDeploymentResults, - installDependenciesResult: installDependenciesResult, - }; - } - - /** - * - * @param releases - * @returns aggregated number of work items in a release - */ - private getAggregatedNumberOfWorkItemsInRelease(releaseName: string, releases: Release[]) { - let aggregatedNumberOfWorkItemsInRelease: number = 0; - releases.forEach((release) => { - if (release.names?.includes(releaseName)) { - aggregatedNumberOfWorkItemsInRelease += this.getNumberOfWorkItems(release); - } - }); - return aggregatedNumberOfWorkItemsInRelease; - } - - /** - * - * @param releases - * @returns aggregated number of commits in a release - */ - private getAggregatedNumberOfCommitsInRelease(releaseName: string, releases: Release[]) { - let aggregatedNumberOfCommitsInRelease: number = 0; - releases.forEach((release) => { - if (release.names?.includes(releaseName)) { - aggregatedNumberOfCommitsInRelease += this.getNumberOfCommits(release); - } - }); - return aggregatedNumberOfCommitsInRelease; - } - - private getNumberOfWorkItems(release: Release) { - return Object.keys(release.workItems).length; - } - - private getNumberOfCommits(release: Release) { - let numberOfCommits: number = 0; - - release.artifacts.forEach((artifact) => { - numberOfCommits += artifact.commits.length; - }); - - return numberOfCommits; - } - - private async deployArtifacts( - releaseDefinitions: ReleaseDefinitionSchema[] - ): Promise<{ releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]> { - let deploymentResults: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[] = []; - for (const releaseDefinition of releaseDefinitions) { - let groupSection = new GroupConsoleLogs(`Release ${releaseDefinition.release}`).begin(); - SFPLogger.log(EOL); - - this.displayReleaseInfo(releaseDefinition, this.props); - - //Each release will be downloaded to specific subfolder inside the provided artifact directory - //As each release is a collection of artifacts - let revisedArtifactDirectory = path.join( - 'artifacts', - releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') - ); - let deployProps: DeployProps = { - targetUsername: this.props.targetOrg, - artifactDir: revisedArtifactDirectory, - waitTime: this.props.waitTime, - tags: this.props.tags, - isTestsToBeTriggered: false, - deploymentMode: DeploymentMode.NORMAL, - skipIfPackageInstalled: releaseDefinition.skipIfAlreadyInstalled, - logsGroupSymbol: this.props.logsGroupSymbol, - currentStage: Stage.DEPLOY, - baselineOrg: releaseDefinition.baselineOrg, - isDryRun: this.props.isDryRun, - disableArtifactCommit: releaseDefinition.skipArtifactUpdate?releaseDefinition.skipArtifactUpdate:false, - promotePackagesBeforeDeploymentToOrg: releaseDefinition.promotePackagesBeforeDeploymentToOrg, - devhubUserName: this.props.devhubUserName, - }; - - let deployImpl: DeployImpl = new DeployImpl(deployProps); - - let deploymentResult = await deployImpl.exec(); - deploymentResults.push({ releaseDefinition: releaseDefinition, result: deploymentResult }); - groupSection.end(); - //Don't continue deployments if a release breaks in between - if (deploymentResult.failed.length > 0) break; - } - - return deploymentResults; - } - - private async installPackageDependencies( - releaseDefinitions: ReleaseDefinitionSchema[], - targetOrg: string, - keys: string, - waitTime: number - ): Promise { - let result: InstallDependenciesResult = { - success: [], - skipped: [], - failed: [], - }; - - let packageDependencies: { [p: string]: string } = {}; - - releaseDefinitions.forEach((releaseDefinition) => { - if (releaseDefinition.packageDependencies) { - packageDependencies = Object.assign(packageDependencies, releaseDefinition.packageDependencies); - } - }); - - let groupSection = new GroupConsoleLogs('Installing package dependencies').begin(); - - try { - let packagesToKeys: { [p: string]: string }; - if (keys) { - packagesToKeys = this.parseKeys(keys); - } - let externalPackage2s: Package2Detail[] = []; - // print packages dependencies to install - for (let pkg in packageDependencies) { - let dependendentPackage: Package2Detail = { name: pkg }; - if (packageDependencies[pkg].startsWith('04t')) - dependendentPackage.subscriberPackageVersionId = packageDependencies[pkg]; - - if (packagesToKeys?.[pkg]) { - dependendentPackage.key = packagesToKeys[pkg]; - } - externalPackage2s.push(dependendentPackage); - } - let sfpOrg = await SFPOrg.create({ aliasOrUsername: targetOrg }); - let packageCollectionInstaller = new InstallUnlockedPackageCollection(sfpOrg, new ConsoleLogger(),this.props.isDryRun); - await packageCollectionInstaller.install(externalPackage2s, true, true); - - groupSection.end(); - return result; - } catch (err) { - console.log(err.message); - - throw new ReleaseError( - 'Failed to install package dependencies', - { installDependenciesResult: result, succeededDeployments: [], failedDeployments: [] }, - err - ); - } - } - - /** - * Parse keys in string format "packageA:key packageB:key packageC:key" - * Returns map of packages to keys - * @param keys - */ - private parseKeys(keys: string) { - let output: { [p: string]: string } = {}; - - keys = keys.trim(); - let listOfKeys = keys.split(' '); - - for (let key of listOfKeys) { - let packageKeyPair = key.split(':'); - if (packageKeyPair.length === 2) { - output[packageKeyPair[0]] = packageKeyPair[1]; - } else { - // Format is incorrect, throw an error - throw new Error(`Error parsing keys, format should be: "packageA:key packageB:key packageC:key"`); - } - } - - return output; - } - - private displayReleaseInfo(releaseDefinition: ReleaseDefinitionSchema, props: ReleaseProps) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - - SFPLogger.log(COLOR_KEY_MESSAGE(`Release: ${releaseDefinition.release}`)); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Skip Packages If Already Installed: ${releaseDefinition.skipIfAlreadyInstalled ? true : false}` - ) - ); - - SFPLogger.log(COLOR_KEY_MESSAGE(`Dry-run: ${props.isDryRun}`)); - - if (releaseDefinition.baselineOrg) - SFPLogger.log(COLOR_KEY_MESSAGE(`Baselined Against Org: ${releaseDefinition.baselineOrg}`)); - - if ( - releaseDefinition.promotePackagesBeforeDeploymentToOrg && - releaseDefinition.promotePackagesBeforeDeploymentToOrg == props.targetOrg - ) - SFPLogger.log(COLOR_KEY_MESSAGE(`Promte Packages Before Deployment Activated?: true`)); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } -} - -interface InstallDependenciesResult { - success: [string, string][]; - skipped: [string, string][]; - failed: [string, string][]; -} - -export interface ReleaseResult { - succeededDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; - failedDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; - installDependenciesResult: InstallDependenciesResult; -} diff --git a/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts b/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts deleted file mode 100644 index d12cf51fa..000000000 --- a/packages/sfpowerscripts-cli/src/impl/repo/AlignImpl.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Logger } from "@flxblio/sfp-logger"; - -export interface AlignRepoProps { - artifactDirectory: string; - workingDirectory?:string -} - -export class AlignImpl { - constructor(private props: AlignRepoProps, private logger?: Logger) { - - } - - async align() - { - //Convert to SFPPacakge - - } - - -} diff --git a/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts b/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts deleted file mode 100644 index 09170a45a..000000000 --- a/packages/sfpowerscripts-cli/src/impl/validate/Analyzer.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ChangedComponentsFetcher from "../../core/dependency/ChangedComponentsFetcher"; -import Component from "../../core/dependency/Component"; - - -export class Analyzer { - - - - private static changedComponents: Component[]; - - public constructor(protected baseBranch: string) { } - - - /** - * - * @returns array of components that have changed, can be empty - */ - protected async getChangedComponents(): Promise { - if (Analyzer.changedComponents) return Analyzer.changedComponents; - else return new ChangedComponentsFetcher(this.baseBranch).fetch(); - } -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts b/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts deleted file mode 100644 index 1b4e650a6..000000000 --- a/packages/sfpowerscripts-cli/src/impl/validate/ApexTestValidator.ts +++ /dev/null @@ -1,203 +0,0 @@ -import SFPLogger, { COLOR_HEADER, Logger } from "@flxblio/sfp-logger"; -import { CoverageOptions } from "../../core/apex/coverage/IndividualClassCoverage"; -import { TestOptions, RunAllTestsInPackageOptions, RunSpecifiedTestsOption } from "../../core/apextest/TestOptions"; -import TriggerApexTests from "../../core/apextest/TriggerApexTests"; -import SfpPackage, { PackageType } from "../../core/package/SfpPackage"; -import { LoggerLevel } from "@salesforce/core"; -import { ValidationMode } from "./ValidateImpl"; - -export interface ApexTestValidatorOptions -{ - coverageThreshold?:number; - validationMode:ValidationMode; - disableParallelTestExecution?:boolean -} - -export class ApexTestValidator { - - constructor( - private targetUsername: string, - private sfpPackage: SfpPackage, - private props:ApexTestValidatorOptions, - private logger: Logger - ) { } - - - public async validateApexTests( - ): Promise<{ - id: string; - result: boolean; - message: string; - }> { - if (this.sfpPackage.packageDescriptor.skipTesting) - return { id: null, result: true, message: "No Tests To Run" }; - - if (!this.sfpPackage.isApexFound) - return { id: null, result: true, message: "No Tests To Run" }; - - if (this.sfpPackage.packageDescriptor.isOptimizedDeployment == false) - return { - id: null, - result: true, - message: "Tests would have already run", - }; - - let testProps; - - if (this.sfpPackage.packageType == PackageType.Diff) { - testProps = this.getTestOptionsForDiffPackage(this.sfpPackage, this.props); - } else if (this.props.validationMode == ValidationMode.FAST_FEEDBACK || - this.props.validationMode == - ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG) { - testProps = this.getTestOptionsForFastFeedBackPackage( - this.sfpPackage, - this.props); - - } - else - testProps = this.getTestOptionsForFullPackageTest( - this.sfpPackage, - this.props); - - let testOptions: TestOptions = testProps.testOptions; - let testCoverageOptions: CoverageOptions = testProps.testCoverageOptions; - - - if (testProps.testOptions == undefined) { - return { id: null, result: true, message: "No Tests To Run" }; - } - - if (testOptions == undefined) { - return { id: null, result: true, message: "No Tests To Run" }; - } - - //override any behaviour if the override is from the deploy this.props - if (this.props.disableParallelTestExecution) testOptions.synchronous = true; - if (this.sfpPackage.packageType == PackageType.Diff) testOptions.synchronous = true; - this.displayTestHeader(this.sfpPackage); - - const triggerApexTests: TriggerApexTests = new TriggerApexTests( - this.targetUsername, - testOptions, - testCoverageOptions, - null, - this.logger, - ); - - return triggerApexTests.exec(); - } - - private getTestOptionsForFullPackageTest( - sfpPackage: SfpPackage, - props: ApexTestValidatorOptions, - ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { - - - const testOptions = new RunAllTestsInPackageOptions( - this.sfpPackage, - 60, - ".testresults", - ); - const testCoverageOptions = { - isIndividualClassCoverageToBeValidated: false, - isPackageCoverageToBeValidated: - !this.sfpPackage.packageDescriptor.skipCoverageValidation, - coverageThreshold: this.props.coverageThreshold || 75, - }; - return { testOptions, testCoverageOptions }; - } - - private getTestOptionsForDiffPackage( - sfpPackage: SfpPackage, - props: ApexTestValidatorOptions, - ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { - - //No impacted test class available - if (!this.sfpPackage.apexTestClassses || this.sfpPackage.apexTestClassses.length == 0) { - SFPLogger.log( - `${COLOR_HEADER( - "Unable to find any impacted test classses,skipping tests, You might need to use thorough option", - )}`, - ); - return { testOptions: undefined, testCoverageOptions: undefined }; - } - - let isImpactedApexClassAvailable:boolean = true; - //Unable to find impacted apex class in the diff package - if(!this.sfpPackage.apexClassWithOutTestClasses || this.sfpPackage.apexClassWithOutTestClasses.length==0) - { - isImpactedApexClassAvailable = false; - SFPLogger.log( - `${COLOR_HEADER( - "Unable to find any impacted classses in the diff package,skipping tests, Ignoring coverage validation", - )}`); - } - - SFPLogger.log( - `${COLOR_HEADER( - "Diff package detected: triggering impacted test classes", - )}`, - ); - - const testOptions = new RunSpecifiedTestsOption( - 60, - ".testResults", - this.sfpPackage.apexTestClassses.join(), - true, - ); - const testCoverageOptions = { - isIndividualClassCoverageToBeValidated: isImpactedApexClassAvailable?true:false, - isPackageCoverageToBeValidated: false, - coverageThreshold: this.props.coverageThreshold || 75, - classesToBeValidated: this.sfpPackage.apexClassWithOutTestClasses - }; - return { testOptions, testCoverageOptions }; - } - - //TODO: Need to fix test options for earlier behaviour for fast feedback - private getTestOptionsForFastFeedBackPackage( - sfpPackage: SfpPackage, - props: ApexTestValidatorOptions, - ): { testOptions: TestOptions; testCoverageOptions: CoverageOptions } { - - //No impacted test class available - if (!this.sfpPackage.apexTestClassses || this.sfpPackage.apexTestClassses.length == 0) { - SFPLogger.log( - `${COLOR_HEADER( - "Unable to find any impacted test classses,skipping tests, You might need to use thorough option", - )}`, - ); - return { testOptions: undefined, testCoverageOptions: undefined }; - } - - SFPLogger.log( - `${COLOR_HEADER( - "Diff mode activated, Only impacted test class will be triggered", - )}`, - ); - - const testOptions = new RunSpecifiedTestsOption( - 60, - ".testResults", - this.sfpPackage.apexTestClassses.join(), - true, - ); - const testCoverageOptions = { - isIndividualClassCoverageToBeValidated: false, - isPackageCoverageToBeValidated: false, - coverageThreshold: 0 - }; - return { testOptions, testCoverageOptions }; - } - - - private displayTestHeader(sfpPackage: SfpPackage) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - `Triggering Apex tests for ${this.sfpPackage.packageName}`, - LoggerLevel.INFO, - ); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts b/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts deleted file mode 100644 index ff804e593..000000000 --- a/packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts +++ /dev/null @@ -1,744 +0,0 @@ -import BuildImpl, { BuildProps } from "../parallelBuilder/BuildImpl"; -import DeployImpl, { - DeploymentMode, - DeployProps, - DeploymentResult, -} from "../deploy/DeployImpl"; -import ArtifactGenerator from "../../core/artifacts/generators/ArtifactGenerator"; -import { Stage } from "../Stage"; -import SFPLogger, { - COLOR_KEY_VALUE, - COLOR_TRACE, - ConsoleLogger, - Logger, - LoggerLevel, -} from "@flxblio/sfp-logger"; -import { - PackageInstallationResult, - PackageInstallationStatus, -} from "../../core/package/packageInstallers/PackageInstallationResult"; -import { PackageDiffOptions } from "../../core/package/diff/PackageDiffImpl"; -import PoolFetchImpl from "../../core/scratchorg/pool/PoolFetchImpl"; -import { Org } from "@salesforce/core"; -import InstalledArtifactsDisplayer from "../../core/display/InstalledArtifactsDisplayer"; -import ValidateError from "../../errors/ValidateError"; -import ScratchOrg from "../../core/scratchorg/ScratchOrg"; -import { COLOR_KEY_MESSAGE } from "@flxblio/sfp-logger"; -import { COLOR_WARNING } from "@flxblio/sfp-logger"; -import { COLOR_ERROR } from "@flxblio/sfp-logger"; -import { COLOR_HEADER } from "@flxblio/sfp-logger"; -import { COLOR_SUCCESS } from "@flxblio/sfp-logger"; -import { COLOR_TIME } from "@flxblio/sfp-logger"; -import SFPStatsSender from "../../core/stats/SFPStatsSender"; -import ScratchOrgInfoFetcher from "../../core/scratchorg/pool/services/fetchers/ScratchOrgInfoFetcher"; -import ScratchOrgInfoAssigner from "../../core/scratchorg/pool/services/updaters/ScratchOrgInfoAssigner"; -import ValidateResult from "./ValidateResult"; -import PoolOrgDeleteImpl from "../../core/scratchorg/pool/PoolOrgDeleteImpl"; -import SFPOrg from "../../core/org/SFPOrg"; -import SfpPackage, { - PackageType, -} from "../../core/package/SfpPackage"; - -import getFormattedTime from "../../core/utils/GetFormattedTime"; -import { PostDeployHook } from "../deploy/PostDeployHook"; -import * as rimraf from "rimraf"; -import ProjectConfig from "../../core/project/ProjectConfig"; -import InstallUnlockedPackageCollection from "../../core/package/packageInstallers/InstallUnlockedPackageCollection"; -import ExternalPackage2DependencyResolver from "../../core/package/dependencies/ExternalPackage2DependencyResolver"; -import ExternalDependencyDisplayer from "../../core/display/ExternalDependencyDisplayer"; -import { PreDeployHook } from "../deploy/PreDeployHook"; -import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; -import ReleaseConfig from "../release/ReleaseConfig"; -import { mapInstalledArtifactstoPkgAndCommits } from "../../utils/FetchArtifactsFromOrg"; -import { ApexTestValidator } from "./ApexTestValidator"; -import OrgInfoDisplayer from "../../ui/OrgInfoDisplayer"; -import FileOutputHandler from "../../outputs/FileOutputHandler"; - - -export enum ValidateAgainst { - PROVIDED_ORG = "PROVIDED_ORG", - PRECREATED_POOL = "PRECREATED_POOL", -} -export enum ValidationMode { - INDIVIDUAL = "individual", - FAST_FEEDBACK = "fastfeedback", - THOROUGH = "thorough", - FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG = "ff-release-config", - THOROUGH_LIMITED_BY_RELEASE_CONFIG = "thorough-release-config", -} - -export interface ValidateProps { - installExternalDependencies?: boolean; - validateAgainst: ValidateAgainst; - validationMode: ValidationMode; - releaseConfigPath?: string; - coverageThreshold: number; - logsGroupSymbol: string[]; - targetOrg?: string; - hubOrg?: Org; - pools?: string[]; - shapeFile?: string; - isDeleteScratchOrg?: boolean; - keys?: string; - baseBranch?: string; - diffcheck?: boolean; - disableArtifactCommit?: boolean; - orgInfo?: boolean; - disableSourcePackageOverride?: boolean; - disableParallelTestExecution?: boolean; -} - -export default class ValidateImpl implements PostDeployHook, PreDeployHook { - - private logger = new ConsoleLogger(); - private orgAsSFPOrg: SFPOrg; - - constructor(private props: ValidateProps) { } - - public async exec(): Promise { - rimraf.sync("artifacts"); - - let deploymentResult: DeploymentResult; - let scratchOrgUsername: string; - try { - - if (this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG) { - scratchOrgUsername = this.props.targetOrg; - } else if ( - this.props.validateAgainst === ValidateAgainst.PRECREATED_POOL - ) { - if (process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG) - scratchOrgUsername = - process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG; - else - scratchOrgUsername = await this.fetchScratchOrgFromPool( - this.props.pools, - this.props.orgInfo, - ); - } else throw new Error(`Unknown mode ${this.props.validateAgainst}`); - - //Create Org - this.orgAsSFPOrg = await SFPOrg.create({ - aliasOrUsername: scratchOrgUsername, - }); - - - //Print Org Info for validateAgainstOrg modes - //TODO: Not ideal need to unify sfpOrg and scratchOrg and then make this a global method - if (this.props.orgInfo && this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG){ - OrgInfoDisplayer.printOrgInfo(this.orgAsSFPOrg); - OrgInfoDisplayer.writeOrgInfoToMarkDown(this.orgAsSFPOrg); - } - - - //Fetch Artifacts in the org - let packagesInstalledInOrgMappedToCommits: { [p: string]: string }; - - if (this.props.validationMode !== ValidationMode.INDIVIDUAL) { - let installedArtifacts = await this.orgAsSFPOrg.getInstalledArtifacts(); - if (installedArtifacts.length == 0) { - SFPLogger.log( - COLOR_ERROR("Failed to query org for sfp Artifacts"), - ); - } - packagesInstalledInOrgMappedToCommits = - await mapInstalledArtifactstoPkgAndCommits(installedArtifacts); - this.printArtifactVersions(this.orgAsSFPOrg, installedArtifacts); - } - //In individual mode, always build changed packages only especially for validateAgainstOrg - if (this.props.validationMode == ValidationMode.INDIVIDUAL) - this.props.diffcheck = true; - - let builtSfpPackages = await this.buildChangedSourcePackages( - packagesInstalledInOrgMappedToCommits, - ); - deploymentResult = await this.deploySourcePackages(scratchOrgUsername); - - if (deploymentResult.failed.length > 0 || deploymentResult.error) - throw new ValidateError("Validation failed", { deploymentResult }); - - return { - deploymentResult - } - } catch (error) { - if ( - error.message?.includes( - `No changes detected in the packages to be built`, - ) - ) { - SFPLogger.log( - `WARNING: No changes detected in any of the packages, Validation is treated as a success`, - LoggerLevel.WARN, - ); - return; - } else if (error instanceof ValidateError) - SFPLogger.log(`Validation failed due to : ${error}`, LoggerLevel.DEBUG); - else SFPLogger.log(`Failure Reason: ${error}`, LoggerLevel.ERROR); - throw error; - } finally { - await this.handleScratchOrgStatus( - scratchOrgUsername, - deploymentResult, - this.props.isDeleteScratchOrg, - ); - } - } - - private async printArtifactVersions( - orgAsSFPOrg: SFPOrg, - installedArtifacts: any, - ) { - let groupSection = new GroupConsoleLogs( - `Artifacts installed in the Org ${orgAsSFPOrg.getUsername()}`, - ).begin(); - - InstalledArtifactsDisplayer.printInstalledArtifacts( - installedArtifacts, - null, - ); - - groupSection.end(); - } - - - private async installPackageDependencies( - sfdxProjectConfig: any, - scratchOrgAsSFPOrg: SFPOrg, - sfpPackage: SfpPackage, - deployedPackages?: SfpPackage[], - ) { - let deployedPackagesAsStringArray: Array = []; - for (const deployedPackage of deployedPackages) { - deployedPackagesAsStringArray.push(deployedPackage.package_name); - } - - //Resolve external package dependencies - let externalPackageResolver = new ExternalPackage2DependencyResolver( - this.props.hubOrg.getConnection(), - sfdxProjectConfig, - this.props.keys, - ); - let externalPackage2s = - await externalPackageResolver.resolveExternalPackage2DependenciesToVersions( - [sfpPackage.packageName], - deployedPackagesAsStringArray, - ); - - SFPLogger.log( - `Installing package dependencies of this ${sfpPackage.packageName - } in ${scratchOrgAsSFPOrg.getUsername()}`, - LoggerLevel.INFO, - new ConsoleLogger(), - ); - //Display resolved dependenencies - let externalDependencyDisplayer = new ExternalDependencyDisplayer( - externalPackage2s, - new ConsoleLogger(), - ); - externalDependencyDisplayer.display(); - - let packageCollectionInstaller = new InstallUnlockedPackageCollection( - scratchOrgAsSFPOrg, - new ConsoleLogger(), - ); - await packageCollectionInstaller.install(externalPackage2s, true, true); - - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Successfully completed external dependencies of this ${sfpPackage.packageName - } in ${scratchOrgAsSFPOrg.getUsername()}`, - ), - ); - } - - private async handleScratchOrgStatus( - scratchOrgUsername: string, - deploymentResult: DeploymentResult, - isToDelete: boolean, - ) { - //No scratch org available.. just return - if (scratchOrgUsername == undefined) return; - - if (isToDelete) { - //If deploymentResult is not available, or there is 0 packages deployed, we can reuse the org - if (!deploymentResult || deploymentResult.deployed.length == 0) { - SFPLogger.log( - `Attempting to return scratch org ${scratchOrgUsername} back to pool`, - LoggerLevel.INFO, - ); - const scratchOrgInfoAssigner = new ScratchOrgInfoAssigner( - this.props.hubOrg, - ); - try { - const result = await scratchOrgInfoAssigner.setScratchOrgStatus( - scratchOrgUsername, - "Return", - ); - if (result) - SFPLogger.log( - `Succesfully returned ${scratchOrgUsername} back to pool`, - LoggerLevel.INFO, - ); - else - SFPLogger.log( - COLOR_WARNING( - `Unable to return scratch org to pool, Please check permissions or update sfpower-pool-package to latest`, - ), - ); - } catch (error) { - SFPLogger.log( - COLOR_WARNING( - `Unable to return scratch org to pool, Please check permissions or update sfpower-pool-package to latest`, - ), - ); - } - } else { - try { - if (scratchOrgUsername && this.props.hubOrg.getUsername()) { - await deleteScratchOrg(this.props.hubOrg, scratchOrgUsername); - } - } catch (error) { - SFPLogger.log(COLOR_WARNING(error.message)); - } - } - } - async function deleteScratchOrg(hubOrg: Org, scratchOrgUsername: string) { - SFPLogger.log( - `Deleting scratch org ${scratchOrgUsername}`, - LoggerLevel.INFO, - ); - const poolOrgDeleteImpl = new PoolOrgDeleteImpl( - hubOrg, - scratchOrgUsername, - ); - await poolOrgDeleteImpl.execute(); - } - } - - private async deploySourcePackages( - scratchOrgUsername: string, - ): Promise { - const deployStartTime: number = Date.now(); - - const deployProps: DeployProps = { - targetUsername: scratchOrgUsername, - artifactDir: "artifacts", - waitTime: 120, - deploymentMode: - this.props.disableSourcePackageOverride == true - ? DeploymentMode.NORMAL - : DeploymentMode.SOURCEPACKAGES, - isTestsToBeTriggered: true, - skipIfPackageInstalled: false, - logsGroupSymbol: this.props.logsGroupSymbol, - currentStage: Stage.VALIDATE, - disableArtifactCommit: this.props.disableArtifactCommit, - selectiveComponentDeployment: - this.props.validationMode == ValidationMode.FAST_FEEDBACK || this.props.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG - - }; - - - - - const deployImpl: DeployImpl = new DeployImpl(deployProps); - deployImpl.postDeployHook = this; - deployImpl.preDeployHook = this; - - const deploymentResult = await deployImpl.exec(); - - const deploymentElapsedTime: number = Date.now() - deployStartTime; - printDeploySummary(deploymentResult, deploymentElapsedTime); - - return deploymentResult; - - function printDeploySummary( - deploymentResult: DeploymentResult, - totalElapsedTime: number, - ): void { - let groupSection = new GroupConsoleLogs(`Deployment Summary`).begin(); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `${deploymentResult.deployed.length - } packages deployed in ${COLOR_TIME( - getFormattedTime(totalElapsedTime), - )} with {${COLOR_ERROR( - deploymentResult.failed.length, - )}} failed deployments`, - ), - ); - - if (deploymentResult.failed.length > 0) { - SFPLogger.log( - COLOR_ERROR( - `\nPackages Failed to Deploy`, - deploymentResult.failed.map( - (packageInfo) => packageInfo.sfpPackage.packageName, - ), - ), - ); - - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`### 💣 Deployment Failed 💣`); - let firstPackageFailedToValdiate = deploymentResult.failed[0]; - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package validation failed for **${firstPackageFailedToValdiate.sfpPackage.packageName}** due to`); - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,""); - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,deploymentResult.error); - - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package that are not validated:`); - deploymentResult.failed.map( - (packageInfo, index) => { - if (index!=0) - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`**${packageInfo.sfpPackage.packageName}**`); - } - ); - } - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - groupSection.end(); - } - } - - private async buildChangedSourcePackages(packagesInstalledInOrgMappedToCommits: { - [p: string]: string; - }): Promise { - let groupSection = new GroupConsoleLogs("Building Packages").begin(); - - const buildStartTime: number = Date.now(); - - - - - const buildProps: BuildProps = { - buildNumber: 1, - executorcount: 10, - waitTime: 120, - isDiffCheckEnabled: this.props.diffcheck, - isQuickBuild: true, - isBuildAllAsSourcePackages: !this.props.disableSourcePackageOverride, - currentStage: Stage.VALIDATE, - baseBranch: this.props.baseBranch, - devhubAlias: this.props.hubOrg?.getUsername() - }; - - //Build DiffOptions - const diffOptions: PackageDiffOptions = buildDiffOption(this.props); - buildProps.diffOptions = diffOptions; - - - //compute pkg overides - buildProps.overridePackageTypes = computePackageOverrides(this.props) - - - //Compute packages to be included - buildProps.includeOnlyPackages = fetchPackagesAsPerReleaseConfig( - this.logger, - this.props, - ); - if (buildProps.includeOnlyPackages) { - printIncludeOnlyPackages(buildProps.includeOnlyPackages); - } - - const buildImpl: BuildImpl = new BuildImpl(buildProps); - const { generatedPackages, failedPackages } = await buildImpl.exec(); - - if (failedPackages.length > 0) - throw new Error(`Failed to create packages ${failedPackages}`); - - if (generatedPackages.length === 0) { - throw new Error( - `No changes detected in the packages to be built\nvalidate will only execute if there is a change in atleast one of the packages`, - ); - } - - for (const generatedPackage of generatedPackages) { - try { - await ArtifactGenerator.generateArtifact( - generatedPackage, - process.cwd(), - "artifacts", - ); - } catch (error) { - SFPLogger.log( - COLOR_ERROR( - `Unable to create artifact for ${generatedPackage.packageName}`, - ), - ); - throw error; - } - } - const buildElapsedTime: number = Date.now() - buildStartTime; - - printBuildSummary(generatedPackages, failedPackages, buildElapsedTime); - - groupSection.end(); - - return generatedPackages; - - - function computePackageOverrides(props: ValidateProps): { [key: string]: PackageType } { - let overridedPackages: { [key: string]: PackageType } = {}; - const allPackages = ProjectConfig.getAllPackages(null); - const projectConfig = ProjectConfig.getSFDXProjectConfig(null); - for (const pkg of allPackages) { - - if (ProjectConfig.getPackageType(projectConfig, pkg) !== PackageType.Data) { - if ( - props.validationMode === - ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - props.validationMode === - ValidationMode.FAST_FEEDBACK - ) { - overridedPackages[pkg] = PackageType.Diff - } - else { - if (!props.disableSourcePackageOverride) { - if (ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Data || ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Diff) - overridedPackages[pkg] = PackageType.Source - } - } - } - } - return overridedPackages; - } - - function fetchPackagesAsPerReleaseConfig( - logger: Logger, - props: ValidateProps, - ) { - if ( - props.validationMode === - ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - props.validationMode === - ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG - ) { - let releaseConfig: ReleaseConfig = new ReleaseConfig( - logger, - props.releaseConfigPath, - true - ); - return releaseConfig.getPackagesAsPerReleaseConfig(); - } - } - - //generate diff Option - function buildDiffOption(props: ValidateProps) { - const diffOptions: PackageDiffOptions = new PackageDiffOptions(); - //In fast feedback ignore package descriptor changes - if ( - props.validationMode === ValidationMode.FAST_FEEDBACK - ) { - diffOptions.skipPackageDescriptorChange = true; - diffOptions.useLatestGitTags = false; - diffOptions.packagesMappedToLastKnownCommitId = - packagesInstalledInOrgMappedToCommits; - } - else if (props.validationMode === ValidationMode.THOROUGH) { - diffOptions.skipPackageDescriptorChange = false; - diffOptions.useLatestGitTags = false; - diffOptions.packagesMappedToLastKnownCommitId = - packagesInstalledInOrgMappedToCommits; - } else if (props.validationMode === ValidationMode.INDIVIDUAL) { - diffOptions.skipPackageDescriptorChange = false; - //Dont send whats installed in orgs, use only the changed package from last know git tags - diffOptions.useLatestGitTags = true; - diffOptions.packagesMappedToLastKnownCommitId = null; - } else if ( - props.validationMode === - ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG - ) { - diffOptions.skipPackageDescriptorChange = false; - diffOptions.useLatestGitTags = false; - diffOptions.packagesMappedToLastKnownCommitId = - packagesInstalledInOrgMappedToCommits; - } else if ( - props.validationMode === - ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG - ) { - diffOptions.skipPackageDescriptorChange = true; - diffOptions.useLatestGitTags = false; - diffOptions.packagesMappedToLastKnownCommitId = - packagesInstalledInOrgMappedToCommits; - } - return diffOptions; - } - - function printBuildSummary( - generatedPackages: SfpPackage[], - failedPackages: string[], - totalElapsedTime: number, - ): void { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - SFPLogger.log( - COLOR_SUCCESS( - `${generatedPackages.length} packages created in ${COLOR_TIME( - getFormattedTime(totalElapsedTime), - )} with {${COLOR_ERROR(failedPackages.length)}} errors`, - ), - ); - - if (failedPackages.length > 0) { - SFPLogger.log(COLOR_ERROR(`Packages Failed To Build`, failedPackages)); - } - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - } - - function printIncludeOnlyPackages(includeOnlyPackages: string[]) { - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Build will include the below packages as per inclusive filter`, - ), - LoggerLevel.INFO, - ); - SFPLogger.log( - COLOR_KEY_VALUE(`${includeOnlyPackages.toString()}`), - LoggerLevel.INFO, - ); - } - } - - private async fetchScratchOrgFromPool( - pools: string[], - displayOrgInfo?: boolean, - ): Promise { - let scratchOrgUsername: string; - - for (const pool of pools) { - let scratchOrg: ScratchOrg; - try { - const poolFetchImpl = new PoolFetchImpl( - this.props.hubOrg, - pool.trim(), - false, - true, - ); - scratchOrg = (await poolFetchImpl.execute()) as ScratchOrg; - } catch (error) { - SFPLogger.log(error.message, LoggerLevel.TRACE); - } - if (scratchOrg && scratchOrg.status === "Assigned") { - scratchOrgUsername = scratchOrg.username; - SFPLogger.log( - COLOR_KEY_MESSAGE( - `Fetched scratch org ${scratchOrgUsername} from ${COLOR_KEY_VALUE( - pool, - )}`, - ), - LoggerLevel.INFO, - this.logger, - ); - - if (displayOrgInfo) { - OrgInfoDisplayer.printScratchOrgInfo(scratchOrg); - OrgInfoDisplayer.writeScratchOrgInfoToMarkDown(scratchOrg); - } - - this.getCurrentRemainingNumberOfOrgsInPoolAndReport(scratchOrg.tag); - break; - } - } - - if (scratchOrgUsername) return scratchOrgUsername; - else - throw new Error( - `Failed to fetch scratch org from ${pools}, Are you sure you created this pool using a DevHub authenticated using auth:sfdxurl or auth:web or auth:accesstoken:store`, - ); - - - } - - private async getCurrentRemainingNumberOfOrgsInPoolAndReport(tag: string) { - try { - const results = await new ScratchOrgInfoFetcher( - this.props.hubOrg, - ).getScratchOrgsByTag(tag, false, true); - - const availableSo = results.records.filter( - (soInfo) => soInfo.Allocation_status__c === "Available", - ); - - SFPStatsSender.logGauge("pool.available", availableSo.length, { - poolName: tag, - }); - } catch (error) { - //do nothing, we are not reporting anything if anything goes wrong here - } - } - - async preDeployPackage( - sfpPackage: SfpPackage, - targetUsername: string, - deployedPackages?: SfpPackage[], - devhubUserName?: string, -): Promise<{ isToFailDeployment: boolean; message?: string }> { - - const shouldInstallDependencies = (mode: ValidationMode) => { - if (this.props.validateAgainst === ValidateAgainst.PROVIDED_ORG && - !this.props.installExternalDependencies) { - return false; - } - - const isThoroughValidation = mode === ValidationMode.THOROUGH || - mode === ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG; - - const isFastFeedbackWithExternalDependencies = - (mode === ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - mode === ValidationMode.FAST_FEEDBACK) && - this.props.installExternalDependencies; - - return isThoroughValidation || - mode === ValidationMode.INDIVIDUAL || - isFastFeedbackWithExternalDependencies; - }; - - if (shouldInstallDependencies(this.props.validationMode)) { - const projectConfig = this.props.validationMode === ValidationMode.INDIVIDUAL ? - ProjectConfig.cleanupMPDFromProjectDirectory(null, sfpPackage.package_name) : - ProjectConfig.getSFDXProjectConfig(null); - - await this.installPackageDependencies( - projectConfig, - this.orgAsSFPOrg, - sfpPackage, - deployedPackages, - ); - } - - return { isToFailDeployment: false }; -} - - - async postDeployPackage( - sfpPackage: SfpPackage, - packageInstallationResult: PackageInstallationResult, - targetUsername: string, - deployedPackages?: SfpPackage[], - devhubUserName?: string, - ): Promise<{ isToFailDeployment: boolean; message?: string }> { - //Trigger Tests after installation of each package - if (sfpPackage.packageType && sfpPackage.packageType != PackageType.Data) { - if ( - packageInstallationResult.result === PackageInstallationStatus.Succeeded - ) { - //Get Changed Components - const apextestValidator = new ApexTestValidator(targetUsername, sfpPackage, this.props, this.logger); - const testResult = await apextestValidator.validateApexTests(); - - if (!testResult.result) { - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`### 💣 Validation Failed 💣`); - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Package validation failed for **${sfpPackage.packageName}**`); - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`Reasons:`); - FileOutputHandler.getInstance().appendOutput(`validation-error.md`,`${testResult.message}`); - } - - return { - isToFailDeployment: !testResult.result, - message: testResult.message, - }; - } - } - return { isToFailDeployment: false }; - } - - -} diff --git a/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts b/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts deleted file mode 100644 index a8c360812..000000000 --- a/packages/sfpowerscripts-cli/src/impl/validate/ValidateResult.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DeploymentResult, PackageInfo } from '../deploy/DeployImpl'; -import DependencyViolation from '../../core/dependency/DependencyViolation'; - -export default interface ValidateResult { - deploymentResult?: DeploymentResult; - dependencyViolations?: DependencyViolation[]; - testFailures?: PackageInfo[]; -} diff --git a/packages/sfpowerscripts-cli/src/index.ts b/packages/sfpowerscripts-cli/src/index.ts deleted file mode 100644 index ff8b4c563..000000000 --- a/packages/sfpowerscripts-cli/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts b/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts deleted file mode 100644 index 1d473cf3d..000000000 --- a/packages/sfpowerscripts-cli/src/outputs/FileOutputHandler.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as fs from 'fs-extra'; -import { EOL } from 'os'; -import path from 'path'; - -export default class FileOutputHandler { - static instance: FileOutputHandler; - - public static getInstance() { - if (!FileOutputHandler.instance) - FileOutputHandler.instance = new FileOutputHandler('.sfp/outputs'); - - return FileOutputHandler.instance; - } - - - private constructor(private containerFolder: string) { - fs.mkdirpSync(this.containerFolder); - } - - public writeOutput(fileName: string, output: string ) { - if (!fs.existsSync(path.join(this.containerFolder, fileName))) { - fs.createFileSync(path.join(this.containerFolder, fileName)); - } - fs.writeFileSync(path.join(this.containerFolder, fileName), output); - }; - - public appendOutput(fileName: string,output: string) { - if (!fs.existsSync(path.join(this.containerFolder, fileName))) { - fs.createFileSync(path.join(this.containerFolder, fileName)); - } - fs.appendFileSync(path.join(this.containerFolder, fileName), EOL); - fs.appendFileSync(path.join(this.containerFolder, fileName), output); - } - -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts b/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts deleted file mode 100644 index 42f284f3c..000000000 --- a/packages/sfpowerscripts-cli/src/ui/GroupConsoleLogs.ts +++ /dev/null @@ -1,58 +0,0 @@ -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; -import { EOL } from 'os'; - -//TODO: Move to sfpconsole package -export default class GroupConsoleLogs { - private static logGroupSymbols?: string[]; - - constructor(private section: string,private logger?:Logger) {} - - public static setLogGroupsSymbol(logGroupSymbols: string[]) { - GroupConsoleLogs.logGroupSymbols = logGroupSymbols; - } - - public begin():GroupConsoleLogs { - let sectionStart = this.getSectionStart(); - if (sectionStart && sectionStart.length > 0) SFPLogger.log(sectionStart, LoggerLevel.INFO,this.logger); - return this; - } - - public end():GroupConsoleLogs { - let sectionEnd = this.getSectionEnd(); - if (sectionEnd && sectionEnd.length > 0) SFPLogger.log(sectionEnd, LoggerLevel.INFO,this.logger); - return this; - } - - private getSectionStart() { - if (process.env.BUILDKITE_BUILD_NUMBER) { - return `--- ${this.section}`; - } else if (process.env.GITHUB_ACTION) { - return `::group::${this.section}`; - } else if (process.env.GITLAB_CI) { - return `\e[0Ksection_start:${Date.now()}:${this.section}\r\e[0K${this.section}`; - } else if (process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) { - return `##[group]${this.section}`; - } else if (GroupConsoleLogs.logGroupSymbols && GroupConsoleLogs.logGroupSymbols[0]) { - return `${GroupConsoleLogs.logGroupSymbols[0]} ${this.section}`; - } else { - return `${EOL}${COLOR_KEY_MESSAGE(this.section)}${EOL}`; - } - } - - private getSectionEnd() { - if (process.env.BUILDKITE_BUILD_NUMBER) { - return undefined; - } else if (process.env.GITHUB_ACTION) { - return `::endgroup::`; - } else if (process.env.GITLAB_CI) { - return `\e[0Ksection_end:${Date.now()}:${this.section}\r\e[0K`; - } else if (process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) { - return `##[endgroup]`; - } else if (GroupConsoleLogs.logGroupSymbols && GroupConsoleLogs.logGroupSymbols[1]) { - return `${GroupConsoleLogs.logGroupSymbols[1]}`; - } else { - return `${EOL}`; - } - } -} diff --git a/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts b/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts deleted file mode 100644 index f3ef01d3e..000000000 --- a/packages/sfpowerscripts-cli/src/ui/OrgInfoDisplayer.ts +++ /dev/null @@ -1,156 +0,0 @@ -import SFPLogger, { COLOR_HEADER, COLOR_KEY_VALUE, COLOR_KEY_MESSAGE, COLOR_TRACE } from "@flxblio/sfp-logger"; -import SFPOrg from "../core/org/SFPOrg"; -const Table = require("cli-table"); -import { LoggerLevel } from "@salesforce/core"; -import GroupConsoleLogs from "./GroupConsoleLogs"; -import { COLON_MIDDLE_BORDER_TABLE } from "./TableConstants"; -import ScratchOrg from "../core/scratchorg/ScratchOrg"; -import { Align, getMarkdownTable } from "markdown-table-ts"; -import fs from "fs-extra"; -import FileOutputHandler from "../outputs/FileOutputHandler"; - -export default class OrgInfoDisplayer { - - public static printScratchOrgInfo(scratchOrg: ScratchOrg): void { - let groupSection = new GroupConsoleLogs(`Display Org Info`).begin(); - - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - SFPLogger.log(COLOR_KEY_VALUE(`-- Org Details:--`)); - const table = new Table({ - chars: COLON_MIDDLE_BORDER_TABLE, - style: { "padding-left": 2 }, - }); - table.push([COLOR_HEADER(`Org Id`), COLOR_KEY_MESSAGE(scratchOrg.orgId)]); - table.push([ - COLOR_HEADER(`Login URL`), - COLOR_KEY_MESSAGE(scratchOrg.loginURL), - ]); - table.push([ - COLOR_HEADER(`Username`), - COLOR_KEY_MESSAGE(scratchOrg.username), - ]); - table.push([ - COLOR_HEADER(`Password`), - COLOR_KEY_MESSAGE(scratchOrg.password), - ]); - table.push([ - COLOR_HEADER(`Auth URL`), - COLOR_KEY_MESSAGE(scratchOrg.sfdxAuthUrl), - ]); - table.push([ - COLOR_HEADER(`Expiry`), - COLOR_KEY_MESSAGE(scratchOrg.expiryDate), - ]); - SFPLogger.log(table.toString(), LoggerLevel.INFO); - - SFPLogger.log( - COLOR_TRACE( - `You may use the following commands to authenticate to the org`, - ), - LoggerLevel.INFO, - ); - SFPLogger.log( - COLOR_TRACE(`cat ${scratchOrg.sfdxAuthUrl} > ./authfile`), - LoggerLevel.INFO, - ); - SFPLogger.log( - COLOR_TRACE(`sfdx auth sfdxurl store --sfdxurlfile authfile`), - LoggerLevel.INFO, - ); - SFPLogger.log( - COLOR_TRACE(`sfdx force org open --u ${scratchOrg.username}`), - LoggerLevel.INFO, - ); - - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - - - - - groupSection.end(); - } - - public static writeScratchOrgInfoToMarkDown(scratchOrg: ScratchOrg): void { - const pathToMarkDownFile = `org-info.md`; - const fileOutputHandler = FileOutputHandler.getInstance(); - fileOutputHandler.writeOutput(pathToMarkDownFile, `\nPlease find the validation org details below`); - let tableData = { - table: { - head: [ - 'Org Info', - '', - ], - body: [] - }, - alignment: [Align.Left, Align.Left, Align.Left, Align.Right], - }; - tableData.table.body.push([`Org Id`, scratchOrg.orgId]); - tableData.table.body.push([`Login URL`, scratchOrg.loginURL]); - tableData.table.body.push([`Username`, scratchOrg.username]); - tableData.table.body.push([`Password`, scratchOrg.password]); - tableData.table.body.push([`Expiry`, scratchOrg.expiryDate]); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\n\n${getMarkdownTable(tableData)}`); - - fileOutputHandler.appendOutput(pathToMarkDownFile, - `\n\nYou may use the following commands to authenticate to the org`,); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); - fileOutputHandler.appendOutput(pathToMarkDownFile, `cat ${scratchOrg.sfdxAuthUrl} > ./authfile`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx auth sfdxurl store --sfdxurlfile authfile`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx force org open --u ${scratchOrg.username}`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); - - } - - public static printOrgInfo(org: SFPOrg): void { - let groupSection = new GroupConsoleLogs(`Display Org Info`).begin(); - - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - SFPLogger.log(COLOR_KEY_VALUE(`-- Org Details:--`)); - const table = new Table({ - chars: COLON_MIDDLE_BORDER_TABLE, - style: { "padding-left": 2 }, - }); - table.push([COLOR_HEADER(`Org Id`), COLOR_KEY_MESSAGE(org.getOrgId())]); - table.push([ - COLOR_HEADER(`Instance URL`), - COLOR_KEY_MESSAGE(org.getConnection().instanceUrl), - ]); - table.push([ - COLOR_HEADER(`Username`), - COLOR_KEY_MESSAGE(org.getUsername()), - ]); - table.push([ - COLOR_HEADER(`Front Door URL`), - COLOR_KEY_MESSAGE(org.getConnection().getAuthInfo().getOrgFrontDoorUrl()) - ]); - SFPLogger.log(table.toString(), LoggerLevel.INFO); - - - - SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - - groupSection.end(); - } - - public static writeOrgInfoToMarkDown(org: SFPOrg): void { - const pathToMarkDownFile = `org-info.md`; - const fileOutputHandler = FileOutputHandler.getInstance(); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\nPlease find the validation org details below`); - let tableData = { - table: { - head: [ - 'Org Details', - '', - ], - body: [] - }, - alignment: [Align.Left, Align.Left, Align.Left,Align.Right], - }; - tableData.table.body.push([`Org Id`,org.getOrgId()]); - tableData.table.body.push([`Username`,org.getUsername()]); - tableData.table.body.push([`Login to the org`, `[Click Here](${org.getConnection().getAuthInfo().getOrgFrontDoorUrl()})`]); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\n\n${getMarkdownTable(tableData)}`); - - } - -} \ No newline at end of file diff --git a/packages/sfpowerscripts-cli/src/ui/TableConstants.ts b/packages/sfpowerscripts-cli/src/ui/TableConstants.ts deleted file mode 100644 index cb902721b..000000000 --- a/packages/sfpowerscripts-cli/src/ui/TableConstants.ts +++ /dev/null @@ -1,37 +0,0 @@ -export const ZERO_BORDER_TABLE = { - top: ' ', - 'top-mid': ' ', - 'top-left': ' ', - 'top-right': ' ', - bottom: ' ', - 'bottom-mid': ' ', - 'bottom-left': ' ', - 'bottom-right': ' ', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ' ', -}; - - - -export const COLON_MIDDLE_BORDER_TABLE = { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ':', -}; diff --git a/packages/sfpowerscripts-cli/src/utils/FetchArtifactsFromOrg.ts b/packages/sfpowerscripts-cli/src/utils/FetchArtifactsFromOrg.ts deleted file mode 100644 index 255a0007d..000000000 --- a/packages/sfpowerscripts-cli/src/utils/FetchArtifactsFromOrg.ts +++ /dev/null @@ -1,31 +0,0 @@ - -export async function mapInstalledArtifactstoPkgAndCommits( - installedArtifacts: any, -) { - let packagesMappedToLastKnownCommitId: { [p: string]: string } = {}; - if (installedArtifacts != null) { - packagesMappedToLastKnownCommitId = - getPackagesToCommits(installedArtifacts); - } - return packagesMappedToLastKnownCommitId; - - function getPackagesToCommits(installedArtifacts: any): { - [p: string]: string; - } { - const packagesToCommits: { [p: string]: string } = {}; - - // Construct map of artifact and associated commit Id - installedArtifacts.forEach((artifact) => { - packagesToCommits[artifact.Name] = artifact.CommitId__c; - //Override for debugging purposes - if (process.env.VALIDATE_OVERRIDE_PKG) - packagesToCommits[process.env.VALIDATE_OVERRIDE_PKG] = - process.env.VALIDATE_PKG_COMMIT_ID; - }); - - if (process.env.VALIDATE_REMOVE_PKG) - delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG]; - - return packagesToCommits; - } -} diff --git a/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts b/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts deleted file mode 100644 index bd2b5df48..000000000 --- a/packages/sfpowerscripts-cli/src/utils/Get18DigitSalesforceId.ts +++ /dev/null @@ -1,19 +0,0 @@ -export default function get18DigitSalesforceId(recordId: string) { - if (recordId && recordId.length === 18) { - return recordId; - } else if (recordId && recordId.length === 15) { - let addon = ''; - for (let block = 0; block < 3; block++) { - let loop = 0; - for (let position = 0; position < 5; position++) { - let current = recordId.charAt(block * 5 + position); - if (current >= 'A' && current <= 'Z') loop += 1 << position; - } - addon += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'.charAt(loop); - } - let convertedId = recordId + addon; - return convertedId; - } else { - throw new Error(`Invalid Salesforce Id ${recordId}`); - } -} diff --git a/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts b/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts deleted file mode 100644 index a3a2f6da0..000000000 --- a/packages/sfpowerscripts-cli/tests/ProjectValidation.test.ts +++ /dev/null @@ -1,414 +0,0 @@ -import ProjectConfig from '../src/core/project/ProjectConfig'; -import { jest, expect } from '@jest/globals'; -import ProjectValidation from '../src/ProjectValidation'; - -describe('Given a sfdx-project.json, it should be validated against the scehma', () => { - it('should not throw an error for a valid sfdx-project.json without any sfp decorators', () => { - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '04t000000000000' }, - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - expect(() => { - new ProjectValidation().validateSFDXProjectJSON(); - }).not.toThrow(); - }); - - it('should not throw an error for a sfdx-project.json where a package directory is missing package name', () => { - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/bi', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '04t000000000000' }, - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - expect(() => { - new ProjectValidation().validateSFDXProjectJSON(); - }).not.toThrow(); - }); - - it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are used', () => { - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - skipCoverageValidation: true, - skipTesting: true, - isOptimizedDeployment: false, - destructiveChangePath: 'test/1.xml', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - postDeploymentScript: 'test/1.bat', - preDeploymentScript: 'test/2.bat', - assignPermSetsPreDeployment: ['PS1', 'PS2'], - assignPermSetsPostDeployment: ['PS3', 'PS4'], - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: true, - alwaysDeploy: true, - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - aliasfy: true, - skipDeployOnOrgs: ['uat'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '04t000000000000' }, - plugins: { - ignoreFiles: { - prepare: 'path/to/.forceignore', - validate: 'path/to/.forceignore', - quickbuild: 'path/to/.forceignore', - build: 'path/to/.forceignore', - }, - }, - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - expect(() => { - new ProjectValidation().validateSFDXProjectJSON(); - }).not.toThrow(); - }); - - it('should not throw an error for a sfdx-project.json where various sfp orchestrator properties are incorrectly used', () => { - //As the errors are moved to warning, it will not throw an error - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build', 'test'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - skipCoverageValidation: true, - skipTesting: 'true', - isOptimizedDeployment: false, - destructiveChangePath: true, - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - postDeploymentScript: 'test/1.bat', - preDeploymentScript: 'test/2.bat', - assignPermsetsPreDeployment: ['PS1', 'PS2'], - assignPermsetsPostDeployment: ['PS3', 'PS4'], - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - alwaysDeploy: true, - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - aliasfy: 'false', - skipDeployOnOrgs: ['uat'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '04t000000000000' }, - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - expect(() => { - new ProjectValidation().validateSFDXProjectJSON(); - }).not.toThrow(); - }); - - it('should not throw an package-specific error for sfdx-project.json when version number is used correctly', () => { - // sfdx-project.json includes one source package with specific build number (valid) and one unlocked package using NEXT keyword (also valid) - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - type: 'source', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.NEXT', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { core: '04t000000000000' }, - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - expect(() => { - new ProjectValidation().validatePackageBuildNumbers(); - }).not.toThrow(); - }); - - it('should throw a package-specific error for sfdx-project.json when version number is used incorrectly', () => { - // sfdx-project.json includes two source packages. One with specific build number (valid), one using NEXT keyword (invalid) - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - type: 'source', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/domains/core', - package: 'invalid_core_pkg', - default: false, - type: 'source', - versionName: 'core', - versionNumber: '1.0.0.NEXT', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - - let excep; - try { - new ProjectValidation().validatePackageBuildNumbers(); - } catch (error) { - excep = error; - } - - expect(excep); - expect(excep.message).toContain('invalid_core_pkg'); - }); - - it('should throw a package-specific error for sfdx-project.json when package name is more than 38 characters', () => { - // sfdx-project.json includes two source packages. One with normal package name, one name is more than 38 characters (invalid) - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - type: 'source', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/ordering-systems', - package: 'feature-mgmt-and-ordering-systems-org-dep', - default: false, - versionName: 'ordering-systems', - versionNumber: '1.0.0.0', - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - - let excep; - try { - new ProjectValidation().validatePackageNames(); - } catch (error) { - excep = error; - } - - expect(excep); - expect(excep.message).toContain('Package name exceed maximum length of 38 characters'); - }); - - it('should throw a package-specific error for sfdx-project.json when package name contains invalid characters', () => { - // sfdx-project.json includes two source packages. One with normal package name, one name contains & (invalid) - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - type: 'source', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/ordering-systems', - package: 'feature-mgmt-&-ordering-systems-org', - default: false, - versionName: 'ordering-systems', - versionNumber: '1.0.0.0', - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - }; - - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return sfdx_project; - }); - - let excep; - try { - new ProjectValidation().validatePackageNames(); - } catch (error) { - excep = error; - } - - expect(excep); - expect(excep.message).toContain('Package names can only contain alphanumeric characters and the symbols - . _ ~.'); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts b/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts deleted file mode 100644 index ac9e026b3..000000000 --- a/packages/sfpowerscripts-cli/tests/core/apextest/ApexTestSuite.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { jest, expect } from '@jest/globals'; -const fs = require('fs-extra'); -import ApexTestSuite from '../../../src/core/apextest/ApexTestSuite'; -import * as globSync from 'glob'; - - - -describe('Provided an apex test suite from a source directory', () => { - it('should return all the apexclasses', () => { - - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/test.testSuite-meta.xml'); - }); - - - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - - - AccountAccountRelationTriggerTest - AccountContactRelationTriggerTest - AccountTeamMemberTriggerTest - AccountTriggerTest - ContactTriggerTest - - `; - }); - - let resultTestClasses = new Array(); - resultTestClasses.push(`AccountAccountRelationTriggerTest`); - resultTestClasses.push(`AccountContactRelationTriggerTest`); - resultTestClasses.push(`AccountTeamMemberTriggerTest`); - resultTestClasses.push(`AccountTriggerTest`); - resultTestClasses.push(`ContactTriggerTest`); - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); - }); - - it('should throw an error if apex test suite is not avaiable in the directory', async () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return []; - }); - - - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - - expect(apexTestSuite.getConstituentClasses()).rejects.toThrowError(); - }); - - it('should return apexclass even if there is only one', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/test.testSuite-meta.xml');; - }); - - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - - - AccountAccountRelationTriggerTest - - `; - }); - - let resultTestClasses = new Array(); - resultTestClasses.push(`AccountAccountRelationTriggerTest`); - - let apexTestSuite = new ApexTestSuite(`dir`, `test`); - expect(apexTestSuite.getConstituentClasses()).resolves.toStrictEqual(resultTestClasses); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts b/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts deleted file mode 100644 index f30a3ab4f..000000000 --- a/packages/sfpowerscripts-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import ArtifactFetcher from '../../../src/core/artifacts/ArtifactFetcher'; -import * as globSync from 'glob'; - -describe('Provided a path to the artifacts folder containing sfp artifact', () => { - it('should return all the artifacts, if a package name is not provided', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core2_sfp_artifact_1.0.0-2.zip', - '/path/to/core3_sfp_artifact_1.0.0-3.zip', - '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' - ]; - }); - - - let artifacts = ArtifactFetcher.findArtifacts('artifacts'); - expect(artifacts).toEqual( - [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core2_sfp_artifact_1.0.0-2.zip', - '/path/to/core3_sfp_artifact_1.0.0-3.zip', - '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' - ] - ); - }); - - it('provided only one artifact exists for a package and a package name is provided, it should just return the one artifact', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/core_sfp_artifact_1.0.0-2.zip'); - }); - - let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-2.zip')); - }); - - it('provided multiple artifacts of the same package exists and a package name is provied, it should return the latest', () => { - - jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core_sfp_artifact_1.0.0-3.zip', - '/path/to/core_sfp_artifact_1.0.0-4.zip', - '/path/to/core_sfp_artifact_1.0.0-5.tgz' - ]; - }); - let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-5.tgz')); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts b/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts deleted file mode 100644 index f2be12f57..000000000 --- a/packages/sfpowerscripts-cli/tests/core/coverage/IndividualClassCoverage.test.ts +++ /dev/null @@ -1,167 +0,0 @@ -import IndividualClassCoverage from '../../../src/core/apex/coverage/IndividualClassCoverage'; -import { expect } from '@jest/globals'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; - -describe('Given a test coverage report', () => { - it('should be able to get a list of all classes and its test coverage', () => { - let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( - testCoverage, - new ConsoleLogger() - ); - let expectedValue = [ - { name: 'CustomerServices', coveredPercent: 87 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'ReservationManagerController', coveredPercent: 72 }, - { name: 'ReservationManager', coveredPercent: 93 }, - ]; - expect(individualClasCoverage.getIndividualClassCoverage()).toEqual(expectedValue); - }); - - it('given a coverage threshold, provide a list of classes that do not satisfy the threshold', () => { - let individualClasCoverage: IndividualClassCoverage = new IndividualClassCoverage( - testCoverage, - new ConsoleLogger() - ); - let validationResult = individualClasCoverage.validateIndividualClassCoverage( - individualClasCoverage.getIndividualClassCoverage(), - 75 - ); - expect(validationResult.classesWithInvalidCoverage).toContainEqual({ - name: 'ReservationManagerController', - coveredPercent: 72, - }); - }); -}); - -let testCoverage = [ - { - id: '01p0w000001qr8HAAQ', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87, - }, - { - id: '01p0w000001qr8JAAQ', - name: 'MarketServices', - totalLines: 3, - lines: { - '3': 1, - '4': 1, - '16': 1, - }, - totalCovered: 3, - coveredPercent: 100, - }, - { - id: '01p0w000001qr8NAAQ', - name: 'ReservationManagerController', - totalLines: 32, - lines: { - '4': 1, - '7': 1, - '8': 1, - '17': 1, - '22': 1, - '23': 1, - '25': 1, - '26': 1, - '27': 1, - '28': 1, - '29': 1, - '30': 1, - '31': 1, - '32': 1, - '33': 1, - '34': 1, - '35': 1, - '36': 1, - '37': 1, - '39': 1, - '41': 1, - '42': 0, - '43': 0, - '44': 0, - '45': 0, - '46': 0, - '47': 0, - '48': 0, - '50': 0, - '52': 0, - '56': 1, - '57': 1, - }, - totalCovered: 23, - coveredPercent: 72, - }, - { - id: '01p0w000001qr8MAAQ', - name: 'ReservationManager', - totalLines: 28, - lines: { - '3': 1, - '6': 1, - '7': 1, - '8': 1, - '9': 1, - '10': 1, - '12': 1, - '13': 1, - '15': 1, - '20': 1, - '24': 1, - '25': 1, - '26': 1, - '27': 1, - '29': 1, - '30': 1, - '31': 1, - '34': 1, - '35': 1, - '36': 1, - '37': 1, - '39': 1, - '40': 1, - '41': 1, - '42': 1, - '43': 0, - '44': 0, - '48': 1, - }, - totalCovered: 26, - coveredPercent: 93, - }, -]; diff --git a/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts b/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts deleted file mode 100644 index e87764aaa..000000000 --- a/packages/sfpowerscripts-cli/tests/core/git/GitTags.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import GitTags from '../../../src/core/git/GitTags'; -import Git from '../../../src/core/git/Git'; - -import child_process = require('child_process'); - -let tags: string[]; -jest.mock('../../../src/core/git/Git', () => { - class Git { - tag = jest.fn().mockReturnValue(tags); - log = jest.fn().mockReturnValue(gitLog); - getRepositoryPath() - { - return process.cwd(); - } - static async initiateRepo(){ - return new Git(); - } - } - - return Git; -}); - -describe('Given a package, listTagsOnBranch', () => { - beforeEach(() => { - const childProcessMock = jest.spyOn(child_process, 'execSync'); - childProcessMock.mockImplementation(() => showRefs); - }); - - it('should return tags belonging to package, on current branch', async () => { - tags = coreTags; - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual(coreTags.slice(0, 4)); - }); - - it('should return an empty array if there are no tags', async () => { - tags = []; - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual([]); - }); - - it('should return an empty array if there are no tags belonging to package, on current branch', async () => { - tags = coreTags.slice(4); - let git: Git = await Git.initiateRepo(); - const gitTags: GitTags = new GitTags(git, 'core'); - expect(await gitTags.listTagsOnBranch()).toEqual([]); - }); -}); - -// Last two tags are not found on the current branch -const coreTags = [ - 'core_v1.0.0.11', - 'core_v1.0.0.43', - 'core_v1.0.0.48', - 'core_v1.0.0.53', - 'core_v1.0.0.85', - 'core_v1.0.0.163', -]; - -// Commits on current branch -const gitLog = [ - '9d7795b9e2391a93b72ae7cf391f55eac5a869c1', - '65ed6f19bb87d31e56efd49cd50a6a19ba172626', - '9e244f0048f53858fe5e5aff210805389f10e523', - '544b52bea434aed68770adb23c168bb89a35b031', -]; - -const showRefs = Buffer.from( - 'fc29c8bedb5cc32b425825aeec6c5ae054704b85 refs/tags/core_v1.0.0.11\n' + - '9d7795b9e2391a93b72ae7cf391f55eac5a869c1 refs/tags/core_v1.0.0.11^{}\n' + - '4fcb4b948d174e721093ff63ffff59cb220ddd7b refs/tags/core_v1.0.0.43\n' + - '65ed6f19bb87d31e56efd49cd50a6a19ba172626 refs/tags/core_v1.0.0.43^{}\n' + - 'ed45cbda7daee5152db1353960fe0ae3b8ad5ed2 refs/tags/core_v1.0.0.48\n' + - '9e244f0048f53858fe5e5aff210805389f10e523 refs/tags/core_v1.0.0.48^{}\n' + - '9eb7e59ef46890495b4c7d9e6cfb2c5e2ef85851 refs/tags/core_v1.0.0.53\n' + - '544b52bea434aed68770adb23c168bb89a35b031 refs/tags/core_v1.0.0.53^{}\n' + - '4af7e0c6b1f663e5b1c2ecc9e424fba2af8e0d63 refs/tags/core__v1.0.0.85\n' + - '46dd375e91d5c00a0f9b64ee38350171f9cf4e50 refs/tags/core_v1.0.0.85^{}\n' + - '1a5c15c8decb0a939447aebf057e1d0889f4eeb6 refs/tags/core_v1.0.0.163\n' + - '86f2f2d107564b053c40abe66555c354f3b7f0f8 refs/tags/core_v1.0.0.163^{}\n' -); diff --git a/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts b/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts deleted file mode 100644 index d4b739399..000000000 --- a/packages/sfpowerscripts-cli/tests/core/org/ArtifactsToOrg.test.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { ConsoleLogger, VoidLogger } from '@flxblio/sfp-logger'; -import { AnyJson, ensureJsonMap, JsonMap, ensureString } from '@salesforce/ts-types'; -import SFPOrg from '../../../src/core/org/SFPOrg'; -import SfpPackage from '../../../src/core/package/SfpPackage'; - - -const $$ = new TestContext(); -const createOrg = async () => { - - const testData = new MockTestOrgData(); - await $$.stubAuths(testData); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - - return await SFPOrg.create({ aliasOrUsername: testData.username }); -}; - -describe('Fetch a list of sfp artifacts from an org', () => { - it('Return a blank list of sfp artifact, if there are no previously installed artifacts ', async () => { - let org = await createOrg(); - - let records = { records: [] }; - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(records); - }; - - let artifacts = await org.getInstalledArtifacts(); - expect(artifacts).toEqual([]); - }); - - it('Return a list of sfp artifact, if there are previously installed artifacts ', async () => { - let org = await createOrg(); - - let records = { records:[ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'sfp-package', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }, - ]}; - - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(records); - }; - - let artifacts = await org.getInstalledArtifacts(); - let expectedpackage = { - Id: 'a0zR0000003F1FuIAK', - Name: 'sfp-package', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }; - expect(artifacts).toEqual([expectedpackage]); - }); - - it('When unable to fetch, it should return a blank list', async () => { - let org = await createOrg(); - - $$.fakeConnectionRequest = (request) => { - return Promise.reject('Failed'); - }; - - let artifacts = await org.getInstalledArtifacts(); - expect(artifacts).toEqual([]); - },45000); -}); - -describe('Update a sfp artifact to an org', () => { - it('Update a sfp artifact, installing it the first time', async () => { - let org = await createOrg(); - - let records = { records: [] }; - - let pushResult = { - id: 'a0zR0000003F1FuIAK', - success: true, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request = ensureJsonMap(request); - if (_request.method == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function () { - throw new Error('Function not implemented.'); - }, - }; - - let result = await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); - expect(result).toEqual(pushResult.id); - }); - - it('Update a sfp artifact, installing a newer version of it', async () => { - let org = await createOrg(); - - let records = { records : [ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'core', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - } - ]}; - - let pushResult: AnyJson = { - id: 'a0zR0000003F1FuIAK', - success: true, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request: JsonMap = ensureJsonMap(request); - if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function (): any { - throw new Error('Function not implemented.'); - }, - }; - - let result = await org.updateArtifactInOrg(new ConsoleLogger(), sfpPackage); - - expect(result).toEqual(pushResult.id); - }); - - it('Update a sfp artifact and resulting an error,should throw an exception', async () => { - let org = await createOrg(); - - let records={ records : [ - { - Id: 'a0zR0000003F1FuIAK', - Name: 'core', - CommitId__c: '0a516404aa92f02866f9d2725bda5b1b3f23547e', - Version__c: '1.0.0.NEXT', - Tag__c: 'undefined', - }, - ]}; - - let pushResult: AnyJson = { - success: false, - errors: [], - }; - - $$.fakeConnectionRequest = (request) => { - const _request: JsonMap = ensureJsonMap(request); - if (request && ensureString(_request.method) == `GET`) return Promise.resolve(records); - else return Promise.resolve(pushResult); - }; - - let sfpPackage: SfpPackage = { - package_name: 'core', - repository_url: 'https://example.com', - package_version_number: '1.0.0.NEXT', - sourceVersion: '3232x232xc3e', - projectDirectory: '', - workingDirectory: '', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: '', - toJSON: function () { - throw new Error('Function not implemented.'); - }, - }; - - try { - await org.updateArtifactInOrg(new VoidLogger(), sfpPackage); - } catch (error) { - expect(error.message).toContain('Aborted'); - } - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts b/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts deleted file mode 100644 index 0c6af8b2b..000000000 --- a/packages/sfpowerscripts-cli/tests/core/org/ListAllPackages.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AnyJson } from '@salesforce/ts-types'; -import SFPOrg from '../../../src/core/org/SFPOrg'; -import { OrgConfigProperties } from '@salesforce/core'; - -const $$ = new TestContext(); - -describe('Retrieve all packages from devhub', () => { - it('should return all the packages provided a devhub', async () => { - - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { - records: [ - { - attributes: { - type: 'Package2', - url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005000k9bNSXQ', - }, - Id: '0Ho1P005000k9bNSXQ', - Name: 'async-framework', - Description: null, - NamespacePrefix: null, - ContainerOptions: 'Unlocked', - IsOrgDependent: false, - }, - { - attributes: { - type: 'Package2', - url: '/services/data/v53.0/tooling/sobjects/Package2/0Ho1P005100k9bNSXQ', - }, - Id: '0Ho1P005100k9bNSXQ', - Name: 'async-framework2', - Description: null, - NamespacePrefix: null, - ContainerOptions: 'Unlocked', - IsOrgDependent: true, - }, - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - const org: SFPOrg = await SFPOrg.create({ aliasOrUsername: testData.username }); - - let packages = await org.listAllPackages(); - expect(packages).toHaveLength(2); - expect(packages[0].Name).toMatch('async-framework'); - expect(packages[0].Id).toMatch('0Ho1P005000k9bNSXQ'); - expect(packages[0].IsOrgDependent).toMatch('No'); - expect(packages[1].IsOrgDependent).toMatch('Yes'); //Translate true to Yes - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts deleted file mode 100644 index 2b7589393..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/Package2VersionFetcher.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo } from '@salesforce/core'; -import Package2VersionFetcher from '../../../src/core/package/version/Package2VersionFetcher'; -import { AnyJson } from '@salesforce/ts-types'; - -const $$ = new TestContext(); - -let conn: Connection; - -describe("Given a PackageDependencyResolver", () => { - - beforeEach(async () => { - const testData = new MockTestOrgData(); - - testData.makeDevHub(); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: any = { - records: [ - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' - }, - SubscriberPackageVersionId: '04t5i000000V2DiAAK', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 17, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'king' - }, - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' - }, - SubscriberPackageVersionId: '04t5i000000UyCJAA0', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 16, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'king' - } - ], - }; - $$.fakeConnectionRequest = (request: any): Promise => { - return Promise.resolve(records); - }; - conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - }) - it('should return an array of Package2Version records if matching records found', async () => { - // Mock the query method in QueryHelper to return some dummy data - const package2VersionFetcher = new Package2VersionFetcher(conn); - - const result = await package2VersionFetcher.fetchByPackageBranchAndName('king', 'core'); - - expect(result[0].Package2.Name).toEqual('core'); - expect(result[0].Branch).toEqual('king'); - }); - -}); - diff --git a/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts b/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts deleted file mode 100644 index 75a8ed5e4..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/PackageDiffImpl.test.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { jest, expect } from '@jest/globals'; -const fs = require('fs'); -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import PackageDiffImpl, { PackageDiffOptions } from '../../../src/core/package/diff/PackageDiffImpl'; -import ProjectConfig from '../../../src/core/project/ProjectConfig'; - -let gitTags: string[] = []; -let gitDiff: string[] = []; -let gitShow: string = ''; - -jest.mock('../../../src/core/git/Git', () => { - class Git { - diff = jest.fn().mockReturnValue(gitDiff); - show = jest.fn().mockReturnValue(gitShow); - static async initiateRepo(){ - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../src/core/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let ignoreFilterResult: string[] = []; -jest.mock('../../../src/core/ignore/IgnoreFiles', () => { - class IgnoreFiles { - filter = jest.fn().mockReturnValue(ignoreFilterResult); - } - - return IgnoreFiles; -}); - -describe('Determines whether a given package has changed', () => { - beforeEach(() => { - const projectConfigMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - projectConfigMock.mockImplementation(() => { - return JSON.parse(packageConfigJson); - }); - - const fsMock = jest.spyOn(fs, 'readFileSync'); - fsMock.mockImplementation(() => { - return '**README.md'; - }); - }); - - it('should throw error if package does not exist', () => { - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl( - new ConsoleLogger(), - 'UNKNOWN-PACKAGE', - null, - ); - expect(() => packageDiffImpl.exec()).rejects.toThrowError(); - }); - - it('should return true if package metadata has changed', async () => { - gitTags = coreTags; - gitDiff = [`packages/domains/core/X/Y/Z/A-meta.xml`]; - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Found change(s) in package`); - - packageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core-b', null); - result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - - }); - - it('should return true if package descriptor has changed', async () => { - gitTags = coreTags; - gitDiff = ['sfdx-project.json']; - gitShow = packageDescriptorChange; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Package Descriptor Changed`); - }); - - it('should return false even if package descriptor has changed when asked to ignore ', async () => { - gitTags = coreTags; - gitDiff = ['sfdx-project.json']; - gitShow = packageDescriptorChange; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,{skipPackageDescriptorChange:true}); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - }); - - it('should return false if only config file has changed', async () => { - gitDiff = ['config/project-scratch-def.json']; - - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - gitTags = coreTags; - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - expect(result.reason).toEqual(`No changes found`); - }); - - it('should return true if package does not have any tags', async () => { - gitTags = []; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Previous version not found`); - }); - - it('should return true if packageToCommits is an empty object', async () => { - let packageDiffOptions = new PackageDiffOptions(); - packageDiffOptions.packagesMappedToLastKnownCommitId={}; - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null,packageDiffOptions); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(true); - expect(result.reason).toEqual(`Previous version not found`); - }); - - it('should return false if package metadata and package config has not changed', async () => { - gitTags = coreTags; - gitDiff = [`packages/access-mgmt/X/Y/Z/A-meta.xml`, `packages/bi/X/Y/Z/B-meta.xml`]; - // No change in package config - gitShow = packageConfigJson; - - // Assume passthrough filter for ignore - ignoreFilterResult = gitDiff; - - let packageDiffImpl: PackageDiffImpl = new PackageDiffImpl(new ConsoleLogger(), 'core', null); - let result = await packageDiffImpl.exec(); - expect(result.isToBeBuilt).toEqual(false); - expect(result.reason).toEqual(`No changes found`); - }); -}); - -const coreTags = [ - `core_v1.0.0.2`, - `core_v1.0.0.3`, - `core_v1.0.0.5`, - `core_v1.0.0.6`, - `core_v1.0.0.7`, - `core_v1.0.0.8`, - `core_v1.0.0.9`, - `core_v1.0.0.10`, -]; - -const packageConfigJson: string = ` -{ - "packageDirectories": [ - { - "path": "packages/temp", - "default": true, - "package": "temp", - "versionName": "temp", - "versionNumber": "1.0.0.0", - "ignoreOnStage": ["prepare","validate","build"] - }, - { - "path": "packages/domains/core", - "package": "core", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA", - "PermSetB", - "PermSetC" - ] - }, - { - "path": "packages/domains/core-b", - "package": "core-b", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA", - "PermSetB", - "PermSetC" - ] - }, - { - "path": "packages/frameworks/mass-dataload", - "package": "mass-dataload", - "default": false, - "type":"data", - "versionName": "mass-dataload", - "versionNumber": "1.0.0.0" - }, - { - "path": "packages/access-mgmt", - "package": "access-mgmt", - "default": false, - "versionName": "access-mgmt", - "versionNumber": "1.0.0.0", - "reconcileProfiles": "true" - }, - { - "path": "packages/bi", - "package": "bi", - "default": false, - "versionName": "bi", - "versionNumber": "1.0.0.0", - "ignoreOnStage":["prepare","validate"] - } - ], - "namespace": "", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "50.0", - "packageAliases": { - "bi":"0x002232323232", - "core":"0H04X00000000XXXXX" - } -}`; - -const packageDescriptorChange: string = ` -{ - "packageDirectories": [ - { - "path": "packages/temp", - "default": true, - "package": "temp", - "versionName": "temp", - "versionNumber": "1.0.0.0", - "ignoreOnStage": ["prepare","validate","build"] - }, - { - "path": "packages/domains/core", - "package": "core", - "default": false, - "versionName": "covax", - "versionNumber": "1.0.0.0", - "assignPermSetsPreDeployment": [ - "PermSetA" - ] - }, - { - "path": "packages/frameworks/mass-dataload", - "package": "mass-dataload", - "default": false, - "type":"data", - "versionName": "mass-dataload", - "versionNumber": "1.0.0.0" - }, - { - "path": "packages/access-mgmt", - "package": "access-mgmt", - "default": false, - "versionName": "access-mgmt", - "versionNumber": "1.0.0.0", - "reconcileProfiles": "true" - }, - { - "path": "packages/bi", - "package": "bi", - "default": false, - "versionName": "bi", - "versionNumber": "1.0.0.0", - "ignoreOnStage":["prepare","validate"] - } - ], - "namespace": "", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "50.0", - "packageAliases": { - "bi":"0x002232323232", - "core":"0H04X00000000XXXXX" - } -} -`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts b/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts deleted file mode 100644 index e9acf2b69..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/PackageManifest.test.ts +++ /dev/null @@ -1,300 +0,0 @@ -import fs from 'fs-extra'; -import { jest, expect } from '@jest/globals'; -import PackageManifest from '../../../src/core/package/components/PackageManifest'; - -describe('Given a mdapi directory that contains manifest file', () => { - beforeEach(() => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML; - }); - }); - - it('should return the manifest in json format', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON); - }); - - it('should return the manifest in xml format', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.manifestXml).toEqual(packageManifestXML); - }); - - it('should return true if there is apex', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isApexInPackage()).toBe(true); - }); - - it('should return undefined if there are no triggers', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.fetchTriggers()).toBe(undefined); - }); - - it('should return false if there are no profiles', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isProfilesInPackage()).toBe(false); - }); - - it('should return false if there are no permission set groups', async () => { - const packageManifest: PackageManifest = await PackageManifest.create('mdapi'); - expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(false); - }); -}); - -describe('Given a list of components', () => { - it('should create a package manifest from scratch', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest).toBeInstanceOf(PackageManifest); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON_b); - expect(packageManifest.manifestXml).toEqual(packageManifestXML_b); - }); - - it('should fetch triggers', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.fetchTriggers()).toEqual(['ContractTrigger']); - }); - - it('should return true if there are permission set groups ', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.isPermissionSetGroupsFoundInPackage()).toBe(true); - }); - - it('should return true if there are profiles', () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - - expect(packageManifest.isProfilesInPackage()).toBe(true); - }); - - it('should return true if there are types supported by profiles', async () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - expect(packageManifest.isPayLoadContainTypesSupportedByProfiles()).toBe(true); - }); - - it('should return true if there are types other than', async () => { - const packageManifest: PackageManifest = PackageManifest.createFromScratch(components, '50.0'); - expect(packageManifest.isPayloadContainTypesOtherThan('Profile')).toBe(true); - }); -}); - -describe('Given a manifest json payload', () => { - it('should create an instance of PackageManifest', async () => { - const packageManifest: PackageManifest = await PackageManifest.createWithJSONManifest(packageManifestJSON); - - expect(packageManifest).toBeInstanceOf(PackageManifest); - expect(packageManifest.manifestJson).toEqual(packageManifestJSON); - expect(packageManifest.manifestXml).toEqual(packageManifestXML); - }); -}); - -const components: { fullName: string; type: string }[] = [ - { - fullName: 'ContractService', - type: 'ApexClass', - }, - { - fullName: 'ContractTrigger', - type: 'ApexTrigger', - }, - { - fullName: 'ContractVariables__mdt-ContractVariables Layout', - type: 'Layout', - }, - { - fullName: 'Contract.Reason__c', - type: 'CustomField', - }, - { - fullName: 'Contract.ContractTerm__c', - type: 'CustomField', - }, - { - fullName: 'Contract', - type: 'CustomObject', - }, - { - fullName: 'ContractPermissionSetGroup', - type: 'PermissionSetGroup', - }, - { - fullName: 'Contractor', - type: 'Profile', - }, -]; - -const packageManifestJSON_b = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: [ - { - name: 'ApexClass', - members: ['ContractService'], - }, - { - name: 'ApexTrigger', - members: ['ContractTrigger'], - }, - { - name: 'Layout', - members: ['ContractVariables__mdt-ContractVariables Layout'], - }, - { - name: 'CustomField', - members: ['Contract.Reason__c', 'Contract.ContractTerm__c'], - }, - { - name: 'CustomObject', - members: ['Contract'], - }, - { - name: 'PermissionSetGroup', - members: ['ContractPermissionSetGroup'], - }, - { - name: 'Profile', - members: ['Contractor'], - }, - ], - version: '50.0', - }, -}; - -const packageManifestXML_b: string = ` - - - ApexClass - ContractService - - - ApexTrigger - ContractTrigger - - - Layout - ContractVariables__mdt-ContractVariables Layout - - - CustomField - Contract.Reason__c - Contract.ContractTerm__c - - - CustomObject - Contract - - - PermissionSetGroup - ContractPermissionSetGroup - - - Profile - Contractor - - 50.0 -`; - -const packageManifestJSON = { - Package: { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [ - { - name: 'AuraDefinitionBundle', - members: ['openRecordAction', 'selectObject'], - }, - { - name: 'ApexClass', - members: [ - 'CustomerServices', - 'CustomerServicesTest', - 'MarketServices', - 'MarketServicesTest', - 'TestDataFactory', - ], - }, - { - name: 'CustomMetadata', - members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], - }, - { - name: 'Layout', - members: 'Customer_Fields__mdt-Customer Fields Layout', - }, - { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, - { - name: 'LightningMessageChannel', - members: ['Flow_Status_Change', 'Tile_Selection'], - }, - { name: 'CustomObject', members: 'Customer_Fields__mdt' }, - { - name: 'CustomField', - members: [ - 'Customer_Fields__mdt.Customer_City__c', - 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', - 'Customer_Fields__mdt.Customer_Email__c', - 'Customer_Fields__mdt.Customer_Name__c', - 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', - 'Customer_Fields__mdt.Customer_State__c', - 'Customer_Fields__mdt.Customer_Status__c', - 'Customer_Fields__mdt.Sobject_Type__c', - ], - }, - ], - version: '50.0', - }, -}; - -const packageManifestXML: string = ` - - - AuraDefinitionBundle - openRecordAction - selectObject - - - ApexClass - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - - CustomMetadata - Customer_Fields.Contact_Customer_Fields - Customer_Fields.Lead_Customer_Fields - - - Layout - Customer_Fields__mdt-Customer Fields Layout - - - LightningComponentBundle - errorPanel - ldsUtils - - - LightningMessageChannel - Flow_Status_Change - Tile_Selection - - - CustomObject - Customer_Fields__mdt - - - CustomField - Customer_Fields__mdt.Customer_City__c - Customer_Fields__mdt.Customer_Draft_Status_Values__c - Customer_Fields__mdt.Customer_Email__c - Customer_Fields__mdt.Customer_Name__c - Customer_Fields__mdt.Customer_Reservation_Status_Value__c - Customer_Fields__mdt.Customer_State__c - Customer_Fields__mdt.Customer_Status__c - Customer_Fields__mdt.Sobject_Type__c - - 50.0 -`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts b/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts deleted file mode 100644 index fa6936479..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/SFPackageBuilder.test.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import SfpPackage, { PackageType, SfpPackageParams } from '../../../src/core/package/SfpPackage'; -import SfpPackageBuilder, { PackageCreationParams } from '../../../src/core/package/SfpPackageBuilder'; -import * as fs from "fs-extra"; -import { Logger } from '@flxblio/sfp-logger'; - - -let packageType = PackageType.Source; -jest.mock('../../../src/core/project/ProjectConfig', () => { - class ProjectConfig { - static getSFDXPackageDescriptor(projectDirectory, sfdx_package) { - return { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - } - - static getSFDXProjectConfig(projectDirectory) { - return { - packageDirectories: [ - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - }; - } - static getPackageType(projectConfig: any, sfdxPackage: string) { - return packageType; - } - } - return ProjectConfig; -}); - -jest.mock('../../../src/core/package/generators/SfpPackageContentGenerator', () => { - class SfpPackageContentGenerator { - static async generateSfpPackageDirectory( - projectDirectory: string, - projectConfig: any, - sfdx_package: string, - packageDirectory: string, - destructiveManifestFilePath?: string, - configFilePath?: string, - pathToReplacementForceIgnore?: string - ): Promise { - return '.sfp/3sIRD_source'; - } - } - - return SfpPackageContentGenerator; -}); - -jest.mock('../../../src/core/package/packageFormatConvertors/SourceToMDAPIConvertor', () => { - class SourceToMDAPIConvertor { - convert = jest.fn().mockReturnValueOnce(Promise.resolve({ packagePath: 'mdapidir' })); - } - return SourceToMDAPIConvertor; -}); - -jest.mock('../../../src/core/package/components/MetadataCount', () => { - class MetadataCount { - static getMetadataCount = jest.fn().mockReturnValue(Promise.resolve(20)); - } - return MetadataCount; -}); - -jest.mock('../../../src/core/apex/parser/ApexTypeFetcher', () => { - class ApexTypeFetcher { - getClassesClassifiedByType = jest.fn(); - getTestClasses = jest - .fn() - .mockReturnValue( - new Array( - 'AccountTriggerHandlerTest', - 'Generate_Dose_Admin_PdfTest', - 'RecordHunterController_Test', - 'SObjectController2Test', - 'Send_Receipt_Test', - 'TestDataFactory', - 'TestFileRestriction', - 'appoinmentSchedulerControllerTest' - ) - ); - - getClassesOnlyExcludingTestsAndInterfaces = jest - .fn() - .mockReturnValue( - new Array( - 'AccountTriggerHandler', - 'Data_TableV2_Controller', - 'Generate_Dose_Admin_Pdf', - 'Generate_QR_Code', - 'RecordHunterController', - 'RecordHunterField', - 'RecordHunterLexer', - 'SObjectController2', - 'Send_Receipt' - ) - ); - } - - return ApexTypeFetcher; -}); - -jest.mock('../../../src/core/package/packageCreators/CreateUnlockedPackageImpl', () => { - class CreateUnlockedPackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) {} - - public async exec(): Promise { - return this.sfpPackage; - } - } - return CreateUnlockedPackageImpl; -}); - -// jest.mock('../../src/package/packageCreators/CreatePackage', () => { -// class CreatePackage { -// public constructor( -// protected projectDirectory: string, -// protected sfpPackage: SfpPackage, -// protected packageCreationParams: PackageCreationParams, -// protected logger?: Logger, -// protected params?: SfpPackageParams -// ) {} -// } -// return CreatePackage; -// }); - -jest.mock('../../../src/core/package/packageCreators/CreateSourcePackageImpl', () => { - - - class CreateSourcePackageImpl { - public constructor( - protected projectDirectory: string, - protected sfpPackage: SfpPackage, - protected packageCreationParams: PackageCreationParams, - protected logger?: Logger, - protected params?: SfpPackageParams - ) { - - } - - public async exec(): Promise { - this.sfpPackage.packageType = PackageType.Source; - return this.sfpPackage; - } - getTypeOfPackage() {} - isEmptyPackage(projectDirectory: string, packageDirectory: string){} - preCreatePackage(sfpPackage: SfpPackage) {} - createPackage(sfpPackage: SfpPackage) {} - postCreatePackage(sfpPackage: SfpPackage) {} - printAdditionalPackageSpecificHeaders() {} - } - return CreateSourcePackageImpl; -}); - -describe.skip('Given a sfdx package, build a sfp package', () => { - it('should build a sfp package', async () => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML; - }); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - null, - null, - 'ESBaseCodeLWC' - ); - expect(sfpPackage.isProfilesFound).toStrictEqual(false); - expect(sfpPackage.isApexFound).toStrictEqual(true); - expect(sfpPackage.isPermissionSetGroupFound).toStrictEqual(true); - expect(sfpPackage.triggers).toBeUndefined(); - expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); - expect(sfpPackage.payload).toStrictEqual(packageManifestJSON); - expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); - expect(sfpPackage.packageDescriptor).toStrictEqual({ - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }); - expect(sfpPackage.apexTestClassses).toStrictEqual( - new Array( - 'AccountTriggerHandlerTest', - 'Generate_Dose_Admin_PdfTest', - 'RecordHunterController_Test', - 'SObjectController2Test', - 'Send_Receipt_Test', - 'TestDataFactory', - 'TestFileRestriction', - 'appoinmentSchedulerControllerTest' - ) - ); - expect(sfpPackage.apexClassWithOutTestClasses).toStrictEqual( - new Array( - 'AccountTriggerHandler', - 'Data_TableV2_Controller', - 'Generate_Dose_Admin_Pdf', - 'Generate_QR_Code', - 'RecordHunterController', - 'RecordHunterField', - 'RecordHunterLexer', - 'SObjectController2', - 'Send_Receipt' - ) - ); - }); - - it('should build a sfp package when there is only one type', async () => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return packageManifestXML2; - }); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory( - null, - null, - 'ESBaseCodeLWC' - ); - expect(sfpPackage.isProfilesFound).toStrictEqual(true); - expect(sfpPackage.isApexFound).toStrictEqual(false); - expect(sfpPackage.triggers).toBeUndefined(); - expect(sfpPackage.packageType).toStrictEqual(PackageType.Source); - expect(sfpPackage.mdapiDir).toStrictEqual('mdapidir'); - expect(sfpPackage.packageDescriptor).toStrictEqual({ - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }); - expect(sfpPackage.isPayLoadContainTypesSupportedByProfiles).toStrictEqual(false); - }); -}); - -let packageManifestJSON = { - Package: { - $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, - types: [ - { - name: 'AuraDefinitionBundle', - members: ['openRecordAction', 'selectObject'], - }, - { - name: 'ApexClass', - members: [ - 'CustomerServices', - 'CustomerServicesTest', - 'MarketServices', - 'MarketServicesTest', - 'TestDataFactory', - ], - }, - { - name: 'CustomMetadata', - members: ['Customer_Fields.Contact_Customer_Fields', 'Customer_Fields.Lead_Customer_Fields'], - }, - { - name: 'Layout', - members: 'Customer_Fields__mdt-Customer Fields Layout', - }, - { name: 'LightningComponentBundle', members: ['errorPanel', 'ldsUtils'] }, - { - name: 'LightningMessageChannel', - members: ['Flow_Status_Change', 'Tile_Selection'], - }, - { name: 'CustomObject', members: 'Customer_Fields__mdt' }, - { name: 'PermissionSetGroup', members: 'TestPermissionSetGroup' }, - { - name: 'CustomField', - members: [ - 'Customer_Fields__mdt.Customer_City__c', - 'Customer_Fields__mdt.Customer_Draft_Status_Values__c', - 'Customer_Fields__mdt.Customer_Email__c', - 'Customer_Fields__mdt.Customer_Name__c', - 'Customer_Fields__mdt.Customer_Reservation_Status_Value__c', - 'Customer_Fields__mdt.Customer_State__c', - 'Customer_Fields__mdt.Customer_Status__c', - 'Customer_Fields__mdt.Sobject_Type__c', - ], - }, - ], - version: '50.0', - }, -}; - -let packageManifestXML: string = ` - - - - AuraDefinitionBundle - openRecordAction - selectObject - - - ApexClass - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - - CustomMetadata - Customer_Fields.Contact_Customer_Fields - Customer_Fields.Lead_Customer_Fields - - - Layout - Customer_Fields__mdt-Customer Fields Layout - - - LightningComponentBundle - errorPanel - ldsUtils - - - LightningMessageChannel - Flow_Status_Change - Tile_Selection - - - CustomObject - Customer_Fields__mdt - - - PermissionSetGroup - TestPermissionSetGroup - - - CustomField - Customer_Fields__mdt.Customer_City__c - Customer_Fields__mdt.Customer_Draft_Status_Values__c - Customer_Fields__mdt.Customer_Email__c - Customer_Fields__mdt.Customer_Name__c - Customer_Fields__mdt.Customer_Reservation_Status_Value__c - Customer_Fields__mdt.Customer_State__c - Customer_Fields__mdt.Customer_Status__c - Customer_Fields__mdt.Sobject_Type__c - - 50.0 - -`; - -let packageManifestXML2: string = ` - - - - Profile - CustomerServices - CustomerServicesTest - MarketServices - MarketServicesTest - TestDataFactory - - 50.0 - -`; diff --git a/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts b/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts deleted file mode 100644 index 437c055d5..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/analysers/FHTAnalyzer.test.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import FHTAnalyser from '../../../../src/core/package/analyser/FHTAnalyzer'; -import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; -const fs = require('fs-extra'); -import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; -import { VoidLogger } from '@flxblio/sfp-logger'; - -let isYamlFileFound: boolean = true; - -describe('FHT Analyzer', () => { - beforeEach(() => { - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - Account: - - Name - - Phone - Contact: - - Name - - Phone - `; - }); - const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); - fsExistSyncMock.mockImplementationOnce(() => { - return isYamlFileFound; - }); - }); - - it('Should not be enabled for data packages', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Data, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); - }); - - it('Should be enabled for source packages by default', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Source, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it('Should be enabled for unlocked packages by default', async () => { - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await fhtAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - }); - - it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); - }); - - it(' When a yaml is provided, package has no history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Account).toStrictEqual(['Name', 'Phone']); - expect(fhtFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(fhtFields).not.toHaveProperty('Test__c'); - }); - - it(' When no yaml is provided, package has history enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = false; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let fhtAnalyzer = new FHTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await fhtAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFHTFieldFound']).toBe(true); - expect(sfpPackage['fhtFields']).toBeDefined(); - let fhtFields = sfpPackage['fhtFields']; - expect(fhtFields.Test__c).toStrictEqual(['AccountManager__c']); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts b/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts deleted file mode 100644 index bc78d22b0..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/analysers/FTAnalyzer.test.ts +++ /dev/null @@ -1,363 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import FTAnalyser from '../../../../src/core/package/analyser/FTAnalyzer'; -import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; -const fs = require('fs-extra'); -import { ComponentSet, SourceComponent, registry, VirtualDirectory } from '@salesforce/source-deploy-retrieve'; -import { VoidLogger } from '@flxblio/sfp-logger'; - -let isYamlFileFound: boolean = true; - -describe('FT Analyzer', () => { - beforeEach(() => { - const fsReadMock = jest.spyOn(fs, 'readFileSync'); - fsReadMock.mockImplementationOnce(() => { - return ` - Account: - - Name - - Phone - Contact: - - Name - - Phone - `; - }); - const fsExistSyncMock = jest.spyOn(fs, 'existsSync'); - fsExistSyncMock.mockImplementationOnce(() => { - return isYamlFileFound; - }); - }); - - it('Should not be enabled for data packages', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Data, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(false); - }); - - it('Should be enabled for source packages by default', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Source, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it('Should be enabled for unlocked packages by default', async () => { - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: process.cwd(), - workingDirectory: 'force-app', - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - expect(await ftAnalyzer.isEnabled(sfpPackage,new VoidLogger())).toBe(true); - }); - - it(' When a yaml is provided and no additional fields, a sfpPackage with additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - }); - - it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); - }); - - it(' When a yaml is provided, package has no feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = true; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - false - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Account).toStrictEqual(['Name', 'Phone']); - expect(ftFields.Contact).toStrictEqual(['Name', 'Phone']); - expect(ftFields).not.toHaveProperty('Test__c'); - }); - - it(' When no yaml is provided, package has feed enabled fields, a sfpPackage with combined additional properties should be created', async () => { - - - isYamlFileFound = false; - - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/main/default/object/Test__c/fields', - children: [ - { - name: 'AccountManager__c.field-meta.xml', - data: Buffer.from(` - - AccountManager__c - false - Account.AccountOwner__c - BlankAsZero - - false - false - true - false - Text - false - `), - }, - ], - }, - ]; - const customField = SourceComponent.createVirtualComponent( - { - name: 'AccountManager__c', - type: registry.types.customobject.children.types.customfield, - xml: '/main/default/object/Test__c/fields/AccountManager__c.field-meta.xml', - parent: SourceComponent.createVirtualComponent({ - name: 'Test__c', - type: registry.types.customobject, - xml: '/main/default/object/Test__c.object-meta.xml', - }), - }, - virtualFs - ); - - set.add(customField); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementationOnce(() => { - return set; - }); - - let ftAnalyzer = new FTAnalyser(); - let sfpPackage: SfpPackage = { - projectDirectory: '', - packageDirectory: 'force-app', - workingDirectory: process.cwd(), - mdapiDir: '', - destructiveChangesPath: '', - resolvedPackageDirectory: '', - version: '', - packageName: '', - versionNumber: '', - packageType: PackageType.Unlocked, - package_name: '', - toJSON: function (): any { - return ''; - }, - }; - sfpPackage = await ftAnalyzer.analyze(sfpPackage,set,new VoidLogger()); - expect(sfpPackage['isFTFieldFound']).toBe(true); - expect(sfpPackage['ftFields']).toBeDefined(); - let ftFields = sfpPackage['ftFields']; - expect(ftFields.Test__c).toStrictEqual(['AccountManager__c']); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts b/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts deleted file mode 100644 index fa3ab1d6e..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/coverage/PackageTestCoverage.test.ts +++ /dev/null @@ -1,330 +0,0 @@ -import PackageTestCoverage from '../../../../src/core/package/coverage/PackageTestCoverage'; -import { jest, expect } from '@jest/globals'; -import { ConsoleLogger, Logger } from '@flxblio/sfp-logger'; -import ApexClassFetcher from '../../../../src/core/apex/ApexClassFetcher'; -import ApexTriggerFetcher from '../../../../src/core/apex/ApexTriggerFetcher'; -import ApexCodeCoverageAggregateFetcher from '../../../../src/core/apex/coverage/ApexCodeCoverageAggregateFetcher'; - -import { AuthInfo, ConfigAggregator, Connection, Org, OrgConfigProperties } from '@salesforce/core'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import SfpPackage, { PackageType } from '../../../../src/core/package/SfpPackage'; -import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; -const $$ = new TestContext(); - -let packageType = PackageType.Unlocked; - - - -jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.apexClassWithOutTestClasses = new Array('CustomerServices', 'MarketServices'); - sfpPackage.triggers = new Array('AccountTrigger'); - sfpPackage.packageType = packageType; - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - - -const setupConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; - } - - - -describe('Given a sfp package and code coverage report, a package coverage calculator', () => { - it('should be able to provide the coverage of a provided unlocked package', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); - }); - - it('should able to validate whether the coverage of unlocked package is above a certain threshold', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 80; - let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should able to validate whether the coverage of unlocked package is above mandatory threshold', async () => { - const conn = await setupConnection(); - - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 75; - let result = await packageTestCoverage.validateTestCoverage(); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Package overall coverage is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should be able to provide the coverage of a provided source package', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - expect(await packageTestCoverage.getCurrentPackageTestCoverage()).toBe(89); - }); - - it('should able to validate whether the coverage of source package is above a certain threshold', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 80; - let result = await packageTestCoverage.validateTestCoverage(requiredCoverage); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should able to validate whether the coverage of source package is above mandatory threshold', async () => { - const conn = await setupConnection(); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - succesfulTestCoverage, - new ConsoleLogger(), - conn - ); - let requiredCoverage = 75; - let result = await packageTestCoverage.validateTestCoverage(); - expect(result.result).toBe(true); - expect(result.packageTestCoverage).toBe(89); - expect(result.message).toStrictEqual(`Individidual coverage of classes is greater than ${requiredCoverage}%`); - expect(result.classesCovered).toStrictEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 100 }, - { name: 'AccountTrigger', coveredPercent: 100 }, - ]); - expect(result.classesWithInvalidCoverage).toBeUndefined(); - }); - - it('should account for untouched classes and triggers when calculating package test coverage', async () => { - const conn = await setupConnection(); - - jest.spyOn(ApexClassFetcher.prototype, 'fetchApexClassByName').mockResolvedValue([ - { Id: '01p0w000001n1SfAAI', Name: 'MarketServices' }, - ]); - jest.spyOn(ApexTriggerFetcher.prototype, 'fetchApexTriggerByName').mockResolvedValue([ - { Id: '01p2O000003s9qcQAA', Name: 'AccountTrigger' }, - ]); - jest.spyOn(ApexCodeCoverageAggregateFetcher.prototype, 'fetchACCAById').mockResolvedValue([ - { ApexClassOrTriggerId: '01p0w000001n1SfAAI', NumLinesCovered: 0, NumLinesUncovered: 3, Coverage: {} }, - { ApexClassOrTriggerId: '01p2O000003s9qcQAA', NumLinesCovered: 0, NumLinesUncovered: 4, Coverage: {} }, - ]); - - packageType = PackageType.Source; - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, 'es-base-code', null, null); - let packageTestCoverage: PackageTestCoverage = new PackageTestCoverage( - sfpPackage, - testCoverageWithUntouchedClasses, - new ConsoleLogger(), - conn - ); - let result = await packageTestCoverage.validateTestCoverage(); - - expect(result.result).toBe(false); - expect(result.packageTestCoverage).toBe(71); - expect(result.classesCovered).toEqual([ - { name: 'CustomerServices', coveredPercent: 87.09677419354838 }, - { name: 'MarketServices', coveredPercent: 0 }, - { name: 'AccountTrigger', coveredPercent: 0 }, - ]); - expect(result.classesWithInvalidCoverage).toEqual([ - { name: 'MarketServices', coveredPercent: 0 }, - { name: 'AccountTrigger', coveredPercent: 0 }, - ]); - }); -}); - -let succesfulTestCoverage = [ - { - id: '01p0w000001n1SdAAI', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87.09677419354838, - }, - { - id: '01p0w000001n1SfAAI', - name: 'MarketServices', - totalLines: 3, - lines: { - '3': 1, - '4': 1, - '16': 1, - }, - totalCovered: 3, - coveredPercent: 100, - }, - { - id: '01p2O000003s9qcQAA', - name: 'AccountTrigger', - totalLines: 4, - lines: { - '3': 1, - '5': 1, - '10': 1, - '11': 1, - }, - totalCovered: 4, - coveredPercent: 100, - }, -]; - -const testCoverageWithUntouchedClasses = [ - { - id: '01p0w000001n1SdAAI', - name: 'CustomerServices', - totalLines: 31, - lines: { - '3': 1, - '4': 1, - '5': 1, - '13': 1, - '15': 1, - '16': 1, - '17': 1, - '18': 1, - '19': 1, - '20': 1, - '21': 1, - '22': 1, - '25': 1, - '31': 1, - '34': 1, - '37': 1, - '40': 1, - '43': 0, - '46': 0, - '49': 1, - '57': 1, - '58': 1, - '59': 1, - '60': 1, - '61': 1, - '62': 1, - '63': 1, - '64': 1, - '65': 0, - '66': 1, - '67': 0, - }, - totalCovered: 27, - coveredPercent: 87.09677419354838, - }, -]; diff --git a/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts b/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts deleted file mode 100644 index 0a27c92a1..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/dependencies/PackageDependencyResolver.test.ts +++ /dev/null @@ -1,346 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; -import PackageDependencyResolver from '../../../../src/core/package/dependencies/PackageDependencyResolver'; -const $$ = new TestContext(); - -const setupFakeConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(response); - }; - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; -} - -jest.mock('../../../../src/core/git/Git', () => { - class Git { - static async initiateRepo() - { - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../../src/core/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let conn: Connection; -let gitTags; -let response; - -describe("Given a PackageDependencyResolver", () => { - - beforeEach(async () => { - conn = await setupFakeConnection(); - gitTags = coreGitTags; - response = coreResponse; - }) - - it("should resolve package dependencies to current branch", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management", "contact-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.2"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.2"); - }); - - it("should skip dependency resolution for packages that are not queued for build", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should skip dependencies on packages from the same build", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["core", "candidate-management", "contact-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - let packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - let coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - - packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "contact-management"); - coreDependency = packageDescriptor.dependencies.find(dependency => dependency.package === "core"); - expect(coreDependency.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should skip dependencies on a subscriber package version id", async () => { - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - const packageDescriptor = resolvedProjectConfig.packageDirectories.find((dir) => dir.package === "candidate-management"); - const techFrameworkDependency = packageDescriptor.dependencies.find(dependency => dependency.package.startsWith("tech-framework")); - expect(techFrameworkDependency.versionNumber).toBeUndefined(); - }); - - it("should throw if dependency package version cannot be found for current branch ", async () => { - gitTags = []; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - - it("should throw if there are no validated dependency package versions", async () => { - response = {records: []}; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["candidate-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - - it("should throw if there are no validated dependency package id", async () => { - response = {records: []}; - const packageDependencyResolver = new PackageDependencyResolver(conn, falseProjectConfig, ["contact-management"]); - expect(() => {return packageDependencyResolver.resolvePackageDependencyVersions()}).rejects.toThrow(); - }); - it('should return the latest branched package version id if matching records found', async () => { - // Mock the query method in QueryHelper to return some dummy data - response = { - records: [ - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNPWAA4' - }, - SubscriberPackageVersionId: '04t5i000000V2DiAAK', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 17, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'inspection' - }, - { - attributes: { - type: 'Package2Version', - url: '/services/data/v57.0/tooling/sobjects/Package2Version/05i5i000000TNOiAAO' - }, - SubscriberPackageVersionId: '04t5i000000UyCJAA0', - Package2Id: '0Ho5i000000sYaWCAU', - Package2: { attributes: [Object], Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 0, - MinorVersion: 1, - PatchVersion: 0, - BuildNumber: 16, - CodeCoverage: { apexCodeCoveragePercentage: 100 }, - HasPassedCodeCoverageCheck: true, - Branch: 'inspection' - } - ], - }; - const packageDependencyResolver = new PackageDependencyResolver(conn, projectConfig, ["inspections"]); - const resolvedProjectConfig = await packageDependencyResolver.resolvePackageDependencyVersions(); - - expect(resolvedProjectConfig.packageAliases['core@0.1.0.17-inspection']).toEqual('04t5i000000V2DiAAK'); - }); - - // TODO: test cache -}); - -let coreGitTags = ['core_v1.0.0.2']; - -let coreResponse = { - records: [ - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx3', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 3, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx2', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 2, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - { - SubscriberPackageVersionId: '04t1P00000xxxxxxx1', - Package2Id: '0Ho4a00000000xxxxx', - Package2: { Name: 'core' }, - IsPasswordProtected: false, - IsReleased: false, - MajorVersion: 1, - MinorVersion: 0, - PatchVersion: 0, - BuildNumber: 1, - CodeCoverage: { apexCodeCoveragePercentage: 80 }, - HasPassedCodeCoverageCheck: true - }, - ] -} - -const projectConfig = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST', - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/inspections', - package: 'inspections', - default: false, - versionName: 'inspections-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST', - branch: 'inspection' - } - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "core": '0Ho4a00000000xxxxx', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2' - } -}; - -const falseProjectConfig = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2' - } -}; - diff --git a/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts b/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts deleted file mode 100644 index ff8343eb2..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/dependencies/TransitiveDependencyResolver.test.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo, OrgConfigProperties, ConfigAggregator } from '@salesforce/core'; -import TransitiveDependencyResolver from '../../../../src/core/package/dependencies/TransitiveDependencyResolver'; -const $$ = new TestContext(); - -const setupFakeConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(response); - }; - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; -} - -jest.mock('../../../../src/core/git/Git', () => { - class Git { - static async initiateRepo() - { - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../../src/core/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let conn: Connection; -let gitTags; -let response; - -describe("Given a TransitiveDependencyResolver", () => { - - beforeEach(async () => { - conn = await setupFakeConnection(); - - }) - - it("should resolve missing package dependencies with transitive dependency", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - let resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let dependencies = resolvedDependencies.get('candidate-management'); - expect(dependencies?.find(dependency => dependency.package === "temp")).toBeTruthy(); - expect(dependencies?.find(dependency => dependency.package === "temp")?.versionNumber).toBe("1.0.0.LATEST"); - }); - - it("should resolve package dependencies in the same order as its dependent packages", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let baseIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "base"); - expect(baseIndex).toBe(2); - let tempIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "temp"); - expect(tempIndex).toBe(3); - let coreIndex = resolvedDependencies.get('candidate-management')?.findIndex(dependency => dependency.package === "core"); - expect(coreIndex).toBe(4); - - }); - - - it("should resolve package dependencies with a higher version of a given package if a higher version is specified", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - - let dependencies = resolvedDependencies.get('quote-management'); - expect(dependencies?.find(dependency => dependency.package === "core")?.versionNumber).toBe("1.2.0.LATEST"); - - }); - - it("should have only one version of a package", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - expect(verifyUniquePkgs(resolvedDependencies.get('quote-management'))).toBeTruthy(); - - }); - - it("should expand the dependencies of external packages", async () => { - const transitiveDependencyResolver = new TransitiveDependencyResolver(projectConfig); - const resolvedDependencies = await transitiveDependencyResolver.resolveTransitiveDependencies(); - let externalDependencyIndex = resolvedDependencies.get('contact-management')?.findIndex(dependency => dependency.package === "sfdc-framework"); - expect(externalDependencyIndex).toBe(0); - - }); - - function verifyUniquePkgs(arr) { - let pkgs = {}; - for (let i = 0; i < arr.length; i++) { - if (arr[i].hasOwnProperty('package')) { - if (pkgs.hasOwnProperty(arr[i].package)) { - return false; - } - pkgs[arr[i].package] = true; - } - } - return true; - } - - - // TODO: test cache -}); - -const projectConfig = { - packageDirectories: [ - { - path: 'packages/base', - default: true, - package: 'base', - versionName: 'temp', - versionNumber: '1.0.2.NEXT', - }, - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'base', - versionNumber: '1.0.2.LATEST' - } - ] - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'temp', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - }, - { - package: 'candidate-management', - versionNumber: '1.0.0.LATEST' - }, - ] - }, - { - path: 'packages/quote-management', - package: 'quote-management', - default: false, - versionName: 'quote-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.2.0.LATEST' - }, - { - package: 'candidate-management', - versionNumber: '1.0.0.LATEST' - }, - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "candidate-management": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2', - "sfdc-framework":"04t1000x00x00x" - }, - "plugins": { - "sfp": { - "disableTransitiveDependencyResolver": false, - "externalDependencyMap": { - "tech-framework@2.0.0.38": [ - { - "package": "sfdc-framework" - } - ] - } - } - } -}; - diff --git a/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts b/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts deleted file mode 100644 index cce32d2ff..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/deploymentFilters/EntitlementVersionFilter.test.ts +++ /dev/null @@ -1,500 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext, } from '@salesforce/core/lib/testSetup'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { AnyJson } from '@salesforce/ts-types'; -import SFPOrg from '../../../../src/core/org/SFPOrg'; -import { ComponentSet, VirtualDirectory, VirtualTreeContainer } from '@salesforce/source-deploy-retrieve'; -import EntitlementVersionFilter from '../../../../src/core/package/deploymentFilters/EntitlementVersionFilter'; -import { OrgConfigProperties } from '@salesforce/core'; - -const fs = require('fs-extra'); - - -const $$ = new TestContext(); -const createOrg = async () => { - const testData = new MockTestOrgData(); - - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - - return await SFPOrg.create({ aliasOrUsername: testData.username }); -}; - -let entitlementSetting:any={}; -jest.mock('../../../../src/core/metadata/MetadataFetcher', () => { - class MetadataFetcher { - getSetttingMetadata= jest.fn().mockReturnValue(entitlementSetting) - } - - return MetadataFetcher; -}); - - -describe('Filter entitlements during deployment', () => { - - beforeEach(() => { - const fsMock = jest.spyOn(fs, 'writeFileSync'); - fsMock.mockImplementationOnce(() => { - return ; - }); - }); - - it('Should return a component set by filtering entitlement versions which are existing in the org', async () => { - - let org = await createOrg(); - let records: AnyJson = { - records: [ - { - Name: 'TestEntitlement1', - NameNorm: 'testentitlement1_v1', - VersionNumber: 1, - VersionMaster:'5522N000000c01Q', - } - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_2) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - entitlementSetting={ - "enableEntitlementVersioning":true - }; - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); - - - - }); - - it('Should only return component sets when the version number is higher than whats existing in the org', async () => { - entitlementSetting={enableEntitlementVersioning:true}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - { - Name: 'TestEntitlement1', - NameNorm: 'testentitlement1_v1', - VersionNumber: 1, - VersionMaster:'5522N000000c01Q', - }, - { - Name: 'TestEntitlement2', - NameNorm: 'testentitlement2_v1', - VersionNumber: 1, - VersionMaster:'5522O000000LlFu', - } - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_2) - }, - { - name: 'testentitlement2_v2.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_2_V2) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeUndefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v2`)).toBeDefined(); - - - - }); - - - it('should return all components when there are no existing versions in the org', async () => { - entitlementSetting={enableEntitlementVersioning:true}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'testentitlement1_v1.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_1) - }, - { - name: 'testentitlement2_v1.entitlementProcess', - data: Buffer.from(TESTENTITLEMENT_1) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`testentitlement1_v1`)).toBeDefined(); - expect(sourceComponents.find((element)=>element.name==`testentitlement2_v1`)).toBeDefined(); - - - - }); - - it('should return all components when entitlement versioning is not enabled in the org', async () => { - entitlementSetting={enableEntitlementVersioning:undefined}; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'TestEntitlement.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); - - - - - }); - - it('should return the same components when unable to fetch entitlement settings', async () => { - entitlementSetting=undefined; - let org = await createOrg(); - let records: AnyJson = { - records: [ - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - - const virtualFs: VirtualDirectory[] = [ - { - dirPath: '/metadata/entitlementProcesses', - children: [ - { - name: 'TestEntitlement.entitlementProcess-meta.xml', - data: Buffer.from(TESTENTITLEMENT_NO_VERSION_NUMBER) - } - ] - } - ] - - - - // resolve components of a virtual tree - const virtualTree = new VirtualTreeContainer(virtualFs); - const componentSet = ComponentSet.fromSource({ - fsPaths: ['/metadata/entitlementProcesses'], - tree: virtualTree, - }); - let entitlementVersionFilter:EntitlementVersionFilter=new EntitlementVersionFilter(); - let modifiedComponentSet = await entitlementVersionFilter.apply(org,componentSet,new ConsoleLogger()); - - let sourceComponents = modifiedComponentSet.getSourceComponents().toArray(); - expect(sourceComponents.find((element)=>element.name==`TestEntitlement`)).toBeDefined(); - - - - - }); - -}); - - -const TESTENTITLEMENT_1=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement1 - 5522O000000LlFu - 1 - -` - -const TESTENTITLEMENT_2=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement2 - 5522O000000LlFu - 1 - -` - -const TESTENTITLEMENT_2_V2=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement2 - 5522O000000LlFu - 2 - -` - -const TESTENTITLEMENT_NO_VERSION_NUMBER=` - - Case - true - SLA Management of Case Resolution Time for AdCreation HK queue - Case.CreatedDate - - Case.IsClosed - equals - true - - true - - First Response to Customer - 999999 - false - - - - Case.Status - equals - New, Open, On Hold - - - Case.Type - equals - Hirer, Candidate, Internal, Partner - - - Case.Priority - equals - Urgent, Normal - - Case Resolution Time - 960 - - - Update_SLA_Breached_to_True - FieldUpdate - - 0 - Minutes - - false - - TestEntitlement - -` diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts deleted file mode 100644 index 5bfa5628e..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/PackageMergeManager.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import ArtifactFetcher from '../../../../src/core/artifacts/ArtifactFetcher'; -import SfpPackage from '../../../../src/core/package/SfpPackage'; -import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; -import PackageMergeManager from '../../../../src/core/package/packageMerger/PackageMergeManager' -import { ConsoleLogger } from '@flxblio/sfp-logger'; -import { ComponentSet } from '@salesforce/source-deploy-retrieve'; -import { jest, expect } from '@jest/globals'; - -const path = require('path'); - -describe('Given multiple sfpPackages, packageManager should be', () => { - it('able to merge into a single package', async () => { - const set = new ComponentSet(); - set.add({ fullName: 'MyClass', type: 'ApexClass' }); - set.add({ fullName: 'MyLayout', type: 'Layout' }); - - const componentSetMock = jest.spyOn(ComponentSet, 'fromSource'); - componentSetMock.mockImplementation(() => { - return set; - }); - // TODO: Complete along with PackageMergeManager Feature - // let artifacts = ArtifactFetcher.fetchArtifacts(path.join(__dirname, 'artifacts1'), undefined, undefined); - // let sfpPackages: SfpPackage[] = []; - - // for (const artifact of artifacts) { - // let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, new ConsoleLogger()); - // sfpPackages.push(sfpPackage); - // } - - // let packageMerger = new PackageMergeManager(sfpPackages); - // let mergeResult = await packageMerger.mergePackages(); - - // expect(mergeResult.mergedPackages.length).toBeGreaterThanOrEqual(2); - // expect(mergeResult.mergedPackage.apexTestClassses?.length).toBeGreaterThanOrEqual(7); - // expect(mergeResult.mergedPackage.isApexFound).toBeTruthy(); - - - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/core2_sfpowerscripts_artifact_1.0.4-1.zip deleted file mode 100644 index b5436df6dd5882319d3577edc14132a05275fe3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8405 zcmeHLc{mi>8y*bV2FXqcNtQt*OVP;A*s@)OF-FEV%vhsE#LbPscOQjDOzu`_A`$=e*}N)TIEj007j~07HPVX@3$B zyo($Fcmf0fWB~vG9EC>gv&A@ipnMT%3>=O0@WR-_&|XMK7~D&8`G>6=!VBgA^MZk$ zF(~(wCQww@VW#p)F@bE&ckCUw(zL=U<037{XmVC_9&h!HV&DBr`VgbV03Q&QYcx84 zs;A6Y(?tDC!PU7CGuK|c1HqB&T{#gv&A6sg-|Zat^=h7%FuLAjvEkp z8XbrFGnH>~ew;o~>*SYism#xLxw8XynH${~)FU=Nj+6B%y;h9{ zu52pht}Uve$*oPY&=(VK@j{;a^p(>1c+Y=IFZGiSjx{%2(Q*L=cZ|CUtu{dh0Equ% z%fX#s?#B_XsN-K+?LwrAOSKf!{n&3S`i>| zXa8=>OIIU&$DhCOwTkj|3ad2K&Im8x?lmd#(n826D5r8UTr{)~%_aFtTLg3Uj>?r( z@Nm2s;wt;%j>JP;lO`f1OjvVlHI4IcrUgAYWI~_W@9jEWQ=!IS9@#&^qo*^cTt0Gv z_wufG&Rg1O^U2q4sf*$oijA`mWyDh|*+zKTEY3`Xo_`5cQW$WBfdZo_>FBD>7?u0? zwdZ3xllR=ZVF30KvW$k7%;g_E1d(?`WiPNVZxZ0kToU%>+uBX|weehHP~K=bLUI{m zX|$UW2dg{?dz?lXZ|TiKfE`f;B;;{-!a0y&gm>qbW*V7i1-8;CGkX{V-(YL@(&K5! zOAbm6_Uv@4$irWrnin1y;%2xg%o;0$zdeX8`}Dr()Fq|N8(6lF*Y=$~*b|-*I8}pw zPp0K~xk=EX>2>!sV@P21wV|{G_TS$Z9*(v+`W|^DyCVoas+n2%>?7!$haeQ42(zz_ z=^9H1zdb6L3QK$f0Y5m$V5uZuJW6R8g*33Li+N~-ch%-*2xY+~N2fF-)V1ddIq6s&ot-up;Za&zejw=aBBL54K>Y)ibW zd-ciStMIo6$OBZ(9Hm?9s$>isGg?Y4y;Sd=MhzN-$fUTW1Y#{o(B6-ESGO>2mJGxeC+@@%H0up zd{rZum38gcCNzR91puJ7*+%$^VgsTAN1$UBgKsYW9VzdgXiZF=2%Ibp( zbUT$G+Ek(B(WXVlZT(u{{Bv;4SGvinfwS=(;a%?~gVU}ho*pl+>4q@#_Ges&1P@4W z@9frMvy*Db^K7{09Hjxe5?^$?oJysogl)Ja{hqFqWiY1{P@S^&1?-k;Uqo}*M1cHn zyR<2BZimQ@{%)dY{lrTyFIWg#BNoRhhCY__VfITfzg|dm~*PejNxu^FUa8o*&*?Ej`c(4;cE_ z@%~ef_qEkLvbAb@dL!X3zsB>Y-`8sk3fWpgePFIg!mH}neE!t=Tr0mMH(O3Om^;!D zf$>^>4eLno$u8zkp9M+RY(}W`5 z_^4FFsn5zEs{9f@KWv_9ShyrB6VK1|s9uD>FbN3L$cN}0DQFq2VI|K|8s;oaHom5? zNUdlXHq0LgwWc>L^9yNX;L^9G&Fr_f?mY2nL2^t{0Yob)Zkyf*f7Ma^K{z6MA~jVU zHQ62^ITJR2v+K2xyP4AinCNte1Et+tS$-QdUhVm#yqt01G=yTN`1(xnO?*O4FZ5Bw zc>@!&aT{*?LX8VZNWZ8YOvI(~Tl60(PopnAx~m)fXaJ*&TN)YI4(h-Zp0QXwr| zN@B&EvwC*|249C?Eu?m8fpz$}w9nh~>rrzA%d;u_GuU^=ybc-fa%s0LDlQg#C_1WG zu!ysQ%iWiJNzHQUb6%n#opp{O9#nt>f$O`A=oMHxr1AO!b$7$!uTV>dPIRfOJLcP) zE5}sq>2+coF=!XPornQG9Bbz@xYEQ_%}Yb_(DGStF-n@`PxX`m4e5R;&E!Wa zZKgRFdKR@C=cwvS-(AR67`8jx0r85BdDYVD>(2UEYEJ$cmxTVw)GOvuC#+P>pta=W z0=IU{slQ0J=VcBs;E3bFT+hhN;@7$aI($-fTi5P+`m`!_rTO0M&W_xo(!krGp6F`_ zK4XriJ`jG&_;O)X#UQ=TC!KBPNWaGR*de<0w}0=Z_Y4jHw)Ja|kWGtu3;~At*q4B# z-8R5G@FQV;!*hcn-8TSL**Yl7p7=~8oqKC{K=a>&L*Q_fx4YK{8R-9aB#uags{<*a zrAuD?Wp*TxFiHJ{kK2FF^))|zZ#R1c+SV2h{t|-((QF0#xw#^u8r`e;S=441X=^HK zwfV9{^-N3)9$zpYQxup})VSaGE+hJ`9gqR=5i*80`7YEMM_xU#- zsuMpl(F_(boh0kPGYLD{hV@g=craZSHxsb(sQO<^orVl{iVxb*r7LTF(Bfg+@kYg5 z9>W4-W`Uw;u9>7-;S)E9$tLgt;}8_HH*N!jIgj`xofKf;s!AjZ~`I{xVayz~^ zB#5Tu^1=mmZx-@+OKqcEh}Xx` zBIXjgZIijIa)wrB^nEFa-q7;G1@&$T|9hv1l*`hfe$RDynTYU>3(6));!SnZid?`e zoQ#dwh;QrVg$weh+Y;OAm-a@4kYzT)H!esAv?aooFF_LB+PNgYO_mn1GdLMHNk@8I zkieHpwfe2H437(P{BiKVeYubr*QP^MyGx6h&Xw((Ooya>SN8a7^}7s?3+mrA^lB}< zQTRl)xU`7jv+mez_+PZ+a_DP!W##x={|GE`w!Uh~_3?>nk`(sME#ZIFmg|!c)g_69 zjBrJ6YVKDE;x8m5t+_rKQEigQZ2mnNNqeqON>raD((3@uuw^Iy_kY+So!tNc diff --git a/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip b/packages/sfpowerscripts-cli/tests/core/package/packageMerger/artifacts1/feature-mgmt3_sfpowerscripts_artifact_1.0.6-1.zip deleted file mode 100644 index 6adbcf2731d852b7133e9e771c7a5152ba9df920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35211 zcmeHQcRbeZ_qVgj%BJkS$=-WpQ$qG0*)ngNtgMh(vO>tpC^J+>NOtzh%E&CgTe=g{ z^YnaE{qg&}UcGK9pYy)X^*-l1*SXGh$V)>)VSs_b!h*?zk*nk_p~5IYfq|7$f`RdX zfq@ws=-AoY7|>Z5S=g~?+ZtM1IU3m5>e-lB+u3UC*w~pE>gd@qfWFYSFtF3n*Rj)~ zH?_60oWG)B)z6OY*7gwAhxb_oLxJLYuI;RjfIo~y2@i&^fKpV87#e4U=_uyrB8mMY zQfVwqZU8jtrB-qG+qM!x{!#9Ui7)uaD0J~7+nqctui~By41sV$QEh?~^i=lt_YAQVBfvw$|-{8 z1BP#?>PI=E9z7@WQZ3i)Jf(-#Wg6P=uxXFeVxiFDHMFO zjo&(;&8LSFK%|M44v{Uc)_8#7xrcD7Z#8L>Mm{T>p0=j(PamAo>!Fi;?4c3rT;HHg z6`A!yjT8!5ZO89ca*wDC1r%H%@z%t`%Db3HsY@TgI0B$!A58QW&yly4)Uu(aX-=9! zEv|c0uJ5p<@WIPddRA`+&Cg}P5l>usYE)X*&y=&ap+(fxRN{w%!Q1Lqy_vV&nfLDe zC9k46Uli3)^s-u+4DT@kx1vBJXMAN(Bb`f=QxGI?-RxHh&J#f_tteV3KMb`F$8C+C z*g@|J&!m~<5ixyvm*-|M`P+<$`)KzmAL<6$sX9n=vNEb6mnz~Eo?l@G+ za%_6ddcL21h-?uu&_sk2uTh>VbvMhj@Y7_3B*M;=cQuqW$1-O)KMPJnX(4U5PRwO2 zqnN54wE@n+fIgGe#Q_HGai3ce?B}?%Vr|4qc#|q0WhhZG8DYsx=bJLcwokdRDXJ;r zCXH8-h>cuKNKhTI-l~i`kAEj(Nba^Kw!i#}YpUCG8I!wQQDw-DHe)NJ$XuX{q6G&7WBu2z zO3zrw(#XKv%ILF;(hT88sU^m!Uw4PE&6Wk*W-t$3uzWUB+-^$SfD!O2{jH{eg^X4C zz~EvPm7tar7#WjzS@g9*N~PCS6?OfWOzbn&#rhLUp60)j(#(C|LIoq(Ir@qG%-QJ( zDTS!Z9~y3lfZ-9b)T&D@M=6V6xh}*>#U5oX)D3pg<&~bm@M~|WRIEIX;rSa`X-w@6 z?_AEKrU>%26U5&^Ig71dgopPy-IOi~yhfTw+)-|l12lZF&z>4M;;#=K@T-64sco(7 zZS)KnK(E?&`t1fhwbno_-iH7KZS?R%8I|>&AC zlgQd6>*&@+_bp`5zf&T)r<2?%NdM9o`3m>Nl6h$PTPBw@8lzhjD$FJEko_>yQX}p* zCpLEHUC4j+rr(9Bw%2d=+JM6Y-+Mi93c+q{ESa{5UhT-?p^%vQ?#m90HF&sE;5Jw+-@mJHT>mqDg*9G{-kLj?EA z#=A2(y02bsbR{IqAmzA73|%mPa%-sdZBMY-tKB&vHOEh8>YBZ&XWn=_L4v07I3xbO zL409^o|UDciO~^as8;r|N$!~!Bp8^?&l2Oy8?9}uObztx=zu|kj-8${oxXwLXVVLb z;J2z}L~U^76CLM7AmA31gz&*$Kx5SWQ;)@?u!SKH-!>#dzXus&r3q5S@41@1t`m0?X+Xh_a>FCr-{X+vC+)kS|6zGNDvD(%o{|v?MRo(QJ0;I0a5e;^m*i`KTv&GEzvina6t|HrNw5z>PmvVq&qlbOq zKNiL-Z3%eY<1&v!tIfVaRzYGtb<0M>9~Mb#?Afp_HO39{p0{0D(brzw@5kSm>CJwg zYf!fE#722o+WO|qCr5&MdyWm5lS#n!vs3nsDcc^Q!nZy`?07M;>wT(ib{;l?z?E!bo8CUKKeAdX-tGzcqZZj-! zaU#Jp&}wH4>rM5PY>|gXyuWvk)@r3Yl;MN_W=`KUsims%OC9R99)0L*?^uboY$`+s z+wyZ4q1FT;Ka?bW@Xo17tbZ%p7P^=hNwny_fku3HGol_+f8`9^qMejegaC1Md3qC^ZXs?z6+VJrPqVtZf2 z;&VpU?Tw!HS?n|GzEWILLeoM$&sF#-O+$~pfngFBBXT!CnFQf#u6zYjVHy&BQ-3ic zCq@rbh1`Y4r~dIVund0h`$R;*?_i3(HkdL$P|L=mTT*+ zRt>SBR(+((#Fod`7T0im_3)B!hQWKRz;A$gTX0um*I#E&l%W^*U(3s0PkHGq7p%IL zJ%o31_{jFNWc-pBJQ6vY$_P6Q0$(Ktq$A%?zw#&nWy4zb$mgRCy*bc_>>aVViTBYL+~iBsth)AFMRlf^wyiRJ@Oi;0a}q zqqcUJ>79hv+B!QbCkg3i7mIT!*c|cO-#m8ie$k&0+IV|G@MQvuZwTAPwzntG1=CL} z&PMO+JRJ8k|30<*WqW7~e4U|WLG z(F3L~ejrQfm&>xyF|quCK#kK8sAsNYYin>YdHYd?hP(?d-JWRz_xL`iD_Gdx*3Qa8 z_RAT8*#6Oil7XF_iKUUPyp5HEiN1jiy`H(Py`r?GHzVqxZO~;jWnV}Ug?p;mQKI~& z$exIVXlf;bAKIz2ZPxn&WdYUZ0`6h!IFUw|A#mm{_B{`X5xF-4jbjfp;wd6TMCTei zsbS43Kp}RmJ+*J>Ri&H-?u0sajVGq>C{$Y_*_o#om|6ok-IIzmsYIcp^}At&>KoBY zP|hpUD5R1jNJqVe8W?|aCt31o+a|=4mb;Fqe3Hv}2vsl|v1vP!;GkW+H!oY_xX!s0 zZYq}tF*xZdPb3jB9RO9s??lDOM=Ex<5O3mg_>pvMjL*ywbVA~wpa|vED(<}0l;h>P z=?K=(x!l*gP)wFiBjcjN@0dH7!!EhIFneEGuKyj3ALmCz_R1N+i>JEv?~Nktn0o5) z86{WBh8mv+Z+fItX6qzt_(?CH0XdER>9l30@eTw|<3r$|kiTR)>GqC==$$OgWkYJ< zfjJ+M#m%7bie7bPk&dVf8_=_ElJ{WxNbTNqw3W)Aono)UOR|_uy{&{zHL3g{mtD$l z-1c1OBh}J(2DZwD*K142UQQ7Pj@w8mKR9R02`>Na?#wN5qM|lPc+_J#C& zB-adOLat>*6kSgk4QnSmb1jP+P+tp1VXc%AA`wX~Nl`y2DIExgQbN1Cn{1#0r<}L;);%x3#f=JN~0bo6HeOQ?pC><;$G_-gw2im^HDguCGDoai8VzyOsC1Gi&1(`^O0&t9qcpz+8T(awILR%?&IJ zEbVmcOsp*TJXW-lpye1NV&yg_4;SY}6j*qu7E1tO3FVbJNQ}5V-)J)7yBf4uo7+-_ z`Wj;RDLfm*wtflcoqHA$dg`*oUW80b8bkBv>v)r*YBCfEi_-GEgUJ+i5)$(kyja?_ zoAQ48EfyW)us7MDpntuo7-E1XDTIk}xD#Hrx!2TqQUh7HgfUmDKyYzuVqEJjFYgx zvZbG4_1bfI?#0;v*JZU~6w%kj2`)0Xtfh@?)t{8{-F9)w8M`FX#aynC;WY&lrS-{V zbr`k?yfvz09GUVuEpFx`0#-pKFcuS~PxClW%LZX4__@w4%JmMK8oPFT1a&p%4kVc~ z5f;ZZxt`;1Oj}M2zSCN`WK+Kxlp{84=xPO>jgp4HyYXhF4PjbO!Rf}^hVAu{)u?xc zC@C;hx81e^=%F0LI+NeYM58g6P-_R9IvAQrUg?c*fQE_%G}Pa-1bhjd_e`@GXqv!?xpF0_N>E;e5LMLlO0gn+Zr3X0v&#WWdL(+d zcd0!dA|clZFhtJ^UvM@uGJ5ucIutTsWW*CwC8tXUz9*)qnmY!b1|z=6kr@(#LBcK< z^+P5b`eT!;&<2S%VgMUO6%Nk_b&g<@IiqJix>L0z0WmeY_%F0*`Z>UIyq!buL}@D6 z(B6pS8$_z-X-_QtNL1kwaknEo{R*|(q7Iot8g@3G$_{7V#f&Cs4B3zLRyZ415pLh- z-D=9#j~#i2^0ID|6{c@!GV|l`-B)Fy6MbYV)E`7yKU|lqFk;hS6CR|6JR_sN))crA zY>4YekcdFmM!bZ`-O5Da`e3=Qgogv8|J+TUO5PD;8p^XmrV?irx!G57vDWJov|ae< zC!DPM9>{7)GH2!VaYCB4E#Wu7h_q}H1&6v7z~?Y@n8Htm7~A6@-H^T{!Pc~@KOnP4 zCRW?(3LzpN43qGIk`;lN*yc`tKB;#Wxv^{*>RJ%^on5y}-SDqp=1hU7l~as939#lo zUpKivwdnq^=17S7ZPfI8mbh=o@wZz}SK|Yz3gFTf478r#s+_}{&afI}uf5I5#~@DX zb9~hZ?}rsa+yw#9rYU6e-9Fg6no^YDXzPWNMq7sLvSKSL4QsRV}m)wJA5(StLz_gek%W-d&hDzwS1*-Rj6kQQ1p9V^ysV zxPj_Aw+2aM=atp|PH@TW{aD?b>ZgH~*0s{KO^)UkX9UHfJoH{(XmfG!B?oAE1-Z?x zKh6JSlk7jn;bClcUeB{H??&pn^2(Ph*YIPyj;IrDv^j%5XMOZd8 zVIfVLv}80tNO{WKbFqYziFRo+?bMO@VEB?Ia}yaaJl1=&8M6|Sx8OM$WxMk0*^%>{ z;+;bSR1;)UuJ8KZMM2GV5kFSSmtIe{n##*&pMnF{>C}H#eI*-kG)Yt_>mSZp;K689v@{UYwYLtE#Z(8g0UPkI`p?RTZWK zZ=h{AJT#W#wp39{I@T^zj9kwZofdbIif6CO(3l_%VUZxbT{bAb2oX}3sBY9zrJr$? zqu(0QG(mTMfmI7SdANMc3DGja$d~X6P4^9sbt7LW7nwzE^%lhy-7F|1doI#ZNp|Y1 z;?p0f8{xE?W<8RdwtrAVbV^oXrMp)TbdZKTZjPsvRsae9j#Ye3#_n%OBmHM=hk&Me z8EB>vr(>c&0`nb!^!xw+t9@F8x5(8qBKj=4!P7X#d!Y(Z-r*&lhl4^}0<)Z5z+KLG zmODJ(+`+r*8OHMVr3Cx-;;>F?mUR%f{h$LpWjU)g&q7z@_Q0L>= z6hqzKtVjv>_Hxpf7C4>bnf6rEck(Ja2Xm20FQ%jvB6YDqVsc!MDOZNx4(5D=DM3OU z?8AHsD#G)A^{sP3)#qK{F`(Px9!<%OKk;nj54i9l3FaP0!)>ZCUT2rGs3*51G?{Ni ztC4Oy3+=8FsRs|0(>%2vN#cDG=9cKv);b;1gT2H7TjpFmf>Vo90w6*=RHve&)8tcNC%$TD=>NMeP#1$ zAFsA9CTXxohr~{Z47DPq7~ZeHFIhnX&yYazu$I!obxx4Bg@2+%;8w zhb2%GYkgzzeBq#;3bpDX(Nxi7l%#aSASI5|;Dfn&UR(*iD-NY8wsS`fI#_sY7>SYg z=7z^)RaTBoX16B?2U_LbDMV|HzUIcf>esnWK5p!1i_&6Wq~Fdjw1X%1=kxNYz-(!q zW7)x|gI}KMVZ+nNP#psks>-YsY~M_WR}R zJtTPV%;z6Ye3XHj+1tbV-l{RJV?^{@bcP=st)4~*7U;d!E-Y;V&utdijhmpaZX-qM zyxwdQVd2Z17)<(PcXwjVFRWgdy;3}^_124qGtVO!thh0}I?l6H!o<+QsZwr;QPwC4 zUMS&wKUA8S+a!*76}|n++mtbv$^4WawDNA%>M8cJS%DxEhnmNZG*h_-sspsTg@Kq4 zP#=&%OMLbScJDhvPYy2ZJ9|HLGq8%9Wxo+)fy3gEm zew3p7QL1=VWuC&dO=wNZ15g<&D%t-;YQZLc4y11w3>et2-{c&k@R#NIyNM|f zcUx3yEP;nPz?zs!bh`Lq$ac~qlgNwtvXCZI?YK=6=uv4YrlW6f7fJRbJ`?EE;ZzCv zX#RA4Ae6#1RH_kuO^Q?pu{SXWn*5b&2f-^?DiWz0bTmx~S9QH|LC)qp+@aBhBs4FYZ#Q@;Z`K)l zBU)FSCF**I!6+KBv2;~S4! z!@;`HduWFhBxsB~djcm-jWQQM*1Q;nRMM+1d|ZHUuj5Hi6GksuQ`IJ*YF&-+%qv1; z1+KXw2HsM$8--UrKSiCwv4@9yR*3zYFPE#WcHiv#g2oEGYhlT0Yk9)cHzrGHI#MDm zu1TqqMWks))D`nRZo;IvYMnakGcTD{nfg%e`6t-cENccR;o4NqqMLA~?Tz&WcfY#m z<3|$#r)!-5hGr*NYLTaFC>~LPSKNPrcb(^9|za)q1 zg(4tPL__^PzX(lv+q_obuKiqBlC?s^(>HQL`H&J8#aC2Jr^s#@whpvP&dm(uw9B({ zXg{75N{J1pXIjAI>bDh=fZ~ARBgs%4LknbnYzw>b3ev0-SG!7^*zckN+?+}Ycws9A zS%_@Be7Zgchk%iE2RokmyK#gh5*g2ljC5SQ(px%ij4iehXeb0mU0w;!kIw+=><7X8 zUkBF_L?GN8Wv3@x&#Ov8)Zr@vWKxy0F4Z{5!!v<(m&9Z%nhQ{SMJ=A~4k!%LL3z~j zy(pg9oA~5bc@ZAjK z9`wDxG_9~(v1Zu`O>g96XX7fSx6x|p6iX?|6G^VSQi&RS&knKI2JW_;shNh1_2%=@ z8d-X6RF>RmKXL{Hp^v_mfqb+k54xVk`CfR!g}Io4QKHPr_c*K^?UTnVJCVq^+1>h@ zf@L+S$rm3)Xrzy8Ug}^wZ^#%6PK=2`^YcK z#gk)>(%srw=Hq{nezv{(3B`ifvH~ZF!jf8)U9Gz2(&1TfvBm$STv1EMrP&8$=nHe!N?wa*^x^70=%k;O{W|&g4 z7Lbr~TWbN>&$uEt=@P?QO@!_sb2FT=SYV>u-Y~F`etjAGw#NLj9a`iD1ZabI+?WA> zP?LYJP4DX|vAMJ&52zmzAmbc=m!3o|j}xwCuUgD!(K(3Ml))K{ftu3k{V2M5e=f|j zIJ=<8)SFMpOf}Cxr^3IT zX<6(xtnfgVT?EFAzjPP(b@lk{%|VX!Z~^LZ##zX}kn;uBovvU$62V#m=ip$%wX!)^ z{vNVP9>&-lVW!9uan};zKH8dj{L47bFm@Fc0q8K^f_$6nHtg0Uc0*_bYj-6gua|`k z`XKY5L)KWM%ED$)TUVHK)%Abxfq2(jKN&DQt~0bL<`X&Xsb?wP%NS9 zDLkyPZh3$x{ zmtL`Rl9u-lb*-BuVWxsNXBliR zEkhGbClZ6Gkd1(`=|U#zFi))XxFtGFC%B1GLEtz*G0g)0-`j@Go(*n7NM8;bZr`@0@(* z9@fW*=su;U>_(*1$ttTf1BczIGD;3Lw;5I9Cw9ADbJS+_EkjY`mAnBcG-HkXd|hvi zwr%G~kro`JZfG#7rVwr|ZbQC>OuR?Ht{6S^$GTd{aV&BsI0D&qYYF58s zE9iJ@aDD_GVx%4`rQ20l#GOk34G5*zg!z4T2@zFsD=?-{YOzQsuRXDaF705kPvjJS zp}e9lw6zg?^}_hIh1Eq|H(n)Y{VAB{kWcO{yEiVa=N55Zx@LKe&f(2v8R`2z)@#8G z?eHs@p|=M3kkyes^qmbw@$%TVQ;)Hfre6Hu4|Pf5#d0u~9HKRc%ouaIaf)U6Ir?yZ zTcZK*3hjY6m}VOu;!D0;-H0X6*VHqHC4pz|6fSac>~&LFHWB1Fq?ec$kb5fx#;h6G zz`AhS3w-1_v)0wnyXS$tK+zDvb*sdMfG zqS&jV5B~#bj>0>7>TVF;A_c_++>xwc$S%lG#X*x=?O zZg>lPTV3TNW>lZs887shSta}idw$sJ>5jQE9gJk6&ev6*i3?qN4-#tcd=zTT->K&c zBC&N3FC>rLF2B^Ev#1!(QD;rzuYnWZV%`HgSYu=QY&NK^l9kTO{jNSzjgOy(U~CgU zbx{yY56jY7om`(c2$Kw(_{=)hO_S&DkNdfpT+q9<8j~}go$H>iideNHtwL7Xjmx(= zn@iDV^l^yRIb&RGHflibUd7jP-{W*R#hu@YbolOBJAD!a7AlYtQ-6pRUqF2ctB#+t zhuqq~lKQz8W7ZQ@sL3A1H;8apxlHwreuujGT+@*9e19Z+6#w<=Qi3*jZnHa^PYjBM zW#~69J8-tJKx_Lw-<+p)xy-;|$--8O{%AVV$6=;A8uyB8yg`VBV}?C^m#h+jZlDRy z6}RXq4z8!&bUxH*&*wyt8oPK`Sc>yelHkRPd!xiWg6?Gq$@0FSxsIZNPJ#VVn7dyQ zN0UO>up&FUo=^%m6PMJ@$CNS)VyTWgLqWVrt+AXkj)7>ricL)C1iubo4BUV33J zgfANX-cz^O#LBP7o5v}2Itjbahjk~rwbKbTJ_`lyD?!5dy%?!&Hh(?PdpQ94>Ut_( z?2z#9ChU~IoT*!c3GU@kMAtbR%1j|fq0>@QpgAtgLW^;m5~oMRQHxeqo36a5gpR zuy((#r1t&8+WmVY?tLZ_&aB()6;@jUndtJnbai<9`IU&5r1yw8IEC@Z459-eAO*qK zQltw(W8BxRV5F*7JDt3kJ+TDSD%MQ~XCU6!F#@u?=d`ZxMrgZ*dVYnsoqQ?vUhy3E=wDWc{F(dZuOAI}(fkmu9f_(Yf8a@EZi7mK=+F{pC-{h*F%Y+sGoZWQyQKvJBJ zF`=f$E6q(T1vegCS^L^x>-e_sm)?l^nhW`kb$?%{e>?qXh?FK?0cjTwq@VZc)9**w zJrE7u!UThW6>&g+DB6;Zj$P>q>lNINAliixm7V~n>?oamH^9lUV!ns#QS4Lr=&gsJ zl4A}n0nyuZmuaj_* zLI8tpZlnteWx12|gPEzt8vf->9$Iu;n9H}B64`NuKO*^mG7H44feLDXCY&m~hmErB z48hmrQr4~9x%qadJEY~^oM=?GLVw)dKAnM?F_aq^q~3EHQtO*9lzD7dU+b((sUzOZ zdw89N!}bTazk~k{jsNW=&E?H~Q41uf4X}{tH>@W=PUC=RId&=Q&*-tnXJlj;X)`#9(l&c7 zzPiVxpI6TjC06`K0|UY!9LEwDOKmXnA?qUt_R=zT{1SF9&sqcB{nxlO4dug zKGf0`D3la426hl=yUZqo4R}p5wjR83EK=g^F7lMwKI5$CG>A#&|D^h=_90O0;VzY-~=io=;8@d_t|1a zr0I%s6wbEoT)z(f zK#^q*nTyIi7KVQy6=|HhFd{3WYsDDgNxVQgfdP94r%|wxz#U;NwJlR=x|nK0?_OR( ztbUE(s>hBEwaHWS{L0|u4`cmVZpB^_=pd?4ZYK8OzVdN5S5dBJSph0%XE zmapA=4}<@USo_&mf7{LXMl=4S{B|%bwpJ{*ul>bTa;iicP zVvpN5$5*j?46;4@lVT70?;Qx)pUR_c{XlZk08Rg0$akCk9Y{VtyuHS7`_JC+z<~bx zr-*ydCho9p9BmW_5|Rc``e_kI+s6H9I7}cxpS^J~=Fbl2bEh@XP>ySBuh-iCv!|{8 z|ML288khZOAO~#Ulf;Jg9|rP`q;KaGn5RE^fP1~z4hER;E5&~4%yzQuy?Z(bvSH8t z!XbZ_{iPW2WB_~jb`AhIpALY7JR=CmzB@SDyA1>-4X}K=Kn`!U#ZK2 zF7PuAP=j+Sa|cr0zefBuDn1JRXqPY$dSH}=d#cdCsCTah^C+folc9UJWQsRo4j~SgO#Qf1 z$-xl*Nta->r!oXkF~g659IVZIk-78f0{M9)9|1V*8ZChP_HW5{@~@}-w?zF60JLE^0J3i}M|&n5%;x0j z0@>TS{L2msM=>95EpUL@mgQ8H_Y;`EvncK>{OAq;1MpeE?DHwk{14E977AHA*(0-grozxX>)AGy5!Bc<+Lz6Cu%rE>oPc;8Xu@sMNh z4($H3w-_-2lYhT#^1r-j??xYsG#2|@_`Oan*={xOgzs`TjnM-bpNfR)gxqdlAw{W;YhUgNMt{y5kZ zReba^-hqlmMSm0OlL|5ZiNAZd%0N#VfJXc;fcqUaA76tGyZ@`eGv`zCWhbREj$ZaU zP-5@tgAv=`Jpa_yuY>jLpR{QUJWD?%ZGyJwKLWFNM`-`qTiKURAIwp0eiQucuS!Sn z41w^a0o;MVviOu$bqw9nZ~ROi!x04ibLh4!`}@(KkjOZC0SAOL4G;x9`~BT2{-^6W zKces9=vYzyG|>NJ8so5gY&<;>C#5ouUQjuhPZ5Pv(+CL6cjHb_N#eoW?Hl*E+iG7B zOyFl4;4W~Z_3N2;Ca{)q~251E)(0&W#!=c>2(e2@5y9+9R6zGYn zJ$j$uK((@}r;hkX(el4h@m@JT=t%=S1$v@W=EA=Le4?t4R>dD6UsnH3$WMxz|BbTu pYOFy|8bA%0IQ}il{wK)as2du1-C*xm^U8qD08fL0ukQWr{{TM{Zeaib diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts deleted file mode 100644 index dd2c050fe..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/AssignPermissionSetFetcher.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { Logger } from '@flxblio/sfp-logger'; -import AssignPermissionSetFetcher from '../../../../src/core/package/propertyFetchers/AssignPermissionSetFetcher'; -import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; -import SfpPackage from '../../../../src/core/package/SfpPackage'; -import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; - -jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new AssignPermissionSetFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getsfpProperties(sfpPackage, logger); - } - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - -describe('Given a package descriptor with assignPermSetsPreDeployment or assignPermSetsPostDeployment', () => { - it('Should set assignPermSetsPreDeployment property in SfpPackage', async () => { - let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - assignPermissionSetFetcher.getsfpProperties(sfpPackage); - expect(sfpPackage.assignPermSetsPreDeployment).toStrictEqual(['PermSetB']); - }); - - it('Should set assignPermSetsPostDeployment property in SfpPackage', async () => { - let assignPermissionSetFetcher: AssignPermissionSetFetcher = new AssignPermissionSetFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - assignPermissionSetFetcher.getsfpProperties(sfpPackage); - expect(sfpPackage.assignPermSetsPostDeployment).toStrictEqual(['PermSetA']); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - assignPermSetsPostDeployment: ['PermSetA'], - assignPermSetsPreDeployment: ['PermSetB'], -}; diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts deleted file mode 100644 index 9f8d33dd4..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/DestructiveManifestPathFetcher.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import DestructiveManifestPathFetcher from '../../../../src/core/package/propertyFetchers/DestructiveManifestPathFetcher'; -import SfpPackage from '../../../../src/core/package/SfpPackage'; -const fs = require('fs-extra'); -import { Logger } from '@flxblio/sfp-logger'; -import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; -import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; - - -jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new DestructiveManifestPathFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getsfpProperties(sfpPackage, logger); - } - - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - - -describe('Given a package descriptor with a destructiveChangePath', () => { - beforeEach(() => { - jest.spyOn(fs, 'readFileSync').mockImplementation(() => { - return destructiveChangesXml; - }); - }); - - it('Should set destructiveChangesPath property in SfpPackage', async () => { - let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); - expect(sfpPackage.destructiveChangesPath).toBe('destructiveChanges.xml'); - }); - - it('Should set destructiveChanges property in SfpPackage', async () => { - let destructiveManifestPathFetcher: DestructiveManifestPathFetcher = new DestructiveManifestPathFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - await destructiveManifestPathFetcher.getsfpProperties(sfpPackage); - expect(sfpPackage.destructiveChanges).toEqual(destructiveChanges); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - destructiveChangePath: 'destructiveChanges.xml', -}; - -const destructiveChangesXml: string = ` - - - - MyCustomObject__c - CustomObject - - -`; -const destructiveChanges: any = { - Package: { - $: { - xmlns: 'http://soap.sforce.com/2006/04/metadata', - }, - types: { - members: 'MyCustomObject__c', - name: 'CustomObject', - }, - }, -}; diff --git a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts deleted file mode 100644 index d7b7a5c22..000000000 --- a/packages/sfpowerscripts-cli/tests/core/package/propertyFetchers/ReconcileProfilePropertyFetcher.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { Logger } from '@flxblio/sfp-logger'; -import PropertyFetcher from '../../../../src/core/package/propertyFetchers/PropertyFetcher'; -import ReconcileProfilePropertyFetcher from '../../../../src/core/package/propertyFetchers/ReconcileProfilePropertyFetcher'; -import SfpPackage from '../../../../src/core/package/SfpPackage'; -import SfpPackageBuilder from '../../../../src/core/package/SfpPackageBuilder'; - -jest.mock('../../../../src/core/package/SfpPackageBuilder', () => { - class SfpPackageBuilder { - - public assignPermSetsPreDeployment?: string[]; - public assignPermSetsPostDeployment?: string[]; - - public static async buildPackageFromProjectDirectory( - logger: Logger, - projectDirectory: string, - sfdx_package: string - ) { - let propertyFetchers: PropertyFetcher[] = [new ReconcileProfilePropertyFetcher()]; - - let sfpPackage: SfpPackage = new SfpPackage(); - sfpPackage.packageDescriptor = packageDescriptor; - for (const propertyFetcher of propertyFetchers) { - await propertyFetcher.getsfpProperties(sfpPackage, logger); - } - - return sfpPackage; - } - } - - return SfpPackageBuilder; -}); - -describe('Given a package descriptor with reconcileProfiles', () => { - it('Should set reconcileProfiles property in SfpPackage', async () => { - let reconcileProfilePropertyFetcher: ReconcileProfilePropertyFetcher = new ReconcileProfilePropertyFetcher(); - let sfpPackage: SfpPackage = await SfpPackageBuilder.buildPackageFromProjectDirectory(null, null, null); - reconcileProfilePropertyFetcher.getsfpProperties(sfpPackage); - expect(sfpPackage.reconcileProfiles).toBe(false); - }); -}); - -const packageDescriptor: any = { - path: 'force-app', - package: 'force-app', - versionNumber: '1.0.0.NEXT', - reconcileProfiles: false, -}; diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts deleted file mode 100644 index 8c8660ca4..000000000 --- a/packages/sfpowerscripts-cli/tests/core/permsets/AssignPermissionSets.test.ts +++ /dev/null @@ -1,198 +0,0 @@ -const child_process = require('child_process'); -import AssignPermissionSetsImpl from '../../../src/core/permsets/AssignPermissionSetsImpl'; -import { jest, expect } from '@jest/globals'; -import { VoidLogger } from '@flxblio/sfp-logger'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; - -const $$ = new TestContext(); - -jest.mock('../../../src/core/permsets/PermissionSetFetcher', () => { - class PermissionSetFetcher { - constructor(private username: string, private conn: Connection) {} - fetchAllPermsetAssignment(): any[] { - return [ - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', - }, - Id: '0Pa2s000000PC8fCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', - }, - Name: 'Salesforce_DX_Permissions', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: 'test-sfvulqawd2w0@example.com', - }, - }, - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', - }, - Id: '0Pa2s000000PC8aCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', - }, - Name: 'X00ex00000018ozT_128_09_43_34_1', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: 'test-sfvulqawd2w0@example.com', - }, - }, - ]; - } - } - return PermissionSetFetcher; -}); - -describe('Given a set of permsets, assign it to the user who is deploying the packages', () => { - it('should assign a set of permset, if its not previously assigned', async () => { - - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(2); - expect(results.failedAssignments).toHaveLength(0); - }); - - it('should assign a partial set of permset, if any of them fails', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 0, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Succesfully applied the permsets" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(1); - expect(results.failedAssignments).toHaveLength(1); - }); - - it('should assign none, if all of them fails', async () => { - const testData = new MockTestOrgData(); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let assignPermSetImpl: AssignPermissionSetsImpl = new AssignPermissionSetsImpl( - connection, - ['test1', 'test2'], - null, - new VoidLogger() - ); - const child_processMock = jest.spyOn(child_process, 'execSync'); - child_processMock - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }) - .mockImplementationOnce(() => { - return Buffer.from(`{ - "status": 1, - "result": { - "successes": [{ - "name": "test-sfvulqawd2w0@example.com", - "message": "Permset cannot be applied" - }] - } - }`); - }); - - let results = await assignPermSetImpl.exec(); - expect(results.successfullAssignments).toHaveLength(0); - expect(results.failedAssignments).toHaveLength(2); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts deleted file mode 100644 index cc8bffb51..000000000 --- a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetFetcher.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { expect } from '@jest/globals'; -import PermissionSetFetcher from '../../../src/core/permsets/PermissionSetFetcher'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AnyJson } from '@salesforce/ts-types'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -const $$ = new TestContext(); - -describe('Retrieve assigned permsets provided username and a target org', () => { - it('should return all the permsets for the provided username', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - - let records: AnyJson = { - records: [ - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8fCAG', - }, - Id: '0Pa2s000000PC8fCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS2s000000bldoGAA', - }, - Name: 'Salesforce_DX_Permissions', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: testData.username, - }, - }, - { - attributes: { - type: 'PermissionSetAssignment', - url: '/services/data/v50.0/sobjects/PermissionSetAssignment/0Pa2s000000PC8aCAG', - }, - Id: '0Pa2s000000PC8aCAG', - PermissionSet: { - attributes: { - type: 'PermissionSet', - url: '/services/data/v50.0/sobjects/PermissionSet/0PS6F000004MA6gWAG', - }, - Name: 'X00ex00000018ozT_128_09_43_34_1', - }, - Assignee: { - attributes: { - type: 'User', - url: '/services/data/v50.0/sobjects/User/0052s000000kuInAAI', - }, - Username: testData.username, - }, - }, - ], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); - expect(permsetRecords).toHaveLength(2); - }); - - it('should return an empty array, if no permsets are assigned', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - - let records: AnyJson = { records: [] }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - let permsetRecords = await permsetListImpl.fetchAllPermsetAssignment(); - expect(permsetRecords).toHaveLength(0); - }); - - it('should throw an error, if unable to query permsets', async () => { - const testData = new MockTestOrgData(); - - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { records: [] }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - throw new Error('Unable to fetch records'); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permsetListImpl: PermissionSetFetcher = new PermissionSetFetcher(testData.username, connection); - - try { - await permsetListImpl.fetchAllPermsetAssignment(); - } catch (error) { - expect(error).toBeDefined(); - } - }, 500000); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts b/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts deleted file mode 100644 index 6afcb47cd..000000000 --- a/packages/sfpowerscripts-cli/tests/core/permsets/PermissionSetGroupUpdateAwaiter.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AuthInfo, Connection, OrgConfigProperties } from '@salesforce/core'; -import { AnyJson } from '@salesforce/ts-types'; -const $$ = new TestContext(); -import PermissionSetGroupUpdateAwaiter from '../../../src/core/permsets/PermissionSetGroupUpdateAwaiter'; -import { expect } from '@jest/globals'; - -describe('Await till permissionsets groups are updated', () => { - it('should return if all permsets groups are updated', async () => { - const testData = new MockTestOrgData(); - - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - await $$.stubAuths(testData); - $$.setConfigStubContents('AuthInfoConfig', { - contents: await testData.getConfig(), - }); - - let records: AnyJson = { - records: [], - }; - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - return Promise.resolve(records); - }; - - const connection: Connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - - let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( - connection, - null - ); - await expect(permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated()).resolves.toBeUndefined(); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts b/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts deleted file mode 100644 index 2bb7616a2..000000000 --- a/packages/sfpowerscripts-cli/tests/core/project/ProjectConfig.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -const fs = require("fs-extra"); -import { jest, expect } from '@jest/globals'; -import { PackageType } from '../../../src/core/package/SfpPackage'; -import ProjectConfig from '../../../src/core/project/ProjectConfig'; - -describe('Given a project directory or sfdx-project.json with multiple packages', () => { - //given the below sfdx-project.json - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0x002232323232' }, - }; - - beforeEach(() => { - const fsextraMock = jest.spyOn(fs, 'readFileSync'); - fsextraMock.mockImplementation((path: any, options: string | { encoding?: string; flag?: string }) => { - return JSON.stringify(sfdx_project); - }); - }); - - it('Get the package id of an unlocked package', () => { - expect(ProjectConfig.getPackageId(sfdx_project, 'bi')).toBe('0x002232323232'); - }); - - it('Throws an error, if the package id is missing in PackageAlias', () => { - expect(() => { - ProjectConfig.getPackageId(sfdx_project, 'bi2'); - }).toThrowError('No Package Id found in sfdx-project.json. Please ensure package alias have the package added'); - }); - - it('Fetches all the package', () => { - const manifestHelperMock = jest.spyOn(ProjectConfig, 'getSFDXProjectConfig'); - manifestHelperMock.mockImplementation((projectDirectory: string) => { - return sfdx_project; - }); - expect(ProjectConfig.getAllPackages(null)).toStrictEqual([ - 'temp', - 'core', - 'mass-dataload', - 'access-mgmt', - 'bi', - ]); - }); - - it('Fetches all the package from a project config', () => { - - expect(ProjectConfig.getAllPackagesFromProjectConfig(sfdx_project)).toStrictEqual([ - 'temp', - 'core', - 'mass-dataload', - 'access-mgmt', - 'bi', - ]); - }); - - it('Get manifest, provided a directory', () => { - expect(ProjectConfig.getSFDXProjectConfig(null)).toStrictEqual(sfdx_project); - }); - - it('Gets the type of a package', () => { - expect(ProjectConfig.getPackageType(sfdx_project, 'bi')).toBe(PackageType.Unlocked); - expect(ProjectConfig.getPackageType(sfdx_project, 'core')).toBe(PackageType.Source); - expect(ProjectConfig.getPackageType(sfdx_project, 'mass-dataload')).toBe(PackageType.Data); - }); - - - - - it('Gets the package descriptor of a provided package,provided directory', () => { - let corePackage = { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - expect(ProjectConfig.getSFDXPackageDescriptor(null, 'core')).toStrictEqual(corePackage); - }); - - it('Gets the package descriptor of a provided package', () => { - let corePackage = { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }; - expect(ProjectConfig.getPackageDescriptorFromConfig('core', sfdx_project)).toStrictEqual(corePackage); - }); - - it('Gets the default package, provided directory', () => { - let defaultPackage = { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }; - - expect(ProjectConfig.getDefaultSFDXPackageDescriptor(null)).toStrictEqual(defaultPackage); - }); - - it('Cleans any other package, than the one provided', () => { - let cleaned_sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0x002232323232' }, - }; - - expect(ProjectConfig.cleanupMPDFromProjectDirectory(null, 'temp')).toStrictEqual(cleaned_sfdx_project); - }); - - it(`Gets all the external dependencies of a project`,()=>{ - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0H432322321',bi2:'0H43232232' }, - }; - - - - expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([{ - alias:'bi2', - Package2IdOrSubscriberPackageVersionId:"0H43232232" - }]) - - }); - - it(`Returns empty if there are no external dependencies`,()=>{ - let sfdx_project = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'core', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { bi: '0H432322321' }, - }; - - expect(ProjectConfig.getAllExternalPackages(sfdx_project)).toEqual([]) - - }); - -}); diff --git a/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts b/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts deleted file mode 100644 index 85c598341..000000000 --- a/packages/sfpowerscripts-cli/tests/core/queryHelper/ChunkCollection.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { expect } from '@jest/globals'; -import chunkCollection from '../../../src/core/queryHelper/ChunkCollection'; - -describe('Given a collection', () => { - - it('should return a single chunk for a collection less than 3000 chars', () => { - const collection = ["ApexClassA", "ApexClassB", "ApexClassC"]; - const result = chunkCollection(collection); - expect(result.length).toBe(1); - expect(result).toEqual([ - ["ApexClassA", "ApexClassB", "ApexClassC"] - ]); - }); - - - it('should return N chunks for a collection exceeding the chunk size', () => { - const collection = ["ApexClassA", "ApexClassB", "ApexClassC", "ApexClassD"]; - const result = chunkCollection(collection, 1050, 1000); - expect(result.length).toBe(2); - expect(result).toEqual([ - ["ApexClassA", "ApexClassB", "ApexClassC"], - ["ApexClassD"] - ]); - }); - - it('should throw an error if single element in collection exceeds chunk size', () => { - const collection = ["ApexClassWithAnExceedinglyLongNameGreaterThanTheChunkSize"]; - expect(() => {chunkCollection(collection, 1050, 1000)}).toThrow(); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts deleted file mode 100644 index 15d92cd24..000000000 --- a/packages/sfpowerscripts-cli/tests/core/utils/ChunkArray.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from '@jest/globals'; -import { chunkArray } from '../../../src/core/utils/ChunkArray'; - -describe('Given an input array', () => { - const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - - it('should chunk for even chunk size', () => { - const result = chunkArray(2, input); - expect(result.length).toBe(5); - expect(result).toEqual([ - [1, 2], - [3, 4], - [5, 6], - [7, 8], - [9, 10], - ]); - }); - - it('should chunk for odd chunk size', () => { - const result = chunkArray(3, input); - expect(result.length).toBe(4); - expect(result).toEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts deleted file mode 100644 index 8686ef38c..000000000 --- a/packages/sfpowerscripts-cli/tests/core/utils/FileSystem.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { expect } from '@jest/globals'; -import FileSystem from '../../../src/core/utils/FileSystem'; -const path = require('path'); - -describe('Given a search directory', () => { - it('should return nested files', () => { - const resourcesDir = path.join(__dirname, 'resources'); - let files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, false); - expect(files).toEqual(expectedFiles); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, false); - expect(files).toEqual(expectedFilesIncludingDirs); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), false, true); - expect(files).toEqual(expectedFiles.map((elem) => path.join(resourcesDir, 'a', elem))); - - files = FileSystem.readdirRecursive(path.join(resourcesDir, 'a'), true, true); - expect(files).toEqual(expectedFilesIncludingDirs.map((elem) => path.join(resourcesDir, 'a', elem))); - }); -}); - -const expectedFiles = ['b/b1.file', 'b/c/c1.file', 'b/c/c2.file', 'b/d/d1.file', 'b/d/x/x1.file', 'b/e/e1.file']; -const expectedFilesIncludingDirs = [ - 'b', - 'b/b1.file', - 'b/c', - 'b/c/c1.file', - 'b/c/c2.file', - 'b/d', - 'b/d/d1.file', - 'b/d/x', - 'b/d/x/x1.file', - 'b/e', - 'b/e/e1.file', -]; diff --git a/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts b/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts deleted file mode 100644 index a0fa39e73..000000000 --- a/packages/sfpowerscripts-cli/tests/core/utils/extractDomainFromUrl.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { expect } from '@jest/globals'; -import extractDomainFromUrl from '../../../src/core/utils/extractDomainFromUrl'; - -describe('Given a URL', () => { - it('should extract the domain name for https', () => { - expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( - 'force-power-8147.cs115.my.salesforce.com' - ); - }); - - it('should extract the domain name for http', () => { - expect(extractDomainFromUrl('https://force-power-8147.cs115.my.salesforce.com')).toBe( - 'force-power-8147.cs115.my.salesforce.com' - ); - }); - - it('should extract only the domain name', () => { - expect( - extractDomainFromUrl( - 'https://company.lightning.force.com/lightning/o/Account/list?filterName=00B4Y000000VyMDUA0' - ) - ).toBe('company.lightning.force.com'); - }); - - it('should return null for protocol other than http/s', () => { - expect(extractDomainFromUrl('ftp://ftp.example.com/files/fileA')).toBe(null); - }); - - it('should return input for falsy values', () => { - expect(extractDomainFromUrl('')).toBe(''); - expect(extractDomainFromUrl(undefined)).toBe(undefined); - expect(extractDomainFromUrl(null)).toBe(null); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/b1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/c/c2.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/d1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/d/x/x1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file b/packages/sfpowerscripts-cli/tests/core/utils/resources/a/b/e/e1.file deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts deleted file mode 100644 index ce1ba2f70..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/CommitUpdater.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { expect } from '@jest/globals'; -import CommitUpdater from '../../../src/impl/changelog/CommitUpdater'; -import ReadPackageChangelog from '../../../src/impl/changelog/ReadPackageChangelog'; -import { Changelog as PackageChangelog } from '../../../src/core/changelog/interfaces/GenericChangelogInterfaces'; -import { Release } from '../../../src/impl/changelog/ReleaseChangelog'; -const path = require('path'); -import * as fs from 'fs-extra'; - -describe('Given a CommitUpdater', () => { - let packagesToChangelogFilePaths: { [p: string]: string } = { - ESBaseCodeLWC: 'path/to/ESBaseCodeLWCChangelog', - ESBaseStylesLWC: 'path/to/ESBaseStylesLWCChangelog', - ESObjects: 'path/to/ESObjectsChangelog', - ESSpaceMgmtLWC: 'path/to/ESSpaceMgmtLWCChangelog', - }; - - let resourcesDir: string = path.join(__dirname, 'resources'); - - let readPackageChangelog: ReadPackageChangelog = (changelogFilePath: string) => { - let packageChangelog: PackageChangelog; - - switch (path.basename(changelogFilePath)) { - case 'ESBaseCodeLWCChangelog': - packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESBaseCodeLWCChangelog.json'), { - encoding: 'UTF-8', - }); - break; - case 'ESBaseStylesLWCChangelog': - packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESBaseStylesLWCChangelog.json'), { - encoding: 'UTF-8', - }); - break; - case 'ESObjectsChangelog': - packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESObjectsChangelog.json'), { - encoding: 'UTF-8', - }); - break; - case 'ESSpaceMgmtLWCChangelog': - packageChangelog = fs.readJSONSync(path.join(resourcesDir, 'ESSpaceMgmtLWCChangelog.json'), { - encoding: 'UTF-8', - }); - break; - default: - throw new Error('No changelog for artifact'); - } - return packageChangelog; - }; - - it('should update latestRelease with all commits', () => { - let latestRelease: Release = { - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: undefined, - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESBaseStylesLWC', - from: undefined, - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESObjects', - from: undefined, - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESSpaceMgmtLWC', - from: undefined, - to: '2dbd257', - version: '50.0.4.6', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }; - - new CommitUpdater(latestRelease, undefined, packagesToChangelogFilePaths, readPackageChangelog).update(); - - expect(latestRelease).toEqual( - fs.readJSONSync( - path.join(resourcesDir, 'ExpectedResults', 'should_update_latestRelease_with_all_commits.json'), - { encoding: 'UTF-8' } - ) - ); - }); - - it('should update latestRelease with subset of commits', () => { - let latestRelease: Release = { - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESBaseStylesLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESObjects', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - { - name: 'ESSpaceMgmtLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.4.6', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }; - - let artifactsToLatestCommitId: { [p: string]: string } = { - ESBaseCodeLWC: 'e88a3919', - ESBaseStylesLWC: '5414295c', - ESObjects: '5c0d9381', - ESSpaceMgmtLWC: 'a155ee7a', - }; - - new CommitUpdater( - latestRelease, - artifactsToLatestCommitId, - packagesToChangelogFilePaths, - readPackageChangelog - ).update(); - - expect(latestRelease).toEqual( - fs.readJSONSync( - path.join(resourcesDir, 'ExpectedResults', 'should_update_latestRelease_with_subset_of_commits.json'), - { encoding: 'UTF-8' } - ) - ); - }); - - it('should update latestRelease with empty commits', () => { - let latestRelease: Release = { - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '2dbd257', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }; - - // same artifact version - let artifactsToLatestCommitId: { [p: string]: string } = { - ESBaseCodeLWC: '2dbd257', - }; - - new CommitUpdater( - latestRelease, - artifactsToLatestCommitId, - packagesToChangelogFilePaths, - readPackageChangelog - ).update(); - - expect(latestRelease).toEqual({ - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '2dbd257', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: 'c8dbab13', - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }); - - // latestCommitId does not exist in package changelog - artifactsToLatestCommitId = { - ESBaseCodeLWC: 'ad4d2228', - }; - - new CommitUpdater( - latestRelease, - artifactsToLatestCommitId, - packagesToChangelogFilePaths, - readPackageChangelog - ).update(); - - expect(latestRelease).toEqual({ - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '2dbd257', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: 'c8dbab13', - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts deleted file mode 100644 index 712f4a477..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/OrgUpdater.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { expect } from '@jest/globals'; -import OrgsUpdater from '../../../src/impl/changelog/OrgsUpdater'; -import { ReleaseChangelog, Release, ReleaseId } from '../../../src/impl/changelog/ReleaseChangelog'; -import lodash = require('lodash'); - -describe('Given an OrgsUpdater', () => { - // new release, org & no org - // old release, org-not current release (add/update org.releases), org-current release, & no org - - let releaseChangelog: ReleaseChangelog; - let expectedResult: ReleaseChangelog; - - beforeEach(() => { - releaseChangelog = lodash.cloneDeep(referenceReleaseChangelog); - expectedResult = lodash.cloneDeep(referenceReleaseChangelog); - }); - - it('should add new org, for a new release', () => { - new OrgsUpdater(releaseChangelog, newRelease, 'DEV', null).update(); - - let newReleaseId = convertReleaseToId(newRelease); - expectedResult.orgs.push({ name: 'DEV', releases: [newReleaseId], latestRelease: newReleaseId, retryCount: 0 }); - expect(releaseChangelog).toEqual(expectedResult); - }); - - it('should update an org, for a new release', () => { - let releaseIds: ReleaseId[] = []; - releaseChangelog.releases.forEach((release) => { - releaseIds.push(convertReleaseToId(release)); - }); - - let org = { - name: 'DEV', - releases: releaseIds, - latestRelease: releaseIds[releaseIds.length - 1], - retryCount: 0, - }; - - releaseChangelog.orgs.push(org); - expectedResult.orgs.push(lodash.cloneDeep(org)); - - new OrgsUpdater(releaseChangelog, newRelease, 'DEV', null).update(); - - let newReleaseId = convertReleaseToId(newRelease); - expectedResult.orgs[0].releases.push(newReleaseId); - expectedResult.orgs[0].latestRelease = newReleaseId; - expect(releaseChangelog).toEqual(expectedResult); - }); - - it('should update an org with the release, for an old release', () => { - let releaseIds: ReleaseId[] = []; - releaseChangelog.releases.forEach((release) => { - releaseIds.push(convertReleaseToId(release)); - }); - - let org_dev = { - name: 'DEV', - releases: releaseIds, - latestRelease: releaseIds[releaseIds.length - 1], - retryCount: 0, - }; - - let org_sit = { - name: 'SIT', - releases: [releaseIds[0]], - latestRelease: releaseIds[0], - retryCount: 0, - }; - - releaseChangelog.orgs.push(org_dev); - releaseChangelog.orgs.push(org_sit); - - expectedResult.orgs.push(lodash.cloneDeep(org_dev)); - - let expectedReleaseIds = lodash.cloneDeep(releaseIds); - - expectedResult.orgs.push({ - name: 'SIT', - releases: expectedReleaseIds, - latestRelease: expectedReleaseIds[1], - retryCount: 0, - }); - - new OrgsUpdater(releaseChangelog, oldRelease1, 'SIT', releaseChangelog.releases[1]).update(); - - expect(releaseChangelog).toEqual(expectedResult); - }); - - it("should update an org's retryCount, for an old release", () => { - let releaseId = convertReleaseToId(releaseChangelog.releases[0]); - - let org = { - name: 'DEV', - releases: [releaseId], - latestRelease: releaseId, - retryCount: 0, - }; - - releaseChangelog.orgs.push(org); - - expectedResult.orgs.push(lodash.cloneDeep(org)); - expectedResult.orgs[0].retryCount++; - - new OrgsUpdater(releaseChangelog, oldRelease2, 'DEV', releaseChangelog.releases[0]).update(); - - expect(releaseChangelog).toEqual(expectedResult); - }); -}); - -const oldRelease1: Release = { - names: ['release-1'], - buildNumber: 3, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: undefined, - to: '3d45227b', - version: '50.0.5.6', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', -}; - -const oldRelease2: Release = { - names: ['release-1'], - buildNumber: 2, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: undefined, - to: '2dbd257a', - version: '50.0.5.5', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: '975c78d55ef4dce9621dfb61b6349d463e7003d0', -}; - -const newRelease: Release = { - names: ['release-1'], - buildNumber: 3, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: undefined, - to: '27b545ef', - version: '50.0.5.7', - latestCommitId: undefined, - commits: [], - }, - ], - hashId: 'fd0edacd5a6ee547aac0068b22f839201fbc3c7f', -}; - -const referenceReleaseChangelog: ReleaseChangelog = { - orgs: [], - releases: [ - { - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '1cbf12aa', - to: '2dbd257a', - version: '50.0.5.5', - latestCommitId: 'd7124579', - commits: [ - { - commitId: 'd7124579', - date: '2020-10-19T02:30:31-04:00', - author: 'Mohith Shrivastava', - message: "feat: winter '21 release updates (#178)", - body: - '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', - }, - ], - }, - ], - hashId: '975c78d55ef4dce9621dfb61b6349d463e7003d0', - }, - { - names: ['release-1'], - buildNumber: 2, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '2dbd257a', - to: '3d45227b', - version: '50.0.5.6', - latestCommitId: 'c8dbab13', - commits: [ - { - commitId: 'c8dbab13', - date: '2021-01-25T11:01:55+11:00', - author: 'Azlam', - message: 'Add persist credential to PR (#6)', - body: - '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', - }, - ], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }, - ], -}; - -function convertReleaseToId(release: Release): ReleaseId { - let releaseNames = [...release.names]; // Shallow copy - return { - names: releaseNames, - buildNumber: release.buildNumber, - hashId: release.hashId, - }; -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts b/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts deleted file mode 100644 index c49c64934..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/WorkItemUpdater.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { expect } from '@jest/globals'; -import WorkItemUpdater from '../../../src/impl/changelog/WorkItemUpdater'; -import { Release } from '../../../src/impl/changelog/ReleaseChangelog'; -const path = require('path'); -import * as fs from 'fs-extra'; - -describe('Given a WorkItemUpdater', () => { - const resourceDir: string = path.join(__dirname, 'resources'); - - it('should update latestRelease with work items', () => { - new WorkItemUpdater(latestRelease, ['NGV-[0-9]{3,4}', 'TEST-[0-9]{3,4}']).update(); - - expect(latestRelease).toEqual( - fs.readJSONSync( - path.join(resourceDir, 'ExpectedResults', 'should_update_latestRelease_with_work_items.json'), - { encoding: 'UTF-8' } - ) - ); - }); - - let latestRelease: Release = { - names: ['release-1'], - buildNumber: 1, - workItems: {}, - artifacts: [ - { - name: 'ESBaseCodeLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: 'c8dbab13', - commits: [ - { - commitId: 'c8dbab13', - date: '2021-01-25T11:01:55+11:00', - author: 'Azlam', - message: 'NGV-626 Add persist credential to PR (#6)', - body: - '* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert "Increment versions"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert "Test abs path"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly ', - }, - { - commitId: 'd7124579', - date: '2020-10-19T02:30:31-04:00', - author: 'Mohith Shrivastava', - message: "feat: winter '21 release updates (#178)", - body: - '* NGV-626 Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', - }, - { - commitId: 'e4fd5b2c', - date: '2020-09-28T09:52:59+02:00', - author: 'Alba Rivas', - message: 'Setup sa11y and implement accessibility tests (#162)', - body: '', - }, - { - commitId: '9ca5cf96', - date: '2020-09-04T12:10:49-04:00', - author: 'Mohith Shrivastava', - message: 'feat:object agnostic design for apex code for Customer List component (#158)', - body: - '* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators', - }, - { - commitId: 'e192b8b1', - date: '2020-08-03T18:35:26+05:30', - author: 'Aditya Naag', - message: 'Dependabot Updates (#150)', - body: - '* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>', - }, - ], - }, - { - name: 'ESBaseStylesLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: 'd7124579', - commits: [ - { - commitId: 'd7124579', - date: '2020-10-19T02:30:31-04:00', - author: 'Mohith Shrivastava', - message: "NGV-4000 feat: winter '21 release updates (#178)", - body: - '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', - }, - { - commitId: 'e4fd5b2c', - date: '2020-09-28T09:52:59+02:00', - author: 'Alba Rivas', - message: 'Setup sa11y and implement accessibility tests (#162)', - body: '', - }, - ], - }, - { - name: 'ESObjects', - from: '15cb14b', - to: '2dbd257', - version: '50.0.5.6', - latestCommitId: '3b12d4c2', - commits: [ - { - commitId: '3b12d4c2', - date: '2020-02-17T11:31:08+05:30', - author: 'Aditya Naag', - message: 'Spring 20 Updates (#76)', - body: - '* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n', - }, - ], - }, - { - name: 'ESSpaceMgmtLWC', - from: '15cb14b', - to: '2dbd257', - version: '50.0.4.6', - latestCommitId: 'd60274b3', - commits: [ - { - commitId: 'd60274b3', - date: '2020-11-03T10:08:08-05:00', - author: 'Mohith Shrivastava', - message: 'feat: add in app guidance (#191)', - body: - '* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments', - }, - { - commitId: 'e61ffe19', - date: '2020-10-26T15:04:09-04:00', - author: 'Mohith Shrivastava', - message: 'fix: add order by clause (#189)', - body: 'NGV-6000', - }, - { - commitId: 'd7124579', - date: '2020-10-19T02:30:31-04:00', - author: 'Mohith Shrivastava', - message: "feat: winter '21 release updates (#178)", - body: - '* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>', - }, - { - commitId: 'e4fd5b2c', - date: '2020-09-28T09:52:59+02:00', - author: 'Alba Rivas', - message: 'Setup sa11y and implement accessibility tests (#162)', - body: '', - }, - ], - }, - ], - hashId: 'c97e09b76f82d830731359abe1bab2c9c5be13a9', - }; -}); diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json deleted file mode 100644 index 2fa66c2ed..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseCodeLWCChangelog.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "name": "ESBaseCodeLWC", - "to": "2dbd257", - "commits": [ - { - "commitId": "c8dbab13", - "date": "2021-01-25T11:01:55+11:00", - "author": "Azlam", - "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "e192b8b1", - "date": "2020-08-03T18:35:26+05:30", - "author": "Aditya Naag", - "message": "Dependabot Updates (#150)", - "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "e88a3919", - "date": "2020-08-02T16:52:16-04:00", - "author": "Mohith Shrivastava", - "message": "implement entity particles custom metadata (#144)", - "body": "* implement entity particles custom metadata\r\n\r\n* format xml with prettier\r\n\r\n* remove help text for fields" - }, - { - "commitId": "b4b1f87b", - "date": "2020-07-15T23:06:44+05:30", - "author": "Aditya Naag", - "message": "Tests for error panel (#133)", - "body": "" - }, - { - "commitId": "f4503797", - "date": "2020-06-29T11:31:34-04:00", - "author": "Mohith Shrivastava", - "message": "Add sharing keyword (#118)", - "body": "" - }, - { - "commitId": "9e072cb0", - "date": "2020-06-22T22:54:04+05:30", - "author": "Aditya Naag", - "message": "Sync with Develop and Updated Aura Linting (#115)", - "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "20d23d4c", - "date": "2020-06-19T19:28:37+05:30", - "author": "Aditya Naag", - "message": "Replaced pubsub with LMS (#113)", - "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" - }, - { - "commitId": "3164a36a", - "date": "2020-05-19T22:30:10+02:00", - "author": "Philippe Ozil", - "message": "Doc fix (#106)", - "body": "" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "d9cbd607", - "date": "2020-05-19T21:20:01+05:30", - "author": "Aditya Naag", - "message": "ci: migrated CI jobs to GitHub Actions (#104)", - "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " - }, - { - "commitId": "93910646", - "date": "2020-05-04T19:27:50+02:00", - "author": "Alba Rivas", - "message": "inline message template and svg refactor (#100)", - "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" - }, - { - "commitId": "ab223c5b", - "date": "2020-04-22T12:01:40+05:30", - "author": "Aditya Naag", - "message": "Updated Style classes to respect org density settings (#94)", - "body": "" - }, - { - "commitId": "4c75cbe1", - "date": "2020-04-17T13:42:24+02:00", - "author": "Alba Rivas", - "message": "Error Panel Refactor (#93)", - "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "d5e935f3", - "date": "2019-02-04T14:07:54-08:00", - "author": "Zayne Turner", - "message": "adding Prettier formatting", - "body": "" - }, - { - "commitId": "cf005512", - "date": "2019-02-04T14:01:36-08:00", - "author": "Zayne Turner", - "message": "Adding regular whitespace", - "body": "" - }, - { - "commitId": "ce1eb00e", - "date": "2019-02-04T13:48:59-08:00", - "author": "Zayne Turner", - "message": "Updates to error extraction for inlineMessage", - "body": "" - }, - { - "commitId": "5d3f2739", - "date": "2019-01-29T10:57:32-08:00", - "author": "Zayne Turner", - "message": "Removing unneeded Aura service components", - "body": "" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json deleted file mode 100644 index 20653f431..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESBaseStylesLWCChangelog.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "name": "ESBaseStylesLWC", - "to": "2dbd257", - "commits": [ - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "5414295c", - "date": "2020-07-15T23:18:49+05:30", - "author": "Aditya Naag", - "message": "Tests for imageGallery (#129)", - "body": "* Added tests for imageGallery\r\n\r\n* Updated Comments\r\n\r\n* Added event fire test\r\n\r\n* Fixed issues based on Review Comments\r\n\r\n* Replaced toBe(true) with toBeTruthy()\r\n\r\n* Minor description update" - }, - { - "commitId": "3fca7dca", - "date": "2020-07-15T23:07:46+05:30", - "author": "Aditya Naag", - "message": "Tests for imageTile (#130)", - "body": "* Tests for imageTile\r\n\r\n* Added test for name element\r\n\r\n* Updated describe statement\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "d94a1779", - "date": "2020-07-15T23:07:17+05:30", - "author": "Aditya Naag", - "message": "Tests for pillList (#131)", - "body": "* Tests for pillList\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "82c988e7", - "date": "2020-06-30T15:04:12+02:00", - "author": "Philippe Ozil", - "message": "Set up LWC tests and codecov.io (#119)", - "body": "* Set up LWC tests and codecov.io\r\n\r\n* Fixed branch for codecov badge" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESObjectsChangelog.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESObjectsChangelog.json deleted file mode 100644 index 7c218239e..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESObjectsChangelog.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "ESObjects", - "to": "2dbd257", - "commits": [ - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json deleted file mode 100644 index d181b22b3..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ESSpaceMgmtLWCChangelog.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "name": "ESSpaceMgmtLWC", - "to": "2dbd257", - "commits": [ - { - "commitId": "d60274b3", - "date": "2020-11-03T10:08:08-05:00", - "author": "Mohith Shrivastava", - "message": "feat: add in app guidance (#191)", - "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" - }, - { - "commitId": "e61ffe19", - "date": "2020-10-26T15:04:09-04:00", - "author": "Mohith Shrivastava", - "message": "fix: add order by clause (#189)", - "body": "" - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "a155ee7a", - "date": "2020-09-07T11:55:42+02:00", - "author": "pozil", - "message": "Simplified LMS pub/sub logic", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "55d0933a", - "date": "2020-07-17T14:33:26-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationHelper lwc (#138)", - "body": "* tests for reservationHelper lwc\r\n\r\n* add negative test cases" - }, - { - "commitId": "37cbaa2b", - "date": "2020-07-16T15:06:50-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationTile lwc component (#126)", - "body": "* tests for reservationTile lwc component\r\n\r\n* address review comments\r\n\r\n* address comments on PR" - }, - { - "commitId": "92e07c50", - "date": "2020-07-16T15:06:36-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationDetailForm lwc (#125)", - "body": "* test for reservationDetailForm lwc\r\n\r\n* fix comments\r\n\r\n* fix comments\r\n\r\n* resolve comments from pozil review" - }, - { - "commitId": "dec3e62f", - "date": "2020-07-16T14:02:22-04:00", - "author": "Mohith Shrivastava", - "message": "test for lwc reservationlist component (#127)", - "body": "* tests for reservationList component\r\n\r\n* add few more tests\r\n\r\n* ignore jest coverage reports\r\n\r\n* resolve comments raised\r\n\r\n* fix formating for jest.config.js\r\n\r\nCo-authored-by: Aditya Naag " - }, - { - "commitId": "68e81302", - "date": "2020-07-16T18:35:04+05:30", - "author": "Aditya Naag", - "message": "Tests for SpaceDesigner component (#137)", - "body": "* Tests for SpaceDesigner component\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "33b4fdd1", - "date": "2020-07-16T17:49:59+05:30", - "author": "Aditya Naag", - "message": "Tests for Space Designer Form Component (#136)", - "body": "* Tests for Space Designer Component\r\n\r\n* Cleanup\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "8e0c67e3", - "date": "2020-07-16T07:47:00-04:00", - "author": "Mohith Shrivastava", - "message": "tests for lwc reservationHelperForm (#128)", - "body": "* tests for lwc reservationHelperForm\r\n\r\n* add some more coverage\r\n\r\n* address comments\r\n\r\n* fix test names and code readability" - }, - { - "commitId": "4757d3f3", - "date": "2020-07-16T16:41:55+05:30", - "author": "Aditya Naag", - "message": "Tests for CustomerList Component (#134)", - "body": "* Tests for Customer List Component\r\n\r\n* Fixes for review comments\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "02a00c82", - "date": "2020-07-16T16:34:49+05:30", - "author": "Aditya Naag", - "message": "Tests for Customer Tile (#135)", - "body": "* Tests for Customer Tile\r\n\r\n* Updated Mock for GenerateURL\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "fc006867", - "date": "2020-07-16T15:37:50+05:30", - "author": "Aditya Naag", - "message": "Tests for Customer Detail Form (#132)", - "body": "* Tests for Customer Detail Form\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "4d0a1047", - "date": "2020-07-15T13:38:34-04:00", - "author": "Mohith Shrivastava", - "message": "test for relatedSpaces lwc (#124)", - "body": "* test for related spaces\r\n\r\n* fix comments" - }, - { - "commitId": "0f92230c", - "date": "2020-07-13T21:36:01+05:30", - "author": "Aditya Naag", - "message": "Removed un-needed Application Scope (#123)", - "body": "" - }, - { - "commitId": "9e072cb0", - "date": "2020-06-22T22:54:04+05:30", - "author": "Aditya Naag", - "message": "Sync with Develop and Updated Aura Linting (#115)", - "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "20d23d4c", - "date": "2020-06-19T19:28:37+05:30", - "author": "Aditya Naag", - "message": "Replaced pubsub with LMS (#113)", - "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "d9cbd607", - "date": "2020-05-19T21:20:01+05:30", - "author": "Aditya Naag", - "message": "ci: migrated CI jobs to GitHub Actions (#104)", - "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " - }, - { - "commitId": "93910646", - "date": "2020-05-04T19:27:50+02:00", - "author": "Alba Rivas", - "message": "inline message template and svg refactor (#100)", - "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" - }, - { - "commitId": "4c75cbe1", - "date": "2020-04-17T13:42:24+02:00", - "author": "Alba Rivas", - "message": "Error Panel Refactor (#93)", - "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "4c982202", - "date": "2019-01-04T19:44:31-08:00", - "author": "Zayne Turner", - "message": "Updating isExposed for components used in app builder", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json deleted file mode 100644 index 070bcd232..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_all_commits.json +++ /dev/null @@ -1,635 +0,0 @@ -{ - "names": ["release-1"], - "buildNumber": 1, - "workItems": {}, - "artifacts": [ - { - "name": "ESBaseCodeLWC", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "c8dbab13", - "commits": [ - { - "commitId": "c8dbab13", - "date": "2021-01-25T11:01:55+11:00", - "author": "Azlam", - "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "e192b8b1", - "date": "2020-08-03T18:35:26+05:30", - "author": "Aditya Naag", - "message": "Dependabot Updates (#150)", - "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "e88a3919", - "date": "2020-08-02T16:52:16-04:00", - "author": "Mohith Shrivastava", - "message": "implement entity particles custom metadata (#144)", - "body": "* implement entity particles custom metadata\r\n\r\n* format xml with prettier\r\n\r\n* remove help text for fields" - }, - { - "commitId": "b4b1f87b", - "date": "2020-07-15T23:06:44+05:30", - "author": "Aditya Naag", - "message": "Tests for error panel (#133)", - "body": "" - }, - { - "commitId": "f4503797", - "date": "2020-06-29T11:31:34-04:00", - "author": "Mohith Shrivastava", - "message": "Add sharing keyword (#118)", - "body": "" - }, - { - "commitId": "9e072cb0", - "date": "2020-06-22T22:54:04+05:30", - "author": "Aditya Naag", - "message": "Sync with Develop and Updated Aura Linting (#115)", - "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "20d23d4c", - "date": "2020-06-19T19:28:37+05:30", - "author": "Aditya Naag", - "message": "Replaced pubsub with LMS (#113)", - "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" - }, - { - "commitId": "3164a36a", - "date": "2020-05-19T22:30:10+02:00", - "author": "Philippe Ozil", - "message": "Doc fix (#106)", - "body": "" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "d9cbd607", - "date": "2020-05-19T21:20:01+05:30", - "author": "Aditya Naag", - "message": "ci: migrated CI jobs to GitHub Actions (#104)", - "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " - }, - { - "commitId": "93910646", - "date": "2020-05-04T19:27:50+02:00", - "author": "Alba Rivas", - "message": "inline message template and svg refactor (#100)", - "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" - }, - { - "commitId": "ab223c5b", - "date": "2020-04-22T12:01:40+05:30", - "author": "Aditya Naag", - "message": "Updated Style classes to respect org density settings (#94)", - "body": "" - }, - { - "commitId": "4c75cbe1", - "date": "2020-04-17T13:42:24+02:00", - "author": "Alba Rivas", - "message": "Error Panel Refactor (#93)", - "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "d5e935f3", - "date": "2019-02-04T14:07:54-08:00", - "author": "Zayne Turner", - "message": "adding Prettier formatting", - "body": "" - }, - { - "commitId": "cf005512", - "date": "2019-02-04T14:01:36-08:00", - "author": "Zayne Turner", - "message": "Adding regular whitespace", - "body": "" - }, - { - "commitId": "ce1eb00e", - "date": "2019-02-04T13:48:59-08:00", - "author": "Zayne Turner", - "message": "Updates to error extraction for inlineMessage", - "body": "" - }, - { - "commitId": "5d3f2739", - "date": "2019-01-29T10:57:32-08:00", - "author": "Zayne Turner", - "message": "Removing unneeded Aura service components", - "body": "" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] - }, - { - "name": "ESBaseStylesLWC", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "d7124579", - "commits": [ - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "5414295c", - "date": "2020-07-15T23:18:49+05:30", - "author": "Aditya Naag", - "message": "Tests for imageGallery (#129)", - "body": "* Added tests for imageGallery\r\n\r\n* Updated Comments\r\n\r\n* Added event fire test\r\n\r\n* Fixed issues based on Review Comments\r\n\r\n* Replaced toBe(true) with toBeTruthy()\r\n\r\n* Minor description update" - }, - { - "commitId": "3fca7dca", - "date": "2020-07-15T23:07:46+05:30", - "author": "Aditya Naag", - "message": "Tests for imageTile (#130)", - "body": "* Tests for imageTile\r\n\r\n* Added test for name element\r\n\r\n* Updated describe statement\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "d94a1779", - "date": "2020-07-15T23:07:17+05:30", - "author": "Aditya Naag", - "message": "Tests for pillList (#131)", - "body": "* Tests for pillList\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "82c988e7", - "date": "2020-06-30T15:04:12+02:00", - "author": "Philippe Ozil", - "message": "Set up LWC tests and codecov.io (#119)", - "body": "* Set up LWC tests and codecov.io\r\n\r\n* Fixed branch for codecov badge" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] - }, - { - "name": "ESObjects", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "3b12d4c2", - "commits": [ - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] - }, - { - "name": "ESSpaceMgmtLWC", - "to": "2dbd257", - "version": "50.0.4.6", - "latestCommitId": "d60274b3", - "commits": [ - { - "commitId": "d60274b3", - "date": "2020-11-03T10:08:08-05:00", - "author": "Mohith Shrivastava", - "message": "feat: add in app guidance (#191)", - "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" - }, - { - "commitId": "e61ffe19", - "date": "2020-10-26T15:04:09-04:00", - "author": "Mohith Shrivastava", - "message": "fix: add order by clause (#189)", - "body": "" - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "a155ee7a", - "date": "2020-09-07T11:55:42+02:00", - "author": "pozil", - "message": "Simplified LMS pub/sub logic", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "55d0933a", - "date": "2020-07-17T14:33:26-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationHelper lwc (#138)", - "body": "* tests for reservationHelper lwc\r\n\r\n* add negative test cases" - }, - { - "commitId": "37cbaa2b", - "date": "2020-07-16T15:06:50-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationTile lwc component (#126)", - "body": "* tests for reservationTile lwc component\r\n\r\n* address review comments\r\n\r\n* address comments on PR" - }, - { - "commitId": "92e07c50", - "date": "2020-07-16T15:06:36-04:00", - "author": "Mohith Shrivastava", - "message": "tests for reservationDetailForm lwc (#125)", - "body": "* test for reservationDetailForm lwc\r\n\r\n* fix comments\r\n\r\n* fix comments\r\n\r\n* resolve comments from pozil review" - }, - { - "commitId": "dec3e62f", - "date": "2020-07-16T14:02:22-04:00", - "author": "Mohith Shrivastava", - "message": "test for lwc reservationlist component (#127)", - "body": "* tests for reservationList component\r\n\r\n* add few more tests\r\n\r\n* ignore jest coverage reports\r\n\r\n* resolve comments raised\r\n\r\n* fix formating for jest.config.js\r\n\r\nCo-authored-by: Aditya Naag " - }, - { - "commitId": "68e81302", - "date": "2020-07-16T18:35:04+05:30", - "author": "Aditya Naag", - "message": "Tests for SpaceDesigner component (#137)", - "body": "* Tests for SpaceDesigner component\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "33b4fdd1", - "date": "2020-07-16T17:49:59+05:30", - "author": "Aditya Naag", - "message": "Tests for Space Designer Form Component (#136)", - "body": "* Tests for Space Designer Component\r\n\r\n* Cleanup\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "8e0c67e3", - "date": "2020-07-16T07:47:00-04:00", - "author": "Mohith Shrivastava", - "message": "tests for lwc reservationHelperForm (#128)", - "body": "* tests for lwc reservationHelperForm\r\n\r\n* add some more coverage\r\n\r\n* address comments\r\n\r\n* fix test names and code readability" - }, - { - "commitId": "4757d3f3", - "date": "2020-07-16T16:41:55+05:30", - "author": "Aditya Naag", - "message": "Tests for CustomerList Component (#134)", - "body": "* Tests for Customer List Component\r\n\r\n* Fixes for review comments\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "02a00c82", - "date": "2020-07-16T16:34:49+05:30", - "author": "Aditya Naag", - "message": "Tests for Customer Tile (#135)", - "body": "* Tests for Customer Tile\r\n\r\n* Updated Mock for GenerateURL\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "fc006867", - "date": "2020-07-16T15:37:50+05:30", - "author": "Aditya Naag", - "message": "Tests for Customer Detail Form (#132)", - "body": "* Tests for Customer Detail Form\r\n\r\n* Fixes based on review comments" - }, - { - "commitId": "4d0a1047", - "date": "2020-07-15T13:38:34-04:00", - "author": "Mohith Shrivastava", - "message": "test for relatedSpaces lwc (#124)", - "body": "* test for related spaces\r\n\r\n* fix comments" - }, - { - "commitId": "0f92230c", - "date": "2020-07-13T21:36:01+05:30", - "author": "Aditya Naag", - "message": "Removed un-needed Application Scope (#123)", - "body": "" - }, - { - "commitId": "9e072cb0", - "date": "2020-06-22T22:54:04+05:30", - "author": "Aditya Naag", - "message": "Sync with Develop and Updated Aura Linting (#115)", - "body": "* feat: 🤘🏼adding new GitHub actions (#103)\r\n\r\n* feat: 🤘🏼adding new GitHub actions\r\n\r\n* feat: add pull request template\r\n\r\n* fix: use GitHub task list instead of icons\r\n\r\n* ci: migrated CI jobs to GitHub Actions (#104)\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil \r\n\r\n* Added new package version IDs (#105)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Removed branch deletion step (this is automated)\r\n\r\n* Doc fix (#106)\r\n\r\n* Added new package version IDs (#107)\r\n\r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/eslint-config-lwc from 0.6.0 to 0.7.0 (#108)\r\n\r\nBumps [@salesforce/eslint-config-lwc](https://github.com/salesforce/eslint-config-lwc) from 0.6.0 to 0.7.0.\r\n- [Release notes](https://github.com/salesforce/eslint-config-lwc/releases)\r\n- [Commits](https://github.com/salesforce/eslint-config-lwc/compare/v0.6.0...v0.7.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.0.0 to 7.1.0 (#109)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.0.0 to 7.1.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.0.0...v7.1.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump prettier-plugin-apex from 1.4.0 to 1.5.0 (#111)\r\n\r\nBumps prettier-plugin-apex from 1.4.0 to 1.5.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump lint-staged from 10.2.4 to 10.2.9 (#112)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.4 to 10.2.9.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.4...v10.2.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Aura Linting Tool changes\r\n\r\n* Separated Event Declarations from Dispatch call\r\n\r\n* Split Github Actions for PR and minor code fixes\r\n\r\n* Update Github action name\r\n\r\nCo-authored-by: satyasekharcvb <31529847+satyasekharcvb@users.noreply.github.com>\r\nCo-authored-by: pozil \r\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - }, - { - "commitId": "20d23d4c", - "date": "2020-06-19T19:28:37+05:30", - "author": "Aditya Naag", - "message": "Replaced pubsub with LMS (#113)", - "body": "* Replaced pubsub with LMS\r\n\r\n* Removed unneeded check" - }, - { - "commitId": "c8ff6924", - "date": "2020-05-19T21:44:01+05:30", - "author": "Aditya Naag", - "message": "Updated to version 49.0 (#102)", - "body": "" - }, - { - "commitId": "d9cbd607", - "date": "2020-05-19T21:20:01+05:30", - "author": "Aditya Naag", - "message": "ci: migrated CI jobs to GitHub Actions (#104)", - "body": "* Migrating to GitHub Actions\r\n\r\n* Migrating to GitHub Actions\r\n\r\n* Updated dependencies and fixed aura linting script\r\n\r\n* Fixed Linting Errors\r\n\r\n* Fixed Linting Errors in Aura\r\n\r\n* Testing package install on a scratch org\r\n\r\n* Fixed label\r\n\r\nCo-authored-by: pozil " - }, - { - "commitId": "93910646", - "date": "2020-05-04T19:27:50+02:00", - "author": "Alba Rivas", - "message": "inline message template and svg refactor (#100)", - "body": "* Include SVG in template so that is can be scaled\r\nUse link instead of checkbox to show details\r\nAdd inline message template\r\n\r\n* Fix wrong class change\r\n\r\n* Remove unneeded file" - }, - { - "commitId": "4c75cbe1", - "date": "2020-04-17T13:42:24+02:00", - "author": "Alba Rivas", - "message": "Error Panel Refactor (#93)", - "body": "* Rename inlineMessage to errorPanel for consistency with other sample apps\r\n\r\n* Refactor error panel to follow SLDS styling\r\n\r\n* prettier formatting\r\n\r\n* Small CSS tweak so that the component looks nice in all sample apps\r\n\r\n* Remove not needed file\r\n\r\n* Remove not needed var\r\n\r\n* Prettier formatting\r\n\r\n* Order properties alphabetically and group by type\r\n\r\n* Changed packaging folder for static resource\r\n\r\nCo-authored-by: adityanaag3 " - }, - { - "commitId": "989d0858", - "date": "2020-04-14T22:52:35+05:30", - "author": "Aditya Naag", - "message": "Updated Style Classes to use SLDS Design Tokens (#92)", - "body": "" - }, - { - "commitId": "0f08c795", - "date": "2020-04-06T10:05:20+02:00", - "author": "René Winkelmeyer", - "message": "feat: 🎉 Prettier 2.0 (#88)", - "body": "* feat: 🎉 Prettier 2.0\r\n\r\n* fix: cleanup temporary GH workflows" - }, - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - }, - { - "commitId": "38d4cf2f", - "date": "2019-10-17T15:27:24+05:30", - "author": "Aditya Naag", - "message": "Winter 20 Updates (#55)", - "body": "* Update .gitignore (#44)\r\n\r\nIgnore LWC Local Dev cache folder\r\n\r\n* Removed Aura Wrappers for Flows (#47)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Removed Aura Wrapper for Flows\r\n\r\n* Prettier Updates\r\n\r\n* Updated Description and Screen Component Names\r\n\r\n* Prettier Apex Formatting (#45)\r\n\r\n* Prettier Apex Formatting\r\n\r\nAdd support for Apex formatting using Prettier #36\r\n\r\n* Added support for trigger\r\n\r\n* Updated file types for prettier\r\n\r\n* Updated Versions to 47.0 (#46)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8 (#42)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.8\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.8.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.8)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1 (#43)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.1\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.1.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Updated Org Preferences (#51)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9 (#50)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump husky from 3.0.5 to 3.0.9\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.5 to 3.0.9.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.5...v3.0.9)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2 (#49)\r\n\r\n* Weekly CI builds (#38)\r\n\r\n* Weekly CI builds (#39)\r\n\r\n* Weekly CI builds (#40)\r\n\r\n* Daily builds on all prerelease branches (#41)\r\n\r\n* Bump lint-staged from 9.3.0 to 9.4.2\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.3.0 to 9.4.2.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.3.0...v9.4.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bug Fixes (#48)\r\n\r\n* Updated Versions to 47.0\r\n\r\n* Lead Status Filter Update\r\n\r\n* Changed cursor to pointer on tiles\r\n\r\n* Prettier fixes\r\n\r\n* Prettier Fix for Apex Class\r\n\r\n* Updated Package Versions and Readme (#52)\r\n\r\n* Updated Readme with Latest Package Versions\r\n\r\n* Fixed Data issue with Spaces CSV (#53)\r\n\r\n* Config update for Prerelease (#54)\r\n" - }, - { - "commitId": "5c0d9381", - "date": "2019-06-16T18:12:28+02:00", - "author": "René Winkelmeyer", - "message": "Summer '19 release (#23)", - "body": "* Updating MD and API versions\r\n\r\n* Modifying scratch org to enable path\r\n\r\n* Update API version to 46.0\r\n\r\n* Dependency updates (#24)\r\n\r\n* Summer '19 README updates (#25)\r\n\r\n* Dependency updates\r\n" - }, - { - "commitId": "6c884f49", - "date": "2019-02-11T11:04:08+01:00", - "author": "René Winkelmeyer", - "message": "Spring '19 GA (#11)", - "body": "* Update README for GA\r\n* Update CI config\r\n* Update Prettier config\r\n* Minor code fixes\r\n* Add GA unlocked packages\r\n" - }, - { - "commitId": "f00179b6", - "date": "2019-01-17T09:15:11+01:00", - "author": "René Winkelmeyer", - "message": "Prettier - remove trailing comma (#7)", - "body": "" - }, - { - "commitId": "60fd7784", - "date": "2019-01-15T16:17:44-08:00", - "author": "Zayne Turner", - "message": "Updates to .gitignore syntax and files for jsconfig.json references", - "body": "" - }, - { - "commitId": "4c982202", - "date": "2019-01-04T19:44:31-08:00", - "author": "Zayne Turner", - "message": "Updating isExposed for components used in app builder", - "body": "" - }, - { - "commitId": "81970b22", - "date": "2018-12-14T05:16:21+01:00", - "author": "René Winkelmeyer", - "message": "Streamline tooling files (#2)", - "body": "" - }, - { - "commitId": "cf695b12", - "date": "2018-12-12T08:30:01-05:00", - "author": "Zayne Turner", - "message": "Initial commit", - "body": "" - } - ] - } - ], - "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json deleted file mode 100644 index 62ea88528..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_subset_of_commits.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "names": ["release-1"], - "buildNumber": 1, - "workItems": {}, - "artifacts": [ - { - "name": "ESBaseCodeLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "c8dbab13", - "commits": [ - { - "commitId": "c8dbab13", - "date": "2021-01-25T11:01:55+11:00", - "author": "Azlam", - "message": "Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "e192b8b1", - "date": "2020-08-03T18:35:26+05:30", - "author": "Aditya Naag", - "message": "Dependabot Updates (#150)", - "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - } - ] - }, - { - "name": "ESBaseStylesLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "d7124579", - "commits": [ - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - } - ] - }, - { - "name": "ESObjects", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "3b12d4c2", - "commits": [ - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - } - ] - }, - { - "name": "ESSpaceMgmtLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.4.6", - "latestCommitId": "d60274b3", - "commits": [ - { - "commitId": "d60274b3", - "date": "2020-11-03T10:08:08-05:00", - "author": "Mohith Shrivastava", - "message": "feat: add in app guidance (#191)", - "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" - }, - { - "commitId": "e61ffe19", - "date": "2020-10-26T15:04:09-04:00", - "author": "Mohith Shrivastava", - "message": "fix: add order by clause (#189)", - "body": "" - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - } - ] - } - ], - "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" -} diff --git a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json b/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json deleted file mode 100644 index 0af6bd844..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/changelog/resources/ExpectedResults/should_update_latestRelease_with_work_items.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "names": ["release-1"], - "buildNumber": 1, - "workItems": { - "NGV-626": ["c8dbab13", "d7124579"], - "NGV-4000": ["d7124579"], - "NGV-6000": ["e61ffe19"] - }, - "artifacts": [ - { - "name": "ESBaseCodeLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "c8dbab13", - "commits": [ - { - "commitId": "c8dbab13", - "date": "2021-01-25T11:01:55+11:00", - "author": "Azlam", - "message": "NGV-626 Add persist credential to PR (#6)", - "body": "* Add persist credential to PR\r\n\r\n* switch to alpha\r\n\r\n* Increment versions\r\n\r\n* Revert \"Increment versions\"\r\n\r\nThis reverts commit 39a68617d8e92de46604b883b6681e8022d2e403.\r\n\r\n* Test abs path\r\n\r\n* Revert \"Test abs path\"\r\n\r\nThis reverts commit 5ab30a8b52eddf16025acf6aec57d1bb9262549d.\r\n\r\n* Cleanup and switch to prod version of sfp\r\n\r\nCo-authored-by: sfp \r\nCo-authored-by: Alan Ly " - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* NGV-626 Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - }, - { - "commitId": "9ca5cf96", - "date": "2020-09-04T12:10:49-04:00", - "author": "Mohith Shrivastava", - "message": "feat:object agnostic design for apex code for Customer List component (#158)", - "body": "* feat:object agnostic design for apex code for Customer List component\r\n\r\n* fix: add compound assignment operators" - }, - { - "commitId": "e192b8b1", - "date": "2020-08-03T18:35:26+05:30", - "author": "Aditya Naag", - "message": "Dependabot Updates (#150)", - "body": "* Bump prettier-plugin-apex from 1.5.0 to 1.6.0 (#146)\r\n\r\nBumps prettier-plugin-apex from 1.5.0 to 1.6.0.\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @prettier/plugin-xml from 0.7.2 to 0.10.0 (#147)\r\n\r\nBumps [@prettier/plugin-xml](https://github.com/prettier/plugin-xml) from 0.7.2 to 0.10.0.\r\n- [Release notes](https://github.com/prettier/plugin-xml/releases)\r\n- [Changelog](https://github.com/prettier/plugin-xml/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/plugin-xml/compare/v0.7.2...v0.10.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump eslint from 7.4.0 to 7.6.0 (#145)\r\n\r\nBumps [eslint](https://github.com/eslint/eslint) from 7.4.0 to 7.6.0.\r\n- [Release notes](https://github.com/eslint/eslint/releases)\r\n- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/eslint/eslint/compare/v7.4.0...v7.6.0)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\n\r\n* Bump @salesforce/sfdx-lwc-jest from 0.9.1 to 0.9.2 (#148)\r\n\r\nBumps [@salesforce/sfdx-lwc-jest](https://github.com/salesforce/sfdx-lwc-jest) from 0.9.1 to 0.9.2.\r\n- [Release notes](https://github.com/salesforce/sfdx-lwc-jest/releases)\r\n- [Changelog](https://github.com/salesforce/sfdx-lwc-jest/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/salesforce/sfdx-lwc-jest/compare/v0.9.1...v0.9.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Aditya Naag \r\n\r\n* Fixes for Prettier Version Update\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>" - } - ] - }, - { - "name": "ESBaseStylesLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "d7124579", - "commits": [ - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "NGV-4000 feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - } - ] - }, - { - "name": "ESObjects", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.5.6", - "latestCommitId": "3b12d4c2", - "commits": [ - { - "commitId": "3b12d4c2", - "date": "2020-02-17T11:31:08+05:30", - "author": "Aditya Naag", - "message": "Spring 20 Updates (#76)", - "body": "* Bump prettier from 1.18.2 to 1.19.1 (#56)\r\n\r\nBumps [prettier](https://github.com/prettier/prettier) from 1.18.2 to 1.19.1.\r\n- [Release notes](https://github.com/prettier/prettier/releases)\r\n- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/prettier/prettier/compare/1.18.2...1.19.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\n* Bump semver from 6.3.0 to 7.1.2 (#63)\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 7.1.2.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v7.1.2)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump husky from 3.0.9 to 4.2.1 (#64)\r\n\r\nBumps [husky](https://github.com/typicode/husky) from 3.0.9 to 4.2.1.\r\n- [Release notes](https://github.com/typicode/husky/releases)\r\n- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/typicode/husky/compare/v3.0.9...v4.2.1)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Bump lint-staged from 9.4.2 to 10.0.7 (#65)\r\n\r\nBumps [lint-staged](https://github.com/okonet/lint-staged) from 9.4.2 to 10.0.7.\r\n- [Release notes](https://github.com/okonet/lint-staged/releases)\r\n- [Commits](https://github.com/okonet/lint-staged/compare/v9.4.2...v10.0.7)\r\n\r\nSigned-off-by: dependabot-preview[bot] \r\n\r\nCo-authored-by: Aditya Naag \r\n\r\n* Updated Version Numbers (#66)\r\n\r\n* Removed Track Decorator (#67)\r\n\r\n* Updated Version Numbers\r\n\r\n* Removed @track where not needed\r\n\r\n* Prettier Updates (#68)\r\n\r\n* Formatted XML using Prettier (#69)\r\n\r\n* Added WITH SECURITY_ENFORCED Clause to SOQL Queries (#74)\r\n\r\n* updates for with security enforced (#73)\r\n\r\n* updates for with security enforced (#72)\r\n\r\n* updates for with security enforced (#71)\r\n\r\n* Prettier Updates\r\n\r\nCo-authored-by: Kevin Poorman \r\n\r\n* Updated Package Versions and Readme (#75)\r\n\r\nCo-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>\r\nCo-authored-by: Kevin Poorman \r\n" - } - ] - }, - { - "name": "ESSpaceMgmtLWC", - "from": "15cb14b", - "to": "2dbd257", - "version": "50.0.4.6", - "latestCommitId": "d60274b3", - "commits": [ - { - "commitId": "d60274b3", - "date": "2020-11-03T10:08:08-05:00", - "author": "Mohith Shrivastava", - "message": "feat: add in app guidance (#191)", - "body": "* feat: add in app guidance\r\n\r\n* fix: prettier formatting\r\n\r\n* fix: fix the order of walk throughs\r\n\r\n* fix: Naming issues\r\n\r\n* fix: address In-App guidance issues\r\n\r\n* fix: address minor comments" - }, - { - "commitId": "e61ffe19", - "date": "2020-10-26T15:04:09-04:00", - "author": "Mohith Shrivastava", - "message": "fix: add order by clause (#189)", - "body": "NGV-6000" - }, - { - "commitId": "d7124579", - "date": "2020-10-19T02:30:31-04:00", - "author": "Mohith Shrivastava", - "message": "feat: winter '21 release updates (#178)", - "body": "* Upgrade sa11y version (#165)\r\n\r\n* Update to v50.0 api version (#164)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* update v50.0\r\n\r\n* feat: flow refactor with innvocable method (#168)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* address comments\r\n\r\n* fix: refactor the reservation manager method\r\n\r\n* run prettier\r\n\r\n* update the version to 50.0\r\n\r\n* refactor: use winter21 safe nav operators for null checks (#170)\r\n\r\n* feat: refactor flows to use flow screen elements (#169)\r\n\r\n* update api version and sfdx-jest versions\r\n\r\n* update sfdx-project.json version\r\n\r\n* updated package json\r\n\r\n* freeze api version for jests to pass\r\n\r\n* update package lock file\r\n\r\n* fix prettier issue\r\n\r\n* fix failing test\r\n\r\n* fix class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete marketServices.cls-meta.xml\r\n\r\nDelete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* Delete lower case class names\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* delete lower cases classes\r\n\r\n* fix class name in perms\r\n\r\n* refactor flows to be object agnostic\r\n\r\n* fix package lock json merge\r\n\r\n* feat: refactor flows to use flow screen elements\r\n\r\n* add jest tests for draft event\r\n\r\n* fix comments\r\n\r\n* fix: provide access for @auraenabled apex class winter21 (#172)\r\n\r\n* fix: provide access for @auraenabled apex class winter21\r\n\r\n* pretiier formatting\r\n\r\n* fix: small issues for winter 21 updates (#181)\r\n\r\n* Changed package versions to 50.0.0\r\n\r\nCo-authored-by: Alba Rivas \r\nCo-authored-by: Philippe Ozil <5071767+pozil@users.noreply.github.com>" - }, - { - "commitId": "e4fd5b2c", - "date": "2020-09-28T09:52:59+02:00", - "author": "Alba Rivas", - "message": "Setup sa11y and implement accessibility tests (#162)", - "body": "" - } - ] - } - ], - "hashId": "c97e09b76f82d830731359abe1bab2c9c5be13a9" -} diff --git a/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts b/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts deleted file mode 100644 index 7a6d6879a..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/dependency/ShrinkImpl.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { Connection, AuthInfo, OrgConfigProperties } from '@salesforce/core'; -import ShrinkImpl from '../../../src/impl/dependency/ShrinkImpl'; -const $$ =new TestContext(); - -const setupFakeConnection = async () => { - const testData = new MockTestOrgData(); - testData.makeDevHub(); - - await $$.stubAuths(testData); - await $$.stubAliases({ myAlias: testData.username }); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - - $$.fakeConnectionRequest = (request) => { - return Promise.resolve(response); - }; - - const conn = await Connection.create({ - authInfo: await AuthInfo.create({username: testData.username}) - }); - - return conn; -} - -jest.mock('../../../src/core/git/Git', () => { - class Git { - static async initiateRepo() - { - return new Git(); - } - } - - return Git; -}); - -jest.mock('../../../src/core/git/GitTags', () => { - class GitTags { - async listTagsOnBranch(): Promise { - return gitTags; - } - } - - return GitTags; -}); - -let conn: Connection; -let gitTags; -let response; - -describe("Given a ShrinkImpl", () => { - - beforeEach(async () => { - conn = await setupFakeConnection(); - - }) - - it("should remove duplicate package dependencies from its dependent package", async () => { - const shrinkImpl = new ShrinkImpl(conn); - let resolvedDependencies = await shrinkImpl.shrinkDependencies(projectConfig); - - let dependencies = resolvedDependencies.packageDirectories?.find(pkg => pkg.package === "candidate-management")?.dependencies; - let coreIndex = dependencies.findIndex(dependency => dependency.package === "core"); - expect(dependencies).toBeTruthy(); - expect(dependencies?.length)?.toBe(2); - expect(coreIndex).toBe(1); - }); - - it("should remove duplicate package dependencies from external dependency map", async () => { - const shrinkImpl = new ShrinkImpl(conn); - let resolvedDependencies = await shrinkImpl.shrinkDependencies(projectConfig); - - let dependencies = resolvedDependencies.packageDirectories?.find(pkg => pkg.package === "contact-management")?.dependencies; - let coreIndex = dependencies.findIndex(dependency => dependency.package === "core"); - expect(dependencies).toBeTruthy(); - expect(dependencies?.length)?.toBe(2); - expect(coreIndex).toBe(1); - }); - - - // TODO: test cache -}); - -const projectConfig = { - packageDirectories: [ - { - path: 'packages/base', - default: true, - package: 'base', - versionName: 'temp', - versionNumber: '1.0.2.NEXT', - }, - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'base', - versionNumber: '1.0.2.LATEST' - } - ] - }, - { - path: 'packages/core', - package: 'core', - default: false, - versionName: 'core-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'base', - versionNumber: '1.0.2.LATEST' - }, - { - package: 'temp', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/candidate-management', - package: 'candidate-management', - default: false, - versionName: 'candidate-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'base', - versionNumber: '1.0.2.LATEST' - }, - { - package: 'temp', - versionNumber: '1.0.0.LATEST' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/contact-management', - package: 'contact-management', - default: false, - versionName: 'contact-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: "sfdc-framework" - }, - { - package: 'base', - versionNumber: '1.0.2.LATEST' - }, - { - package: 'temp', - versionNumber: '1.0.0.LATEST' - }, - { - package: 'core', - versionNumber: '1.0.0.LATEST' - } - ] - }, - { - path: 'packages/quote-management', - package: 'quote-management', - default: false, - versionName: 'quote-management-1.0.0', - versionNumber: '1.0.0.NEXT', - dependencies: [ - { - package: 'tech-framework@2.0.0.38' - }, - { - package: 'core', - versionNumber: '1.2.0.LATEST' - }, - { - package: 'candidate-management', - versionNumber: '1.0.0.LATEST' - }, - ] - } - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - "tech-framework@2.0.0.38": '04t1P00000xxxxxx00', - "candidate-management": '0Ho4a00000000xxxx1', - "base": '0Ho4a00000000xxxx1', - "temp": '0Ho4a00000000xxxx1', - "core": '0Ho4a00000000xxxx1', - "contact-management": '0Ho4a00000000xxxx2', - "sfdc-framework":"04t1000x00x00x" - }, - "plugins": { - "sfp": { - "disableShrinkImpl": false, - "externalDependencyMap": { - "tech-framework@2.0.0.38": [ - { - "package": "sfdc-framework" - } - ] - } - } - } -}; - diff --git a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts b/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts deleted file mode 100644 index 876858d10..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/BuildCollections.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { jest, expect } from '@jest/globals'; -import BuildCollections from '../../../src/impl/parallelBuilder/BuildCollections'; - -let packageManifest = null; -jest.mock('../../../src/core/project/ProjectConfig', () => { - class ProjectConfig { - static getSFDXProjectConfig(projectDirectory: string) { - return packageManifest; - } - } - - return ProjectConfig; -}); - -describe('Given a BuildCollections class', () => { - it('should be able to create a graph of collections defined in a sfdx-project.json', () => { - packageManifest = packageManifestWithCollections; - let buildCollections = new BuildCollections(null); - expect(buildCollections.graph.adjacencyList).toEqual(adjacencyList); - }); - - it('should create an empty graph when there are no collections defined in sfdx-project.json', () => { - packageManifest = packageManifestWithNoCollections; - let buildCollections = new BuildCollections(null); - expect(buildCollections.graph.adjacencyList).toEqual({}); - }); - - it('should throw an error when package in collection does not exist', () => { - packageManifest = packageManifestWithError1; - expect(() => { - new BuildCollections(null); - }).toThrowError(`Package 'UNKNOWN' in collection UNKNOWN,core is not a valid package`); - }); - - it("should throw an error when received 'buildCollection' property is not an array", () => { - packageManifest = packageManifestWithError2; - expect(() => { - new BuildCollections(null); - }).toThrowError(`Property 'buildCollection' must be of type Array. Received core`); - }); -}); - -let adjacencyList = { - temp: ['core'], - core: ['temp', 'mass-dataload', 'sales'], - 'mass-dataload': ['core'], - 'access-mgmt': ['bi'], - bi: ['access-mgmt'], - sales: ['core', 'cases'], - cases: ['sales'], -}; - -const packageManifestWithCollections = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate', 'build'], - buildCollection: ['core'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'covax', - versionNumber: '1.0.0.0', - assignPermSetsPreDeployment: ['PermSetA', 'PermSetB', 'PermSetC'], - }, - { - path: 'packages/frameworks/mass-dataload', - package: 'mass-dataload', - default: false, - type: 'data', - versionName: 'mass-dataload', - versionNumber: '1.0.0.0', - buildCollection: ['core'], - }, - { - path: 'packages/access-mgmt', - package: 'access-mgmt', - default: false, - versionName: 'access-mgmt', - versionNumber: '1.0.0.0', - reconcileProfiles: 'true', - buildCollection: ['bi'], - }, - { - path: 'packages/bi', - package: 'bi', - default: false, - versionName: 'bi', - versionNumber: '1.0.0.0', - ignoreOnStage: ['prepare', 'validate'], - }, - { - path: 'packages/sales', - package: 'sales', - default: false, - versionName: 'sales', - versionNumber: '1.0.0.0', - buildCollection: ['core'], - }, - { - path: 'packages/cases', - package: 'cases', - default: false, - versionName: 'cases', - versionNumber: '1.0.0.0', - buildCollection: ['sales'], - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', - packageAliases: { - bi: '0x002232323232', - core: '0H04X00000000XXXXX', - }, -}; - -const packageManifestWithNoCollections = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', -}; - -const packageManifestWithError1 = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - buildCollection: ['UNKNOWN', 'core'], - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'covax', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', -}; - -const packageManifestWithError2 = { - packageDirectories: [ - { - path: 'packages/temp', - default: true, - package: 'temp', - versionName: 'temp', - versionNumber: '1.0.0.0', - buildCollection: 'core', - }, - { - path: 'packages/domains/core', - package: 'core', - default: false, - versionName: 'covax', - versionNumber: '1.0.0.0', - }, - ], - namespace: '', - sfdcLoginUrl: 'https://login.salesforce.com', - sourceApiVersion: '50.0', -}; diff --git a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts b/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts deleted file mode 100644 index d82dcba08..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/parallelBuilder/UndirectedGraph.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { expect } from '@jest/globals'; -import UndirectedGraph from '../../../src/impl/parallelBuilder/UndirectedGraph'; - -describe('Given an Undirected Graph class', () => { - it('should initialise with an empty adjacency list', () => { - let graph = new UndirectedGraph(); - expect(graph.adjacencyList).toEqual({}); - }); - - it('should be able to add new vertices', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - expect(graph.adjacencyList.A).toEqual([]); - }); - - it('should throw an error if adding a vertex that already exists', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - expect(() => { - graph.addVertex('A'); - }).toThrow(); - }); - - it('should be able to add a bi-directional edge between two vertices', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - graph.addVertex('B'); - graph.addEdge('A', 'B'); - expect(graph.adjacencyList).toEqual({ A: ['B'], B: ['A'] }); - }); - - it('should throw an error if adding an edge between vertices that do not exist', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - graph.addVertex('B'); - - expect(() => { - graph.addEdge('A', 'C'); - }).toThrow(); - expect(() => { - graph.addEdge('C', 'A'); - }).toThrow(); - expect(() => { - graph.addEdge('C', 'D'); - }).toThrow(); - }); - - it('should throw an error if adding an edge to a single vertex', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - - expect(() => { - graph.addEdge('A', 'A'); - }).toThrow(); - }); - - it('should be able to list the vertices in a graph, using depth-first search from a given vertex', () => { - let graph = new UndirectedGraph(); - graph.addVertex('A'); - graph.addVertex('B'); - graph.addVertex('C'); - graph.addVertex('D'); - graph.addVertex('E'); - graph.addVertex('F'); - - graph.addEdge('A', 'B'); - graph.addEdge('A', 'C'); - graph.addEdge('B', 'D'); - graph.addEdge('C', 'E'); - graph.addEdge('D', 'E'); - graph.addEdge('D', 'F'); - graph.addEdge('E', 'F'); - - // A - // / \ - // B C - // | | - // D --- E - // \ / - // F - - expect(graph.dfs('F')).toEqual(['F', 'D', 'B', 'A', 'C', 'E']); - expect(graph.dfs('C')).toEqual(['C', 'A', 'B', 'D', 'E', 'F']); - expect(graph.dfs('A')).toEqual(['A', 'B', 'D', 'E', 'C', 'F']); - }); - - it('should throw an error when attempting to perform dfs from a non-existent vertex', () => { - let graph = new UndirectedGraph(); - expect(() => { - graph.dfs('A'); - }).toThrowError("Vertex 'A' does not exist"); - }); -}); diff --git a/packages/sfpowerscripts-cli/tests/impl/release/ReleaseDefinition.test.ts b/packages/sfpowerscripts-cli/tests/impl/release/ReleaseDefinition.test.ts deleted file mode 100644 index a4820edba..000000000 --- a/packages/sfpowerscripts-cli/tests/impl/release/ReleaseDefinition.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { jest, expect } from '@jest/globals'; -const fs = require('fs-extra'); -import ReleaseDefinition from '../../../src/impl/release/ReleaseDefinition'; - -describe('Given a release definition, validateReleaseDefinition', () => { - let releaseDefinitionYaml: string; - - beforeEach(() => { - const fsMock = jest.spyOn(fs, 'readFileSync'); - fsMock.mockImplementation(() => { - return releaseDefinitionYaml; - }); - }); - - it('should throw if artifacts field is missing', async () => { - releaseDefinitionYaml = ` - release: "test-release" - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).rejects.toThrowError(); - }); - - it('should throw if release field is missing', async () => { - releaseDefinitionYaml = ` - artifacts: - packageA: "1.0.0-0" - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).rejects.toThrowError(); - }); - - it('should not throw an error for valid package dependency', async () => { - releaseDefinitionYaml = ` - release: "test-release" - artifacts: - packageA: "3.0.5-13" - packageDependencies: - packageX: 04t0H000000xVrwQAE - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).toBeDefined(); - }); - - it('should throw an error for an invalid package dependency', async () => { - releaseDefinitionYaml = ` - release: "test-release" - artifacts: - packageA: "3.0.5-13" - packageDependencies: - packageX: 04t0H000000xVrwQAE123 - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).rejects.toThrowError(); - }); - - it('should not throw an error for valid release parameters', async () => { - releaseDefinitionYaml = ` - release: "test-release" - skipIfAlreadyInstalled: true - baselineOrg: "prod" - artifacts: - packageA: "3.0.5-13" - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).toBeDefined(); - }); - - it('should throw an error if baselineOrg specified but skipIfAlreadyInstalled is false', async () => { - releaseDefinitionYaml = ` - release: "test-release" - skipIfAlreadyInstalled: false - baselineOrg: "prod" - artifacts: - packageA: "3.0.5-13" - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).rejects.toThrowError(); - }); - - it('should not throw an error for valid changelog parameters', async () => { - releaseDefinitionYaml = ` - release: "test-release" - artifacts: - packageA: "3.0.5-13" - changelog: - workItemFilters: - - "GOR-[0-9]{4}" - workItemUrl: "https://www.atlassian.com/software/jira" - limit: 10 - showAllArtifacts: false - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).toBeDefined(); - }); - - it('should throw an error if required changelog parameters are missing', async () => { - releaseDefinitionYaml = ` - release: "test-release" - artifacts: - packageA: "3.0.5-13" - changelog: - workItemUrl: "https://www.atlassian.com/software/jira" - limit: 10 - showAllArtifacts: false - `; - - expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); - }).rejects.toThrow(); - }); -}); diff --git a/packages/sfpowerscripts-cli/tsconfig.json b/packages/sfpowerscripts-cli/tsconfig.json deleted file mode 100644 index 35a048a99..000000000 --- a/packages/sfpowerscripts-cli/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib", - "rootDir": "./src", - "skipLibCheck": true - }, - "exclude": ["node_modules", "dist", "tests"] -} diff --git a/packages/sfprofiles/package.json b/packages/sfprofiles/package.json index 72fdcf59a..0d81d3f16 100644 --- a/packages/sfprofiles/package.json +++ b/packages/sfprofiles/package.json @@ -1,5 +1,5 @@ { - "name": "@dxatscale/sfprofiles", + "name": "@flxblio/sfprofiles", "version": "2.0.8", "description": "Salesforce Profile management", "keywords": [ @@ -8,8 +8,8 @@ "profiles", "permissions" ], - "author": "dxatscale", - "homepage": "https://github.com/dxatscale/sfpowerscripts", + "author": "flxblio", + "homepage": "https://github.com/flxblio/sfp", "license": "MIT", "main": "lib/sfprofiles", "types": "lib/sfprofiles", @@ -22,7 +22,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/dxatscale/sfpowerscripts.git" + "url": "git+https://github.com/flxblio/sfp.git" }, "scripts": { "build": "pnpm run clean && pnpm run compile", @@ -32,7 +32,7 @@ "clearCache": "jest --clearCache" }, "bugs": { - "url": "https://github.com/dxatscale/sfpowerscripts/issues" + "url": "https://github.com/flxblio/sfp/issues" }, "devDependencies": { "@babel/core": "7.18.2", @@ -59,7 +59,7 @@ "typescript": "^5" }, "dependencies": { - "@dxatscale/sfp-logger": "^2.1.2", + "@flxblio/sfp-logger": "^2.1.2", "@salesforce/core": "5.3.9", "@salesforce/source-deploy-retrieve": "9.7.24", "async-retry": "^1.3.3", diff --git a/packages/sfprofiles/src/impl/diff/diffImpl.ts b/packages/sfprofiles/src/impl/diff/diffImpl.ts index 0c08a3777..f51cb06e1 100644 --- a/packages/sfprofiles/src/impl/diff/diffImpl.ts +++ b/packages/sfprofiles/src/impl/diff/diffImpl.ts @@ -21,7 +21,7 @@ import SharingRuleDiff from './sharingRuleDiff'; import CustomLabelsDiff from './customLabelsDiff'; import DiffUtil, { DiffFile, DiffFileStatus } from './diffUtil'; import { Sfpowerkit } from '@utils/sfpowerkit'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { DXProjectManifestUtils } from '@utils/dxProjectManifestUtils'; import simplegit from 'simple-git'; import { Messages } from '@salesforce/core'; diff --git a/packages/sfprofiles/src/impl/diff/diffUtil.ts b/packages/sfprofiles/src/impl/diff/diffUtil.ts index 89f342954..901457b68 100644 --- a/packages/sfprofiles/src/impl/diff/diffUtil.ts +++ b/packages/sfprofiles/src/impl/diff/diffUtil.ts @@ -5,7 +5,7 @@ import * as _ from 'lodash'; import MetadataFiles from '@impl/metadata/metadataFiles'; import { SOURCE_EXTENSION_REGEX } from '@impl/metadata/metadataInfo'; import { METADATA_INFO } from '@impl/metadata/metadataInfo'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import simplegit, { SimpleGit } from 'simple-git'; const SEP = /\/|\\/; diff --git a/packages/sfprofiles/src/impl/metadata/metadataFiles.ts b/packages/sfprofiles/src/impl/metadata/metadataFiles.ts index 7cdf12cf0..272f93bd1 100644 --- a/packages/sfprofiles/src/impl/metadata/metadataFiles.ts +++ b/packages/sfprofiles/src/impl/metadata/metadataFiles.ts @@ -5,7 +5,7 @@ import _ from 'lodash'; import ignore from 'ignore'; import * as fs from 'fs-extra'; import { Sfpowerkit } from 'utils/sfpowerkit'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { globSync } from 'glob'; const SEP = /\/|\\/; diff --git a/packages/sfprofiles/src/impl/metadata/packageBuilder.ts b/packages/sfprofiles/src/impl/metadata/packageBuilder.ts index 674deaaf6..7ccf0d423 100644 --- a/packages/sfprofiles/src/impl/metadata/packageBuilder.ts +++ b/packages/sfprofiles/src/impl/metadata/packageBuilder.ts @@ -5,7 +5,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import FileUtils from 'utils/fileutils'; import { FileProperties } from 'jsforce/lib/api/metadata'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; if (Symbol['asyncIterator'] === undefined) { diff --git a/packages/sfprofiles/src/impl/metadata/retriever/metadataRetriever.ts b/packages/sfprofiles/src/impl/metadata/retriever/metadataRetriever.ts index 86145a360..8cff0045b 100644 --- a/packages/sfprofiles/src/impl/metadata/retriever/metadataRetriever.ts +++ b/packages/sfprofiles/src/impl/metadata/retriever/metadataRetriever.ts @@ -4,7 +4,7 @@ import { Connection } from 'jsforce'; import QueryExecutor from '@utils/queryExecutor'; import MetadataOperation from '@utils/metadataOperation'; import { registry } from '@salesforce/source-deploy-retrieve'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; export default class MetadataRetriever { protected _componentType; diff --git a/packages/sfprofiles/src/impl/metadata/retriever/metadataSummaryInfoFetcher.ts b/packages/sfprofiles/src/impl/metadata/retriever/metadataSummaryInfoFetcher.ts index f0e8f57a0..0ac652102 100644 --- a/packages/sfprofiles/src/impl/metadata/retriever/metadataSummaryInfoFetcher.ts +++ b/packages/sfprofiles/src/impl/metadata/retriever/metadataSummaryInfoFetcher.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import getDefaults from '@utils/getDefaults'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { FileProperties, DescribeMetadataResult } from 'jsforce/lib/api/metadata'; import { Connection } from 'jsforce'; import { chunkArray } from '@utils/chunkArray'; diff --git a/packages/sfprofiles/src/impl/source/profileActions.ts b/packages/sfprofiles/src/impl/source/profileActions.ts index a68dca869..7d2aed9ee 100644 --- a/packages/sfprofiles/src/impl/source/profileActions.ts +++ b/packages/sfprofiles/src/impl/source/profileActions.ts @@ -1,5 +1,5 @@ import { Sfpowerkit } from '@utils/sfpowerkit'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import * as path from 'path'; import FileUtils from '@utils/fileutils'; import { retrieveMetadata } from '@utils/retrieveMetadata'; diff --git a/packages/sfprofiles/src/impl/source/profileComponentReconciler.ts b/packages/sfprofiles/src/impl/source/profileComponentReconciler.ts index 272942a2d..ab53ac8b8 100644 --- a/packages/sfprofiles/src/impl/source/profileComponentReconciler.ts +++ b/packages/sfprofiles/src/impl/source/profileComponentReconciler.ts @@ -1,7 +1,7 @@ import { Connection } from '@salesforce/core'; import { registry } from '@salesforce/source-deploy-retrieve'; import MetadataFiles from '@impl/metadata/metadataFiles'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { Sfpowerkit } from '@utils/sfpowerkit'; import UserPermissionBuilder from '@impl/metadata/builder/userPermissionBuilder'; import MetadataRetriever from '@impl/metadata/retriever/metadataRetriever'; diff --git a/packages/sfprofiles/src/impl/source/profileDiff.ts b/packages/sfprofiles/src/impl/source/profileDiff.ts index dda358a2a..e59633df6 100644 --- a/packages/sfprofiles/src/impl/source/profileDiff.ts +++ b/packages/sfprofiles/src/impl/source/profileDiff.ts @@ -8,7 +8,7 @@ import ProfileWriter from '@impl/metadata/writer/profileWriter'; import Profile from '@impl/metadata/schema'; import { Sfpowerkit } from '@utils/sfpowerkit'; import MetadataFiles from '@impl/metadata/metadataFiles'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { diff_match_patch } from 'diff-match-patch'; import 'diff-match-patch-line-and-word'; // import globally to enhanse the class diff --git a/packages/sfprofiles/src/impl/source/profileMerge.ts b/packages/sfprofiles/src/impl/source/profileMerge.ts index da2103c5c..b95a48e25 100644 --- a/packages/sfprofiles/src/impl/source/profileMerge.ts +++ b/packages/sfprofiles/src/impl/source/profileMerge.ts @@ -24,7 +24,7 @@ import Profile, { import * as util from 'util'; import ProfileActions, { ProfileStatus } from './profileActions'; import ProfileWriter from '@impl/metadata/writer/profileWriter'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; const unsupportedprofiles = []; diff --git a/packages/sfprofiles/src/impl/source/profileReconcile.ts b/packages/sfprofiles/src/impl/source/profileReconcile.ts index 37f9faf15..443223673 100644 --- a/packages/sfprofiles/src/impl/source/profileReconcile.ts +++ b/packages/sfprofiles/src/impl/source/profileReconcile.ts @@ -5,7 +5,7 @@ import ProfileActions, { ProfileSourceFile } from './profileActions'; import FileUtils from '@utils/fileutils'; import * as fs from 'fs-extra'; import { Worker } from 'worker_threads'; -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; import MetadataFiles from '@impl/metadata/metadataFiles'; export default class ProfileReconcile extends ProfileActions { diff --git a/packages/sfprofiles/src/impl/source/profileSync.ts b/packages/sfprofiles/src/impl/source/profileSync.ts index fefedd17c..bb41a5f6c 100644 --- a/packages/sfprofiles/src/impl/source/profileSync.ts +++ b/packages/sfprofiles/src/impl/source/profileSync.ts @@ -1,4 +1,4 @@ -import SFPLogger, { LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; import Profile from '@impl/metadata/schema'; import * as _ from 'lodash'; diff --git a/packages/sfprofiles/src/impl/source/reconcileWorker.ts b/packages/sfprofiles/src/impl/source/reconcileWorker.ts index 5252e3073..e0af61daf 100644 --- a/packages/sfprofiles/src/impl/source/reconcileWorker.ts +++ b/packages/sfprofiles/src/impl/source/reconcileWorker.ts @@ -1,6 +1,6 @@ import { Connection, Org, SfProject } from '@salesforce/core'; import { Sfpowerkit } from '@utils/sfpowerkit'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import { parentPort, workerData } from 'worker_threads'; import * as fs from 'fs-extra'; import * as path from 'path'; diff --git a/packages/sfprofiles/src/impl/user/passwordgenerateimpl.ts b/packages/sfprofiles/src/impl/user/passwordgenerateimpl.ts index e0894d8b0..bf0a14fab 100644 --- a/packages/sfprofiles/src/impl/user/passwordgenerateimpl.ts +++ b/packages/sfprofiles/src/impl/user/passwordgenerateimpl.ts @@ -2,7 +2,7 @@ // eslint-disable-next-line no-useless-escape import { Connection, User, AuthInfo } from '@salesforce/core'; import queryApi from '../../utils/queryExecutor'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; export default class Passwordgenerateimpl { public static async run(userName: string) { diff --git a/packages/sfprofiles/src/utils/checkDeploymentStatus.ts b/packages/sfprofiles/src/utils/checkDeploymentStatus.ts index d12a2d729..9ff43425a 100644 --- a/packages/sfprofiles/src/utils/checkDeploymentStatus.ts +++ b/packages/sfprofiles/src/utils/checkDeploymentStatus.ts @@ -1,7 +1,7 @@ import { Connection } from 'jsforce'; import { DeployResult } from 'jsforce/lib/api/metadata'; import { delay } from './delay'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; export async function checkDeploymentStatus(conn: Connection, retrievedId: string): Promise { let metadata_result; diff --git a/packages/sfprofiles/src/utils/checkRetrievalStatus.ts b/packages/sfprofiles/src/utils/checkRetrievalStatus.ts index ac018f593..a5fcbee25 100644 --- a/packages/sfprofiles/src/utils/checkRetrievalStatus.ts +++ b/packages/sfprofiles/src/utils/checkRetrievalStatus.ts @@ -1,7 +1,7 @@ import { Connection } from 'jsforce'; import { RetrieveResult } from 'jsforce/lib/api/metadata'; import { delay } from './delay'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; export async function checkRetrievalStatus(conn: Connection, retrievedId: string, isToBeLoggedToConsole = true): Promise { diff --git a/packages/sfprofiles/src/utils/fileutils.ts b/packages/sfprofiles/src/utils/fileutils.ts index 9eac17c81..136316bd9 100644 --- a/packages/sfprofiles/src/utils/fileutils.ts +++ b/packages/sfprofiles/src/utils/fileutils.ts @@ -1,4 +1,4 @@ -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra' const path = require('path'); const _ = require('lodash'); diff --git a/packages/sfprofiles/src/utils/metadataOperation.ts b/packages/sfprofiles/src/utils/metadataOperation.ts index e25c5bb89..a3c687bc3 100644 --- a/packages/sfprofiles/src/utils/metadataOperation.ts +++ b/packages/sfprofiles/src/utils/metadataOperation.ts @@ -1,6 +1,6 @@ import { Connection } from 'jsforce'; import { Sfpowerkit } from '@utils/sfpowerkit'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import retry from 'async-retry'; export default class MetadataOperation { diff --git a/packages/sfprofiles/src/utils/queryExecutor.ts b/packages/sfprofiles/src/utils/queryExecutor.ts index 6b318c121..c97a3b62e 100644 --- a/packages/sfprofiles/src/utils/queryExecutor.ts +++ b/packages/sfprofiles/src/utils/queryExecutor.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Connection } from 'jsforce'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import retry from 'async-retry'; export default class QueryExecutor { diff --git a/packages/sfprofiles/src/utils/searchFilesInDirectory.ts b/packages/sfprofiles/src/utils/searchFilesInDirectory.ts index 506e0af12..4e96f7de5 100644 --- a/packages/sfprofiles/src/utils/searchFilesInDirectory.ts +++ b/packages/sfprofiles/src/utils/searchFilesInDirectory.ts @@ -1,4 +1,4 @@ -import SFPLogger from '@dxatscale/sfp-logger'; +import SFPLogger from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; import * as path from 'path'; diff --git a/packages/sfprofiles/src/utils/sfpowerkit.ts b/packages/sfprofiles/src/utils/sfpowerkit.ts index 9d0b4afdd..184659e9c 100644 --- a/packages/sfprofiles/src/utils/sfpowerkit.ts +++ b/packages/sfprofiles/src/utils/sfpowerkit.ts @@ -3,7 +3,7 @@ import chalk from 'chalk'; import * as fs from 'fs-extra'; import SQLITEKeyValue from './sqlitekv'; import FileUtils from './fileutils'; -import SFPLogger, {LoggerLevel } from '@dxatscale/sfp-logger'; +import SFPLogger, {LoggerLevel } from '@flxblio/sfp-logger'; import NodeCache from 'node-cache'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4403be2d5..1ee561811 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16276 +1,11510 @@ lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - .: - dependencies: - neverthrow: - specifier: ^4.2.1 - version: 4.2.1 - xml-formatter: - specifier: ^3.3.2 - version: 3.3.2 - devDependencies: - '@commitlint/cli': - specifier: ^15.0.0 - version: 15.0.0 - '@commitlint/config-conventional': - specifier: ^15.0.0 - version: 15.0.0 - '@types/async-retry': - specifier: ^1.4.2 - version: 1.4.2 - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/mocha': - specifier: ^5.2.7 - version: 5.2.7 - '@types/node': - specifier: ^10 - version: 10.0.0 - '@types/q': - specifier: ^1.5.2 - version: 1.5.2 - '@types/xml2js': - specifier: ^0.4.5 - version: 0.4.5 - lerna: - specifier: ^7.1.4 - version: 7.1.4 - lerna-update-wizard: - specifier: ^1.1.0 - version: 1.1.0 - prettier: - specifier: ^2.0.5 - version: 2.0.5 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - semver: - specifier: 7.5.2 - version: 7.5.2 - ts-loader: - specifier: ~9.4.2 - version: 9.4.2(typescript@5.0.2)(webpack@5.88.2) - ts-node: - specifier: ^9 - version: 9.1.1(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/apexlink: - dependencies: - '@dxatscale/sfdx-process-wrapper': - specifier: ^1.0.2 - version: link:../sfdx-process-wrapper - '@dxatscale/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - find-java-home: - specifier: 2.0.0 - version: 2.0.0 - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - jest: - specifier: 29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/core: - dependencies: - '@dxatscale/apexlink': - specifier: ^1.0.2 - version: link:../apexlink - '@dxatscale/sfdx-process-wrapper': - specifier: ^1.0.2 - version: link:../sfdx-process-wrapper - '@dxatscale/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - '@dxatscale/sfprofiles': - specifier: ^2.0.8 - version: link:../sfprofiles - '@newrelic/telemetry-sdk': - specifier: ^0.6.0 - version: 0.6.0 - '@salesforce/apex-node': - specifier: 2.1.0 - version: 2.1.0 - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/kit': - specifier: 3.0.13 - version: 3.0.13 - '@salesforce/packaging': - specifier: 2.3.3 - version: 2.3.3(@types/node@20.4.4)(typescript@5.0.2) - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - '@salesforce/source-tracking': - specifier: 4.2.16 - version: 4.2.16 - adm-zip: - specifier: ^0.5.6 - version: 0.5.6 - apex-parser: - specifier: 2.13.0 - version: 2.13.0 - async-retry: - specifier: ^1.3.3 - version: 1.3.3 - axios: - specifier: ^1.4.0 - version: 1.4.0 - bottleneck: - specifier: ^2.19.5 - version: 2.19.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - cli-table: - specifier: 0.3.11 - version: 0.3.11 - datadog-metrics: - specifier: ^0.9.3 - version: 0.9.3 - fast-xml-parser: - specifier: 4.2.7 - version: 4.2.7 - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - glob: - specifier: ^10.3.3 - version: 10.3.3 - hot-shots: - specifier: ^8.5.0 - version: 8.5.0 - ignore: - specifier: ^5.1.6 - version: 5.1.6 - js-yaml: - specifier: 4.1.0 - version: 4.1.0 - jsforce: - specifier: ^2.0.0-beta.27 - version: 2.0.0-beta.27 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - neverthrow: - specifier: 4.4.2 - version: 4.4.2 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - semver: - specifier: 7.5.2 - version: 7.5.2 - simple-git: - specifier: 3.16.0 - version: 3.16.0 - tar: - specifier: ^6.1.9 - version: 6.1.9 - tmp: - specifier: ^0.2.1 - version: 0.2.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.7 - version: 2.0.7 - '@types/adm-zip': - specifier: ^0.5.0 - version: 0.5.0 - '@types/async-retry': - specifier: ^1.4.2 - version: 1.4.2 - '@types/datadog-metrics': - specifier: ^0.6.1 - version: 0.6.1 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - '@types/node': - specifier: 20.4.4 - version: 20.4.4 - '@types/splunk-logging': - specifier: ^0.11.1 - version: 0.11.1 - '@types/tmp': - specifier: ^0.2.3 - version: 0.2.3 - jest: - specifier: ^29.5.3 - version: 29.6.0(@types/node@20.4.4)(ts-node@10.7.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.0)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@20.4.4)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/forcemula: - devDependencies: - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - - packages/sfdx-process-wrapper: - dependencies: - '@dxatscale/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - devDependencies: - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/node': - specifier: ^10 - version: 10.0.0 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfplogger: - dependencies: - chalk: - specifier: ^4.1.2 - version: 4.1.2 - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - strip-ansi: - specifier: ^6.0.0 - version: 6.0.1 - devDependencies: - '@types/node': - specifier: ^14.14.7 - version: 14.14.7 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfpowerscripts-cli: - dependencies: - '@dxatscale/sfdx-process-wrapper': - specifier: ^1.0.2 - version: link:../sfdx-process-wrapper - '@dxatscale/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - '@dxatscale/sfpowerscripts.core': - specifier: ^36.5.3 - version: link:../core - '@dxatscale/sfprofiles': - specifier: ^2.0.8 - version: link:../sfprofiles - '@oclif/core': - specifier: 2.11.8 - version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-commands': - specifier: ^3.0.3 - version: 3.0.3 - '@oclif/plugin-help': - specifier: 5.2.17 - version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/kit': - specifier: 3.0.13 - version: 3.0.13 - adm-zip: - specifier: ^0.5.10 - version: 0.5.10 - ajv: - specifier: 8.11.0 - version: 8.11.0 - async-retry: - specifier: ^1.3.1 - version: 1.3.1 - bottleneck: - specifier: ^2.19.5 - version: 2.19.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - cli-table: - specifier: 0.3.11 - version: 0.3.11 - dotenv: - specifier: 16.3.1 - version: 16.3.1 - fs-extra: - specifier: ^11.1.1 - version: 11.1.1 - glob: - specifier: ^10.3.3 - version: 10.3.3 - handlebars: - specifier: ^4.7.7 - version: 4.7.7 - js-yaml: - specifier: ^4.0.0 - version: 4.0.0 - jsforce: - specifier: 2.0.0-beta.27 - version: 2.0.0-beta.27 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - markdown-table: - specifier: ^2.0.0 - version: 2.0.0 - markdown-table-ts: - specifier: ^1.0.3 - version: 1.0.3 - marked: - specifier: 4.0.16 - version: 4.0.16 - marked-terminal: - specifier: 5.1.1 - version: 5.1.1(marked@4.0.16) - neverthrow: - specifier: 4.4.2 - version: 4.4.2 - object-hash: - specifier: ^2.1.1 - version: 2.1.1 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - semver: - specifier: 7.5.2 - version: 7.5.2 - simple-git: - specifier: 3.19.1 - version: 3.19.1 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@oclif/plugin-command-snapshot': - specifier: ^3 - version: 3.0.0(@oclif/config@1.18.15) - '@oclif/test': - specifier: ^2 - version: 2.0.0 - '@salesforce/dev-config': - specifier: 3.0.1 - version: 3.0.1 - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.5 - version: 2.0.5 - '@types/adm-zip': - specifier: ^0.4.33 - version: 0.4.33 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/marked': - specifier: 4.0.2 - version: 4.0.2 - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - oclif: - specifier: ^3.10.0 - version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfprofiles: - dependencies: - '@dxatscale/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - async-retry: - specifier: ^1.3.3 - version: 1.3.3 - better-sqlite3: - specifier: 8.4.0 - version: 8.4.0 - chalk: - specifier: ^4.1.0 - version: 4.1.0 - diff-match-patch: - specifier: ^1.0.5 - version: 1.0.5 - fs-extra: - specifier: ^11.1.0 - version: 11.1.0 - glob: - specifier: 10.3.3 - version: 10.3.3 - ignore: - specifier: ^5.1.8 - version: 5.2.4 - jsforce: - specifier: ^2.0.0-beta.27 - version: 2.0.0-beta.27 - node-cache: - specifier: ^5.1.2 - version: 5.1.2 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - simple-git: - specifier: ^3.16.0 - version: 3.16.0 - tslib: - specifier: 2.1.0 - version: 2.1.0 - xml-formatter: - specifier: ^3.4.1 - version: 3.4.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.7 - version: 2.0.7 - '@types/async-retry': - specifier: 1.4.5 - version: 1.4.5 - '@types/datadog-metrics': - specifier: ^0.6.1 - version: 0.6.1 - '@types/diff-match-patch': - specifier: ^1.0.32 - version: 1.0.32 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/lodash': - specifier: ^4.14.191 - version: 4.14.191 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - '@types/node': - specifier: 20.4.4 - version: 20.4.4 - '@types/rimraf': - specifier: ^3.0.2 - version: 3.0.2 - '@typescript-eslint/eslint-plugin': - specifier: ^5.53.0 - version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/parser': - specifier: ^5.53.0 - version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) - eslint: - specifier: ^8.33.0 - version: 8.33.0 - jest: - specifier: ^29.5.3 - version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: ^9.1.1 - version: 9.1.1(typescript@5.0.2) - tsc-alias: - specifier: ^1.8.3 - version: 1.8.3 - typescript: - specifier: ^5 - version: 5.0.2 + + .: + dependencies: + neverthrow: + specifier: ^4.2.1 + version: 4.2.1 + xml-formatter: + specifier: ^3.3.2 + version: 3.3.2 + devDependencies: + '@commitlint/cli': + specifier: ^15.0.0 + version: 15.0.0 + '@commitlint/config-conventional': + specifier: ^15.0.0 + version: 15.0.0 + '@types/async-retry': + specifier: ^1.4.2 + version: 1.4.2 + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/mocha': + specifier: ^5.2.7 + version: 5.2.7 + '@types/node': + specifier: ^10 + version: 10.0.0 + '@types/q': + specifier: ^1.5.2 + version: 1.5.2 + '@types/xml2js': + specifier: ^0.4.5 + version: 0.4.5 + lerna: + specifier: ^7.1.4 + version: 7.1.4 + lerna-update-wizard: + specifier: ^1.1.0 + version: 1.1.0 + prettier: + specifier: ^2.0.5 + version: 2.0.5 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + semver: + specifier: 7.5.2 + version: 7.5.2 + ts-loader: + specifier: ~9.4.2 + version: 9.4.2(typescript@5.0.2)(webpack@5.88.2) + ts-node: + specifier: ^9 + version: 9.1.1(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/apexlink: + dependencies: + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.2 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.2 + version: link:../sfplogger + find-java-home: + specifier: 2.0.0 + version: 2.0.0 + fs-extra: + specifier: 11.1.1 + version: 11.1.1 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + jest: + specifier: 29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/forcemula: + devDependencies: + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + + packages/sfdx-process-wrapper: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.2 + version: link:../sfplogger + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + devDependencies: + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/node': + specifier: ^10 + version: 10.0.0 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfp-cli: + dependencies: + '@flxblio/apexlink': + specifier: ^1.0.2 + version: link:../apexlink + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.2 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.2 + version: link:../sfplogger + '@flxblio/sfprofiles': + specifier: ^2.0.8 + version: link:../sfprofiles + '@newrelic/telemetry-sdk': + specifier: ^0.6.0 + version: 0.6.0 + '@oclif/core': + specifier: 2.11.8 + version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-commands': + specifier: ^3.0.3 + version: 3.0.3 + '@oclif/plugin-help': + specifier: 5.2.17 + version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/apex-node': + specifier: 2.1.0 + version: 2.1.0 + '@salesforce/core': + specifier: 5.3.9 + version: 5.3.9 + '@salesforce/kit': + specifier: 3.0.13 + version: 3.0.13 + '@salesforce/packaging': + specifier: 2.3.3 + version: 2.3.3(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/source-deploy-retrieve': + specifier: 9.7.24 + version: 9.7.24 + '@salesforce/source-tracking': + specifier: 4.2.16 + version: 4.2.16 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + ajv: + specifier: 8.11.0 + version: 8.11.0 + apex-parser: + specifier: 2.13.0 + version: 2.13.0 + async-retry: + specifier: ^1.3.1 + version: 1.3.3 + axios: + specifier: ^1.4.0 + version: 1.4.0 + bottleneck: + specifier: ^2.19.5 + version: 2.19.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cli-table: + specifier: 0.3.11 + version: 0.3.11 + datadog-metrics: + specifier: ^0.9.3 + version: 0.9.3 + dotenv: + specifier: 16.3.1 + version: 16.3.1 + fast-xml-parser: + specifier: 4.2.7 + version: 4.2.7 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 + hot-shots: + specifier: ^8.5.0 + version: 8.5.0 + ignore: + specifier: ^5.1.6 + version: 5.2.4 + js-yaml: + specifier: ^4.0.0 + version: 4.1.0 + jsforce: + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + markdown-table: + specifier: ^2.0.0 + version: 2.0.0 + markdown-table-ts: + specifier: ^1.0.3 + version: 1.0.3 + marked: + specifier: 4.0.16 + version: 4.0.16 + marked-terminal: + specifier: 5.1.1 + version: 5.1.1(marked@4.0.16) + neverthrow: + specifier: 4.4.2 + version: 4.4.2 + object-hash: + specifier: ^2.1.1 + version: 2.1.1 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + semver: + specifier: 7.5.2 + version: 7.5.2 + simple-git: + specifier: 3.19.1 + version: 3.19.1 + tar: + specifier: ^6.1.9 + version: 6.1.15 + tmp: + specifier: ^0.2.1 + version: 0.2.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@oclif/plugin-command-snapshot': + specifier: ^3 + version: 3.0.0(@oclif/config@1.18.15) + '@oclif/test': + specifier: ^2 + version: 2.0.0 + '@salesforce/dev-config': + specifier: 3.0.1 + version: 3.0.1 + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.5 + version: 2.0.5 + '@types/adm-zip': + specifier: ^0.4.33 + version: 0.4.33 + '@types/fs-extra': + specifier: 11.0.4 + version: 11.0.4 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/marked': + specifier: 4.0.2 + version: 4.0.2 + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + oclif: + specifier: ^3.10.0 + version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) + ts-jest: + specifier: 29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfplogger: + dependencies: + chalk: + specifier: ^4.1.2 + version: 4.1.2 + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + strip-ansi: + specifier: ^6.0.0 + version: 6.0.1 + devDependencies: + '@types/node': + specifier: ^14.14.7 + version: 14.14.7 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfprofiles: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.2 + version: link:../sfplogger + '@salesforce/core': + specifier: 5.3.9 + version: 5.3.9 + '@salesforce/source-deploy-retrieve': + specifier: 9.7.24 + version: 9.7.24 + async-retry: + specifier: ^1.3.3 + version: 1.3.3 + better-sqlite3: + specifier: 8.4.0 + version: 8.4.0 + chalk: + specifier: ^4.1.0 + version: 4.1.0 + diff-match-patch: + specifier: ^1.0.5 + version: 1.0.5 + fs-extra: + specifier: ^11.1.0 + version: 11.1.0 + glob: + specifier: 10.3.3 + version: 10.3.3 + ignore: + specifier: ^5.1.8 + version: 5.2.4 + jsforce: + specifier: ^2.0.0-beta.27 + version: 2.0.0-beta.27 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + simple-git: + specifier: ^3.16.0 + version: 3.16.0 + tslib: + specifier: 2.1.0 + version: 2.1.0 + xml-formatter: + specifier: ^3.4.1 + version: 3.4.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.7 + version: 2.0.7 + '@types/async-retry': + specifier: 1.4.5 + version: 1.4.5 + '@types/datadog-metrics': + specifier: ^0.6.1 + version: 0.6.1 + '@types/diff-match-patch': + specifier: ^1.0.32 + version: 1.0.32 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + '@types/node': + specifier: 20.4.4 + version: 20.4.4 + '@types/rimraf': + specifier: ^3.0.2 + version: 3.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.53.0 + version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.53.0 + version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) + eslint: + specifier: ^8.33.0 + version: 8.33.0 + jest: + specifier: ^29.5.3 + version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: ^9.1.1 + version: 9.1.1(typescript@5.0.2) + tsc-alias: + specifier: ^1.8.3 + version: 1.8.3 + typescript: + specifier: ^5 + version: 5.0.2 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /@ampproject/remapping@2.2.1: - resolution: - { - integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@babel/code-frame@7.22.5: - resolution: - { - integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.9: - resolution: - { - integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/core@7.18.2: - resolution: - { - integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.9: - resolution: - { - integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): - resolution: - { - integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.18.2 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: - { - integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: - { - integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: - { - integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: - { - integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): - resolution: - { - integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: - { - integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: - { - integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: - { - integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: - { - integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: - { - integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: - { - integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: - { - integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helpers@7.22.6: - resolution: - { - integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: - { - integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.7: - resolution: - { - integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==, - } - engines: { node: '>=6.0.0' } - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): - resolution: - { - integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): - resolution: - { - integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime-corejs3@7.22.6: - resolution: - { - integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==, - } - engines: { node: '>=6.9.0' } - dependencies: - core-js-pure: 3.31.1 - regenerator-runtime: 0.13.11 - dev: false - - /@babel/runtime@7.22.6: - resolution: - { - integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - regenerator-runtime: 0.13.11 - - /@babel/template@7.22.5: - resolution: - { - integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.8: - resolution: - { - integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: - { - integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - dev: true - - /@colors/colors@1.5.0: - resolution: - { - integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, - } - engines: { node: '>=0.1.90' } - requiresBuild: true - dev: false - optional: true - /@commitlint/cli@15.0.0: - resolution: - { - integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==, - } - engines: { node: '>=v12' } - hasBin: true - dependencies: - '@commitlint/format': 15.0.0 - '@commitlint/lint': 15.0.0 - '@commitlint/load': 15.0.0 - '@commitlint/read': 15.0.0 - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - dev: true - - /@commitlint/config-conventional@15.0.0: - resolution: - { - integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==, - } - engines: { node: '>=v12' } - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/ensure@15.0.0: - resolution: - { - integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule@15.0.0: - resolution: - { - integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/format@15.0.0: - resolution: - { - integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@15.0.0: - resolution: - { - integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - semver: 7.3.5 - dev: true - - /@commitlint/lint@15.0.0: - resolution: - { - integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/is-ignored': 15.0.0 - '@commitlint/parse': 15.0.0 - '@commitlint/rules': 15.0.0 - '@commitlint/types': 15.0.0 - dev: true - - /@commitlint/load@15.0.0: - resolution: - { - integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/execute-rule': 15.0.0 - '@commitlint/resolve-extends': 15.0.0 - '@commitlint/types': 15.0.0 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) - chalk: 4.1.2 - cosmiconfig: 7.1.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.9.5 - dev: true - - /@commitlint/message@15.0.0: - resolution: - { - integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/parse@15.0.0: - resolution: - { - integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read@15.0.0: - resolution: - { - integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/top-level': 15.0.0 - '@commitlint/types': 15.0.0 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends@15.0.0: - resolution: - { - integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==, - } - engines: { node: '>=v12' } - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules@15.0.0: - resolution: - { - integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/ensure': 15.0.0 - '@commitlint/message': 15.0.0 - '@commitlint/to-lines': 15.0.0 - '@commitlint/types': 15.0.0 - execa: 5.1.1 - dev: true - - /@commitlint/to-lines@15.0.0: - resolution: - { - integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/top-level@15.0.0: - resolution: - { - integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==, - } - engines: { node: '>=v12' } - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types@15.0.0: - resolution: - { - integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==, - } - engines: { node: '>=v12' } - dependencies: - chalk: 4.1.2 - dev: true - - /@cspotcode/source-map-consumer@0.8.0: - resolution: - { - integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==, - } - engines: { node: '>= 12' } - dev: true - - /@cspotcode/source-map-support@0.7.0: - resolution: - { - integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==, - } - engines: { node: '>=12' } - dependencies: - '@cspotcode/source-map-consumer': 0.8.0 - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: - { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, - } - engines: { node: '>=12' } - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): - resolution: - { - integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==, - } - engines: { node: '>=10.0.0' } - peerDependencies: - cosmiconfig: '>=6' - dependencies: - cosmiconfig: 7.1.0 - lodash.get: 4.4.2 - make-error: 1.3.6 - ts-node: 9.1.1(typescript@4.9.5) - tslib: 2.1.0 - transitivePeerDependencies: - - typescript - dev: true - - /@eslint/eslintrc@1.4.1: - resolution: - { - integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@gar/promisify@1.1.3: - resolution: - { - integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, - } - dev: true - - /@humanwhocodes/config-array@0.11.10: - resolution: - { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, - } - engines: { node: '>=10.10.0' } - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - dev: true - - /@hutson/parse-repository-url@3.0.2: - resolution: - { - integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@isaacs/cliui@8.0.2: - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@isaacs/string-locale-compare@1.1.0: - resolution: - { - integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, - } - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: '>=8' } - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: '>=8' } - dev: true - - /@jest/console@29.6.1: - resolution: - { - integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/core@29.6.1(ts-node@10.7.0): - resolution: - { - integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/core@29.6.1(ts-node@9.1.1): - resolution: - { - integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.6.1: - resolution: - { - integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - dev: true - - /@jest/expect-utils@29.6.1: - resolution: - { - integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.1: - resolution: - { - integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - expect: 29.6.1 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.6.1: - resolution: - { - integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 14.14.7 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /@jest/globals@29.6.1: - resolution: - { - integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/types': 29.6.1 - jest-mock: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.6.1: - resolution: - { - integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 14.14.7 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - jest-worker: 29.6.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.0: - resolution: - { - integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: - { - integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.6.1: - resolution: - { - integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/console': 29.6.1 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.6.1: - resolution: - { - integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/test-result': 29.6.1 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/transform@29.6.1: - resolution: - { - integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/core': 7.18.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.1: - resolution: - { - integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 14.14.7 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: - { - integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: - { - integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: - { - integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, - } - engines: { node: '>=6.0.0' } - - /@jridgewell/set-array@1.1.2: - resolution: - { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: - { - integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, - } - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: - { - integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, - } - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, - } - - /@jridgewell/trace-mapping@0.3.18: - resolution: - { - integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@kwsites/file-exists@1.1.1: - resolution: - { - integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==, - } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /@kwsites/promise-deferred@1.1.1: - resolution: - { - integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==, - } - dev: false - - /@lerna/child-process@7.1.4: - resolution: - { - integrity: sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - dependencies: - chalk: 4.1.2 - execa: 5.1.1 - strong-log-transformer: 2.1.0 - dev: true - - /@lerna/create@7.1.4: - resolution: - { - integrity: sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - dependencies: - '@lerna/child-process': 7.1.4 - dedent: 0.7.0 - fs-extra: 11.1.1 - init-package-json: 5.0.0 - npm-package-arg: 8.1.1 - p-reduce: 2.1.0 - pacote: 15.2.0 - pify: 5.0.0 - semver: 7.5.2 - slash: 3.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@newrelic/telemetry-sdk@0.6.0: - resolution: - { - integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==, - } - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/arborist@4.3.1: - resolution: - { - integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - hasBin: true - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/map-workspaces': 2.0.4 - '@npmcli/metavuln-calculator': 2.0.0 - '@npmcli/move-file': 1.1.2 - '@npmcli/name-from-folder': 1.0.1 - '@npmcli/node-gyp': 1.0.3 - '@npmcli/package-json': 1.0.1 - '@npmcli/run-script': 2.0.0 - bin-links: 3.0.3 - cacache: 15.3.0 - common-ancestor-path: 1.0.1 - json-parse-even-better-errors: 2.3.1 - json-stringify-nice: 1.1.4 - mkdirp: 1.0.4 - mkdirp-infer-owner: 2.0.0 - npm-install-checks: 4.0.0 - npm-package-arg: 8.1.5 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - pacote: 12.0.3 - parse-conflict-json: 2.0.2 - proc-log: 1.0.0 - promise-all-reject-late: 1.0.1 - promise-call-limit: 1.0.2 - read-package-json-fast: 2.0.3 - readdir-scoped-modules: 1.1.0 - rimraf: 3.0.2 - semver: 7.5.2 - ssri: 8.0.1 - treeverse: 1.0.4 - walk-up-path: 1.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/fs@1.1.1: - resolution: - { - integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, - } - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@2.1.2: - resolution: - { - integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@3.1.0: - resolution: - { - integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - semver: 7.5.2 - dev: true - - /@npmcli/git@2.1.0: - resolution: - { - integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==, - } - dependencies: - '@npmcli/promise-spawn': 1.3.2 - lru-cache: 6.0.0 - mkdirp: 1.0.4 - npm-pick-manifest: 6.1.1 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/git@4.1.0: - resolution: - { - integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@1.0.7: - resolution: - { - integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==, - } - engines: { node: '>= 10' } - hasBin: true - dependencies: - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: - { - integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/map-workspaces@2.0.4: - resolution: - { - integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@npmcli/name-from-folder': 1.0.1 - glob: 8.1.0 - minimatch: 5.1.6 - read-package-json-fast: 2.0.3 - dev: true - - /@npmcli/metavuln-calculator@2.0.0: - resolution: - { - integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - dependencies: - cacache: 15.3.0 - json-parse-even-better-errors: 2.3.1 - pacote: 12.0.3 - semver: 7.5.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/move-file@1.1.2: - resolution: - { - integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==, - } - engines: { node: '>=10' } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/move-file@2.0.1: - resolution: - { - integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/name-from-folder@1.0.1: - resolution: - { - integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==, - } - dev: true - - /@npmcli/node-gyp@1.0.3: - resolution: - { - integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==, - } - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: - { - integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@npmcli/package-json@1.0.1: - resolution: - { - integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==, - } - dependencies: - json-parse-even-better-errors: 2.3.1 - dev: true - - /@npmcli/promise-spawn@1.3.2: - resolution: - { - integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==, - } - dependencies: - infer-owner: 1.0.4 - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: - { - integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/run-script@2.0.0: - resolution: - { - integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==, - } - dependencies: - '@npmcli/node-gyp': 1.0.3 - '@npmcli/promise-spawn': 1.3.2 - node-gyp: 8.4.1 - read-package-json-fast: 2.0.3 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/run-script@6.0.2: - resolution: - { - integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@nrwl/devkit@16.5.5(nx@16.5.5): - resolution: - { - integrity: sha512-4ho9Vfg1YzRYZ4SMygYI9Yz1avpujd81gy/Um2Z0q8Q7Twp6Q/uG1KY9Hb7EzVXgrRcgGWdIPXuw41DpmnfWug==, - } - dependencies: - '@nx/devkit': 16.5.5(nx@16.5.5) - transitivePeerDependencies: - - nx - dev: true - - /@nrwl/tao@16.5.5: - resolution: - { - integrity: sha512-6SYG3rlKkYvy/wauPwoUXQuN0PTJi95hCEC7lGfCEGye2Y/61UwJQf2xixMxafUM2X84WdEStEz3Jty85gVqkQ==, - } - hasBin: true - dependencies: - nx: 16.5.5 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - dev: true - - /@nx/devkit@16.5.5(nx@16.5.5): - resolution: - { - integrity: sha512-9YaQ3s5VMgTXo5cEuaVc2b6btZU2REmHsgn/V4Gi3nSmwBHvIn86gtlh4BoBFinHpqge1chG/dC+B7yoXioQmQ==, - } - peerDependencies: - nx: '>= 15 <= 17' - dependencies: - '@nrwl/devkit': 16.5.5(nx@16.5.5) - ejs: 3.1.9 - ignore: 5.2.4 - nx: 16.5.5 - semver: 7.5.3 - tmp: 0.2.1 - tslib: 2.6.2 - dev: true - - /@nx/nx-darwin-arm64@16.5.5: - resolution: - { - integrity: sha512-Zzwy7pkSDFTiWcBk78qDe4VzygO9kemtz/kbbLvpisZkUlZX9nIQnLHT80Ms++iqA0enIQAwdTcJiaIHLVd5JQ==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.5 + dev: true + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.18.2: + resolution: {integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.9: + resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): + resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.18.2 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): + resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): + resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime-corejs3@7.22.6: + resolution: {integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.31.1 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@babel/traverse@7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: false + optional: true + + /@commitlint/cli@15.0.0: + resolution: {integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==} + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': 15.0.0 + '@commitlint/lint': 15.0.0 + '@commitlint/load': 15.0.0 + '@commitlint/read': 15.0.0 + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + dev: true + + /@commitlint/config-conventional@15.0.0: + resolution: {integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==} + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/ensure@15.0.0: + resolution: {integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule@15.0.0: + resolution: {integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/format@15.0.0: + resolution: {integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@15.0.0: + resolution: {integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + semver: 7.3.5 + dev: true + + /@commitlint/lint@15.0.0: + resolution: {integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': 15.0.0 + '@commitlint/parse': 15.0.0 + '@commitlint/rules': 15.0.0 + '@commitlint/types': 15.0.0 + dev: true + + /@commitlint/load@15.0.0: + resolution: {integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/execute-rule': 15.0.0 + '@commitlint/resolve-extends': 15.0.0 + '@commitlint/types': 15.0.0 + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) + chalk: 4.1.2 + cosmiconfig: 7.1.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.9.5 + dev: true + + /@commitlint/message@15.0.0: + resolution: {integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/parse@15.0.0: + resolution: {integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@15.0.0: + resolution: {integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': 15.0.0 + '@commitlint/types': 15.0.0 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends@15.0.0: + resolution: {integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==} + engines: {node: '>=v12'} + dependencies: + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@15.0.0: + resolution: {integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': 15.0.0 + '@commitlint/message': 15.0.0 + '@commitlint/to-lines': 15.0.0 + '@commitlint/types': 15.0.0 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@15.0.0: + resolution: {integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/top-level@15.0.0: + resolution: {integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==} + engines: {node: '>=v12'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@15.0.0: + resolution: {integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==} + engines: {node: '>=v12'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): + resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} + engines: {node: '>=10.0.0'} + peerDependencies: + cosmiconfig: '>=6' + dependencies: + cosmiconfig: 7.1.0 + lodash.get: 4.4.2 + make-error: 1.3.6 + ts-node: 9.1.1(typescript@4.9.5) + tslib: 2.1.0 + transitivePeerDependencies: + - typescript + dev: true + + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/string-locale-compare@1.1.0: + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.6.1: + resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/core@29.6.1(ts-node@10.7.0): + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-darwin-x64@16.5.5: - resolution: - { - integrity: sha512-d5O8BD5HFI2hJnMgVVV1pl2A+hlUmn4GxCZTmx2Tr329TYGdpvyXm8NnDFEAigZ77QVMHwFN6vqS07HARu+uVA==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@9.1.1): + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-freebsd-x64@16.5.5: - resolution: - { - integrity: sha512-SqTvbz21iUc8DHKgisX9pPuXc7/DngbiZxInlEHPXi8zUtyUOqZI3yQk4NVj3dqLBMLwEOZDgvXs0XxzB5nn+g==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment@29.6.1: + resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + dev: true + + /@jest/expect-utils@29.6.1: + resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect@29.6.1: + resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.6.1 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.6.1: + resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.14.7 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /@jest/globals@29.6.1: + resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/types': 29.6.1 + jest-mock: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.6.1: + resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-linux-arm-gnueabihf@16.5.5: - resolution: - { - integrity: sha512-8C2KVFHqcyGViEgUicYo1frEgQARbD+CicIos6A5WRYLaxS+upb9FDblKU0eGYIwDp8oCagVjUjNX8d1WHLX7w==, - } - engines: { node: '>= 10' } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 14.14.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + jest-worker: 29.6.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.0: + resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.6.1: + resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.6.1 + '@jest/types': 29.6.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.6.1: + resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.6.1 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/transform@29.6.1: + resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.2 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.1: + resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 14.14.7 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@kwsites/file-exists@1.1.1: + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@kwsites/promise-deferred@1.1.1: + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + dev: false + + /@lerna/child-process@7.1.4: + resolution: {integrity: sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + chalk: 4.1.2 + execa: 5.1.1 + strong-log-transformer: 2.1.0 + dev: true + + /@lerna/create@7.1.4: + resolution: {integrity: sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + '@lerna/child-process': 7.1.4 + dedent: 0.7.0 + fs-extra: 11.1.1 + init-package-json: 5.0.0 + npm-package-arg: 8.1.1 + p-reduce: 2.1.0 + pacote: 15.2.0 + pify: 5.0.0 + semver: 7.5.2 + slash: 3.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@newrelic/telemetry-sdk@0.6.0: + resolution: {integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/arborist@4.3.1: + resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/map-workspaces': 2.0.4 + '@npmcli/metavuln-calculator': 2.0.0 + '@npmcli/move-file': 1.1.2 + '@npmcli/name-from-folder': 1.0.1 + '@npmcli/node-gyp': 1.0.3 + '@npmcli/package-json': 1.0.1 + '@npmcli/run-script': 2.0.0 + bin-links: 3.0.3 + cacache: 15.3.0 + common-ancestor-path: 1.0.1 + json-parse-even-better-errors: 2.3.1 + json-stringify-nice: 1.1.4 + mkdirp: 1.0.4 + mkdirp-infer-owner: 2.0.0 + npm-install-checks: 4.0.0 + npm-package-arg: 8.1.5 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + pacote: 12.0.3 + parse-conflict-json: 2.0.2 + proc-log: 1.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 1.0.2 + read-package-json-fast: 2.0.3 + readdir-scoped-modules: 1.1.0 + rimraf: 3.0.2 + semver: 7.5.2 + ssri: 8.0.1 + treeverse: 1.0.4 + walk-up-path: 1.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.2 + dev: true + + /@npmcli/git@2.1.0: + resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + dependencies: + '@npmcli/promise-spawn': 1.3.2 + lru-cache: 6.0.0 + mkdirp: 1.0.4 + npm-pick-manifest: 6.1.1 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.1 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@1.0.7: + resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/map-workspaces@2.0.4: + resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/name-from-folder': 1.0.1 + glob: 8.1.0 + minimatch: 5.1.6 + read-package-json-fast: 2.0.3 + dev: true + + /@npmcli/metavuln-calculator@2.0.0: + resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + cacache: 15.3.0 + json-parse-even-better-errors: 2.3.1 + pacote: 12.0.3 + semver: 7.5.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/name-from-folder@1.0.1: + resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} + dev: true + + /@npmcli/node-gyp@1.0.3: + resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/package-json@1.0.1: + resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} + dependencies: + json-parse-even-better-errors: 2.3.1 + dev: true + + /@npmcli/promise-spawn@1.3.2: + resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + dependencies: + infer-owner: 1.0.4 + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/run-script@2.0.0: + resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} + dependencies: + '@npmcli/node-gyp': 1.0.3 + '@npmcli/promise-spawn': 1.3.2 + node-gyp: 8.4.1 + read-package-json-fast: 2.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@nrwl/devkit@16.5.5(nx@16.5.5): + resolution: {integrity: sha512-4ho9Vfg1YzRYZ4SMygYI9Yz1avpujd81gy/Um2Z0q8Q7Twp6Q/uG1KY9Hb7EzVXgrRcgGWdIPXuw41DpmnfWug==} + dependencies: + '@nx/devkit': 16.5.5(nx@16.5.5) + transitivePeerDependencies: + - nx + dev: true + + /@nrwl/tao@16.5.5: + resolution: {integrity: sha512-6SYG3rlKkYvy/wauPwoUXQuN0PTJi95hCEC7lGfCEGye2Y/61UwJQf2xixMxafUM2X84WdEStEz3Jty85gVqkQ==} + hasBin: true + dependencies: + nx: 16.5.5 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + + /@nx/devkit@16.5.5(nx@16.5.5): + resolution: {integrity: sha512-9YaQ3s5VMgTXo5cEuaVc2b6btZU2REmHsgn/V4Gi3nSmwBHvIn86gtlh4BoBFinHpqge1chG/dC+B7yoXioQmQ==} + peerDependencies: + nx: '>= 15 <= 17' + dependencies: + '@nrwl/devkit': 16.5.5(nx@16.5.5) + ejs: 3.1.9 + ignore: 5.2.4 + nx: 16.5.5 + semver: 7.5.3 + tmp: 0.2.1 + tslib: 2.6.2 + dev: true + + /@nx/nx-darwin-arm64@16.5.5: + resolution: {integrity: sha512-Zzwy7pkSDFTiWcBk78qDe4VzygO9kemtz/kbbLvpisZkUlZX9nIQnLHT80Ms++iqA0enIQAwdTcJiaIHLVd5JQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-darwin-x64@16.5.5: + resolution: {integrity: sha512-d5O8BD5HFI2hJnMgVVV1pl2A+hlUmn4GxCZTmx2Tr329TYGdpvyXm8NnDFEAigZ77QVMHwFN6vqS07HARu+uVA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-freebsd-x64@16.5.5: + resolution: {integrity: sha512-SqTvbz21iUc8DHKgisX9pPuXc7/DngbiZxInlEHPXi8zUtyUOqZI3yQk4NVj3dqLBMLwEOZDgvXs0XxzB5nn+g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm-gnueabihf@16.5.5: + resolution: {integrity: sha512-8C2KVFHqcyGViEgUicYo1frEgQARbD+CicIos6A5WRYLaxS+upb9FDblKU0eGYIwDp8oCagVjUjNX8d1WHLX7w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-gnu@16.5.5: + resolution: {integrity: sha512-AGq4wp3Wn8bE0h2c7/bHj2wQWfp08DYJemwTNLkwLcoJWkUidLOBQePRvLxqPeo42Zmt3GYMi+fi5XtKCmvcjg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-musl@16.5.5: + resolution: {integrity: sha512-xPTYjDCPnXLPXZThAzugiithZaIHk42rTxussMZA00Cx0iEkh5zohqtC0vGBnaAPNcMv0uyCiWABhL4RRUVp2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-gnu@16.5.5: + resolution: {integrity: sha512-Rq55OWD4SObfo4sWpjvaijWg33dm+cOf8e2cO06t2EmLMdOyyVnpNdtpjXh6A9tSi3EU5xPfYiy3I9O6gWOnuw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-musl@16.5.5: + resolution: {integrity: sha512-fnkSPv+VIKmQQOEQxFrGx5DlkHGxeH9Fzme6jwuDwmsvs+8Vv/uUnfcxkDZfJxKK+p27w37q3PQCfZGrFXE1cw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-arm64-msvc@16.5.5: + resolution: {integrity: sha512-9nWm+d+tlbxFMLvTLJqIfpTLDuSVDXfSBCSBampyeoI1mUALvq/6CVvWVBDlNqjmrZsYm0sudNqI4Ss7w3BUCQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-x64-msvc@16.5.5: + resolution: {integrity: sha512-fB8miPr887GIGBDhyT6VX7MWX5aC40izEi+4GGSk38oh5dOUK9TLwjAEW/3vBE01fj5Hjcy0CPN7RA45fh/WUw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@oclif/color@1.0.9: + resolution: {integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==} + engines: {node: '>=12.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + ansi-styles: 4.3.0 + chalk: 4.1.2 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + tslib: 2.1.0 + dev: true + + /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): + resolution: {integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==} + engines: {node: '>=12.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@oclif/config': ^1 + dependencies: + '@oclif/config': 1.18.15 + '@oclif/errors': 1.3.6 + '@oclif/help': 1.0.13(supports-color@8.1.1) + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.14(supports-color@8.1.1): + resolution: {integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.15: + resolution: {integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/core@0.5.41(@oclif/config@1.18.15): + resolution: {integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-ux: 5.6.7(@oclif/config@1.18.15) + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lodash.template: 4.5.0 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.1.0 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/cli-progress': 3.11.0 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.4 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/core@3.3.2: + resolution: {integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==} + engines: {node: '>=18.0.0'} + dependencies: + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/errors@1.3.6: + resolution: {integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + clean-stack: 3.0.1 + fs-extra: 8.1.0 + indent-string: 4.0.0 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /@oclif/help@1.0.13(supports-color@8.1.1): + resolution: {integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/config': 1.18.14(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + chalk: 4.1.2 + indent-string: 4.0.0 + lodash: 4.17.21 + string-width: 4.2.3 + strip-ansi: 6.0.1 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/linewrap@1.0.0: + resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} + dev: true + + /@oclif/parser@3.8.15: + resolution: {integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + tslib: 2.6.2 + dev: true + + /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): + resolution: {integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 0.5.41(@oclif/config@1.18.15) + chalk: 4.1.2 + just-diff: 3.1.1 + semver: 7.5.2 + sinon: 11.1.2 + ts-json-schema-generator: 0.93.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/plugin-commands@3.0.3: + resolution: {integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==} + engines: {node: '>=18.0.0'} + dependencies: + '@oclif/core': 3.3.2 + lodash.pickby: 4.6.0 + lodash.sortby: 4.7.0 + lodash.template: 4.5.0 + lodash.uniqby: 4.7.0 + dev: false + + /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/color': 1.0.9 + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + http-call: 5.3.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + dev: true + + /@oclif/screen@1.0.4: + resolution: {integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==} + engines: {node: '>=8.0.0'} + deprecated: Deprecated in favor of @oclif/core + dev: true + + /@oclif/test@2.0.0: + resolution: {integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==} + engines: {node: '>=8.0.0'} + dependencies: + fancy-test: 1.4.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@octokit/auth-token@2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + dependencies: + '@octokit/types': 6.41.0 + dev: true + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@3.6.0: + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql@4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@12.11.0: + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + dev: true + + /@octokit/plugin-enterprise-rest@6.0.1: + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + dev: true + + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + dependencies: + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@5.6.3: + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@18.12.0: + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.11: + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@octokit/types@6.41.0: + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + dependencies: + '@octokit/openapi-types': 12.11.0 + dev: true + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@parcel/watcher@2.0.4: + resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.6.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@salesforce/apex-node@2.1.0: + resolution: {integrity: sha512-W7OcqcBNHhf2wQMiPWOx/MED7ao1ZlML4vX5+A6hMDZTCZ5g34rj5wwVUQFOOAxHnS5F8jQUU5VpxpKo01jrTQ==} + engines: {node: '>=16.13.0'} + dependencies: + '@salesforce/core': 5.3.9 + '@types/istanbul-reports': 3.0.1 + faye: 1.4.0 + glob: 8.1.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/core@5.3.9: + resolution: {integrity: sha512-/HX0PiXq3Sjc5eVJ0EaYetcDGsKU9O9Nj8jFGw5qYlITx8zogfxc0j07liH67tQXS1KbTysYoj/MQ2zbHSNkPA==} + engines: {node: '>=16.0.0'} + dependencies: + '@salesforce/kit': 3.0.13 + '@salesforce/schemas': 1.6.0 + '@salesforce/ts-types': 2.0.8 + '@types/semver': 7.5.3 + ajv: 8.12.0 + change-case: 4.1.2 + faye: 1.4.0 + form-data: 4.0.0 + js2xmlparser: 4.0.2 + jsforce: 2.0.0-beta.27 + jsonwebtoken: 9.0.2 + jszip: 3.10.1 + pino: 8.16.0 + pino-abstract-transport: 1.1.0 + pino-pretty: 10.2.3 + proper-lockfile: 4.1.2 + semver: 7.5.4 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/dev-config@3.0.1: + resolution: {integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==} + dev: true + + /@salesforce/kit@3.0.13: + resolution: {integrity: sha512-HLQ5L5bBi0tsMeH5ZHJAhHUpvNUNPQoNJt2O82Jf6C60GGsrlzwzQ5ONAHGNBgKSZ7HLr0UGL5xaA+hE9uOcgw==} + dependencies: + '@salesforce/ts-types': 2.0.8 + tslib: 2.6.2 + dev: false + + /@salesforce/packaging@2.3.3(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-gGxN4FA5mX85B6960sUOrUz9KYAC7Iw5GXPYV/0YoBSU4M42I0V4pgWcOQOiRwW8gbe8wpSKB/Ccv6NSjNCuBQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/schemas': 1.6.0 + '@salesforce/source-deploy-retrieve': 9.7.24 + '@salesforce/ts-types': 2.0.7 + fast-xml-parser: 4.2.7 + globby: 11.1.0 + graphology: 0.25.4(graphology-types@0.24.7) + graphology-traversal: 0.3.1(graphology-types@0.24.7) + graphology-types: 0.24.7 + jsforce: 2.0.0-beta.27 + jszip: 3.10.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - encoding + - supports-color + - typescript + dev: false + + /@salesforce/schemas@1.6.0: + resolution: {integrity: sha512-SwhDTLucj/GRbPpxlEoDZeqlX22o+G6fiebTXTu1cZKmd1oE0W2L7SlTTgJnWck8bhTeBIgQi9cpD8c2t5ISKA==} + dev: false + + /@salesforce/source-deploy-retrieve@9.7.24: + resolution: {integrity: sha512-nkP9KgzuCoV6LtdDxgxt7KRnoQ6ZS12DJgXErCBXm7Swmr0dnbo1LhxrH05C4UFFe0JuvSta+u+Oor8jxSGaCQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/ts-types': 2.0.7 + fast-levenshtein: 3.0.0 + fast-xml-parser: 4.3.2 + got: 11.8.6 + graceful-fs: 4.2.11 + ignore: 5.2.4 + jszip: 3.10.1 + mime: 2.6.0 + minimatch: 5.1.6 + proxy-agent: 6.3.1 + unzipper: 0.10.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/source-tracking@4.2.16: + resolution: {integrity: sha512-HAuLaY+RrdKvWjx9FVYMrYlIUW4JyQtF/TA5hbDpy4Rw8IUOgrYyt+IaoiAAtMyRqU8En8fJBUqiq4qFvhdpCA==} + engines: {node: '>=16.0.0'} + dependencies: + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/source-deploy-retrieve': 9.7.24 + '@salesforce/ts-types': 2.0.8 + fast-xml-parser: 4.2.7 + graceful-fs: 4.2.11 + isomorphic-git: 1.23.0 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/ts-sinon@1.3.21: + resolution: {integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==} + dependencies: + '@salesforce/ts-types': 1.7.3 + sinon: 5.1.1 + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@1.7.3: + resolution: {integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==} + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.5: + resolution: {integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.7: + resolution: {integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + + /@salesforce/ts-types@2.0.8: + resolution: {integrity: sha512-vuzLcxtThBhpuhmnoh8GFrVU8XjdoNyQm9gPtmcjUyUD/9nQIBTAX8oGoUvCiiq93c4LFEmSua+xm3yu0bbNfg==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@sigstore/bundle@1.0.0: + resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + dev: true + + /@sigstore/protobuf-specs@0.2.0: + resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/fake-timers@7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/formatio@2.0.0: + resolution: {integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==} + dependencies: + samsam: 1.3.0 + dev: true + + /@sinonjs/formatio@3.2.2: + resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam': 3.3.3 + dev: true + + /@sinonjs/samsam@3.3.3: + resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + array-from: 2.1.1 + lodash: 4.17.21 + dev: true + + /@sinonjs/samsam@6.1.3: + resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + /@tufjs/canonical-json@1.0.0: + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@tufjs/models@1.0.4: + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.3 + dev: true + + /@types/adm-zip@0.4.33: + resolution: {integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/async-retry@1.4.2: + resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/async-retry@1.4.5: + resolution: {integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==} + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 14.14.7 + '@types/responselike': 1.0.0 + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/cli-progress@3.11.0: + resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} + dependencies: + '@types/node': 14.14.7 + + /@types/datadog-metrics@0.6.1: + resolution: {integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==} + dev: true + + /@types/diff-match-patch@1.0.32: + resolution: {integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==} + dev: true + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.0 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.0: + resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/expect@1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + dev: true + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 14.14.7 + dev: true + + /@types/fs-extra@9.0.11: + resolution: {integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==} + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 14.14.7 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + + /@types/jest@29.5.3: + resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} + dependencies: + expect: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /@types/js-yaml@4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 14.14.7 + + /@types/lodash@4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + dev: true + + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: true + + /@types/marked@4.0.2: + resolution: {integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/mocha@5.2.7: + resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==} + dev: true + + /@types/mocha@9.1.0: + resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} + dev: true + + /@types/node@10.0.0: + resolution: {integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@14.14.7: + resolution: {integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==} + + /@types/node@15.14.9: + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + dev: true + + /@types/node@20.4.4: + resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/q@1.5.2: + resolution: {integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==} + dev: true + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 14.14.7 + + /@types/retry@0.12.2: + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + dev: true + + /@types/rimraf@3.0.2: + resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + dependencies: + '@types/glob': 8.1.0 + '@types/node': 14.14.7 + dev: true + + /@types/semver@7.5.2: + resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} + dev: true + + /@types/semver@7.5.3: + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + dev: false + + /@types/sinon@10.0.15: + resolution: {integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.2 + dev: true + + /@types/sinonjs__fake-timers@8.1.2: + resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} + dev: true + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/vinyl@2.0.7: + resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} + dependencies: + '@types/expect': 1.20.4 + '@types/node': 14.14.7 + dev: true + + /@types/xml2js@0.4.5: + resolution: {integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==} + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-arm64-gnu@16.5.5: - resolution: - { - integrity: sha512-AGq4wp3Wn8bE0h2c7/bHj2wQWfp08DYJemwTNLkwLcoJWkUidLOBQePRvLxqPeo42Zmt3GYMi+fi5XtKCmvcjg==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-arm64-musl@16.5.5: - resolution: - { - integrity: sha512-xPTYjDCPnXLPXZThAzugiithZaIHk42rTxussMZA00Cx0iEkh5zohqtC0vGBnaAPNcMv0uyCiWABhL4RRUVp2w==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.53.0: + resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-x64-gnu@16.5.5: - resolution: - { - integrity: sha512-Rq55OWD4SObfo4sWpjvaijWg33dm+cOf8e2cO06t2EmLMdOyyVnpNdtpjXh6A9tSi3EU5xPfYiy3I9O6gWOnuw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.53.0: + resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): + resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-x64-musl@16.5.5: - resolution: - { - integrity: sha512-fnkSPv+VIKmQQOEQxFrGx5DlkHGxeH9Fzme6jwuDwmsvs+8Vv/uUnfcxkDZfJxKK+p27w37q3PQCfZGrFXE1cw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.2 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + eslint: 8.33.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.33.0) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.53.0: + resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /adm-zip@0.5.10: + resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} + engines: {node: '>=6.0'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + /antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /apex-parser@2.13.0: + resolution: {integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==} + engines: {node: '>=8.0.0'} + dependencies: + antlr4ts: 0.5.0-alpha.4 + node-dir: 0.1.17 + dev: false + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + + /array-from@2.1.1: + resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.1.0 + dev: false + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + /async-lock@1.4.0: + resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} + dev: false + + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: false + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /aws-sdk@2.1421.0: + resolution: {integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==} + engines: {node: '>= 10.0.0'} + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: 0.12.5 + uuid: 8.0.0 + xml2js: 0.5.0 + dev: true + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /babel-jest@29.6.1(@babel/core@7.18.2): + resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.18.2 + '@jest/transform': 29.6.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0(@babel/core@7.18.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.18.2): + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + dev: false + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + + /better-sqlite3@8.4.0: + resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /bin-links@3.0.3: + resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + cmd-shim: 5.0.0 + mkdirp-infer-owner: 2.0.0 + npm-normalize-package-bin: 2.0.0 + read-cmd-shim: 3.0.1 + rimraf: 3.0.2 + write-file-atomic: 4.0.2 + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + dev: false + + /binaryextensions@4.18.0: + resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} + engines: {node: '>=0.8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + dev: false + + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.469 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + dev: false + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + dev: false + + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.2 + dev: true + + /byte-size@8.1.1: + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} + dev: true + + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.15 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.3: + resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.3 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.1.0 + dev: false + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001517: + resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} + dev: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + /chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + dependencies: + traverse: 0.3.9 + dev: false + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.0: + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clean-git-ref@2.0.1: + resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 4.0.0 + + /cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + dev: true + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + + /cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + dependencies: + string-width: 4.2.3 + + /cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: true + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: false + + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + dependencies: + colors: 1.0.3 + + /cli-ux@5.6.7(@oclif/config@1.18.15): + resolution: {integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + '@oclif/screen': 1.0.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + extract-stack: 2.0.0 + fs-extra: 8.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + + /clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + /cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /cmd-shim@5.0.0: + resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + mkdirp-infer-owner: 2.0.0 + dev: true + + /cmd-shim@6.0.1: + resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + + /columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@7.1.0: + resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} + engines: {node: '>= 10'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + requiresBuild: true + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} + engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case: 2.0.2 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@5.0.1: + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: true + + /conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} + dev: true + + /conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.2 + split: 1.0.1 + dev: true + + /conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /core-js-pure@3.31.1: + resolution: {integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==} + requiresBuild: true + dev: false + + /core-js@3.31.1: + resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /csprng@0.1.2: + resolution: {integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==} + engines: {node: '>=0.6.0'} + dependencies: + sequin: 0.1.1 + dev: false + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: false + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: false + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /data-uri-to-buffer@5.0.1: + resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + engines: {node: '>= 14'} + dev: false + + /datadog-metrics@0.9.3: + resolution: {integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==} + dependencies: + debug: 3.1.0 + dogapi: 2.8.4 + transitivePeerDependencies: + - supports-color + dev: false + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@nx/nx-win32-arm64-msvc@16.5.5: - resolution: - { - integrity: sha512-9nWm+d+tlbxFMLvTLJqIfpTLDuSVDXfSBCSBampyeoI1mUALvq/6CVvWVBDlNqjmrZsYm0sudNqI4Ss7w3BUCQ==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@nx/nx-win32-x64-msvc@16.5.5: - resolution: - { - integrity: sha512-fB8miPr887GIGBDhyT6VX7MWX5aC40izEi+4GGSk38oh5dOUK9TLwjAEW/3vBE01fj5Hjcy0CPN7RA45fh/WUw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + dev: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff3@0.0.3: + resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} + dev: false + + /diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dogapi@2.8.4: + resolution: {integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==} + hasBin: true + dependencies: + extend: 3.0.2 + json-bigint: 1.0.0 + lodash: 4.17.21 + minimist: 1.2.8 + rc: 1.2.8 + dev: false + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: false + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + + /electron-to-chromium@1.4.469: + resolution: {integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /envinfo@7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error@10.4.0: + resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} + dev: true + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.1: + resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.33.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.33.0: + resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.1 + eslint-utils: 3.0.0(eslint@8.33.0) + eslint-visitor-keys: 3.4.1 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.2 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@1.1.1: + resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} + engines: {node: '>=0.4.x'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.0.0: + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execution-time@1.4.1: + resolution: {integrity: sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==} + dependencies: + pretty-hrtime: 1.0.3 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /expect@29.6.1: + resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.6.1 + '@types/node': 14.14.7 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + dev: true + + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + /extract-stack@2.0.0: + resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} + engines: {node: '>=8'} + dev: true + + /fancy-test@1.4.10: + resolution: {integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/chai': 4.3.5 + '@types/lodash': 4.14.195 + '@types/node': 14.14.7 + '@types/sinon': 10.0.15 + lodash: 4.17.21 + mock-stdin: 1.0.0 + nock: 13.3.2 + stdout-stderr: 0.1.13 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.2.7: + resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} + engines: {node: '>=8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + dependencies: + fastest-levenshtein: 1.0.16 + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-xml-parser@4.2.7: + resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: false + + /faye@1.4.0: + resolution: {integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==} + engines: {node: '>=0.8.0'} + dependencies: + asap: 2.0.6 + csprng: 0.1.2 + faye-websocket: 0.11.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + dev: false + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-java-home@2.0.0: + resolution: {integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==} + dependencies: + which: 1.0.9 + winreg: 1.2.4 + dev: false + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: true + + /first-chunk-stream@2.0.0: + resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} + engines: {node: '>=0.10.0'} + dependencies: + readable-stream: 2.3.8 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: optional: true - /@oclif/color@1.0.9: - resolution: - { - integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==, - } - engines: { node: '>=12.0.0' } - dependencies: - ansi-styles: 4.3.0 - chalk: 4.1.2 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - tslib: 2.1.0 - dev: true - - /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): - resolution: - { - integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==, - } - engines: { node: '>=12.0.0' } - peerDependencies: - '@oclif/config': ^1 - dependencies: - '@oclif/config': 1.18.15 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.13(supports-color@8.1.1) - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.14(supports-color@8.1.1): - resolution: - { - integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==, - } - engines: { node: '>=8.0.0' } - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.15: - resolution: - { - integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/core@0.5.41(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-ux: 5.6.7(@oclif/config@1.18.15) - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lodash.template: 4.5.0 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tslib: 2.1.0 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==, - } - engines: { node: '>=14.0.0' } - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.4 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/core@2.11.8(@types/node@20.4.4)(typescript@5.0.2): - resolution: - { - integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==, - } - engines: { node: '>=14.0.0' } - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.4 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@20.4.4)(typescript@5.0.2) - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: false - - /@oclif/core@3.3.2: - resolution: - { - integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==, - } - engines: { node: '>=18.0.0' } - dependencies: - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - dev: false - - /@oclif/errors@1.3.6: - resolution: - { - integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==, - } - engines: { node: '>=8.0.0' } - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /@oclif/help@1.0.13(supports-color@8.1.1): - resolution: - { - integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==, - } - engines: { node: '>=8.0.0' } - dependencies: - '@oclif/config': 1.18.14(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/linewrap@1.0.0: - resolution: - { - integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==, - } - dev: true - - /@oclif/parser@3.8.15: - resolution: - { - integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==, - } - engines: { node: '>=8.0.0' } - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - tslib: 2.6.2 - dev: true - - /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 0.5.41(@oclif/config@1.18.15) - chalk: 4.1.2 - just-diff: 3.1.1 - semver: 7.5.2 - sinon: 11.1.2 - ts-json-schema-generator: 0.93.0 - tslib: 2.6.1 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/plugin-commands@3.0.3: - resolution: - { - integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==, - } - engines: { node: '>=18.0.0' } - dependencies: - '@oclif/core': 3.3.2 - lodash.pickby: 4.6.0 - lodash.sortby: 4.7.0 - lodash.template: 4.5.0 - lodash.uniqby: 4.7.0 - dev: false - - /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/color': 1.0.9 - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: true - - /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - http-call: 5.3.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - - /@oclif/screen@1.0.4: - resolution: - { - integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==, - } - engines: { node: '>=8.0.0' } - deprecated: Deprecated in favor of @oclif/core - dev: true - - /@oclif/test@2.0.0: - resolution: - { - integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==, - } - engines: { node: '>=8.0.0' } - dependencies: - fancy-test: 1.4.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@octokit/auth-token@2.5.0: - resolution: - { - integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, - } - dependencies: - '@octokit/types': 6.41.0 - dev: true - - /@octokit/auth-token@3.0.4: - resolution: - { - integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==, - } - engines: { node: '>= 14' } - dev: true - - /@octokit/core@3.6.0: - resolution: - { - integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, - } - dependencies: - '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/core@4.2.4: - resolution: - { - integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/endpoint@6.0.12: - resolution: - { - integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, - } - dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/endpoint@7.0.6: - resolution: - { - integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/graphql@4.8.0: - resolution: - { - integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, - } - dependencies: - '@octokit/request': 5.6.3 - '@octokit/types': 6.41.0 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/graphql@5.0.6: - resolution: - { - integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/request': 6.2.8 - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/openapi-types@12.11.0: - resolution: - { - integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, - } - dev: true - - /@octokit/openapi-types@18.0.0: - resolution: - { - integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==, - } - dev: true - - /@octokit/plugin-enterprise-rest@6.0.1: - resolution: - { - integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, - } - dev: true - - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, - } - peerDependencies: - '@octokit/core': '>=2' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: true - - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==, - } - engines: { node: '>= 14' } - peerDependencies: - '@octokit/core': '>=4' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - dev: true - - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - dev: true - - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==, - } - engines: { node: '>= 14' } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true - - /@octokit/request-error@2.1.0: - resolution: - { - integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, - } - dependencies: - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request-error@3.0.3: - resolution: - { - integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@5.6.3: - resolution: - { - integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, - } - dependencies: - '@octokit/endpoint': 6.0.12 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/request@6.2.8: - resolution: - { - integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@18.12.0: - resolution: - { - integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==, - } - dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@19.0.11: - resolution: - { - integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/tsconfig@1.0.2: - resolution: - { - integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==, - } - dev: true - - /@octokit/types@10.0.0: - resolution: - { - integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==, - } - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@octokit/types@6.41.0: - resolution: - { - integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, - } - dependencies: - '@octokit/openapi-types': 12.11.0 - dev: true - - /@octokit/types@9.3.2: - resolution: - { - integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==, - } - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@parcel/watcher@2.0.4: - resolution: - { - integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==, - } - engines: { node: '>= 10.0.0' } - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.6.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } - requiresBuild: true + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /fs-minipass@3.0.2: + resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: false + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.0: + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-uri@6.0.1: + resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.5.2 + dev: true + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: true + + /github-username@6.0.0: + resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} + engines: {node: '>=10'} + dependencies: + '@octokit/rest': 18.12.0 + transitivePeerDependencies: + - encoding + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@7.1.4: + resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphology-indices@0.17.0(graphology-types@0.24.7): + resolution: {integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==} + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + mnemonist: 0.39.5 + dev: false + + /graphology-traversal@0.3.1(graphology-types@0.24.7): + resolution: {integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==} + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-indices: 0.17.0(graphology-types@0.24.7) + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + dev: false + + /graphology-types@0.24.7: + resolution: {integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==} + dev: false + + /graphology-utils@2.5.2(graphology-types@0.24.7): + resolution: {integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==} + peerDependencies: + graphology-types: '>=0.23.0' + dependencies: + graphology-types: 0.24.7 + dev: false + + /graphology@0.25.4(graphology-types@0.24.7): + resolution: {integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==} + peerDependencies: + graphology-types: '>=0.24.0' + dependencies: + events: 3.3.0 + graphology-types: 0.24.7 + obliterator: 2.0.4 + dev: false + + /grouped-queue@2.0.0: + resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} + engines: {node: '>=8.0.0'} + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.1.0 + dev: false + + /help-me@4.2.0: + resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} + dependencies: + glob: 8.1.0 + readable-stream: 3.6.2 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@3.0.8: + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + dev: true + + /hot-shots@8.5.0: + resolution: {integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==} + engines: {node: '>=6.0.0'} + optionalDependencies: + unix-dgram: 2.0.6 + dev: false + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http-call@5.3.0: + resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} + engines: {node: '>=8.0.0'} + dependencies: + content-type: 1.0.5 + debug: 4.3.4(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: false + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /hyperlinker@1.0.0: + resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} + engines: {node: '>=4'} + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ieee754@1.1.13: + resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore-walk@4.0.1: + resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} + engines: {node: '>=10'} + dependencies: + minimatch: 3.1.2 + dev: true + + /ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minimatch: 5.1.6 + dev: true + + /ignore-walk@6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /init-package-json@5.0.0: + resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + promzard: 1.0.0 + read: 2.1.0 + read-package-json: 6.0.4 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + dev: true + + /inquirer-autocomplete-prompt@1.4.0(inquirer@7.3.3): + resolution: {integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==} + engines: {node: '>=10'} + peerDependencies: + inquirer: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + figures: 3.2.0 + inquirer: 7.3.3 + run-async: 2.4.1 + rxjs: 6.6.7 + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-scoped@2.1.0: + resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} + engines: {node: '>=8'} + dependencies: + scoped-regex: 2.1.0 + dev: true + + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@2.0.0: + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: true + + /isbinaryfile@5.0.0: + resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} + engines: {node: '>= 14.0.0'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isomorphic-git@1.23.0: + resolution: {integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==} + engines: {node: '>=12'} + hasBin: true + dependencies: + async-lock: 1.4.0 + clean-git-ref: 2.0.1 + crc-32: 1.2.2 + diff3: 0.0.3 + ignore: 5.2.4 + minimisted: 2.0.1 + pako: 1.0.11 + pify: 4.0.1 + readable-stream: 3.6.2 + sha.js: 2.4.11 + simple-get: 4.0.1 + dev: false + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.18.2 + '@babel/parser': 7.22.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + /jest-changed-files@29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.6.1: + resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.6.1 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + p-limit: 3.1.0 + pretty-format: 29.6.1 + pure-rand: 6.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@salesforce/apex-node@2.1.0: - resolution: - { - integrity: sha512-W7OcqcBNHhf2wQMiPWOx/MED7ao1ZlML4vX5+A6hMDZTCZ5g34rj5wwVUQFOOAxHnS5F8jQUU5VpxpKo01jrTQ==, - } - engines: { node: '>=16.13.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@types/istanbul-reports': 3.0.1 - faye: 1.4.0 - glob: 8.1.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/core@5.3.9: - resolution: - { - integrity: sha512-/HX0PiXq3Sjc5eVJ0EaYetcDGsKU9O9Nj8jFGw5qYlITx8zogfxc0j07liH67tQXS1KbTysYoj/MQ2zbHSNkPA==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/ts-types': 2.0.8 - '@types/semver': 7.5.3 - ajv: 8.12.0 - change-case: 4.1.2 - faye: 1.4.0 - form-data: 4.0.0 - js2xmlparser: 4.0.2 - jsforce: 2.0.0-beta.27 - jsonwebtoken: 9.0.2 - jszip: 3.10.1 - pino: 8.16.0 - pino-abstract-transport: 1.1.0 - pino-pretty: 10.2.3 - proper-lockfile: 4.1.2 - semver: 7.5.4 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/dev-config@3.0.1: - resolution: - { - integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==, - } - dev: true - - /@salesforce/kit@3.0.13: - resolution: - { - integrity: sha512-HLQ5L5bBi0tsMeH5ZHJAhHUpvNUNPQoNJt2O82Jf6C60GGsrlzwzQ5ONAHGNBgKSZ7HLr0UGL5xaA+hE9uOcgw==, - } - dependencies: - '@salesforce/ts-types': 2.0.8 - tslib: 2.6.2 - dev: false - - /@salesforce/packaging@2.3.3(@types/node@20.4.4)(typescript@5.0.2): - resolution: - { - integrity: sha512-gGxN4FA5mX85B6960sUOrUz9KYAC7Iw5GXPYV/0YoBSU4M42I0V4pgWcOQOiRwW8gbe8wpSKB/Ccv6NSjNCuBQ==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@20.4.4)(typescript@5.0.2) - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.7 - fast-xml-parser: 4.2.7 - globby: 11.1.0 - graphology: 0.25.4(graphology-types@0.24.7) - graphology-traversal: 0.3.1(graphology-types@0.24.7) - graphology-types: 0.24.7 - jsforce: 2.0.0-beta.27 - jszip: 3.10.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - encoding - - supports-color - - typescript - dev: false - - /@salesforce/schemas@1.6.0: - resolution: - { - integrity: sha512-SwhDTLucj/GRbPpxlEoDZeqlX22o+G6fiebTXTu1cZKmd1oE0W2L7SlTTgJnWck8bhTeBIgQi9cpD8c2t5ISKA==, - } - dev: false - - /@salesforce/source-deploy-retrieve@9.7.24: - resolution: - { - integrity: sha512-nkP9KgzuCoV6LtdDxgxt7KRnoQ6ZS12DJgXErCBXm7Swmr0dnbo1LhxrH05C4UFFe0JuvSta+u+Oor8jxSGaCQ==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/ts-types': 2.0.7 - fast-levenshtein: 3.0.0 - fast-xml-parser: 4.3.2 - got: 11.8.6 - graceful-fs: 4.2.11 - ignore: 5.2.4 - jszip: 3.10.1 - mime: 2.6.0 - minimatch: 5.1.6 - proxy-agent: 6.3.1 - unzipper: 0.10.14 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/source-tracking@4.2.16: - resolution: - { - integrity: sha512-HAuLaY+RrdKvWjx9FVYMrYlIUW4JyQtF/TA5hbDpy4Rw8IUOgrYyt+IaoiAAtMyRqU8En8fJBUqiq4qFvhdpCA==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.8 - fast-xml-parser: 4.2.7 - graceful-fs: 4.2.11 - isomorphic-git: 1.23.0 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/ts-sinon@1.3.21: - resolution: - { - integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==, - } - dependencies: - '@salesforce/ts-types': 1.7.3 - sinon: 5.1.1 - tslib: 2.6.1 - dev: true - - /@salesforce/ts-types@1.7.3: - resolution: - { - integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==, - } - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.5: - resolution: - { - integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.1 - dev: true - - /@salesforce/ts-types@2.0.7: - resolution: - { - integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.2 - - /@salesforce/ts-types@2.0.8: - resolution: - { - integrity: sha512-vuzLcxtThBhpuhmnoh8GFrVU8XjdoNyQm9gPtmcjUyUD/9nQIBTAX8oGoUvCiiq93c4LFEmSua+xm3yu0bbNfg==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.2 - dev: false - - /@sigstore/bundle@1.0.0: - resolution: - { - integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - dev: true - - /@sigstore/protobuf-specs@0.2.0: - resolution: - { - integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@sigstore/tuf@1.0.3: - resolution: - { - integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@sinclair/typebox@0.27.8: - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } - dev: true - - /@sindresorhus/is@4.6.0: - resolution: - { - integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, - } - engines: { node: '>=10' } - - /@sinonjs/commons@1.8.6: - resolution: - { - integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@2.0.0: - resolution: - { - integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.0: - resolution: - { - integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: - { - integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, - } - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@sinonjs/fake-timers@7.1.2: - resolution: - { - integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/formatio@2.0.0: - resolution: - { - integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==, - } - dependencies: - samsam: 1.3.0 - dev: true - - /@sinonjs/formatio@3.2.2: - resolution: - { - integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/samsam': 3.3.3 - dev: true - - /@sinonjs/samsam@3.3.3: - resolution: - { - integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - array-from: 2.1.1 - lodash: 4.17.21 - dev: true - - /@sinonjs/samsam@6.1.3: - resolution: - { - integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding@0.7.2: - resolution: - { - integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, - } - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: - { - integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, - } - engines: { node: '>=10' } - dependencies: - defer-to-connect: 2.0.1 - - /@tootallnate/once@1.1.2: - resolution: - { - integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, - } - engines: { node: '>= 6' } - dev: true - - /@tootallnate/once@2.0.0: - resolution: - { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, - } - engines: { node: '>= 10' } - dev: true - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: - { - integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, - } - dev: false - - /@tsconfig/node10@1.0.9: - resolution: - { - integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, - } - - /@tsconfig/node12@1.0.11: - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } - - /@tsconfig/node14@1.0.3: - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } - - /@tsconfig/node16@1.0.4: - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } - - /@tufjs/canonical-json@1.0.0: - resolution: - { - integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@tufjs/models@1.0.4: - resolution: - { - integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.3 - dev: true - - /@types/adm-zip@0.4.33: - resolution: - { - integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/adm-zip@0.5.0: - resolution: - { - integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/async-retry@1.4.2: - resolution: - { - integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==, - } - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/async-retry@1.4.5: - resolution: - { - integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==, - } - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/babel__core@7.20.1: - resolution: - { - integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==, - } - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /@types/babel__generator@7.6.4: - resolution: - { - integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, - } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/babel__template@7.4.1: - resolution: - { - integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, - } - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@types/babel__traverse@7.20.1: - resolution: - { - integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==, - } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: - { - integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, - } - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 14.14.7 - '@types/responselike': 1.0.0 - - /@types/caseless@0.12.2: - resolution: - { - integrity: sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==, - } - dev: true - - /@types/chai@4.3.5: - resolution: - { - integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==, - } - dev: true - - /@types/cli-progress@3.11.0: - resolution: - { - integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/datadog-metrics@0.6.1: - resolution: - { - integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==, - } - dev: true - - /@types/diff-match-patch@1.0.32: - resolution: - { - integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==, - } - dev: true - - /@types/eslint-scope@3.7.4: - resolution: - { - integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==, - } - dependencies: - '@types/eslint': 8.44.0 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.44.0: - resolution: - { - integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==, - } - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: - { - integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, - } - dev: true - - /@types/expect@1.20.4: - resolution: - { - integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==, - } - dev: true - - /@types/fs-extra@9.0.11: - resolution: - { - integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==, - } - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/glob@8.1.0: - resolution: - { - integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==, - } - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 14.14.7 - dev: true - - /@types/graceful-fs@4.1.6: - resolution: - { - integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/http-cache-semantics@4.0.1: - resolution: - { - integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, - } - - /@types/istanbul-lib-coverage@2.0.4: - resolution: - { - integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, - } - - /@types/istanbul-lib-report@3.0.0: - resolution: - { - integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, - } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - /@types/istanbul-reports@3.0.1: - resolution: - { - integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, - } - dependencies: - '@types/istanbul-lib-report': 3.0.0 - - /@types/jest@29.5.3: - resolution: - { - integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==, - } - dependencies: - expect: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /@types/js-yaml@4.0.5: - resolution: - { - integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==, - } - dev: true - - /@types/json-schema@7.0.12: - resolution: - { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, - } - dev: true - - /@types/keyv@3.1.4: - resolution: - { - integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/lodash@4.14.191: - resolution: - { - integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==, - } - dev: true - - /@types/lodash@4.14.195: - resolution: - { - integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==, - } - dev: true - - /@types/marked@4.0.2: - resolution: - { - integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==, - } - dev: true - - /@types/minimatch@3.0.5: - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } - dev: true - - /@types/minimatch@5.1.2: - resolution: - { - integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, - } - dev: true - - /@types/minimist@1.2.2: - resolution: - { - integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, - } - dev: true - - /@types/mocha@5.2.7: - resolution: - { - integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==, - } - dev: true - - /@types/mocha@9.1.0: - resolution: - { - integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==, - } - dev: true - - /@types/node@10.0.0: - resolution: - { - integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==, - } - dev: true - - /@types/node@12.20.55: - resolution: - { - integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, - } - dev: false - - /@types/node@14.14.7: - resolution: - { - integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==, - } - - /@types/node@15.14.9: - resolution: - { - integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==, - } - dev: true - - /@types/node@20.4.4: - resolution: - { - integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==, - } - - /@types/normalize-package-data@2.4.1: - resolution: - { - integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, - } - dev: true - - /@types/parse-json@4.0.0: - resolution: - { - integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, - } - dev: true - - /@types/prettier@2.7.3: - resolution: - { - integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, - } - dev: true - - /@types/q@1.5.2: - resolution: - { - integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==, - } - dev: true - - /@types/request@2.48.8: - resolution: - { - integrity: sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==, - } - dependencies: - '@types/caseless': 0.12.2 - '@types/node': 14.14.7 - '@types/tough-cookie': 4.0.2 - form-data: 2.5.1 - dev: true - - /@types/responselike@1.0.0: - resolution: - { - integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/retry@0.12.2: - resolution: - { - integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, - } - dev: true - - /@types/rimraf@3.0.2: - resolution: - { - integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==, - } - dependencies: - '@types/glob': 8.1.0 - '@types/node': 14.14.7 - dev: true - - /@types/semver@7.5.2: - resolution: - { - integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, - } - dev: true - - /@types/semver@7.5.3: - resolution: - { - integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==, - } - dev: false - - /@types/sinon@10.0.15: - resolution: - { - integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==, - } - dependencies: - '@types/sinonjs__fake-timers': 8.1.2 - dev: true - - /@types/sinonjs__fake-timers@8.1.2: - resolution: - { - integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==, - } - dev: true - - /@types/splunk-logging@0.11.1: - resolution: - { - integrity: sha512-XA1klgOlalLzZERNTuB8rpwCDZno4GV7M7eOEdJPnBNAVoOft9BoPdYgn+I3Ke7aY6gBGajebkSNCBzf6DJljQ==, - } - dependencies: - '@types/request': 2.48.8 - dev: true - - /@types/stack-utils@2.0.1: - resolution: - { - integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, - } - dev: true - - /@types/tmp@0.2.3: - resolution: - { - integrity: sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==, - } - dev: true - - /@types/tough-cookie@4.0.2: - resolution: - { - integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==, - } - dev: true - - /@types/vinyl@2.0.7: - resolution: - { - integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==, - } - dependencies: - '@types/expect': 1.20.4 - '@types/node': 14.14.7 - dev: true - - /@types/xml2js@0.4.5: - resolution: - { - integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==, - } - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: - { - integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, - } - dev: true - - /@types/yargs@17.0.24: - resolution: - { - integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==, - } - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.53.0: - resolution: - { - integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - dev: true - - /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.53.0: - resolution: - { - integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): - resolution: - { - integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - eslint: 8.33.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.53.0: - resolution: - { - integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.53.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: - { - integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==, - } - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: - { - integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, - } - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: - { - integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, - } - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: - { - integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==, - } - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: - { - integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, - } - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: - { - integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, - } - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: - { - integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: - { - integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, - } - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: - { - integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, - } - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: - { - integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, - } - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: - { - integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: - { - integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: - { - integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: - { - integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: - { - integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: - { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, - } - dev: true - - /@xtuc/long@4.2.2: - resolution: - { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, - } - dev: true - - /@yarnpkg/lockfile@1.1.0: - resolution: - { - integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, - } - dev: true - - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: - { - integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==, - } - engines: { node: '>=14.15.0' } - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - dev: true - - /@zkochan/js-yaml@0.0.6: - resolution: - { - integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abbrev@1.1.1: - resolution: - { - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, - } - dev: true - - /abort-controller@3.0.0: - resolution: - { - integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, - } - engines: { node: '>=6.5' } - dependencies: - event-target-shim: 5.0.1 - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: - { - integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, - } - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: '>=0.4.0' } - - /acorn@8.10.0: - resolution: - { - integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, - } - engines: { node: '>=0.4.0' } - hasBin: true - - /add-stream@1.0.0: - resolution: - { - integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, - } - dev: true - - /adm-zip@0.5.10: - resolution: - { - integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==, - } - engines: { node: '>=6.0' } - dev: false - - /adm-zip@0.5.6: - resolution: - { - integrity: sha512-nUeYhBHLG08VFOkVwai0pLXge6NNlahH+ccwxXodvl+SLa5l9mXHjg40jRVzofRPz29goiTGze7vIKmCltKtSA==, - } - engines: { node: '>=6.0' } - dev: false - - /agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: '>= 6.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /agent-base@7.1.0: - resolution: - { - integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, - } - engines: { node: '>= 14' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /agentkeepalive@4.3.0: - resolution: - { - integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==, - } - engines: { node: '>= 8.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - depd: 2.0.0 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: '>=8' } - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: - { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, - } - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.11.0: - resolution: - { - integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: '>=6' } - dev: true - - /ansi-escapes@3.2.0: - resolution: - { - integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, - } - engines: { node: '>=4' } - - /ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: '>=8' } - dependencies: - type-fest: 0.21.3 - - /ansi-escapes@5.0.0: - resolution: - { - integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, - } - engines: { node: '>=12' } - dependencies: - type-fest: 1.4.0 - dev: false - - /ansi-regex@2.1.1: - resolution: - { - integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ansi-regex@3.0.1: - resolution: - { - integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, - } - engines: { node: '>=4' } - dev: true - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } - - /ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - } - engines: { node: '>=12' } - - /ansi-styles@2.2.1: - resolution: - { - integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: '>=4' } - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } - dev: true - - /ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } - - /ansicolors@0.3.2: - resolution: - { - integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, - } - - /antlr4ts@0.5.0-alpha.4: - resolution: - { - integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==, - } - dev: false - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /apex-parser@2.13.0: - resolution: - { - integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==, - } - engines: { node: '>=8.0.0' } - dependencies: - antlr4ts: 0.5.0-alpha.4 - node-dir: 0.1.17 - dev: false - - /aproba@2.0.0: - resolution: - { - integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, - } - dev: true - - /are-we-there-yet@2.0.0: - resolution: - { - integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, - } - engines: { node: '>=10' } - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /are-we-there-yet@3.0.1: - resolution: - { - integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } - - /argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } - dependencies: - sprintf-js: 1.0.3 - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-differ@3.0.0: - resolution: - { - integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, - } - engines: { node: '>=8' } - dev: true - - /array-from@2.1.1: - resolution: - { - integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, - } - dev: true - - /array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } - dev: true - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: '>=8' } - - /arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /arrify@2.0.1: - resolution: - { - integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, - } - engines: { node: '>=8' } - dev: true - - /asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } - - /ast-types@0.13.4: - resolution: - { - integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, - } - engines: { node: '>=4' } - dependencies: - tslib: 2.1.0 - dev: false - - /astral-regex@2.0.0: - resolution: - { - integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, - } - engines: { node: '>=8' } - - /async-lock@1.4.0: - resolution: - { - integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==, - } - dev: false - - /async-retry@1.3.1: - resolution: - { - integrity: sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==, - } - dependencies: - retry: 0.12.0 - dev: false - - /async-retry@1.3.3: - resolution: - { - integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, - } - dependencies: - retry: 0.13.1 - dev: false - - /async@3.2.4: - resolution: - { - integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, - } - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - - /at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: '>= 4.0.0' } - - /atomic-sleep@1.0.0: - resolution: - { - integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, - } - engines: { node: '>=8.0.0' } - dev: false - - /available-typed-arrays@1.0.5: - resolution: - { - integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, - } - engines: { node: '>= 0.4' } - dev: true - - /aws-sdk@2.1421.0: - resolution: - { - integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==, - } - engines: { node: '>= 10.0.0' } - dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.5.0 - dev: true - - /axios@1.4.0: - resolution: - { - integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, - } - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - /babel-jest@29.6.1(@babel/core@7.18.2): - resolution: - { - integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.18.2 - '@jest/transform': 29.6.1 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.18.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - } - engines: { node: '>=8' } - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.5.0: - resolution: - { - integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): - resolution: - { - integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, - } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.18.2): - resolution: - { - integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - dev: true - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - - /base64url@3.0.1: - resolution: - { - integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, - } - engines: { node: '>=6.0.0' } - dev: false - - /basic-ftp@5.0.3: - resolution: - { - integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, - } - engines: { node: '>=10.0.0' } - dev: false - - /before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } - dev: true - - /better-sqlite3@8.4.0: - resolution: - { - integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, - } - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: false - - /big-integer@1.6.51: - resolution: - { - integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, - } - engines: { node: '>=0.6' } - dev: false - - /bignumber.js@9.1.1: - resolution: - { - integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==, - } - dev: false - - /bin-links@3.0.3: - resolution: - { - integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - cmd-shim: 5.0.0 - mkdirp-infer-owner: 2.0.0 - npm-normalize-package-bin: 2.0.0 - read-cmd-shim: 3.0.1 - rimraf: 3.0.2 - write-file-atomic: 4.0.2 - dev: true - - /binary-extensions@2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - } - engines: { node: '>=8' } - dev: true - - /binary@0.3.0: - resolution: - { - integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, - } - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: false - - /binaryextensions@4.18.0: - resolution: - { - integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==, - } - engines: { node: '>=0.8' } - dev: true - - /bindings@1.5.0: - resolution: - { - integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, - } - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /bluebird@3.4.7: - resolution: - { - integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, - } - dev: false - - /bottleneck@2.19.5: - resolution: - { - integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, - } - dev: false - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: '>=8' } - dependencies: - fill-range: 7.0.1 - - /browserslist@4.21.9: - resolution: - { - integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.469 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true - - /bs-logger@0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: '>= 6' } - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-equal-constant-time@1.0.1: - resolution: - { - integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, - } - dev: false - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer-indexof-polyfill@1.0.2: - resolution: - { - integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, - } - engines: { node: '>=0.10' } - dev: false - - /buffer@4.9.2: - resolution: - { - integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffer@6.0.3: - resolution: - { - integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffers@0.1.1: - resolution: - { - integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, - } - engines: { node: '>=0.2.0' } - dev: false - - /builtins@1.0.3: - resolution: - { - integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, - } - dev: true - - /builtins@5.0.1: - resolution: - { - integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, - } - dependencies: - semver: 7.5.2 - dev: true - - /byte-size@8.1.1: - resolution: - { - integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, - } - engines: { node: '>=12.17' } - dev: true - - /cacache@15.3.0: - resolution: - { - integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==, - } - engines: { node: '>= 10' } - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@16.1.3: - resolution: - { - integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.1.15 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@17.1.3: - resolution: - { - integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /cacheable-lookup@5.0.4: - resolution: - { - integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, - } - engines: { node: '>=10.6.0' } - - /cacheable-request@7.0.4: - resolution: - { - integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, - } - engines: { node: '>=8' } - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.3 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - /call-bind@1.0.2: - resolution: - { - integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, - } - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } - dev: true - - /camel-case@4.1.2: - resolution: - { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, - } - dependencies: - pascal-case: 3.1.2 - tslib: 2.1.0 - dev: false - - /camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: '>=8' } - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: '>=6' } - dev: true - - /camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: '>=10' } - dev: true - - /caniuse-lite@1.0.30001517: - resolution: - { - integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==, - } - dev: true - - /capital-case@1.0.4: - resolution: - { - integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /cardinal@2.1.1: - resolution: - { - integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, - } - hasBin: true - dependencies: - ansicolors: 0.3.2 - redeyed: 2.1.1 - - /chainsaw@0.1.0: - resolution: - { - integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, - } - dependencies: - traverse: 0.3.9 - dev: false - - /chalk@1.1.3: - resolution: - { - integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: '>=4' } - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.0: - resolution: - { - integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: false - - /change-case@4.1.2: - resolution: - { - integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==, - } - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: '>=10' } - dev: true - - /chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: '>= 8.10.0' } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: '>=10' } - - /chrome-trace-event@1.0.3: - resolution: - { - integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, - } - engines: { node: '>=6.0' } - dev: true - - /ci-info@3.8.0: - resolution: - { - integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, - } - engines: { node: '>=8' } - dev: true - - /cjs-module-lexer@1.2.3: - resolution: - { - integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==, - } - dev: true - - /clean-git-ref@2.0.1: - resolution: - { - integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==, - } - dev: false - - /clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: '>=6' } - dev: true - - /clean-stack@3.0.1: - resolution: - { - integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==, - } - engines: { node: '>=10' } - dependencies: - escape-string-regexp: 4.0.0 - - /cli-boxes@1.0.0: - resolution: - { - integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /cli-cursor@2.1.0: - resolution: - { - integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, - } - engines: { node: '>=4' } - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: '>=8' } - dependencies: - restore-cursor: 3.1.0 - - /cli-progress@3.12.0: - resolution: - { - integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==, - } - engines: { node: '>=4' } - dependencies: - string-width: 4.2.3 - - /cli-spinners@2.6.1: - resolution: - { - integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, - } - engines: { node: '>=6' } - dev: true - - /cli-spinners@2.9.0: - resolution: - { - integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==, - } - engines: { node: '>=6' } - dev: true - - /cli-table3@0.6.3: - resolution: - { - integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, - } - engines: { node: 10.* || >= 12.* } - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: false - - /cli-table@0.3.11: - resolution: - { - integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==, - } - engines: { node: '>= 0.2.0' } - dependencies: - colors: 1.0.3 - - /cli-ux@5.6.7(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - '@oclif/screen': 1.0.4 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - extract-stack: 2.0.0 - fs-extra: 8.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - lodash: 4.17.21 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - dev: true - - /cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: '>= 10' } - - /cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: '>=12' } - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-buffer@1.0.0: - resolution: - { - integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, - } - engines: { node: '>= 0.10' } - dev: true - - /clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone-response@1.0.3: - resolution: - { - integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, - } - dependencies: - mimic-response: 1.0.1 - - /clone-stats@1.0.0: - resolution: - { - integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, - } - dev: true - - /clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: '>=0.8' } - dev: true - - /clone@2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: '>=0.8' } - - /cloneable-readable@1.1.3: - resolution: - { - integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, - } - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: true - - /cmd-shim@5.0.0: - resolution: - { - integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - mkdirp-infer-owner: 2.0.0 - dev: true - - /cmd-shim@6.0.1: - resolution: - { - integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } - dev: true - - /code-point-at@1.1.0: - resolution: - { - integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /collect-v8-coverage@1.0.2: - resolution: - { - integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, - } - dev: true - - /color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - dev: true - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /color-support@1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } - hasBin: true - dev: true - - /colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - dev: false - - /colors@1.0.3: - resolution: - { - integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==, - } - engines: { node: '>=0.1.90' } - - /columnify@1.6.0: - resolution: - { - integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, - } - engines: { node: '>=8.0.0' } - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } - dependencies: - delayed-stream: 1.0.0 - - /commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - dev: true - - /commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: '>= 6' } - dev: false - - /commander@7.1.0: - resolution: - { - integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==, - } - engines: { node: '>= 10' } - dev: true - - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: '>= 10' } - dev: true - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /common-ancestor-path@1.0.1: - resolution: - { - integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, - } - dev: true - - /commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } - dev: true - - /compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - requiresBuild: true - - /concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { '0': node >= 6.0 } - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: true - - /concurrently@7.6.0: - resolution: - { - integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==, - } - engines: { node: ^12.20.0 || ^14.13.0 || >=16.0.0 } - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /console-control-strings@1.1.0: - resolution: - { - integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, - } - dev: true - - /constant-case@3.0.4: - resolution: - { - integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case: 2.0.2 - dev: false - - /content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } - dev: true - - /conventional-changelog-angular@5.0.13: - resolution: - { - integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, - } - engines: { node: '>=10' } - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-angular@6.0.0: - resolution: - { - integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==, - } - engines: { node: '>=14' } - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-changelog-conventionalcommits@4.6.3: - resolution: - { - integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, - } - engines: { node: '>=10' } - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-changelog-core@5.0.1: - resolution: - { - integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, - } - engines: { node: '>=14' } - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 - git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - dev: true - - /conventional-changelog-preset-loader@3.0.0: - resolution: - { - integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, - } - engines: { node: '>=14' } - dev: true - - /conventional-changelog-writer@6.0.1: - resolution: - { - integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 - handlebars: 4.7.7 - json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.5.2 - split: 1.0.1 - dev: true - - /conventional-commits-filter@3.0.0: - resolution: - { - integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, - } - engines: { node: '>=14' } - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - - /conventional-commits-parser@3.2.4: - resolution: - { - integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /conventional-commits-parser@4.0.0: - resolution: - { - integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /conventional-recommended-bump@7.0.1: - resolution: - { - integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 - dev: true - - /convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } - dev: true - - /convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } - dev: true - - /core-js-pure@3.31.1: - resolution: - { - integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==, - } - requiresBuild: true - dev: false - - /core-js@3.31.1: - resolution: - { - integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==, - } - requiresBuild: true - dev: false - - /core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - - /cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: '>=10' } - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /cosmiconfig@8.2.0: - resolution: - { - integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==, - } - engines: { node: '>=14' } - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /crc-32@1.2.2: - resolution: - { - integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, - } - engines: { node: '>=0.8' } - hasBin: true - dev: false - - /create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } - - /cross-spawn@6.0.5: - resolution: - { - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, - } - engines: { node: '>=4.8' } - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: '>= 8' } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /csprng@0.1.2: - resolution: - { - integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==, - } - engines: { node: '>=0.6.0' } - dependencies: - sequin: 0.1.1 - dev: false - - /csv-parse@4.16.3: - resolution: - { - integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, - } - dev: false - - /csv-stringify@5.6.5: - resolution: - { - integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, - } - dev: false - - /dargs@7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: '>=8' } - dev: true - - /data-uri-to-buffer@5.0.1: - resolution: - { - integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==, - } - engines: { node: '>= 14' } - dev: false - - /datadog-metrics@0.9.3: - resolution: - { - integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==, - } - dependencies: - debug: 3.1.0 - dogapi: 2.8.4 - transitivePeerDependencies: - - supports-color - dev: false - - /date-fns@2.30.0: - resolution: - { - integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, - } - engines: { node: '>=0.11' } - dependencies: - '@babel/runtime': 7.22.6 - dev: true - - /dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } - dev: true - - /dateformat@4.6.3: - resolution: - { - integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, - } - - /debug@3.1.0: - resolution: - { - integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@4.3.4(supports-color@8.1.1): - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - - /debuglog@1.0.1: - resolution: - { - integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==, - } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: '>=0.10.0' } - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } - dependencies: - mimic-response: 3.1.0 - - /dedent@0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } - dev: true - - /deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } - - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - dev: true - - /deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } - dev: true - - /defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@2.0.1: - resolution: - { - integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, - } - engines: { node: '>=10' } - - /define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } - dev: true - - /degenerator@5.0.1: - resolution: - { - integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, - } - engines: { node: '>= 14' } - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } - - /delegates@1.0.0: - resolution: - { - integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, - } - dev: true - - /depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: '>= 0.8' } - dev: true - - /deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } - dev: true - - /detect-indent@5.0.0: - resolution: - { - integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, - } - engines: { node: '>=4' } - dev: true - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: '>=8' } - dev: false - - /detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: '>=8' } - dev: true - - /dezalgo@1.0.4: - resolution: - { - integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==, - } - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: true - - /diff-match-patch@1.0.5: - resolution: - { - integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, - } - dev: false - - /diff-sequences@29.4.3: - resolution: - { - integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /diff3@0.0.3: - resolution: - { - integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==, - } - dev: false - - /diff@3.5.0: - resolution: - { - integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, - } - engines: { node: '>=0.3.1' } - dev: true - - /diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: '>=0.3.1' } - - /diff@5.1.0: - resolution: - { - integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, - } - engines: { node: '>=0.3.1' } - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: '>=8' } - dependencies: - path-type: 4.0.0 - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: '>=6.0.0' } - dependencies: - esutils: 2.0.3 - dev: true - - /dogapi@2.8.4: - resolution: - { - integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==, - } - hasBin: true - dependencies: - extend: 3.0.2 - json-bigint: 1.0.0 - lodash: 4.17.21 - minimist: 1.2.8 - rc: 1.2.8 - dev: false - - /dot-case@3.0.4: - resolution: - { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: '>=8' } - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv@10.0.0: - resolution: - { - integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, - } - engines: { node: '>=10' } - dev: true - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: '>=12' } - dev: false - - /duplexer2@0.1.4: - resolution: - { - integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, - } - dependencies: - readable-stream: 2.3.8 - dev: false - - /duplexer@0.1.2: - resolution: - { - integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, - } - dev: true - - /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - - /ecdsa-sig-formatter@1.0.11: - resolution: - { - integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /ejs@3.1.9: - resolution: - { - integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, - } - engines: { node: '>=0.10.0' } - hasBin: true - dependencies: - jake: 10.8.7 - - /electron-to-chromium@1.4.469: - resolution: - { - integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==, - } - dev: true - - /emittery@0.13.1: - resolution: - { - integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, - } - engines: { node: '>=12' } - dev: true - - /emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - - /emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - - /encoding@0.1.13: - resolution: - { - integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, - } - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - - /enhanced-resolve@5.15.0: - resolution: - { - integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, - } - engines: { node: '>=10.13.0' } - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /enquirer@2.3.6: - resolution: - { - integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, - } - engines: { node: '>=8.6' } - dependencies: - ansi-colors: 4.1.3 - dev: true - - /env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: '>=6' } - dev: true - - /envinfo@7.8.1: - resolution: - { - integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /err-code@2.0.3: - resolution: - { - integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, - } - dev: true - - /error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error@10.4.0: - resolution: - { - integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==, - } - dev: true - - /es-module-lexer@1.3.0: - resolution: - { - integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==, - } - dev: true - - /escalade@3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - } - engines: { node: '>=6' } - dev: true - - /escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: '>=0.8.0' } - - /escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: '>=8' } - dev: true - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } - - /escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - } - engines: { node: '>=6.0' } - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: '>=8.0.0' } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.1: - resolution: - { - integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.33.0): - resolution: - { - integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, - } - engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.33.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: '>=10' } - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: - { - integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /eslint@8.33.0: - resolution: - { - integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-utils: 3.0.0(eslint@8.33.0) - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 - dev: true - - /esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } - hasBin: true - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: '>=0.10' } - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: '>=4.0' } - dev: true - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } - - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } - - /event-target-shim@5.0.1: - resolution: - { - integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, - } - engines: { node: '>=6' } - - /eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } - dev: true - - /events@1.1.1: - resolution: - { - integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==, - } - engines: { node: '>=0.4.x' } - dev: true - - /events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } - - /execa@5.0.0: - resolution: - { - integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, - } - engines: { node: '>=10' } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: '>=10' } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execution-time@1.4.1: - resolution: - { - integrity: sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==, - } - dependencies: - pretty-hrtime: 1.0.3 - dev: true - - /exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: '>=6' } - dev: false - - /expect@29.6.1: - resolution: - { - integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/expect-utils': 29.6.1 - '@types/node': 14.14.7 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - dev: true - - /exponential-backoff@3.1.1: - resolution: - { - integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==, - } - dev: true - - /extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } - dev: false - - /external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: '>=4' } - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /extract-stack@2.0.0: - resolution: - { - integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==, - } - engines: { node: '>=8' } - dev: true - - /fancy-test@1.4.10: - resolution: - { - integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==, - } - engines: { node: '>=8.0.0' } - dependencies: - '@types/chai': 4.3.5 - '@types/lodash': 4.14.195 - '@types/node': 14.14.7 - '@types/sinon': 10.0.15 - lodash: 4.17.21 - mock-stdin: 1.0.0 - nock: 13.3.2 - stdout-stderr: 0.1.13 - transitivePeerDependencies: - - supports-color - dev: true - - /fast-copy@3.0.1: - resolution: - { - integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==, - } - dev: false - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.2.7: - resolution: - { - integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==, - } - engines: { node: '>=8' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: '>=8.6.0' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - dev: true - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - dev: true - - /fast-levenshtein@3.0.0: - resolution: - { - integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==, - } - dependencies: - fastest-levenshtein: 1.0.16 - - /fast-redact@3.3.0: - resolution: - { - integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==, - } - engines: { node: '>=6' } - dev: false - - /fast-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } - dev: false - - /fast-xml-parser@4.2.7: - resolution: - { - integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==, - } - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fast-xml-parser@4.3.2: - resolution: - { - integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==, - } - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fastest-levenshtein@1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: '>= 4.9.1' } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /faye-websocket@0.11.4: - resolution: - { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, - } - engines: { node: '>=0.8.0' } - dependencies: - websocket-driver: 0.7.4 - dev: false - - /faye@1.4.0: - resolution: - { - integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==, - } - engines: { node: '>=0.8.0' } - dependencies: - asap: 2.0.6 - csprng: 0.1.2 - faye-websocket: 0.11.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - dev: false - - /fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: '>=8' } - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.0.4 - dev: true - - /file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } - dev: false - - /filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } - dependencies: - minimatch: 5.1.6 - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: '>=8' } - dependencies: - to-regex-range: 5.0.1 - - /find-java-home@2.0.0: - resolution: - { - integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==, - } - dependencies: - which: 1.0.9 - winreg: 1.2.4 - dev: false - - /find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: '>=4' } - dependencies: - locate-path: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: - { - integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, - } - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - - /find-yarn-workspace-root@2.0.0: - resolution: - { - integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, - } - dependencies: - micromatch: 4.0.5 - dev: true - - /first-chunk-stream@2.0.0: - resolution: - { - integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==, - } - engines: { node: '>=0.10.0' } - dependencies: - readable-stream: 2.3.8 - dev: true - - /flat-cache@3.0.4: - resolution: - { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } - hasBin: true - dev: true - - /flatted@3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - dev: true - - /follow-redirects@1.15.2: - resolution: - { - integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, - } - engines: { node: '>=4.0' } - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - /for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - } - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: - { - integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, - } - engines: { node: '>=14' } - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.0.2 - - /form-data@2.5.1: - resolution: - { - integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==, - } - engines: { node: '>= 0.12' } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: '>= 6' } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - - /fs-extra@10.1.0: - resolution: - { - integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, - } - engines: { node: '>=12' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra@11.1.0: - resolution: - { - integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, - } - engines: { node: '>=14.14' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - - /fs-extra@11.1.1: - resolution: - { - integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, - } - engines: { node: '>=14.14' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@7.0.1: - resolution: - { - integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, - } - engines: { node: '>=6 <7 || >=8' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - } - engines: { node: '>=6 <7 || >=8' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: '>=10' } - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - - /fs-minipass@3.0.2: - resolution: - { - integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /fstream@1.0.12: - resolution: - { - integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, - } - engines: { node: '>=0.6' } - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: false - - /function-bind@1.1.1: - resolution: - { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, - } - dev: true - - /gauge@3.0.2: - resolution: - { - integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, - } - engines: { node: '>=10' } - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gauge@4.0.4: - resolution: - { - integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: '>=6.9.0' } - dev: true - - /get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } - dev: true - - /get-intrinsic@1.2.1: - resolution: - { - integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, - } - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } - - /get-pkg-repo@4.2.1: - resolution: - { - integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, - } - engines: { node: '>=6.9.0' } - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - - /get-port@5.1.1: - resolution: - { - integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, - } - engines: { node: '>=8' } - dev: true - - /get-stdin@4.0.1: - resolution: - { - integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /get-stream@5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - } - engines: { node: '>=8' } - dependencies: - pump: 3.0.0 - - /get-stream@6.0.0: - resolution: - { - integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, - } - engines: { node: '>=10' } - dev: true - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: '>=10' } - dev: true - - /get-uri@6.0.1: - resolution: - { - integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==, - } - engines: { node: '>= 14' } - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /git-raw-commits@2.0.11: - resolution: - { - integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /git-raw-commits@3.0.0: - resolution: - { - integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /git-remote-origin-url@2.0.0: - resolution: - { - integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, - } - engines: { node: '>=4' } - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - dev: true - - /git-semver-tags@5.0.1: - resolution: - { - integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - meow: 8.1.2 - semver: 7.5.2 - dev: true - - /git-up@7.0.0: - resolution: - { - integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, - } - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: true - - /git-url-parse@13.1.0: - resolution: - { - integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==, - } - dependencies: - git-up: 7.0.0 - dev: true - - /gitconfiglocal@1.0.0: - resolution: - { - integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, - } - dependencies: - ini: 1.3.8 - dev: true - - /github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } - dev: false - - /github-slugger@1.5.0: - resolution: - { - integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, - } - dev: true - - /github-username@6.0.0: - resolution: - { - integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==, - } - engines: { node: '>=10' } - dependencies: - '@octokit/rest': 18.12.0 - transitivePeerDependencies: - - encoding - dev: true - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@10.3.3: - resolution: - { - integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==, - } - engines: { node: '>=16 || 14 >=14.17' } - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.2 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - - /glob@7.1.4: - resolution: - { - integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: '>=12' } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /glob@9.3.5: - resolution: - { - integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: true - - /global-dirs@0.1.1: - resolution: - { - integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, - } - engines: { node: '>=4' } - dependencies: - ini: 1.3.8 - dev: true - - /globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } - dev: true - - /globals@13.20.0: - resolution: - { - integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, - } - engines: { node: '>=8' } - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: '>=10' } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /got@11.8.6: - resolution: - { - integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, - } - engines: { node: '>=10.19.0' } - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - - /grapheme-splitter@1.0.4: - resolution: - { - integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, - } - dev: true - - /graphology-indices@0.17.0(graphology-types@0.24.7): - resolution: - { - integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==, - } - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - mnemonist: 0.39.5 - dev: false - - /graphology-traversal@0.3.1(graphology-types@0.24.7): - resolution: - { - integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==, - } - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-indices: 0.17.0(graphology-types@0.24.7) - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - dev: false - - /graphology-types@0.24.7: - resolution: - { - integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==, - } - dev: false - - /graphology-utils@2.5.2(graphology-types@0.24.7): - resolution: - { - integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==, - } - peerDependencies: - graphology-types: '>=0.23.0' - dependencies: - graphology-types: 0.24.7 - dev: false - - /graphology@0.25.4(graphology-types@0.24.7): - resolution: - { - integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==, - } - peerDependencies: - graphology-types: '>=0.24.0' - dependencies: - events: 3.3.0 - graphology-types: 0.24.7 - obliterator: 2.0.4 - dev: false - - /grouped-queue@2.0.0: - resolution: - { - integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==, - } - engines: { node: '>=8.0.0' } - dev: true - - /handlebars@4.7.7: - resolution: - { - integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, - } - engines: { node: '>=0.4.7' } - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - - /hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: '>=6' } - dev: true - - /has-ansi@2.0.0: - resolution: - { - integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: '>=4' } - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } - - /has-proto@1.0.1: - resolution: - { - integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, - } - engines: { node: '>= 0.4' } - dev: true - - /has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: '>= 0.4' } - dev: true - - /has-tostringtag@1.0.0: - resolution: - { - integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, - } - engines: { node: '>= 0.4' } - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-unicode@2.0.1: - resolution: - { - integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, - } - dev: true - - /has@1.0.3: - resolution: - { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, - } - engines: { node: '>= 0.4.0' } - dependencies: - function-bind: 1.1.1 - dev: true - - /header-case@2.0.4: - resolution: - { - integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==, - } - dependencies: - capital-case: 1.0.4 - tslib: 2.1.0 - dev: false - - /help-me@4.2.0: - resolution: - { - integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==, - } - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - dev: false - - /hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } - dev: true - - /hosted-git-info@3.0.8: - resolution: - { - integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, - } - engines: { node: '>=10' } - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: '>=10' } - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@6.1.1: - resolution: - { - integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - lru-cache: 7.18.3 - dev: true - - /hot-shots@8.5.0: - resolution: - { - integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==, - } - engines: { node: '>=6.0.0' } - optionalDependencies: - unix-dgram: 2.0.6 - dev: false - - /html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } - - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - - /http-call@5.3.0: - resolution: - { - integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==, - } - engines: { node: '>=8.0.0' } - dependencies: - content-type: 1.0.5 - debug: 4.3.4(supports-color@8.1.1) - is-retry-allowed: 1.2.0 - is-stream: 2.0.1 - parse-json: 4.0.0 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /http-parser-js@0.5.8: - resolution: - { - integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, - } - dev: false - - /http-proxy-agent@4.0.1: - resolution: - { - integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, - } - engines: { node: '>= 6' } - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@5.0.0: - resolution: - { - integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, - } - engines: { node: '>= 6' } - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /http2-wrapper@1.0.3: - resolution: - { - integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, - } - engines: { node: '>=10.19.0' } - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - /https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: '>= 6' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: '>=10.17.0' } - dev: true - - /humanize-ms@1.2.1: - resolution: - { - integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, - } - dependencies: - ms: 2.1.3 - dev: true - - /hyperlinker@1.0.0: - resolution: - { - integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==, - } - engines: { node: '>=4' } - - /iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: '>=0.10.0' } - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } - requiresBuild: true - dependencies: - safer-buffer: 2.1.2 - dev: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': optional: true - - /ieee754@1.1.13: - resolution: - { - integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==, - } - dev: true - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - - /ignore-walk@4.0.1: - resolution: - { - integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==, - } - engines: { node: '>=10' } - dependencies: - minimatch: 3.1.2 - dev: true - - /ignore-walk@5.0.1: - resolution: - { - integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minimatch: 5.1.6 - dev: true - - /ignore-walk@6.0.3: - resolution: - { - integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minimatch: 9.0.3 - dev: true - - /ignore@5.1.6: - resolution: - { - integrity: sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==, - } - engines: { node: '>= 4' } - dev: false - - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: '>= 4' } - - /immediate@3.0.6: - resolution: - { - integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, - } - dev: false - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: '>=6' } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: '>=8' } - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } - dev: true - - /indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: '>=8' } - - /infer-owner@1.0.4: - resolution: - { - integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, - } - dev: true - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - - /init-package-json@5.0.0: - resolution: - { - integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-package-arg: 10.1.0 - promzard: 1.0.0 - read: 2.1.0 - read-package-json: 6.0.4 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - dev: true - - /inquirer-autocomplete-prompt@1.4.0(inquirer@7.3.3): - resolution: - { - integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==, - } - engines: { node: '>=10' } - peerDependencies: - inquirer: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - figures: 3.2.0 - inquirer: 7.3.3 - run-async: 2.4.1 - rxjs: 6.6.7 - dev: true - - /inquirer@7.3.3: - resolution: - { - integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, - } - engines: { node: '>=8.0.0' } - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - - /inquirer@8.2.5: - resolution: - { - integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, - } - engines: { node: '>=12.0.0' } - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /interpret@1.4.0: - resolution: - { - integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, - } - engines: { node: '>= 0.10' } - dev: true - - /ip@1.1.8: - resolution: - { - integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, - } - dev: false - - /ip@2.0.0: - resolution: - { - integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, - } - - /is-arguments@1.1.1: - resolution: - { - integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } - dev: true - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } - dev: true - - /is-ci@3.0.1: - resolution: - { - integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, - } - hasBin: true - dependencies: - ci-info: 3.8.0 - dev: true - - /is-core-module@2.12.1: - resolution: - { - integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==, - } - dependencies: - has: 1.0.3 - dev: true - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } - hasBin: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } - - /is-fullwidth-code-point@1.0.0: - resolution: - { - integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, - } - engines: { node: '>=0.10.0' } - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: - { - integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, - } - engines: { node: '>=4' } - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } - - /is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: '>=6' } - dev: true - - /is-generator-function@1.0.10: - resolution: - { - integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, - } - engines: { node: '>= 0.4' } - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-extglob: 2.1.1 - - /is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: '>=8' } - dev: true - - /is-lambda@1.0.1: - resolution: - { - integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, - } - dev: true - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } - - /is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: '>=8' } - dev: true - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-plain-obj@2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object@5.0.0: - resolution: - { - integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-retry-allowed@1.2.0: - resolution: - { - integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-scoped@2.1.0: - resolution: - { - integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==, - } - engines: { node: '>=8' } - dependencies: - scoped-regex: 2.1.0 - dev: true - - /is-ssh@1.4.0: - resolution: - { - integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==, - } - dependencies: - protocols: 2.0.1 - dev: true - - /is-stream@2.0.0: - resolution: - { - integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, - } - engines: { node: '>=8' } - dev: true - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: '>=8' } - dev: true - - /is-text-path@1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: '>=0.10.0' } - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typed-array@1.1.12: - resolution: - { - integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, - } - engines: { node: '>= 0.4' } - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: '>=10' } - dev: true - - /is-utf8@0.2.1: - resolution: - { - integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, - } - dev: true - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } - dependencies: - is-docker: 2.2.1 - - /isarray@0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } - dev: true - - /isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - - /isbinaryfile@4.0.10: - resolution: - { - integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, - } - engines: { node: '>= 8.0.0' } - dev: true - - /isbinaryfile@5.0.0: - resolution: - { - integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==, - } - engines: { node: '>= 14.0.0' } - dev: true - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /isomorphic-git@1.23.0: - resolution: - { - integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==, - } - engines: { node: '>=12' } - hasBin: true - dependencies: - async-lock: 1.4.0 - clean-git-ref: 2.0.1 - crc-32: 1.2.2 - diff3: 0.0.3 - ignore: 5.2.4 - minimisted: 2.0.1 - pako: 1.0.11 - pify: 4.0.1 - readable-stream: 3.6.2 - sha.js: 2.4.11 - simple-get: 4.0.1 - dev: false - - /istanbul-lib-coverage@3.2.0: - resolution: - { - integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, - } - engines: { node: '>=8' } - - /istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: '>=8' } - dependencies: - '@babel/core': 7.18.2 - '@babel/parser': 7.22.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.0: - resolution: - { - integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==, - } - engines: { node: '>=8' } - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: '>=10' } - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: false - - /istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - } - engines: { node: '>=10' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.5: - resolution: - { - integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, - } - engines: { node: '>=8' } - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /istanbul-reports@3.1.6: - resolution: - { - integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==, - } - engines: { node: '>=8' } - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: false - - /jackspeak@2.2.2: - resolution: - { - integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==, - } - engines: { node: '>=14' } - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jake@10.8.7: - resolution: - { - integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - /jest-changed-files@29.5.0: - resolution: - { - integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.6.1: - resolution: - { - integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.6.1 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - p-limit: 3.1.0 - pretty-format: 29.6.1 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@10.7.0): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@20.4.4)(ts-node@10.7.0) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 10.0.0 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@20.4.4)(ts-node@10.7.0): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 20.4.4 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0(@types/node@20.4.4)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 20.4.4 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.6.1: - resolution: - { - integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-docblock@29.4.3: - resolution: - { - integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.6.1: - resolution: - { - integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /jest-environment-node@29.6.1: - resolution: - { - integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /jest-get-type@29.4.3: - resolution: - { - integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /jest-haste-map@29.6.1: - resolution: - { - integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 14.14.7 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - jest-worker: 29.6.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.1: - resolution: - { - integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-matcher-utils@29.6.1: - resolution: - { - integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.6.1: - resolution: - { - integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.6.1: - resolution: - { - integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-util: 29.6.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - } - engines: { node: '>=6' } - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.6.1 - dev: true - - /jest-regex-util@29.4.3: - resolution: - { - integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /jest-resolve-dependencies@29.6.1: - resolution: - { - integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.6.1: - resolution: - { - integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.6.1: - resolution: - { - integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/console': 29.6.1 - '@jest/environment': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.1 - jest-haste-map: 29.6.1 - jest-leak-detector: 29.6.1 - jest-message-util: 29.6.1 - jest-resolve: 29.6.1 - jest-runtime: 29.6.1 - jest-util: 29.6.1 - jest-watcher: 29.6.1 - jest-worker: 29.6.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.6.1: - resolution: - { - integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/globals': 29.6.1 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.6.1: - resolution: - { - integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/core': 7.18.2 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - chalk: 4.1.2 - expect: 29.6.1 - graceful-fs: 4.2.11 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - natural-compare: 1.4.0 - pretty-format: 29.6.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.6.1: - resolution: - { - integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.6.1: - resolution: - { - integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.1 - dev: true - - /jest-watcher@29.6.1: - resolution: - { - integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.6.1 - string-length: 4.0.2 - dev: true - - /jest-worker@27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: '>= 10.13.0' } - dependencies: - '@types/node': 14.14.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest-worker@29.6.1: - resolution: - { - integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@types/node': 14.14.7 - jest-util: 29.6.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.6.0(@types/node@20.4.4)(ts-node@10.7.0): - resolution: - { - integrity: sha512-do1J9gGrQ68E4UfMz/4OM71p9qCqQxu32N/9ZfeYFSSlx0uUOuxeyZxtJZNaUTW12ZA11ERhmBjBhy1Ho96R4g==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@10.7.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jmespath@0.16.0: - resolution: - { - integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==, - } - engines: { node: '>= 0.6.0' } - dev: true - - /joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: '>=10' } - dev: false - - /js-sdsl@4.4.2: - resolution: - { - integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==, - } - dev: true - - /js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - dev: true - - /js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /js-yaml@4.0.0: - resolution: - { - integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /js2xmlparser@4.0.2: - resolution: - { - integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, - } - dependencies: - xmlcreate: 2.0.4 - dev: false - - /jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /jsforce@2.0.0-beta.27: - resolution: - { - integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==, - } - engines: { node: '>=8.0' } - hasBin: true - dependencies: - '@babel/runtime': 7.22.6 - '@babel/runtime-corejs3': 7.22.6 - '@types/node': 12.20.55 - abort-controller: 3.0.0 - base64url: 3.0.1 - commander: 4.1.1 - core-js: 3.31.1 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - faye: 1.4.0 - form-data: 4.0.0 - fs-extra: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 7.3.3 - multistream: 3.1.0 - node-fetch: 2.6.12 - open: 7.4.2 - regenerator-runtime: 0.13.11 - strip-ansi: 6.0.1 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /json-bigint@1.0.0: - resolution: - { - integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, - } - dependencies: - bignumber.js: 9.1.1 - dev: false - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - dev: true - - /json-parse-even-better-errors@3.0.0: - resolution: - { - integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - dev: true - - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - dev: true - - /json-stable-stringify@1.0.2: - resolution: - { - integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==, - } - dependencies: - jsonify: 0.0.1 - dev: true - - /json-stringify-nice@1.1.4: - resolution: - { - integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, - } - dev: true - - /json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } - dev: true - - /json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - dev: true - - /jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - } - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonify@0.0.1: - resolution: - { - integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==, - } - dev: true - - /jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { '0': node >= 0.2.0 } - dev: true - - /jsonwebtoken@9.0.2: - resolution: - { - integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, - } - engines: { node: '>=12', npm: '>=6' } - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.5.4 - dev: false - - /jszip@3.10.1: - resolution: - { - integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, - } - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /just-diff-apply@5.5.0: - resolution: - { - integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, - } - dev: true - - /just-diff@3.1.1: - resolution: - { - integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==, - } - dev: true - - /just-diff@5.2.0: - resolution: - { - integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==, - } - dev: true - - /just-extend@4.2.1: - resolution: - { - integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, - } - dev: true - - /jwa@1.4.1: - resolution: - { - integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, - } - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: - { - integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, - } - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - - /keyv@4.5.3: - resolution: - { - integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, - } - dependencies: - json-buffer: 3.0.1 - - /kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } - dev: true - - /lerna-update-wizard@1.1.0: - resolution: - { - integrity: sha512-V6VtJFbt4BS1HKsNDsyBMeAU86CYRoQSikZsJyEMVc2x/yqH/hX+Z79fI0J3gSiWFkkIKrLj/vPUf6Zvn/79jw==, - } - engines: { node: '>=12' } - hasBin: true - dependencies: - chalk: 4.1.2 - cli-cursor: 2.1.0 - execution-time: 1.4.1 - fs-extra: 7.0.1 - globby: 11.1.0 - inquirer: 7.3.3 - inquirer-autocomplete-prompt: 1.4.0(inquirer@7.3.3) - lodash: 4.17.21 - meow: 9.0.0 - minimist: 1.2.8 - semver-compare: 1.0.0 - dev: true - - /lerna@7.1.4: - resolution: - { - integrity: sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - '@lerna/child-process': 7.1.4 - '@lerna/create': 7.1.4 - '@npmcli/run-script': 6.0.2 - '@nx/devkit': 16.5.5(nx@16.5.5) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.1 - columnify: 1.6.0 - conventional-changelog-angular: 6.0.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 8.2.0 - dedent: 0.7.0 - envinfo: 7.8.1 - execa: 5.0.0 - fs-extra: 11.1.1 - get-port: 5.1.1 - get-stream: 6.0.0 - git-url-parse: 13.1.0 - glob-parent: 5.1.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - import-local: 3.1.0 - ini: 1.3.8 - init-package-json: 5.0.0 - inquirer: 8.2.5 - is-ci: 3.0.1 - is-stream: 2.0.0 - jest-diff: 29.6.1 - js-yaml: 4.1.0 - libnpmaccess: 7.0.2 - libnpmpublish: 7.3.0 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 3.1.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7 - npm-package-arg: 8.1.1 - npm-packlist: 5.1.1 - npm-registry-fetch: 14.0.5 - npmlog: 6.0.2 - nx: 16.5.5 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-pipe: 3.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - p-waterfall: 2.1.1 - pacote: 15.2.0 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - read-package-json: 6.0.4 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.5.2 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 9.0.1 - strong-log-transformer: 2.1.0 - tar: 6.1.11 - temp-dir: 1.0.0 - typescript: 5.0.2 - upath: 2.0.1 - uuid: 9.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - bluebird - - debug - - encoding - - supports-color - dev: true - - /leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } - dev: true - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /libnpmaccess@7.0.2: - resolution: - { - integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - transitivePeerDependencies: - - supports-color - dev: true - - /libnpmpublish@7.3.0: - resolution: - { - integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - ci-info: 3.8.0 - normalize-package-data: 5.0.0 - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - semver: 7.5.2 - sigstore: 1.8.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /lie@3.3.0: - resolution: - { - integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, - } - dependencies: - immediate: 3.0.6 - dev: false - - /lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - dev: true - - /lines-and-columns@2.0.3: - resolution: - { - integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - /listenercount@1.0.1: - resolution: - { - integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, - } - dev: false - - /load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: '>=4' } - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /load-json-file@6.2.0: - resolution: - { - integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, - } - engines: { node: '>=8' } - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - dev: true - - /load-yaml-file@0.2.0: - resolution: - { - integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, - } - engines: { node: '>=6' } - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /loader-runner@4.3.0: - resolution: - { - integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, - } - engines: { node: '>=6.11.5' } - dev: true - - /locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: '>=4' } - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash._reinterpolate@3.0.0: - resolution: - { - integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==, - } - - /lodash.get@4.4.2: - resolution: - { - integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, - } - dev: true - - /lodash.includes@4.3.0: - resolution: - { - integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, - } - dev: false - - /lodash.isboolean@3.0.3: - resolution: - { - integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, - } - dev: false - - /lodash.isinteger@4.0.4: - resolution: - { - integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, - } - dev: false - - /lodash.ismatch@4.4.0: - resolution: - { - integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, - } - dev: true - - /lodash.isnumber@3.0.3: - resolution: - { - integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, - } - dev: false - - /lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } - dev: false - - /lodash.isstring@4.0.1: - resolution: - { - integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, - } - dev: false - - /lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } - dev: true - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - dev: true - - /lodash.once@4.1.1: - resolution: - { - integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, - } - dev: false - - /lodash.pickby@4.6.0: - resolution: - { - integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, - } - dev: false - - /lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } - dev: false - - /lodash.template@4.5.0: - resolution: - { - integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==, - } - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - /lodash.templatesettings@4.2.0: - resolution: - { - integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==, - } - dependencies: - lodash._reinterpolate: 3.0.0 - - /lodash.uniqby@4.7.0: - resolution: - { - integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, - } - dev: false - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - - /log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: '>=10' } - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /lolex@2.7.5: - resolution: - { - integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==, - } - dev: true - - /lolex@5.1.2: - resolution: - { - integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /lower-case@2.0.2: - resolution: - { - integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /lowercase-keys@2.0.0: - resolution: - { - integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, - } - engines: { node: '>=8' } - - /lru-cache@10.0.0: - resolution: - { - integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==, - } - engines: { node: 14 || >=16.14 } - - /lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: '>=10' } - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: '>=12' } - - /make-dir@2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: '>=6' } - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - - /make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: '>=8' } - dependencies: - semver: 6.3.1 - dev: true - - /make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.4 - dev: false - - /make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } - - /make-fetch-happen@10.2.1: - resolution: - { - integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - agentkeepalive: 4.3.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /make-fetch-happen@11.1.1: - resolution: - { - integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /make-fetch-happen@9.1.0: - resolution: - { - integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==, - } - engines: { node: '>= 10' } - dependencies: - agentkeepalive: 4.3.0 - cacache: 15.3.0 - http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } - dependencies: - tmpl: 1.0.5 - dev: true - - /map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: '>=8' } - dev: true - - /markdown-table-ts@1.0.3: - resolution: - { - integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==, - } - dev: false - - /markdown-table@2.0.0: - resolution: - { - integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==, - } - dependencies: - repeat-string: 1.6.1 - dev: false - - /marked-terminal@5.1.1(marked@4.0.16): - resolution: - { - integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, - } - engines: { node: '>=14.13.1 || >=16.0.0' } - peerDependencies: - marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - ansi-escapes: 5.0.0 - cardinal: 2.1.1 - chalk: 5.3.0 - cli-table3: 0.6.3 - marked: 4.0.16 - node-emoji: 1.11.0 - supports-hyperlinks: 2.3.0 - dev: false - - /marked@4.0.16: - resolution: - { - integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==, - } - engines: { node: '>= 12' } - hasBin: true - dev: false - - /mem-fs-editor@9.7.0(mem-fs@2.3.0): - resolution: - { - integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==, - } - engines: { node: '>=12.10.0' } - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true - dependencies: - binaryextensions: 4.18.0 - commondir: 1.0.1 - deep-extend: 0.6.0 - ejs: 3.1.9 - globby: 11.1.0 - isbinaryfile: 5.0.0 - mem-fs: 2.3.0 - minimatch: 7.4.6 - multimatch: 5.0.0 - normalize-path: 3.0.0 - textextensions: 5.16.0 - dev: true - - /mem-fs@2.3.0: - resolution: - { - integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==, - } - engines: { node: '>=12' } - dependencies: - '@types/node': 15.14.9 - '@types/vinyl': 2.0.7 - vinyl: 2.2.1 - vinyl-file: 3.0.0 - dev: true - - /meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /meow@9.0.0: - resolution: - { - integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: true - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: '>=8.6' } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } - dependencies: - mime-db: 1.52.0 - - /mime@2.6.0: - resolution: - { - integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, - } - engines: { node: '>=4.0.0' } - hasBin: true - dev: false - - /mimic-fn@1.2.0: - resolution: - { - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, - } - engines: { node: '>=4' } - dev: true - - /mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: '>=6' } - - /mimic-response@1.0.1: - resolution: - { - integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, - } - engines: { node: '>=4' } - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } - - /min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: '>=4' } - dev: true - - /minimatch@3.0.5: - resolution: - { - integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, - } - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: '>=10' } - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: '>=10' } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@8.0.4: - resolution: - { - integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - brace-expansion: 2.0.1 - - /minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: '>= 6' } - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - /minimisted@2.0.1: - resolution: - { - integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==, - } - dependencies: - minimist: 1.2.8 - dev: false - - /minipass-collect@1.0.2: - resolution: - { - integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-fetch@1.4.1: - resolution: - { - integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@2.1.2: - resolution: - { - integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@3.0.3: - resolution: - { - integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: - { - integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-json-stream@1.0.1: - resolution: - { - integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==, - } - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - dev: true - - /minipass-pipeline@1.2.4: - resolution: - { - integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-sized@1.0.3: - resolution: - { - integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass@3.3.6: - resolution: - { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, - } - engines: { node: '>=8' } - dependencies: - yallist: 4.0.0 - - /minipass@4.2.8: - resolution: - { - integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, - } - engines: { node: '>=8' } - dev: true - - /minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: '>=8' } - dev: true - - /minipass@7.0.2: - resolution: - { - integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==, - } - engines: { node: '>=16 || 14 >=14.17' } - - /minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /mkdirp-infer-owner@2.0.0: - resolution: - { - integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==, - } - engines: { node: '>=10' } - dependencies: - chownr: 2.0.0 - infer-owner: 1.0.4 - mkdirp: 1.0.4 - dev: true - - /mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } - hasBin: true - - /mnemonist@0.39.5: - resolution: - { - integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==, - } - dependencies: - obliterator: 2.0.4 - dev: false - - /mock-stdin@1.0.0: - resolution: - { - integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==, - } - dev: true - - /modify-values@1.0.1: - resolution: - { - integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - - /multimatch@5.0.0: - resolution: - { - integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /multistream@3.1.0: - resolution: - { - integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==, - } - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } - - /mute-stream@1.0.0: - resolution: - { - integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /mylas@2.1.13: - resolution: - { - integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==, - } - engines: { node: '>=12.0.0' } - dev: true - - /nan@2.17.0: - resolution: - { - integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, - } - requiresBuild: true - dev: false + ts-node: optional: true - - /napi-build-utils@1.0.2: - resolution: - { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, - } - dev: false - - /natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } - dev: true - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - dev: true - - /natural-orderby@2.0.3: - resolution: - { - integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==, - } - - /negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: '>= 0.6' } - dev: true - - /neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - - /netmask@2.0.2: - resolution: - { - integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, - } - engines: { node: '>= 0.4.0' } - dev: false - - /neverthrow@4.2.1: - resolution: - { - integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==, - } - dev: false - - /neverthrow@4.4.2: - resolution: - { - integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==, - } - dev: false - - /nice-try@1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } - - /nise@1.5.3: - resolution: - { - integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==, - } - dependencies: - '@sinonjs/formatio': 3.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - lolex: 5.1.2 - path-to-regexp: 1.8.0 - dev: true - - /nise@5.1.4: - resolution: - { - integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==, - } - dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - dev: true - - /no-case@3.0.4: - resolution: - { - integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, - } - dependencies: - lower-case: 2.0.2 - tslib: 2.1.0 - dev: false - - /nock@13.3.2: - resolution: - { - integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==, - } - engines: { node: '>= 10.13' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /node-abi@3.45.0: - resolution: - { - integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.2 - dev: false - - /node-addon-api@3.2.1: - resolution: - { - integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==, - } - dev: true - - /node-cache@5.1.2: - resolution: - { - integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==, - } - engines: { node: '>= 8.0.0' } - dependencies: - clone: 2.1.2 - dev: false - - /node-dir@0.1.17: - resolution: - { - integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==, - } - engines: { node: '>= 0.10.5' } - dependencies: - minimatch: 3.1.2 - dev: false - - /node-emoji@1.11.0: - resolution: - { - integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, - } - dependencies: - lodash: 4.17.21 - dev: false - - /node-fetch@2.6.12: - resolution: - { - integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - - /node-fetch@2.6.7: - resolution: - { - integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-gyp-build@4.6.0: - resolution: - { - integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==, - } - hasBin: true - dev: true - - /node-gyp@8.4.1: - resolution: - { - integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==, - } - engines: { node: '>= 10.12.0' } - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /node-gyp@9.4.0: - resolution: - { - integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==, - } - engines: { node: ^12.13 || ^14.13 || >=16 } - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 11.1.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } - dev: true - - /node-releases@2.0.13: - resolution: - { - integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, - } - dev: true - - /nopt@5.0.0: - resolution: - { - integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, - } - engines: { node: '>=6' } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@6.0.0: - resolution: - { - integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@5.0.0: - resolution: - { - integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /normalize-url@6.1.0: - resolution: - { - integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, - } - engines: { node: '>=10' } - - /npm-bundled@1.1.2: - resolution: - { - integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==, - } - dependencies: - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-bundled@3.0.0: - resolution: - { - integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-normalize-package-bin: 3.0.1 - dev: true - - /npm-install-checks@4.0.0: - resolution: - { - integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.2 - dev: true - - /npm-install-checks@6.1.1: - resolution: - { - integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - semver: 7.5.2 - dev: true - - /npm-normalize-package-bin@1.0.1: - resolution: - { - integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==, - } - dev: true - - /npm-normalize-package-bin@2.0.0: - resolution: - { - integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: - { - integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /npm-package-arg@10.1.0: - resolution: - { - integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.2 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-package-arg@8.1.1: - resolution: - { - integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 3.0.8 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-package-arg@8.1.5: - resolution: - { - integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 4.1.0 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-packlist@3.0.0: - resolution: - { - integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - glob: 7.2.3 - ignore-walk: 4.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@5.1.1: - resolution: - { - integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - glob: 8.1.0 - ignore-walk: 5.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@7.0.4: - resolution: - { - integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - ignore-walk: 6.0.3 - dev: true - - /npm-pick-manifest@6.1.1: - resolution: - { - integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==, - } - dependencies: - npm-install-checks: 4.0.0 - npm-normalize-package-bin: 1.0.1 - npm-package-arg: 8.1.5 - semver: 7.5.2 - dev: true - - /npm-pick-manifest@8.0.1: - resolution: - { - integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.5.2 - dev: true - - /npm-registry-fetch@12.0.2: - resolution: - { - integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - dependencies: - make-fetch-happen: 10.2.1 - minipass: 3.3.6 - minipass-fetch: 1.4.1 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 8.1.5 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /npm-registry-fetch@14.0.5: - resolution: - { - integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: '>=8' } - dependencies: - path-key: 3.1.1 - dev: true - - /npmlog@5.0.1: - resolution: - { - integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, - } - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - - /npmlog@6.0.2: - resolution: - { - integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /number-is-nan@1.0.1: - resolution: - { - integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /nx@16.5.5: - resolution: - { - integrity: sha512-DHwoUtkirI52JIlCtRK78UI/Ik/VgCtM6FlkfPnFsy8PVyTYMQ40KoG6aZLHjqj5qxoGG2CUjcsbFjGXYrjDbw==, - } - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.4.2 - '@swc/core': ^1.2.173 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true - dependencies: - '@nrwl/tao': 16.5.5 - '@parcel/watcher': 2.0.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 - axios: 1.4.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 7.0.4 - dotenv: 10.0.0 - enquirer: 2.3.6 - fast-glob: 3.2.7 - figures: 3.2.0 - flat: 5.0.2 - fs-extra: 11.1.1 - glob: 7.1.4 - ignore: 5.2.4 - js-yaml: 4.1.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 3.0.5 - npm-run-path: 4.0.1 - open: 8.4.2 - semver: 7.5.3 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - v8-compile-cache: 2.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 16.5.5 - '@nx/nx-darwin-x64': 16.5.5 - '@nx/nx-freebsd-x64': 16.5.5 - '@nx/nx-linux-arm-gnueabihf': 16.5.5 - '@nx/nx-linux-arm64-gnu': 16.5.5 - '@nx/nx-linux-arm64-musl': 16.5.5 - '@nx/nx-linux-x64-gnu': 16.5.5 - '@nx/nx-linux-x64-musl': 16.5.5 - '@nx/nx-win32-arm64-msvc': 16.5.5 - '@nx/nx-win32-x64-msvc': 16.5.5 - transitivePeerDependencies: - - debug - dev: true - - /object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /object-hash@2.1.1: - resolution: - { - integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==, - } - engines: { node: '>= 6' } - dev: false - - /object-treeify@1.1.33: - resolution: - { - integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==, - } - engines: { node: '>= 10' } - - /obliterator@2.0.4: - resolution: - { - integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, - } - dev: false - - /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==, - } - engines: { node: '>=12.0.0' } - hasBin: true - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) - aws-sdk: 2.1421.0 - concurrently: 7.6.0 - debug: 4.3.4(supports-color@8.1.1) - find-yarn-workspace-root: 2.0.0 - fs-extra: 8.1.0 - github-slugger: 1.5.0 - got: 11.8.6 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - semver: 7.5.2 - shelljs: 0.8.5 - tslib: 2.6.1 - yeoman-environment: 3.19.3 - yeoman-generator: 5.9.0(yeoman-environment@3.19.3) - yosay: 2.0.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bluebird - - encoding - - mem-fs - - supports-color - - typescript - dev: true - - /on-exit-leak-free@2.1.0: - resolution: - { - integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==, - } - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@2.0.1: - resolution: - { - integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, - } - engines: { node: '>=4' } - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: '>=6' } - dependencies: - mimic-fn: 2.1.0 - - /open@7.4.2: - resolution: - { - integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, - } - engines: { node: '>=8' } - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false - - /open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: '>=12' } - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: '>= 0.8.0' } - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: '>=10' } - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: '>=0.10.0' } - - /p-cancelable@2.1.1: - resolution: - { - integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, - } - engines: { node: '>=8' } - - /p-finally@1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: '>=4' } - dev: true - - /p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: '>=4' } - dependencies: - p-try: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: '>=4' } - dependencies: - p-limit: 1.3.0 - dev: true - - /p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map-series@2.1.0: - resolution: - { - integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, - } - engines: { node: '>=8' } - dev: true - - /p-map@4.0.0: - resolution: - { - integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, - } - engines: { node: '>=10' } - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-pipe@3.1.0: - resolution: - { - integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, - } - engines: { node: '>=8' } - dev: true - - /p-queue@6.6.2: - resolution: - { - integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, - } - engines: { node: '>=8' } - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: true - - /p-reduce@2.1.0: - resolution: - { - integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, - } - engines: { node: '>=8' } - dev: true - - /p-timeout@3.2.0: - resolution: - { - integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, - } - engines: { node: '>=8' } - dependencies: - p-finally: 1.0.0 - dev: true - - /p-transform@1.3.0: - resolution: - { - integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==, - } - engines: { node: '>=12.10.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - p-queue: 6.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: '>=4' } - dev: true - - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } - dev: true - - /p-waterfall@2.1.1: - resolution: - { - integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, - } - engines: { node: '>=8' } - dependencies: - p-reduce: 2.1.0 - dev: true - - /pac-proxy-agent@7.0.1: - resolution: - { - integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, - } - engines: { node: '>= 14' } - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /pac-resolver@7.0.0: - resolution: - { - integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, - } - engines: { node: '>= 14' } - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - dev: false - - /pacote@12.0.3: - resolution: - { - integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - hasBin: true - dependencies: - '@npmcli/git': 2.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/promise-spawn': 1.3.2 - '@npmcli/run-script': 2.0.0 - cacache: 15.3.0 - chownr: 2.0.0 - fs-minipass: 2.1.0 - infer-owner: 1.0.4 - minipass: 3.3.6 - mkdirp: 1.0.4 - npm-package-arg: 8.1.5 - npm-packlist: 3.0.0 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - promise-retry: 2.0.1 - read-package-json-fast: 2.0.3 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pacote@15.2.0: - resolution: - { - integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.8.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pad-component@0.0.1: - resolution: - { - integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==, - } - dev: true - - /pako@1.0.11: - resolution: - { - integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, - } - dev: false - - /param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } - dependencies: - callsites: 3.1.0 - dev: true - - /parse-conflict-json@2.0.2: - resolution: - { - integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - json-parse-even-better-errors: 2.3.1 - just-diff: 5.2.0 - just-diff-apply: 5.5.0 - dev: true - - /parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-path@7.0.0: - resolution: - { - integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, - } - dependencies: - protocols: 2.0.1 - dev: true - - /parse-url@8.1.0: - resolution: - { - integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, - } - dependencies: - parse-path: 7.0.0 - dev: true - - /pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /password-prompt@1.1.2: - resolution: - { - integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==, - } - dependencies: - ansi-escapes: 3.2.0 - cross-spawn: 6.0.5 - - /path-case@3.0.4: - resolution: - { - integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } - dev: true - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } - dev: true - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } - - /path-key@2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: '>=4' } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /path-scurry@1.10.1: - resolution: - { - integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 - - /path-to-regexp@1.8.0: - resolution: - { - integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, - } - dependencies: - isarray: 0.0.1 - dev: true - - /path-type@3.0.0: - resolution: - { - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, - } - engines: { node: '>=4' } - dependencies: - pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: true - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } - - /pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } - dev: true - - /pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: '>=4' } - dev: true - - /pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } - - /pify@5.0.0: - resolution: - { - integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, - } - engines: { node: '>=10' } - dev: true - - /pino-abstract-transport@1.1.0: - resolution: - { - integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==, - } - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - dev: false - - /pino-pretty@10.2.3: - resolution: - { - integrity: sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==, - } - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.4.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.7.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: - { - integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==, - } - dev: false - - /pino@8.16.0: - resolution: - { - integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==, - } - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 2.2.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.7.0 - thread-stream: 2.4.0 - dev: false - - /pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: '>= 6' } - dev: true - - /pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: '>=8' } - dependencies: - find-up: 4.1.0 - dev: true - - /plimit-lit@1.5.0: - resolution: - { - integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==, - } - dependencies: - queue-lit: 1.5.0 - dev: true - - /prebuild-install@7.1.1: - resolution: - { - integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.45.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /preferred-pm@3.0.3: - resolution: - { - integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, - } - engines: { node: '>=10' } - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /prettier@2.0.5: - resolution: - { - integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==, - } - engines: { node: '>=10.13.0' } - hasBin: true - dev: true - - /pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: '>=6' } - dev: true - - /pretty-format@29.6.1: - resolution: - { - integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-hrtime@1.0.3: - resolution: - { - integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, - } - engines: { node: '>= 0.8' } - dev: true - - /proc-log@1.0.0: - resolution: - { - integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==, - } - dev: true - - /proc-log@3.0.0: - resolution: - { - integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - - /process-warning@2.2.0: - resolution: - { - integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==, - } - dev: false - - /process@0.11.10: - resolution: - { - integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, - } - engines: { node: '>= 0.6.0' } - - /promise-all-reject-late@1.0.1: - resolution: - { - integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, - } - dev: true - - /promise-call-limit@1.0.2: - resolution: - { - integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==, - } - dev: true - - /promise-inflight@1.0.1: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true - - /promise-retry@2.0.1: - resolution: - { - integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, - } - engines: { node: '>=10' } - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - - /prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /promzard@1.0.0: - resolution: - { - integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - read: 2.1.0 - dev: true - - /propagate@2.0.1: - resolution: - { - integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==, - } - engines: { node: '>= 8' } - dev: true - - /proper-lockfile@4.1.2: - resolution: - { - integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, - } - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - dev: false - - /protocols@2.0.1: - resolution: - { - integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, - } - dev: true - - /proxy-agent@6.3.1: - resolution: - { - integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - - /psl@1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - } - dev: false - - /pump@3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - } - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@1.3.2: - resolution: - { - integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, - } - dev: true - - /punycode@2.3.0: - resolution: - { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, - } - engines: { node: '>=6' } - - /pure-rand@6.0.2: - resolution: - { - integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==, - } - dev: true - - /q@1.5.1: - resolution: - { - integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, - } - engines: { node: '>=0.6.0', teleport: '>=0.2.0' } - dev: true - - /querystring@0.2.0: - resolution: - { - integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, - } - engines: { node: '>=0.4.x' } - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - dev: false - - /queue-lit@1.5.0: - resolution: - { - integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==, - } - dev: true - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /quick-format-unescaped@4.0.4: - resolution: - { - integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, - } - dev: false - - /quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: '>=8' } - dev: true - - /quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - } - engines: { node: '>=10' } - - /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /react-is@18.2.0: - resolution: - { - integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, - } - dev: true - - /read-cmd-shim@3.0.1: - resolution: - { - integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dev: true - - /read-cmd-shim@4.0.0: - resolution: - { - integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /read-package-json-fast@2.0.3: - resolution: - { - integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==, - } - engines: { node: '>=10' } - dependencies: - json-parse-even-better-errors: 2.3.1 - npm-normalize-package-bin: 1.0.1 - dev: true - - /read-package-json-fast@3.0.2: - resolution: - { - integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@6.0.4: - resolution: - { - integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - glob: 10.3.3 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-pkg-up@3.0.0: - resolution: - { - integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, - } - engines: { node: '>=4' } - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - - /read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: '>=8' } - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@3.0.0: - resolution: - { - integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, - } - engines: { node: '>=4' } - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: '>=8' } - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read@2.1.0: - resolution: - { - integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - mute-stream: 1.0.0 - dev: true - - /readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readable-stream@4.4.2: - resolution: - { - integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - /readdir-scoped-modules@1.1.0: - resolution: - { - integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==, - } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - debuglog: 1.0.1 - dezalgo: 1.0.4 - graceful-fs: 4.2.11 - once: 1.4.0 - dev: true - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } - dependencies: - picomatch: 2.3.1 - dev: true - - /real-require@0.2.0: - resolution: - { - integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, - } - engines: { node: '>= 12.13.0' } - dev: false - - /rechoir@0.6.2: - resolution: - { - integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, - } - engines: { node: '>= 0.10' } - dependencies: - resolve: 1.22.2 - dev: true - - /redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: '>=8' } - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /redeyed@2.1.1: - resolution: - { - integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, - } - dependencies: - esprima: 4.0.1 - - /regenerator-runtime@0.13.11: - resolution: - { - integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, - } - - /regexpp@3.2.0: - resolution: - { - integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, - } - engines: { node: '>=8' } - dev: true - - /remove-trailing-separator@1.1.0: - resolution: - { - integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, - } - dev: true - - /repeat-string@1.6.1: - resolution: - { - integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, - } - engines: { node: '>=0.10' } - dev: false - - /replace-ext@1.0.1: - resolution: - { - integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, - } - engines: { node: '>= 0.10' } - dev: true - - /require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: '>=0.10.0' } - dev: false - - /requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } - dev: false - - /resolve-alpn@1.2.1: - resolution: - { - integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, - } - - /resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: '>=8' } - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } - dev: true - - /resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: '>=8' } - dev: true - - /resolve-global@1.0.0: - resolution: - { - integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, - } - engines: { node: '>=8' } - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve.exports@2.0.2: - resolution: - { - integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, - } - engines: { node: '>=10' } - dev: true - - /resolve@1.22.2: - resolution: - { - integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==, - } - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: - { - integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, - } - dependencies: - lowercase-keys: 2.0.0 - - /restore-cursor@2.0.0: - resolution: - { - integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, - } - engines: { node: '>=4' } - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: '>=8' } - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /retry@0.12.0: - resolution: - { - integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, - } - engines: { node: '>= 4' } - - /retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: '>= 4' } - dev: false - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } - - /rimraf@2.7.1: - resolution: - { - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, - } - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /rimraf@4.4.1: - resolution: - { - integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - glob: 9.3.5 - dev: true - - /rimraf@5.0.1: - resolution: - { - integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - glob: 10.3.3 - dev: false - - /run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: '>=0.12.0' } - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /rxjs@6.6.7: - resolution: - { - integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, - } - engines: { npm: '>=2.0.0' } - dependencies: - tslib: 1.14.1 - - /rxjs@7.8.1: - resolution: - { - integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, - } - dependencies: - tslib: 2.1.0 - dev: true - - /safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - /safe-stable-stringify@2.4.3: - resolution: - { - integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, - } - engines: { node: '>=10' } - dev: false - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - - /samsam@1.3.0: - resolution: - { - integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==, - } - deprecated: This package has been deprecated in favour of @sinonjs/samsam - dev: true - - /sax@1.2.1: - resolution: - { - integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==, - } - dev: true - - /sax@1.2.4: - resolution: - { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, - } - - /schema-utils@3.3.0: - resolution: - { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, - } - engines: { node: '>= 10.13.0' } - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /scoped-regex@2.1.0: - resolution: - { - integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==, - } - engines: { node: '>=8' } - dev: true - - /secure-json-parse@2.7.0: - resolution: - { - integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, - } - dev: false - - /semver-compare@1.0.0: - resolution: - { - integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==, - } - dev: true - - /semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } - hasBin: true - - /semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - dev: true - - /semver@7.3.5: - resolution: - { - integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.2: - resolution: - { - integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /semver@7.5.3: - resolution: - { - integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /sentence-case@3.0.4: - resolution: - { - integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /sequin@0.1.1: - resolution: - { - integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==, - } - engines: { node: '>=0.4.0' } - dev: false - - /serialize-javascript@6.0.1: - resolution: - { - integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==, - } - dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } - dev: true - - /setimmediate@1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - } - dev: false - - /sha.js@2.4.11: - resolution: - { - integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, - } - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command@1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: '>=0.10.0' } - dependencies: - shebang-regex: 1.0.0 - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: '>=0.10.0' } - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } - - /shell-quote@1.8.1: - resolution: - { - integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, - } - dev: true - - /shelljs@0.8.5: - resolution: - { - integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - - /signal-exit@4.0.2: - resolution: - { - integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==, - } - engines: { node: '>=14' } - - /sigstore@1.8.0: - resolution: - { - integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - '@sigstore/bundle': 1.0.0 - '@sigstore/protobuf-specs': 0.2.0 - '@sigstore/tuf': 1.0.3 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - - /simple-git@3.16.0: - resolution: - { - integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==, - } - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /simple-git@3.19.1: - resolution: - { - integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==, - } - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /sinon@11.1.2: - resolution: - { - integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/samsam': 6.1.3 - diff: 5.1.0 - nise: 5.1.4 - supports-color: 7.2.0 - dev: true - - /sinon@5.1.1: - resolution: - { - integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==, - } - dependencies: - '@sinonjs/formatio': 2.0.0 - diff: 3.5.0 - lodash.get: 4.4.2 - lolex: 2.7.5 - nise: 1.5.3 - supports-color: 5.5.0 - type-detect: 4.0.8 - dev: true - - /sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } - dev: true - - /slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } - - /slice-ansi@4.0.0: - resolution: - { - integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - /smart-buffer@4.2.0: - resolution: - { - integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, - } - engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } - - /snake-case@3.0.4: - resolution: - { - integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /socks-proxy-agent@6.2.1: - resolution: - { - integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==, - } - engines: { node: '>= 10' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==, - } - engines: { node: '>= 10' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@8.0.2: - resolution: - { - integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: false - - /socks@2.7.1: - resolution: - { - integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, - } - engines: { node: '>= 10.13.0', npm: '>= 3.0.0' } - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sonic-boom@3.7.0: - resolution: - { - integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==, - } - dependencies: - atomic-sleep: 1.0.0 - dev: false - - /sort-keys@2.0.0: - resolution: - { - integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, - } - engines: { node: '>=4' } - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /sort-keys@4.2.0: - resolution: - { - integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==, - } - engines: { node: '>=8' } - dependencies: - is-plain-obj: 2.1.0 - dev: true - - /source-map-support@0.5.13: - resolution: - { - integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } - - /spawn-command@0.0.2-1: - resolution: - { - integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==, - } - dev: true - - /spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: - { - integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, - } - dev: true - - /spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: - { - integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, - } - dev: true - - /split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - - /split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } - dev: false - - /split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - - /ssri@10.0.4: - resolution: - { - integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - dev: true - - /ssri@8.0.1: - resolution: - { - integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /ssri@9.0.1: - resolution: - { - integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minipass: 3.3.6 - dev: true - - /stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: '>=10' } - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stdout-stderr@0.1.13: - resolution: - { - integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==, - } - engines: { node: '>=8.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: '>=10' } - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@1.0.2: - resolution: - { - integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, - } - engines: { node: '>=0.10.0' } - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: - { - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, - } - engines: { node: '>=4' } - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } - dependencies: - safe-buffer: 5.1.2 - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@3.0.1: - resolution: - { - integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: - { - integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, - } - engines: { node: '>=4' } - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } - dependencies: - ansi-regex: 6.0.1 - - /strip-bom-buf@1.0.0: - resolution: - { - integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==, - } - engines: { node: '>=4' } - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom-stream@2.0.0: - resolution: - { - integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==, - } - engines: { node: '>=0.10.0' } - dependencies: - first-chunk-stream: 2.0.0 - strip-bom: 2.0.0 - dev: true - - /strip-bom@2.0.0: - resolution: - { - integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } - dev: true - - /strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: '>=8' } - dev: true - - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: '>=6' } - dev: true - - /strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: '>=8' } - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } - dev: false - - /strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } - - /strnum@1.0.5: - resolution: - { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, - } - dev: false - - /strong-log-transformer@2.1.0: - resolution: - { - integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - dev: true - - /supports-color@2.0.0: - resolution: - { - integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, - } - engines: { node: '>=0.8.0' } - dev: true - - /supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: '>=4' } - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } - dependencies: - has-flag: 4.0.0 - - /supports-hyperlinks@2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: '>=8' } - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } - dev: true - - /taketalk@1.0.0: - resolution: - { - integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==, - } - dependencies: - get-stdin: 4.0.1 - minimist: 1.2.8 - dev: true - - /tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: '>=6' } - dev: true - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /tar@6.1.11: - resolution: - { - integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==, - } - engines: { node: '>= 10' } - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tar@6.1.15: - resolution: - { - integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==, - } - engines: { node: '>=10' } - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tar@6.1.9: - resolution: - { - integrity: sha512-XjLaMNl76o07zqZC/aW4lwegdY07baOH1T8w3AEfrHAdyg/oYO4ctjzEBq9Gy9fEP9oHqLIgvx6zuGDGe+bc8Q==, - } - engines: { node: '>= 10' } - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - - /temp-dir@1.0.0: - resolution: - { - integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, - } - engines: { node: '>=4' } - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: - { - integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==, - } - engines: { node: '>= 10.13.0' } - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2 - dev: true - - /terser@5.19.2: - resolution: - { - integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions@1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: '>=0.10' } - dev: true - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - dev: true - - /textextensions@5.16.0: - resolution: - { - integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==, - } - engines: { node: '>=0.8' } - dev: true - - /thread-stream@2.4.0: - resolution: - { - integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==, - } - dependencies: - real-require: 0.2.0 - dev: false - - /through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through2@4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - - /through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } - - /tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: '>=0.6.0' } - dependencies: - os-tmpdir: 1.0.2 - - /tmp@0.2.1: - resolution: - { - integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==, - } - engines: { node: '>=8.17.0' } - dependencies: - rimraf: 3.0.2 - - /tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } - dev: true - - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: '>=4' } - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } - dependencies: - is-number: 7.0.0 - - /tough-cookie@4.1.3: - resolution: - { - integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, - } - engines: { node: '>=6' } - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - - /traverse@0.3.9: - resolution: - { - integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, - } - dev: false - - /tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } - hasBin: true - dev: true - - /treeverse@1.0.4: - resolution: - { - integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==, - } - dev: true - - /trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: '>=8' } - dev: true - - /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.18.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.0(@types/node@20.4.4)(ts-node@10.7.0) - jest-util: 29.6.1 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.0.2 - yargs-parser: 21.1.1 - dev: true - - /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): - resolution: - { - integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.18.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.0.2 - yargs-parser: 21.1.1 - dev: true - - /ts-json-schema-generator@0.93.0: - resolution: - { - integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==, - } - engines: { node: '>=10.0.0' } - hasBin: true - dependencies: - '@types/json-schema': 7.0.12 - commander: 7.2.0 - fast-json-stable-stringify: 2.1.0 - glob: 7.2.3 - json-stable-stringify: 1.0.2 - typescript: 4.3.5 - dev: true - - /ts-loader@9.4.2(typescript@5.0.2)(webpack@5.88.2): - resolution: - { - integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==, - } - engines: { node: '>=12.0.0' } - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.2 - typescript: 5.0.2 - webpack: 5.88.2 - dev: true - - /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.7.0(@types/node@20.4.4)(typescript@5.0.2): - resolution: - { - integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.4.4 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /ts-node@10.9.1(@types/node@20.4.4)(typescript@5.0.2): - resolution: - { - integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.4.4 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: false - - /ts-node@9.1.1(typescript@4.9.5): - resolution: - { - integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, - } - engines: { node: '>=10.0.0' } - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.9.5 - yn: 3.1.1 - dev: true - - /ts-node@9.1.1(typescript@5.0.2): - resolution: - { - integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, - } - engines: { node: '>=10.0.0' } - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 5.0.2 - yn: 3.1.1 - dev: true - - /ts-retry-promise@0.7.1: - resolution: - { - integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==, - } - engines: { node: '>=6' } - dev: false - - /tsc-alias@1.8.3: - resolution: - { - integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==, - } - hasBin: true - dependencies: - chokidar: 3.5.3 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.5.0 - dev: true - - /tsconfig-paths@4.2.0: - resolution: - { - integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, - } - engines: { node: '>=6' } - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - - /tslib@2.1.0: - resolution: - { - integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==, - } - - /tslib@2.6.1: - resolution: - { - integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, - } - dev: true - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsutils@3.21.0(typescript@5.0.2): - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: '>= 6' } - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.2 - dev: true - - /tuf-js@1.1.7: - resolution: - { - integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4(supports-color@8.1.1) - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: '>=4' } - dev: true - - /type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: '>=10' } - dev: true - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: '>=10' } - dev: true - - /type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: '>=10' } - - /type-fest@0.4.1: - resolution: - { - integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, - } - engines: { node: '>=6' } - dev: true - - /type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: '>=8' } - dev: true - - /type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: '>=8' } - dev: true - - /type-fest@1.4.0: - resolution: - { - integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, - } - engines: { node: '>=10' } - dev: false - - /typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - dev: true - - /typescript@4.3.5: - resolution: - { - integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==, - } - engines: { node: '>=4.2.0' } - hasBin: true - dev: true - - /typescript@4.9.5: - resolution: - { - integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, - } - engines: { node: '>=4.2.0' } - hasBin: true - dev: true - - /typescript@5.0.2: - resolution: - { - integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, - } - engines: { node: '>=12.20' } - hasBin: true - - /uglify-js@3.17.4: - resolution: - { - integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, - } - engines: { node: '>=0.8.0' } - hasBin: true - requiresBuild: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 10.0.0 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': optional: true - - /unique-filename@1.1.1: - resolution: - { - integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, - } - dependencies: - unique-slug: 2.0.2 - dev: true - - /unique-filename@2.0.1: - resolution: - { - integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - unique-slug: 3.0.0 - dev: true - - /unique-filename@3.0.0: - resolution: - { - integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - unique-slug: 4.0.0 - dev: true - - /unique-slug@2.0.2: - resolution: - { - integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, - } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@3.0.0: - resolution: - { - integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@4.0.0: - resolution: - { - integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universal-user-agent@6.0.0: - resolution: - { - integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, - } - dev: true - - /universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: '>= 4.0.0' } - - /universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: '>= 4.0.0' } - dev: false - - /universalify@2.0.0: - resolution: - { - integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, - } - engines: { node: '>= 10.0.0' } - - /unix-dgram@2.0.6: - resolution: - { - integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==, - } - engines: { node: '>=0.10.48' } - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: false + ts-node: optional: true - - /untildify@4.0.0: - resolution: - { - integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, - } - engines: { node: '>=8' } - dev: true - - /unzipper@0.10.14: - resolution: - { - integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, - } - dependencies: - big-integer: 1.6.51 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /upath@2.0.1: - resolution: - { - integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, - } - engines: { node: '>=4' } - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: - { - integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, - } - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /upper-case-first@2.0.2: - resolution: - { - integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /upper-case@2.0.2: - resolution: - { - integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.0 - - /url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url@0.10.3: - resolution: - { - integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==, - } - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - /util@0.12.5: - resolution: - { - integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, - } - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - - /uuid@8.0.0: - resolution: - { - integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==, - } - hasBin: true - dev: true - - /uuid@9.0.0: - resolution: - { - integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==, - } - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } - - /v8-compile-cache@2.3.0: - resolution: - { - integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, - } - dev: true - - /v8-to-istanbul@9.1.0: - resolution: - { - integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==, - } - engines: { node: '>=10.12.0' } - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@3.0.0: - resolution: - { - integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, - } - dependencies: - builtins: 1.0.3 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: - { - integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - builtins: 5.0.1 - dev: true - - /vinyl-file@3.0.0: - resolution: - { - integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==, - } - engines: { node: '>=4' } - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - strip-bom-buf: 1.0.0 - strip-bom-stream: 2.0.0 - vinyl: 2.2.1 - dev: true - - /vinyl@2.2.1: - resolution: - { - integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, - } - engines: { node: '>= 0.10' } - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 - dev: true - - /walk-up-path@1.0.0: - resolution: - { - integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==, - } - dev: true - - /walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } - dependencies: - makeerror: 1.0.12 - dev: true - - /watchpack@2.4.0: - resolution: - { - integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, - } - engines: { node: '>=10.13.0' } - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } - dependencies: - defaults: 1.0.4 - dev: true - - /webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - - /webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, - } - engines: { node: '>=10.13.0' } - dev: true - - /webpack@5.88.2: - resolution: - { - integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==, - } - engines: { node: '>=10.13.0' } - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: - { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, - } - engines: { node: '>=0.8.0' } - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: false - - /websocket-extensions@0.1.4: - resolution: - { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, - } - engines: { node: '>=0.8.0' } - dev: false - - /whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /which-pm@2.0.0: - resolution: - { - integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, - } - engines: { node: '>=8.15' } - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true - - /which-typed-array@1.1.11: - resolution: - { - integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==, - } - engines: { node: '>= 0.4' } - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@1.0.9: - resolution: - { - integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==, - } - hasBin: true - dev: false - - /which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@3.0.1: - resolution: - { - integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wide-align@1.1.5: - resolution: - { - integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, - } - dependencies: - string-width: 4.2.3 - dev: true - - /widest-line@3.1.0: - resolution: - { - integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, - } - engines: { node: '>=8' } - dependencies: - string-width: 4.2.3 - - /winreg@1.2.4: - resolution: - { - integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==, - } - dev: false - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - - /wrap-ansi@2.1.0: - resolution: - { - integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, - } - engines: { node: '>=0.10.0' } - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - - /wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: '>=8' } - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /write-file-atomic@2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@4.0.2: - resolution: - { - integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@5.0.1: - resolution: - { - integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.0.2 - dev: true - - /write-json-file@3.2.0: - resolution: - { - integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, - } - engines: { node: '>=6' } - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.2.11 - make-dir: 2.1.0 - pify: 4.0.1 - sort-keys: 2.0.0 - write-file-atomic: 2.4.3 - dev: true - - /write-pkg@4.0.0: - resolution: - { - integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, - } - engines: { node: '>=8' } - dependencies: - sort-keys: 2.0.0 - type-fest: 0.4.1 - write-json-file: 3.2.0 - dev: true - - /xml-formatter@3.3.2: - resolution: - { - integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, - } - engines: { node: '>= 14' } - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-formatter@3.4.1: - resolution: - { - integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==, - } - engines: { node: '>= 14' } - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-parser-xo@4.1.1: - resolution: - { - integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, - } - engines: { node: '>= 14' } - dev: false - - /xml2js@0.5.0: - resolution: - { - integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==, - } - engines: { node: '>=4.0.0' } - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - - /xml2js@0.6.0: - resolution: - { - integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, - } - engines: { node: '>=4.0.0' } - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: - { - integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, - } - engines: { node: '>=4.0' } - - /xmlcreate@2.0.4: - resolution: - { - integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, - } - dev: false - - /xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } - dev: true - - /y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } - dev: true - - /yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } - dev: true - - /yargs-parser@20.2.4: - resolution: - { - integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: '>=12' } - dev: true - - /yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: '>=12' } - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yeoman-environment@3.19.3: - resolution: - { - integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==, - } - engines: { node: '>=12.10.0' } - hasBin: true - dependencies: - '@npmcli/arborist': 4.3.1 - are-we-there-yet: 2.0.0 - arrify: 2.0.1 - binaryextensions: 4.18.0 - chalk: 4.1.2 - cli-table: 0.3.11 - commander: 7.1.0 - dateformat: 4.6.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.1.0 - error: 10.4.0 - escape-string-regexp: 4.0.0 - execa: 5.1.1 - find-up: 5.0.0 - globby: 11.1.0 - grouped-queue: 2.0.0 - inquirer: 8.2.5 - is-scoped: 2.1.0 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log-symbols: 4.1.0 - mem-fs: 2.3.0 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimatch: 3.1.2 - npmlog: 5.0.1 - p-queue: 6.6.2 - p-transform: 1.3.0 - pacote: 12.0.3 - preferred-pm: 3.0.3 - pretty-bytes: 5.6.0 - readable-stream: 4.4.2 - semver: 7.5.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - text-table: 0.2.0 - textextensions: 5.16.0 - untildify: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /yeoman-generator@5.9.0(yeoman-environment@3.19.3): - resolution: - { - integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==, - } - engines: { node: '>=12.10.0' } - peerDependencies: - yeoman-environment: ^3.2.0 - peerDependenciesMeta: - yeoman-environment: - optional: true - dependencies: - chalk: 4.1.2 - dargs: 7.0.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 5.1.1 - github-username: 6.0.0 - lodash: 4.17.21 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimist: 1.2.8 - pacote: 15.2.0 - read-pkg-up: 7.0.1 - run-async: 2.4.1 - semver: 7.5.2 - shelljs: 0.8.5 - sort-keys: 4.2.0 - text-table: 0.2.0 - yeoman-environment: 3.19.3 - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - supports-color - dev: true - - /yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: '>=6' } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } - dev: true - - /yosay@2.0.2: - resolution: - { - integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - ansi-regex: 2.1.1 - ansi-styles: 3.2.1 - chalk: 1.1.3 - cli-boxes: 1.0.0 - pad-component: 0.0.1 - string-width: 2.1.1 - strip-ansi: 3.0.1 - taketalk: 1.0.0 - wrap-ansi: 2.1.0 - dev: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 20.4.4 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff@29.6.1: + resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-docblock@29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.6.1: + resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /jest-environment-node@29.6.1: + resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.6.1: + resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 14.14.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + jest-worker: 29.6.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector@29.6.1: + resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-matcher-utils@29.6.1: + resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-message-util@29.6.1: + resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.6.1: + resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-util: 29.6.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.6.1 + dev: true + + /jest-regex-util@29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.6.1: + resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.6.1: + resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.6.1: + resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.6.1 + '@jest/environment': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.6.1 + jest-haste-map: 29.6.1 + jest-leak-detector: 29.6.1 + jest-message-util: 29.6.1 + jest-resolve: 29.6.1 + jest-runtime: 29.6.1 + jest-util: 29.6.1 + jest-watcher: 29.6.1 + jest-worker: 29.6.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.6.1: + resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/globals': 29.6.1 + '@jest/source-map': 29.6.0 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.6.1: + resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.2 + '@babel/generator': 7.22.9 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) + '@babel/types': 7.22.5 + '@jest/expect-utils': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + chalk: 4.1.2 + expect: 29.6.1 + graceful-fs: 4.2.11 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + natural-compare: 1.4.0 + pretty-format: 29.6.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.6.1: + resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.6.1: + resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.6.1 + dev: true + + /jest-watcher@29.6.1: + resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.6.1 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 14.14.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.6.1: + resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 14.14.7 + jest-util: 29.6.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jmespath@0.16.0: + resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} + engines: {node: '>= 0.6.0'} + dev: true + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /js2xmlparser@4.0.2: + resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + dependencies: + xmlcreate: 2.0.4 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /jsforce@2.0.0-beta.27: + resolution: {integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==} + engines: {node: '>=8.0'} + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + dependencies: + bignumber.js: 9.1.1 + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stable-stringify@1.0.2: + resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} + dependencies: + jsonify: 0.0.1 + dev: true + + /json-stringify-nice@1.1.4: + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /just-diff-apply@5.5.0: + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + dev: true + + /just-diff@3.1.1: + resolution: {integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==} + dev: true + + /just-diff@5.2.0: + resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} + dev: true + + /just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /lerna-update-wizard@1.1.0: + resolution: {integrity: sha512-V6VtJFbt4BS1HKsNDsyBMeAU86CYRoQSikZsJyEMVc2x/yqH/hX+Z79fI0J3gSiWFkkIKrLj/vPUf6Zvn/79jw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + chalk: 4.1.2 + cli-cursor: 2.1.0 + execution-time: 1.4.1 + fs-extra: 7.0.1 + globby: 11.1.0 + inquirer: 7.3.3 + inquirer-autocomplete-prompt: 1.4.0(inquirer@7.3.3) + lodash: 4.17.21 + meow: 9.0.0 + minimist: 1.2.8 + semver-compare: 1.0.0 + dev: true + + /lerna@7.1.4: + resolution: {integrity: sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw==} + engines: {node: ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@lerna/child-process': 7.1.4 + '@lerna/create': 7.1.4 + '@npmcli/run-script': 6.0.2 + '@nx/devkit': 16.5.5(nx@16.5.5) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-angular: 6.0.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + envinfo: 7.8.1 + execa: 5.0.0 + fs-extra: 11.1.1 + get-port: 5.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + import-local: 3.1.0 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + libnpmaccess: 7.0.2 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 3.1.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 16.5.5 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-pipe: 3.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + pacote: 15.2.0 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + typescript: 5.0.2 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libnpmaccess@7.0.2: + resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish@7.3.0: + resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ci-info: 3.8.0 + normalize-package-data: 5.0.0 + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + semver: 7.5.2 + sigstore: 1.8.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + dev: false + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + + /lodash.template@4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + + /lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + dependencies: + lodash._reinterpolate: 3.0.0 + + /lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /lolex@2.7.5: + resolution: {integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==} + dev: true + + /lolex@5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.1.0 + dev: false + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 17.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.3.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /markdown-table-ts@1.0.3: + resolution: {integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==} + dev: false + + /markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + dependencies: + repeat-string: 1.6.1 + dev: false + + /marked-terminal@5.1.1(marked@4.0.16): + resolution: {integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==} + engines: {node: '>=14.13.1 || >=16.0.0'} + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + ansi-escapes: 5.0.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 4.0.16 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + dev: false + + /marked@4.0.16: + resolution: {integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==} + engines: {node: '>= 12'} + hasBin: true + dev: false + + /mem-fs-editor@9.7.0(mem-fs@2.3.0): + resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} + engines: {node: '>=12.10.0'} + peerDependencies: + mem-fs: ^2.1.0 + peerDependenciesMeta: + mem-fs: + optional: true + dependencies: + binaryextensions: 4.18.0 + commondir: 1.0.1 + deep-extend: 0.6.0 + ejs: 3.1.9 + globby: 11.1.0 + isbinaryfile: 5.0.0 + mem-fs: 2.3.0 + minimatch: 7.4.6 + multimatch: 5.0.0 + normalize-path: 3.0.0 + textextensions: 5.16.0 + dev: true + + /mem-fs@2.3.0: + resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} + engines: {node: '>=12'} + dependencies: + '@types/node': 15.14.9 + '@types/vinyl': 2.0.7 + vinyl: 2.2.1 + vinyl-file: 3.0.0 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minimisted@2.0.1: + resolution: {integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==} + dependencies: + minimist: 1.2.8 + dev: false + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.3: + resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + /minipass@7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp-infer-owner@2.0.0: + resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + infer-owner: 1.0.4 + mkdirp: 1.0.4 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mnemonist@0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + dependencies: + obliterator: 2.0.4 + dev: false + + /mock-stdin@1.0.0: + resolution: {integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==} + dev: true + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + + /multistream@3.1.0: + resolution: {integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /mylas@2.1.13: + resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} + engines: {node: '>=12.0.0'} + dev: true + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true + dev: false + optional: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /natural-orderby@2.0.3: + resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: false + + /neverthrow@4.2.1: + resolution: {integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==} + dev: false + + /neverthrow@4.4.2: + resolution: {integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==} + dev: false + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + /nise@1.5.3: + resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} + dependencies: + '@sinonjs/formatio': 3.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + lolex: 5.1.2 + path-to-regexp: 1.8.0 + dev: true + + /nise@5.1.4: + resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.1.0 + dev: false + + /nock@13.3.2: + resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} + engines: {node: '>= 10.13'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /node-abi@3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.2 + dev: false + + /node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: true + + /node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + dependencies: + clone: 2.1.2 + dev: false + + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: false + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + dev: true + + /node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-gyp@9.4.0: + resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 11.1.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@4.0.0: + resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.2 + dev: true + + /npm-install-checks@6.1.1: + resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.2 + dev: true + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: true + + /npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@8.1.1: + resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 3.0.8 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-package-arg@8.1.5: + resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist@3.0.0: + resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 4.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@5.1.1: + resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-pick-manifest@6.1.1: + resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + dependencies: + npm-install-checks: 4.0.0 + npm-normalize-package-bin: 1.0.1 + npm-package-arg: 8.1.5 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@8.0.1: + resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.5.2 + dev: true + + /npm-registry-fetch@12.0.2: + resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + make-fetch-happen: 10.2.1 + minipass: 3.3.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /nx@16.5.5: + resolution: {integrity: sha512-DHwoUtkirI52JIlCtRK78UI/Ik/VgCtM6FlkfPnFsy8PVyTYMQ40KoG6aZLHjqj5qxoGG2CUjcsbFjGXYrjDbw==} + hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.4.2 + '@swc/core': ^1.2.173 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + dependencies: + '@nrwl/tao': 16.5.5 + '@parcel/watcher': 2.0.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.4.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 7.0.4 + dotenv: 10.0.0 + enquirer: 2.3.6 + fast-glob: 3.2.7 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.1.1 + glob: 7.1.4 + ignore: 5.2.4 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 3.0.5 + npm-run-path: 4.0.1 + open: 8.4.2 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.1 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + v8-compile-cache: 2.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 16.5.5 + '@nx/nx-darwin-x64': 16.5.5 + '@nx/nx-freebsd-x64': 16.5.5 + '@nx/nx-linux-arm-gnueabihf': 16.5.5 + '@nx/nx-linux-arm64-gnu': 16.5.5 + '@nx/nx-linux-arm64-musl': 16.5.5 + '@nx/nx-linux-x64-gnu': 16.5.5 + '@nx/nx-linux-x64-musl': 16.5.5 + '@nx/nx-win32-arm64-msvc': 16.5.5 + '@nx/nx-win32-x64-msvc': 16.5.5 + transitivePeerDependencies: + - debug + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@2.1.1: + resolution: {integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==} + engines: {node: '>= 6'} + dev: false + + /object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + + /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) + aws-sdk: 2.1421.0 + concurrently: 7.6.0 + debug: 4.3.4(supports-color@8.1.1) + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 1.5.0 + got: 11.8.6 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + semver: 7.5.2 + shelljs: 0.8.5 + tslib: 2.6.2 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0(yeoman-environment@3.19.3) + yosay: 2.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bluebird + - encoding + - mem-fs + - supports-color + - typescript + dev: true + + /on-exit-leak-free@2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map-series@2.1.0: + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + dev: true + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + dev: true + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-transform@1.3.0: + resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} + engines: {node: '>=12.10.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + p-queue: 6.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /p-waterfall@2.1.1: + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} + dependencies: + p-reduce: 2.1.0 + dev: true + + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /pacote@12.0.3: + resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + dependencies: + '@npmcli/git': 2.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/promise-spawn': 1.3.2 + '@npmcli/run-script': 2.0.0 + cacache: 15.3.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + infer-owner: 1.0.4 + minipass: 3.3.6 + mkdirp: 1.0.4 + npm-package-arg: 8.1.5 + npm-packlist: 3.0.0 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + promise-retry: 2.0.1 + read-package-json-fast: 2.0.3 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.3 + fs-minipass: 3.0.2 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.1 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.8.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pad-component@0.0.1: + resolution: {integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==} + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-conflict-json@2.0.2: + resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + json-parse-even-better-errors: 2.3.1 + just-diff: 5.2.0 + just-diff-apply: 5.5.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /password-prompt@1.1.2: + resolution: {integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==} + dependencies: + ansi-escapes: 3.2.0 + cross-spawn: 6.0.5 + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.2.3: + resolution: {integrity: sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 4.2.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.7.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino@8.16.0: + resolution: {integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.7.0 + thread-stream: 2.4.0 + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plimit-lit@1.5.0: + resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} + dependencies: + queue-lit: 1.5.0 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.45.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.0.5: + resolution: {integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-format@29.6.1: + resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: true + + /proc-log@1.0.0: + resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} + dev: true + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process-warning@2.2.0: + resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /promise-all-reject-late@1.0.1: + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + dev: true + + /promise-call-limit@1.0.2: + resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + dev: true + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard@1.0.0: + resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + read: 2.1.0 + dev: true + + /propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} + dev: true + + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: true + + /proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /pure-rand@6.0.2: + resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-lit@1.5.0: + resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-cmd-shim@3.0.1: + resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dev: true + + /read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /read-package-json-fast@2.0.3: + resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} + engines: {node: '>=10'} + dependencies: + json-parse-even-better-errors: 2.3.1 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read@2.1.0: + resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + mute-stream: 1.0.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readdir-scoped-modules@1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: false + + /replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /rimraf@5.0.1: + resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.3 + dev: false + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.1.0 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /samsam@1.3.0: + resolution: {integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==} + deprecated: This package has been deprecated in favour of @sinonjs/samsam + dev: true + + /sax@1.2.1: + resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} + dev: true + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /scoped-regex@2.1.0: + resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} + engines: {node: '>=8'} + dev: true + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.2: + resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /sequin@0.1.1: + resolution: {integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==} + engines: {node: '>=0.4.0'} + dev: false + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + /sigstore@1.8.0: + resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-git@3.16.0: + resolution: {integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-git@3.19.1: + resolution: {integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /sinon@11.1.2: + resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} + deprecated: 16.1.1 + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.1.3 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true + + /sinon@5.1.1: + resolution: {integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==} + dependencies: + '@sinonjs/formatio': 2.0.0 + diff: 3.5.0 + lodash.get: 4.4.2 + lolex: 2.7.5 + nise: 1.5.3 + supports-color: 5.5.0 + type-detect: 4.0.8 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + + /sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spawn-command@0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /ssri@10.0.4: + resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + dev: true + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stdout-stderr@0.1.13: + resolution: {integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==} + engines: {node: '>=8.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-buf@1.0.0: + resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} + engines: {node: '>=4'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom-stream@2.0.0: + resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} + engines: {node: '>=0.10.0'} + dependencies: + first-chunk-stream: 2.0.0 + strip-bom: 2.0.0 + dev: true + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + + /strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /taketalk@1.0.0: + resolution: {integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==} + dependencies: + get-stdin: 4.0.1 + minimist: 1.2.8 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /textextensions@5.16.0: + resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} + engines: {node: '>=0.8'} + dev: true + + /thread-stream@2.4.0: + resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} + dependencies: + real-require: 0.2.0 + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /treeverse@1.0.4: + resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.18.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.0.2 + yargs-parser: 21.1.1 + dev: true + + /ts-json-schema-generator@0.93.0: + resolution: {integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + '@types/json-schema': 7.0.12 + commander: 7.2.0 + fast-json-stable-stringify: 2.1.0 + glob: 7.2.3 + json-stable-stringify: 1.0.2 + typescript: 4.3.5 + dev: true + + /ts-loader@9.4.2(typescript@5.0.2)(webpack@5.88.2): + resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.2 + typescript: 5.0.2 + webpack: 5.88.2 + dev: true + + /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@9.1.1(typescript@4.9.5): + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 4.9.5 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@5.0.2): + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 5.0.2 + yn: 3.1.1 + dev: true + + /ts-retry-promise@0.7.1: + resolution: {integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==} + engines: {node: '>=6'} + dev: false + + /tsc-alias@1.8.3: + resolution: {integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==} + hasBin: true + dependencies: + chokidar: 3.5.3 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.5.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.1.0: + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@5.0.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-fest@0.4.1: + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@4.3.5: + resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + optional: true + + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unix-dgram@2.0.6: + resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} + engines: {node: '>=0.10.48'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: false + optional: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + dependencies: + big-integer: 1.6.51 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.1.0 + dev: false + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.1.0 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /url@0.10.3: + resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: true + + /uuid@8.0.0: + resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} + hasBin: true + dev: true + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + dependencies: + builtins: 1.0.3 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + + /vinyl-file@3.0.0: + resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + strip-bom-buf: 1.0.0 + strip-bom-stream: 2.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /walk-up-path@1.0.0: + resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.0.9: + resolution: {integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==} + hasBin: true + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + + /winreg@1.2.4: + resolution: {integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.0.2 + dev: true + + /write-json-file@3.2.0: + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.11 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-pkg@4.0.0: + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /xml-formatter@3.3.2: + resolution: {integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==} + engines: {node: '>= 14'} + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-formatter@3.4.1: + resolution: {integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==} + engines: {node: '>= 14'} + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-parser-xo@4.1.1: + resolution: {integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==} + engines: {node: '>= 14'} + dev: false + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + + /xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + /xmlcreate@2.0.4: + resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yeoman-environment@3.19.3: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} + engines: {node: '>=12.10.0'} + hasBin: true + dependencies: + '@npmcli/arborist': 4.3.1 + are-we-there-yet: 2.0.0 + arrify: 2.0.1 + binaryextensions: 4.18.0 + chalk: 4.1.2 + cli-table: 0.3.11 + commander: 7.1.0 + dateformat: 4.6.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.1.0 + error: 10.4.0 + escape-string-regexp: 4.0.0 + execa: 5.1.1 + find-up: 5.0.0 + globby: 11.1.0 + grouped-queue: 2.0.0 + inquirer: 8.2.5 + is-scoped: 2.1.0 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log-symbols: 4.1.0 + mem-fs: 2.3.0 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimatch: 3.1.2 + npmlog: 5.0.1 + p-queue: 6.6.2 + p-transform: 1.3.0 + pacote: 12.0.3 + preferred-pm: 3.0.3 + pretty-bytes: 5.6.0 + readable-stream: 4.4.2 + semver: 7.5.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 + textextensions: 5.16.0 + untildify: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /yeoman-generator@5.9.0(yeoman-environment@3.19.3): + resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} + engines: {node: '>=12.10.0'} + peerDependencies: + yeoman-environment: ^3.2.0 + peerDependenciesMeta: + yeoman-environment: + optional: true + dependencies: + chalk: 4.1.2 + dargs: 7.0.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 5.1.1 + github-username: 6.0.0 + lodash: 4.17.21 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimist: 1.2.8 + pacote: 15.2.0 + read-pkg-up: 7.0.1 + run-async: 2.4.1 + semver: 7.5.2 + shelljs: 0.8.5 + sort-keys: 4.2.0 + text-table: 0.2.0 + yeoman-environment: 3.19.3 + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - supports-color + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yosay@2.0.2: + resolution: {integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + ansi-regex: 2.1.1 + ansi-styles: 3.2.1 + chalk: 1.1.3 + cli-boxes: 1.0.0 + pad-component: 0.0.1 + string-width: 2.1.1 + strip-ansi: 3.0.1 + taketalk: 1.0.0 + wrap-ansi: 2.1.0 + dev: true From 811b30adca021475facd71dc6a251955645436a4 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 16:48:59 +1100 Subject: [PATCH 04/95] fix(config): add public config --- packages/forcemula/package.json | 3 +++ packages/sfp-cli/package.json | 3 +++ packages/sfplogger/package.json | 3 +++ 3 files changed, 9 insertions(+) diff --git a/packages/forcemula/package.json b/packages/forcemula/package.json index 470e29b15..0574a1680 100644 --- a/packages/forcemula/package.json +++ b/packages/forcemula/package.json @@ -9,6 +9,9 @@ "watch": "jest --silent=false --verbose --detectOpenHandles --coverage --watchAll", "test:coverage": "jest --silent=false --verbose --detectOpenHandles --coverage" }, + "publishConfig": { + "access": "public" + }, "author": "flxblio", "license": "MIT", "devDependencies": { diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index c65d9f6bb..5d4749d04 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -9,6 +9,9 @@ "sfp": "./bin/run" }, "bugs": "https://github.com/flxblio/sfp/issues", + "publishConfig": { + "access": "public" + }, "dependencies": { "@flxblio/apexlink": "^1.0.2", "@newrelic/telemetry-sdk": "^0.6.0", diff --git a/packages/sfplogger/package.json b/packages/sfplogger/package.json index d374319dd..e4e0fdeef 100644 --- a/packages/sfplogger/package.json +++ b/packages/sfplogger/package.json @@ -12,6 +12,9 @@ "clean": "rimraf ./lib && rimraf tsconfig.tsbuildinfo", "compile": "tsc -b tsconfig.json" }, + "publishConfig": { + "access": "public" + }, "dependencies": { "chalk": "^4.1.2", "fs-extra": "^9.1.0", From a951573eff273b3540fb128844a2ae46ef4c6bff Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 16:57:09 +1100 Subject: [PATCH 05/95] fix(cicd): change to GITHUB_TOKEN --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bfeee6bf6..1da1199a8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -106,7 +106,7 @@ jobs: image: 'sfp-lite-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build-docker-lite ] From 74c51578020e90aaef5e2db7663e518cb835293f Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 17:16:05 +1100 Subject: [PATCH 06/95] fix(cicd): fix usernames used in pipelines --- .github/workflows/release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1da1199a8..4832d4b69 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,8 +50,8 @@ jobs: repo: 'dxatscale' image: 'sfpowerscripts-rc' secrets: - username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + username: ${{ secrets.DOCKER_USERNAME }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build ] build-docker-lite: @@ -64,8 +64,8 @@ jobs: dockerFileName: 'sfp-lite' image: 'sfp-lite-rc' secrets: - username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + username: ${{ secrets.DOCKER_USERNAME }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build ] #Promotion Stages @@ -93,7 +93,7 @@ jobs: image: 'sfpowerscripts-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build-docker ] alpha-docker-lite: From f82a4564f8f026ab5b8a610158b1658d44e8a52c Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 17:17:04 +1100 Subject: [PATCH 07/95] fix(cicd): remove run name --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4832d4b69..da087a6b6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ on: workflow_dispatch: -run-name: Release ${{ github.run_id }} / ${{ github.ref_name }} + # Merge to Develop, create builds jobs: From d7b4ca945713dcbaf4d048ca1c243e97a43eb801 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 17:24:58 +1100 Subject: [PATCH 08/95] fix(cicd): fix path to package --- .github/workflows/release.yml | 6 +++--- .github/workflows/sfpowerscripts-build-docker.yml | 4 ++-- .github/workflows/sfpowerscripts-copy-docker.yml | 4 ++-- .github/workflows/sfpowerscripts-promote-docker.yml | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da087a6b6..2753915c8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,7 @@ jobs: uses: ./.github/workflows/promotePackage.yml with: version: 'alpha' - pathToPackageJson: 'packages/sfpowerscripts-cli/package.json' + pathToPackageJson: 'packages/sfp-cli/package.json' environment: sfpowerscripts-alpha secrets: npm-token: ${{ secrets.NPM_TOKEN }} @@ -115,7 +115,7 @@ jobs: uses: ./.github/workflows/promotePackage.yml with: version: 'beta' - pathToPackageJson: 'packages/sfpowerscripts-cli/package.json' + pathToPackageJson: 'packages/sfp-cli/package.json' environment: sfpowerscripts-beta secrets: npm-token: ${{ secrets.NPM_TOKEN }} @@ -155,7 +155,7 @@ jobs: uses: ./.github/workflows/promotePackage.yml with: version: 'latest' - pathToPackageJson: 'packages/sfpowerscripts-cli/package.json' + pathToPackageJson: 'packages/sfp-cli/package.json' environment: sfpowerscripts-prod secrets: npm-token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/sfpowerscripts-build-docker.yml b/.github/workflows/sfpowerscripts-build-docker.yml index 7ba97fe1e..258c01982 100644 --- a/.github/workflows/sfpowerscripts-build-docker.yml +++ b/.github/workflows/sfpowerscripts-build-docker.yml @@ -63,8 +63,8 @@ jobs: - name: 'Get package version and name' run: | - echo "PKG_VERSION=$(jq -r ".version" packages/sfpowerscripts-cli/package.json)" >> $GITHUB_ENV - RELEASE_NAME=$(jq -r ".release" packages/sfpowerscripts-cli/package.json) + echo "PKG_VERSION=$(jq -r ".version" packages/sfp-cli/package.json)" >> $GITHUB_ENV + RELEASE_NAME=$(jq -r ".release" packages/sfp-cli/package.json) RELEASE_NAME_AS_ARRAY=($RELEASE_NAME) RELEASE_NAME=$(echo ${RELEASE_NAME_AS_ARRAY[0]} | cut -c1-3)${RELEASE_NAME_AS_ARRAY[1]} echo "RELEASE_NAME=release-$RELEASE_NAME" >> $GITHUB_ENV diff --git a/.github/workflows/sfpowerscripts-copy-docker.yml b/.github/workflows/sfpowerscripts-copy-docker.yml index a21be93c9..89d5e1dd6 100644 --- a/.github/workflows/sfpowerscripts-copy-docker.yml +++ b/.github/workflows/sfpowerscripts-copy-docker.yml @@ -53,8 +53,8 @@ jobs: - name: 'Get package version' run: | - echo "PKG_VERSION=$(jq -r ".version" packages/sfpowerscripts-cli/package.json)" >> $GITHUB_ENV - RELEASE_NAME=$(jq -r ".release" packages/sfpowerscripts-cli/package.json) + echo "PKG_VERSION=$(jq -r ".version" packages/sfp-cli/package.json)" >> $GITHUB_ENV + RELEASE_NAME=$(jq -r ".release" packages/sfp-cli/package.json) RELEASE_NAME_AS_ARRAY=($RELEASE_NAME) RELEASE_NAME=$(echo ${RELEASE_NAME_AS_ARRAY[0]} | cut -c1-3)${RELEASE_NAME_AS_ARRAY[1]} echo "RELEASE_NAME=release-$RELEASE_NAME" >> $GITHUB_ENV diff --git a/.github/workflows/sfpowerscripts-promote-docker.yml b/.github/workflows/sfpowerscripts-promote-docker.yml index 18e18f129..c9ed1f347 100644 --- a/.github/workflows/sfpowerscripts-promote-docker.yml +++ b/.github/workflows/sfpowerscripts-promote-docker.yml @@ -37,8 +37,8 @@ jobs: - name: 'Get package version' run: | - echo "PKG_VERSION=$(jq -r ".version" packages/sfpowerscripts-cli/package.json)" >> $GITHUB_ENV - RELEASE_NAME=$(jq -r ".release" packages/sfpowerscripts-cli/package.json) + echo "PKG_VERSION=$(jq -r ".version" packages/sfp-cli/package.json)" >> $GITHUB_ENV + RELEASE_NAME=$(jq -r ".release" packages/sfp-cli/package.json) RELEASE_NAME_AS_ARRAY=($RELEASE_NAME) RELEASE_NAME=$(echo ${RELEASE_NAME_AS_ARRAY[0]} | cut -c1-3)${RELEASE_NAME_AS_ARRAY[1]} echo "RELEASE_NAME=release-$RELEASE_NAME" >> $GITHUB_ENV From b44570236e8ae8887bd12b62ee940b6912218f10 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 18:13:06 +1100 Subject: [PATCH 09/95] fix(cicd): fix repo name --- .github/workflows/release.yml | 14 +++++++------- .github/workflows/sfpowerscripts-build-docker.yml | 2 +- CONTRIBUTING.md | 2 +- .../001-sfpowerscripts-artifact-customsettings.md | 2 +- decision records/003-dependency-manager.md | 2 +- .../001-aliasified-data-sourcepackages.md | 4 ++-- decision records/release/001-release.md | 2 +- .../release/002-release-installing-packages.md | 2 +- .../release/003-release-autorollback.md | 2 +- dockerfiles/sfp-lite.Dockerfile | 4 ++-- .../{sfpowerscripts.Dockerfile => sfp.Dockerfile} | 4 ++-- packages/apexlink/package.json | 6 +++--- packages/sfdx-process-wrapper/package.json | 6 +++--- packages/sfp-cli/README.md | 10 +++++----- packages/sfp-cli/package.json | 6 +++--- .../schemas/releasedefinition.schema.json | 2 +- .../schemas/releasedefinitiongenerator.schema.json | 2 +- .../resources/schemas/sfdx-project.schema.json | 2 +- packages/sfplogger/package.json | 6 +++--- packages/sfprofiles/package.json | 6 +++--- 20 files changed, 43 insertions(+), 43 deletions(-) rename dockerfiles/{sfpowerscripts.Dockerfile => sfp.Dockerfile} (96%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2753915c8..b64317efb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,8 +47,8 @@ jobs: with: job-environment: 'build-docker' suffix-tag: ${{ github.run_id }} - repo: 'dxatscale' - image: 'sfpowerscripts-rc' + repo: 'flxbl-io' + image: 'sfp-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} token: ${{ secrets.GITHUB_TOKEN }} @@ -60,7 +60,7 @@ jobs: with: job-environment: 'build-docker' suffix-tag: ${{ github.run_id }} - repo: 'dxatscale' + repo: 'flxbl-io' dockerFileName: 'sfp-lite' image: 'sfp-lite-rc' secrets: @@ -88,7 +88,7 @@ jobs: uses: ./.github/workflows/sfpowerscripts-promote-docker.yml with: job-environment: 'sfpowerscripts-alpha-docker' - repo: 'dxatscale' + repo: 'flxbl-io' new-tag: alpha image: 'sfpowerscripts-rc' secrets: @@ -101,7 +101,7 @@ jobs: uses: ./.github/workflows/sfpowerscripts-promote-docker.yml with: job-environment: 'sfpowerscripts-alpha-docker' - repo: 'dxatscale' + repo: 'flxbl-io' new-tag: alpha image: 'sfp-lite-rc' secrets: @@ -126,7 +126,7 @@ jobs: uses: ./.github/workflows/sfpowerscripts-promote-docker.yml with: job-environment: 'sfpowerscripts-beta-docker' - repo: 'dxatscale' + repo: 'flxbl-io' new-tag: beta image: 'sfp-lite-rc' secrets: @@ -139,7 +139,7 @@ jobs: uses: ./.github/workflows/sfpowerscripts-promote-docker.yml with: job-environment: 'sfpowerscripts-beta-docker' - repo: 'dxatscale' + repo: 'flxbl-io' new-tag: beta image: 'sfpowerscripts-rc' secrets: diff --git a/.github/workflows/sfpowerscripts-build-docker.yml b/.github/workflows/sfpowerscripts-build-docker.yml index 258c01982..f68f3e9b5 100644 --- a/.github/workflows/sfpowerscripts-build-docker.yml +++ b/.github/workflows/sfpowerscripts-build-docker.yml @@ -13,7 +13,7 @@ on: dockerFileName: type: string required: false - default: sfpowerscripts + default: sfp image: type: string required: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8407a8b9..4a43b069e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,5 +25,5 @@ Creating an issue is the simplest form of contributing to the project. But there ## Issues -Please only create issues for bug reports or feature requests at [sfp repo](https://github.com/flxblio/sfp). Issues discussing any other topics may be closed by the project’s maintainers without further explanation. +Please only create issues for bug reports or feature requests at [sfp repo](https://github.com/flxbl-io/sfp). Issues discussing any other topics may be closed by the project’s maintainers without further explanation. diff --git a/decision records/001-sfpowerscripts-artifact-customsettings.md b/decision records/001-sfpowerscripts-artifact-customsettings.md index 061796f4c..1056eb1cb 100644 --- a/decision records/001-sfpowerscripts-artifact-customsettings.md +++ b/decision records/001-sfpowerscripts-artifact-customsettings.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: -Issue [Issue #476](https://github.com/flxblio/sfp/issues/476) +Issue [Issue #476](https://github.com/flxbl-io/sfp/issues/476) ## Context and Problem Statement diff --git a/decision records/003-dependency-manager.md b/decision records/003-dependency-manager.md index e57bae917..47e9b702f 100644 --- a/decision records/003-dependency-manager.md +++ b/decision records/003-dependency-manager.md @@ -5,7 +5,7 @@ ## Context and Problem Statement As the number of packages increases in large scale projects, with multiple dependencies, updating package versions and dependencies manually is time consuming and takes great care to update dependencies one by one. -Other solutions encountered were local bash scripts as documented in both the issue https://github.com/flxblio/sfp/issues/638 raised and in the discussions has here: https://github.com/dxatscale/sfpowerscripts/discussions/468 +Other solutions encountered were local bash scripts as documented in both the issue https://github.com/flxbl-io/sfp/issues/638 raised and in the discussions has here: https://github.com/dxatscale/sfpowerscripts/discussions/468 ## Solution The dependency manager should utilise the SemVer incrementation style https://semver.org/ and be of a similar method to the ‘lerna version’ command. It should prompt the user for the version either for individual packages or for all packages in the sfdx-project.json: (major, minor, patch, custom). diff --git a/decision records/deployments/001-aliasified-data-sourcepackages.md b/decision records/deployments/001-aliasified-data-sourcepackages.md index 41b804a0d..70f91b9d7 100644 --- a/decision records/deployments/001-aliasified-data-sourcepackages.md +++ b/decision records/deployments/001-aliasified-data-sourcepackages.md @@ -4,8 +4,8 @@ * Deciders: Azlam, Alan * Date: -Issue [Issue #632](https://github.com/flxblio/sfp/issues/632) -Issue [Issue #715](https://github.com/flxblio/sfp/issues/715) +Issue [Issue #632](https://github.com/flxbl-io/sfp/issues/632) +Issue [Issue #715](https://github.com/flxbl-io/sfp/issues/715) ## Context and Problem Statement diff --git a/decision records/release/001-release.md b/decision records/release/001-release.md index 0e94b2917..39415dea0 100644 --- a/decision records/release/001-release.md +++ b/decision records/release/001-release.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: 23/03/21 -Issue: [Issue #452](https://github.com/flxblio/sfp/issues/452) +Issue: [Issue #452](https://github.com/flxbl-io/sfp/issues/452) ## Context and Problem Statement diff --git a/decision records/release/002-release-installing-packages.md b/decision records/release/002-release-installing-packages.md index 7d28f08f8..111ef0b56 100644 --- a/decision records/release/002-release-installing-packages.md +++ b/decision records/release/002-release-installing-packages.md @@ -4,7 +4,7 @@ * Deciders: Azlam, Alan * Date: 23/03/21 -Issue: [Issue #452](https://github.com/flxblio/sfp/issues/452) +Issue: [Issue #452](https://github.com/flxbl-io/sfp/issues/452) ## Context and Problem Statement diff --git a/decision records/release/003-release-autorollback.md b/decision records/release/003-release-autorollback.md index 11d33019e..0cb6cd2f1 100644 --- a/decision records/release/003-release-autorollback.md +++ b/decision records/release/003-release-autorollback.md @@ -3,7 +3,7 @@ * Status: Proposed -Issue: [Issue #478](https://github.com/flxblio/sfp/issues/478) +Issue: [Issue #478](https://github.com/flxbl-io/sfp/issues/478) ## Context and Problem Statement diff --git a/dockerfiles/sfp-lite.Dockerfile b/dockerfiles/sfp-lite.Dockerfile index 390b25762..4b1794217 100644 --- a/dockerfiles/sfp-lite.Dockerfile +++ b/dockerfiles/sfp-lite.Dockerfile @@ -7,11 +7,11 @@ ARG NODE_MAJOR=18 LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" -LABEL org.opencontainers.image.url "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.url "https://github.com/flxbl-io/sfp" LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "Flxbl" -LABEL org.opencontainers.image.source "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" LABEL org.opencontainers.image.title "Flxbl sfp lite docker image - January 24" diff --git a/dockerfiles/sfpowerscripts.Dockerfile b/dockerfiles/sfp.Dockerfile similarity index 96% rename from dockerfiles/sfpowerscripts.Dockerfile rename to dockerfiles/sfp.Dockerfile index 4f3e8b390..180715c9f 100644 --- a/dockerfiles/sfpowerscripts.Dockerfile +++ b/dockerfiles/sfp.Dockerfile @@ -10,11 +10,11 @@ ARG NODE_MAJOR=18 LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" -LABEL org.opencontainers.image.url "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.url "https://github.com/flxbl-io/sfp" LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "DX@Scale" -LABEL org.opencontainers.image.source "https://github.com/flxblio/sfp" +LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" LABEL org.opencontainers.image.title "DX@Scale sfpowercripts docker image - January 24" diff --git a/packages/apexlink/package.json b/packages/apexlink/package.json index bd4e27ad1..0c1cfdb6e 100644 --- a/packages/apexlink/package.json +++ b/packages/apexlink/package.json @@ -3,7 +3,7 @@ "version": "1.0.2", "description": "Wrappers around @nawforce's apexlink java pom ", "author": "flxblio", - "homepage": "https://github.com/flxblio/sfp", + "homepage": "https://github.com/flxbl-io/sfp", "license": "MIT", "main": "lib/index", "types": "lib/index", @@ -31,7 +31,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/flxblio/sfp.git" + "url": "git+https://github.com/flxbl-io/sfp.git" }, "publishConfig": { "access": "public" @@ -45,6 +45,6 @@ "spec-test": "FORCE_COLOR=true jest -i packages/apexlink/tests/ApexDependencyCheckImpl.test.ts --verbose true --coverage --detectOpenHandles" }, "bugs": { - "url": "https://github.com/flxblio/sfp/issues" + "url": "https://github.com/flxbl-io/sfp/issues" } } diff --git a/packages/sfdx-process-wrapper/package.json b/packages/sfdx-process-wrapper/package.json index 079c29fd9..45327da68 100644 --- a/packages/sfdx-process-wrapper/package.json +++ b/packages/sfdx-process-wrapper/package.json @@ -3,7 +3,7 @@ "version": "1.0.2", "description": "Wraps around SFDXCommand to exeute it using a subprocess", "author": "flxbl", - "homepage": "https://github.com/flxblio/sfp#readme", + "homepage": "https://github.com/flxbl-io/sfp#readme", "license": "MIT", "main": "lib/index", "types": "lib/index", @@ -24,7 +24,7 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/flxblio/sfp.git" + "url": "git+https://github.com/flxbl-io/sfp.git" }, "publishConfig": { "access": "public" @@ -35,6 +35,6 @@ "compile": "tsc -b tsconfig.json" }, "bugs": { - "url": "https://github.com/flxblio/sfp/issues" + "url": "https://github.com/flxbl-io/sfp/issues" } } diff --git a/packages/sfp-cli/README.md b/packages/sfp-cli/README.md index 0abca1322..9c7f12720 100644 --- a/packages/sfp-cli/README.md +++ b/packages/sfp-cli/README.md @@ -3,9 +3,9 @@

![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) -[![GitHub stars](https://img.shields.io/github/stars/flxblio/sfp)](https://github.com/flxblio/sfp/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/flxblio/sfp.svg)](https://github.com/flxblio/sfp/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxblio/sfp/blob/master/LICENSE) +[![GitHub stars](https://img.shields.io/github/stars/flxblio/sfp)](https://github.com/flxbl-io/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxblio/sfp.svg)](https://github.com/flxbl-io/sfp/graphs/contributors/) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxbl-io/sfp/blob/master/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) @@ -29,7 +29,7 @@ A build system for package based development in Salesforce, delivered as a node There are lot more features to explore. Read more at https://docs.flxblio.io The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxblio/sfp) or can be -used by using the [docker image](https://github.com/flxblio/sfp/pkgs/container/sfp) +used by using the [docker image](https://github.com/flxbl-io/sfp/pkgs/container/sfp) @@ -58,7 +58,7 @@ npm i -g @flxblio/sfp #### Docker -Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxblio/sfp/pkgs/container/sfp). +Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxbl-io/sfp/pkgs/container/sfp). We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 5d4749d04..bdc1be320 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -8,7 +8,7 @@ "bin": { "sfp": "./bin/run" }, - "bugs": "https://github.com/flxblio/sfp/issues", + "bugs": "https://github.com/flxbl-io/sfp/issues", "publishConfig": { "access": "public" }, @@ -91,7 +91,7 @@ "/resources", "/oclif.manifest.json" ], - "homepage": "https://github.com/flxblio/sfp", + "homepage": "https://github.com/flxbl-io/sfp", "keywords": [ "flxblio", "sfp-cli", @@ -165,7 +165,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/flxblio/sfp.git", + "url": "https://github.com/flxbl-io/sfp.git", "directory": "packages/sfp-cli" }, "scripts": { diff --git a/packages/sfp-cli/resources/schemas/releasedefinition.schema.json b/packages/sfp-cli/resources/schemas/releasedefinition.schema.json index 7a9071925..d81dcd6bb 100644 --- a/packages/sfp-cli/resources/schemas/releasedefinition.schema.json +++ b/packages/sfp-cli/resources/schemas/releasedefinition.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", + "$id": "https://github.com/flxbl-io/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", "title": "release definition", "description": "The definition for a release using sfp orchestrator", "type": "object", diff --git a/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json b/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json index 9b9c4372d..580d0fefb 100644 --- a/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json +++ b/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", + "$id": "https://github.com/flxbl-io/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", "title": "release definition generator", "description": "The definition for generating a release defintion using generator command", "type": "object", diff --git a/packages/sfp-cli/resources/schemas/sfdx-project.schema.json b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json index db002e40b..4eb47bfc2 100644 --- a/packages/sfp-cli/resources/schemas/sfdx-project.schema.json +++ b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxblio/sfp/blob/develop/packages/sfp-cli/resources/sfdx-project.schema.json", + "$id": "https://github.com/flxbl-io/sfp/blob/develop/packages/sfp-cli/resources/sfdx-project.schema.json", "title": "sfp DX Project File", "description": "The properties and shape of the SFDX project enhanced for sfp", "type": "object", diff --git a/packages/sfplogger/package.json b/packages/sfplogger/package.json index e4e0fdeef..1061f8409 100644 --- a/packages/sfplogger/package.json +++ b/packages/sfplogger/package.json @@ -29,14 +29,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/flxblio/sfp.git" + "url": "git+https://github.com/flxbl-io/sfp.git" }, "author": "flxblio", "license": "MIT", "bugs": { - "url": "https://github.com/flxblio/sfp/issues" + "url": "https://github.com/flxbl-io/sfp/issues" }, - "homepage": "https://github.com/flxblio/sfp/tree/main/packages/sfplogger#readme", + "homepage": "https://github.com/flxbl-io/sfp/tree/main/packages/sfplogger#readme", "keywords": [ "logger", "sfp", diff --git a/packages/sfprofiles/package.json b/packages/sfprofiles/package.json index 0d81d3f16..a3661e674 100644 --- a/packages/sfprofiles/package.json +++ b/packages/sfprofiles/package.json @@ -9,7 +9,7 @@ "permissions" ], "author": "flxblio", - "homepage": "https://github.com/flxblio/sfp", + "homepage": "https://github.com/flxbl-io/sfp", "license": "MIT", "main": "lib/sfprofiles", "types": "lib/sfprofiles", @@ -22,7 +22,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/flxblio/sfp.git" + "url": "git+https://github.com/flxbl-io/sfp.git" }, "scripts": { "build": "pnpm run clean && pnpm run compile", @@ -32,7 +32,7 @@ "clearCache": "jest --clearCache" }, "bugs": { - "url": "https://github.com/flxblio/sfp/issues" + "url": "https://github.com/flxbl-io/sfp/issues" }, "devDependencies": { "@babel/core": "7.18.2", From 12a2d237c0e14434b98119b10e6a7b1a29eb3294 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Fri, 15 Dec 2023 23:29:28 +1100 Subject: [PATCH 10/95] fix(cicd): fix use to sfp --- .github/workflows/buildPackages.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/sfpowerscripts-copy-docker.yml | 2 +- .github/workflows/sfpowerscripts-promote-docker.yml | 2 +- .github/workflows/tagDockerImage.yml | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/buildPackages.yml b/.github/workflows/buildPackages.yml index 0fe9f1625..125243382 100644 --- a/.github/workflows/buildPackages.yml +++ b/.github/workflows/buildPackages.yml @@ -40,7 +40,7 @@ jobs: - name: 'Set Git Config' run: | - git config --global user.email "ciuser@dxatscale.io" + git config --global user.email "ciuser@flxbl.io" git config --global user.name "ciuser" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b64317efb..a3ee05dc0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,7 @@ jobs: job-environment: 'sfpowerscripts-alpha-docker' repo: 'flxbl-io' new-tag: alpha - image: 'sfpowerscripts-rc' + image: 'sfp-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} token: ${{ secrets.GITHUB_TOKEN }} @@ -141,7 +141,7 @@ jobs: job-environment: 'sfpowerscripts-beta-docker' repo: 'flxbl-io' new-tag: beta - image: 'sfpowerscripts-rc' + image: 'sfp-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} token: ${{ secrets.DOCKER_SECRET }} diff --git a/.github/workflows/sfpowerscripts-copy-docker.yml b/.github/workflows/sfpowerscripts-copy-docker.yml index 89d5e1dd6..6e185771a 100644 --- a/.github/workflows/sfpowerscripts-copy-docker.yml +++ b/.github/workflows/sfpowerscripts-copy-docker.yml @@ -14,7 +14,7 @@ on: image: type: string required: false - default: sfpowerscripts-rc + default: sfp-rc image-as: type: string required: false diff --git a/.github/workflows/sfpowerscripts-promote-docker.yml b/.github/workflows/sfpowerscripts-promote-docker.yml index c9ed1f347..8baef73dc 100644 --- a/.github/workflows/sfpowerscripts-promote-docker.yml +++ b/.github/workflows/sfpowerscripts-promote-docker.yml @@ -13,7 +13,7 @@ on: image: type: string required: false - default: sfpowerscripts + default: sfp new-tag: type: string required: true diff --git a/.github/workflows/tagDockerImage.yml b/.github/workflows/tagDockerImage.yml index f2e357307..992a51a21 100644 --- a/.github/workflows/tagDockerImage.yml +++ b/.github/workflows/tagDockerImage.yml @@ -7,11 +7,11 @@ on: repo: type: string required: true - default: dxatscale + default: flxbl-io image: type: string required: true - default: sfpowerscripts + default: sfp existing-tag: type: string required: true @@ -24,7 +24,7 @@ on: jobs: build: - name: 'tag sfpowerscripts docker image' + name: 'tag sfp docker image' environment: tagger runs-on: ubuntu-latest steps: From a7cd6a0f156d97a74cbab1da73b5c925e45fc0fa Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Sat, 16 Dec 2023 20:19:14 +1100 Subject: [PATCH 11/95] fix(cicd): fix secret used in publishing --- .github/workflows/release.yml | 8 ++++---- .github/workflows/tagDockerImage.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3ee05dc0..b08709791 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -131,7 +131,7 @@ jobs: image: 'sfp-lite-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build-docker ] beta-docker-lite: @@ -144,7 +144,7 @@ jobs: image: 'sfp-rc' secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} needs: [ build-docker-lite ] @@ -168,7 +168,7 @@ jobs: job-environment: 'sfpowerscripts-prod-docker' secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} signing_secret: ${{ secrets.SIGNING_SECRET }} cosign_password: ${{ secrets.COSIGN_PASSWORD }} needs: [ build-docker ] @@ -182,7 +182,7 @@ jobs: image-as: sfp-lite secrets: username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} signing_secret: ${{ secrets.SIGNING_SECRET }} cosign_password: ${{ secrets.COSIGN_PASSWORD }} needs: [ build-docker-lite ] diff --git a/.github/workflows/tagDockerImage.yml b/.github/workflows/tagDockerImage.yml index 992a51a21..a65c58a76 100644 --- a/.github/workflows/tagDockerImage.yml +++ b/.github/workflows/tagDockerImage.yml @@ -43,5 +43,5 @@ jobs: new-tag: ${{ github.event.new-tag }} registry: ghcr.io username: ${{ secrets.DOCKER_USERNAME }} - token: ${{ secrets.DOCKER_SECRET }} + token: ${{ secrets.GITHUB_TOKEN }} From c28727a5d63d40d59357312d6c4378e016a6a556 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Sat, 16 Dec 2023 20:22:11 +1100 Subject: [PATCH 12/95] fix(sfp): update header --- packages/sfp-cli/src/SfpCommand.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/SfpCommand.ts b/packages/sfp-cli/src/SfpCommand.ts index cff888a9a..56a5a1999 100644 --- a/packages/sfp-cli/src/SfpCommand.ts +++ b/packages/sfp-cli/src/SfpCommand.ts @@ -88,7 +88,7 @@ export default abstract class sfpCommand extends Command { SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); SFPLogger.log( COLOR_HEADER( - `sfp -- The DX@Scale CLI -Version:${this.config.version} -Release:${this.config.pjson.release}` + `sfp -- By Flxbl -Version:${this.config.version} -Release:${this.config.pjson.release}` ) ); From 7a7668030fb82bc2ec5b08dd6bbdf4f01a02d4f8 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 13:12:16 +1100 Subject: [PATCH 13/95] chore(version): update version and header --- packages/sfp-cli/package.json | 2 +- packages/sfp-cli/src/SfpCommand.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index bdc1be320..3315cffea 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "1.0.0", + "version": "30.0.0", "license": "MIT", "author": "flxblio", "release": "January 24", diff --git a/packages/sfp-cli/src/SfpCommand.ts b/packages/sfp-cli/src/SfpCommand.ts index 56a5a1999..03048231b 100644 --- a/packages/sfp-cli/src/SfpCommand.ts +++ b/packages/sfp-cli/src/SfpCommand.ts @@ -88,7 +88,7 @@ export default abstract class sfpCommand extends Command { SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); SFPLogger.log( COLOR_HEADER( - `sfp -- By Flxbl -Version:${this.config.version} -Release:${this.config.pjson.release}` + `sfp -- Salesforce Package Manager -Version:${this.config.version} -Release:${this.config.pjson.release}` ) ); From 5883ab640bc61c53bee90650c2bf13f21bcea531 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 13:19:45 +1100 Subject: [PATCH 14/95] fix(validate): fix incorrect condition while packages are overriden Diff package is overriden to source incorrectly during validation --- packages/sfp-cli/src/impl/validate/ValidateImpl.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts index ff804e593..5431d37ba 100644 --- a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts +++ b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts @@ -493,9 +493,10 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { } else { if (!props.disableSourcePackageOverride) { - if (ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Data || ProjectConfig.getPackageType(projectConfig, pkg) != PackageType.Diff) + if(ProjectConfig.getPackageType(projectConfig, pkg) == PackageType.Unlocked) + { overridedPackages[pkg] = PackageType.Source - } + } } } } From 4e81088ce4351945d62ed6cc2085bb9ec0dea260 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 13:24:17 +1100 Subject: [PATCH 15/95] fix(validate): fix incorrect syntax and version --- packages/sfp-cli/package.json | 5 +- .../sfp-cli/src/impl/validate/ValidateImpl.ts | 46 +++++++++---------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 3315cffea..94f768333 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,12 +1,13 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.0", + "version": "30.0.2", "license": "MIT", "author": "flxblio", "release": "January 24", "bin": { - "sfp": "./bin/run" + "sfp": "./bin/run", + "sfpowerscripts": "./bin/run" }, "bugs": "https://github.com/flxbl-io/sfp/issues", "publishConfig": { diff --git a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts index 5431d37ba..39e17c6ba 100644 --- a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts +++ b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts @@ -477,31 +477,27 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { function computePackageOverrides(props: ValidateProps): { [key: string]: PackageType } { - let overridedPackages: { [key: string]: PackageType } = {}; - const allPackages = ProjectConfig.getAllPackages(null); - const projectConfig = ProjectConfig.getSFDXProjectConfig(null); - for (const pkg of allPackages) { - - if (ProjectConfig.getPackageType(projectConfig, pkg) !== PackageType.Data) { - if ( - props.validationMode === - ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || - props.validationMode === - ValidationMode.FAST_FEEDBACK - ) { - overridedPackages[pkg] = PackageType.Diff - } - else { - if (!props.disableSourcePackageOverride) { - if(ProjectConfig.getPackageType(projectConfig, pkg) == PackageType.Unlocked) - { - overridedPackages[pkg] = PackageType.Source - } - } - } - } - return overridedPackages; - } + let overridedPackages: { [key: string]: PackageType } = {}; + const allPackages = ProjectConfig.getAllPackages(null); + const projectConfig = ProjectConfig.getSFDXProjectConfig(null); + for (const pkg of allPackages) { + if (ProjectConfig.getPackageType(projectConfig, pkg) !== PackageType.Data) { + if ( + props.validationMode === ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || + props.validationMode === ValidationMode.FAST_FEEDBACK + ) { + overridedPackages[pkg] = PackageType.Diff; + } else { + if (!props.disableSourcePackageOverride) { + if (ProjectConfig.getPackageType(projectConfig, pkg) == PackageType.Unlocked) { + overridedPackages[pkg] = PackageType.Source; + } + } + } + } + } + return overridedPackages; + } function fetchPackagesAsPerReleaseConfig( logger: Logger, From b188c56b7de1cb83fd3a7a51d1c6fb1cb281bc7d Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 13:38:34 +1100 Subject: [PATCH 16/95] fix(docker): fix package name used in image --- dockerfiles/sfp.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/sfp.Dockerfile b/dockerfiles/sfp.Dockerfile index 180715c9f..3061ba50f 100644 --- a/dockerfiles/sfp.Dockerfile +++ b/dockerfiles/sfp.Dockerfile @@ -72,7 +72,7 @@ RUN npm install --global yarn --omit-dev \ # Install SF cli and sfpowerscripts RUN npm install --global --omit=dev \ @salesforce/cli@${SF_CLI_VERSION} \ - @dxatscale/sfpowerscripts@${SFPOWERSCRIPTS_VERSION} \ + @flxblio/sfp@${SFPOWERSCRIPTS_VERSION} \ && npm cache clean --force From 6172fe578545f9079c9530baa9ba670ccb6be464 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 14:58:01 +1100 Subject: [PATCH 17/95] fix(sfporg): revert incorrect replacement of sfp artifact --- packages/sfp-cli/src/core/org/SFPOrg.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/sfp-cli/src/core/org/SFPOrg.ts b/packages/sfp-cli/src/core/org/SFPOrg.ts index d1fc38c18..270702e0d 100644 --- a/packages/sfp-cli/src/core/org/SFPOrg.ts +++ b/packages/sfp-cli/src/core/org/SFPOrg.ts @@ -14,8 +14,8 @@ export default class SFPOrg extends Org { public async getInstalledArtifacts(orderBy: string = `CreatedDate`,logger?:Logger) { let records=[] try { - records = await QueryHelper.query( - `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM sfpArtifact2__c ORDER BY ${orderBy} ASC`, + records = await QueryHelper.query( + `SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM SfpowerscriptsArtifact2__c ORDER BY ${orderBy} ASC`, this.getConnection(), false ); @@ -23,7 +23,7 @@ export default class SFPOrg extends Org { } catch (error) { SFPLogger.log( 'Unable to fetch any sfp artifacts in the org\n' + - '1. sfp package is not installed in the org\n' + + '1. sfpowerscripts artifact package is not installed in the org\n' + '2. The required prerequisite object is not deployed to this org\n', LoggerLevel.WARN, logger @@ -91,7 +91,7 @@ export default class SFPOrg extends Org { if (artifactId == null) { artifactId = await ObjectCRUDHelper.createRecord( this.getConnection(), - 'sfpArtifact2__c', + 'SfpowerscriptsArtifact2__c', { Name: packageName, Tag__c: sfpPackage.tag, @@ -102,7 +102,7 @@ export default class SFPOrg extends Org { } else { artifactId = await ObjectCRUDHelper.updateRecord( this.getConnection(), - 'sfpArtifact2__c', + 'SfpowerscriptsArtifact2__c', { Id: artifactId, Name: packageName, @@ -253,7 +253,7 @@ export interface InstalledArtifact { isInstalledBysfp?: boolean; } -export interface sfpArtifact2__c { +export interface SfpowerscriptsArtifact2__c { Id?: string; Name: string; Tag__c: string; From 8b7cd6aca8ed6854a2ed733675913937efc5130a Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 19 Dec 2023 14:59:30 +1100 Subject: [PATCH 18/95] chore(publish): update versions and publish to npm - @flxblio/apexlink@1.0.3 - @flxblio/forcemula@1.0.1 - @flxblio/sfdx-process-wrapper@1.0.3 - @flxblio/sfp@30.0.3 - @flxblio/sfp-logger@2.1.3 - @flxblio/sfprofiles@2.0.9 --- packages/apexlink/package.json | 6 +- packages/forcemula/package.json | 2 +- packages/sfdx-process-wrapper/package.json | 4 +- packages/sfp-cli/package.json | 40 +- packages/sfplogger/package.json | 2 +- packages/sfprofiles/package.json | 4 +- pnpm-lock.yaml | 27253 +++++++++++-------- 7 files changed, 15798 insertions(+), 11513 deletions(-) diff --git a/packages/apexlink/package.json b/packages/apexlink/package.json index 0c1cfdb6e..4de8c4351 100644 --- a/packages/apexlink/package.json +++ b/packages/apexlink/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/apexlink", - "version": "1.0.2", + "version": "1.0.3", "description": "Wrappers around @nawforce's apexlink java pom ", "author": "flxblio", "homepage": "https://github.com/flxbl-io/sfp", @@ -12,8 +12,8 @@ "/jars" ], "dependencies": { - "@flxblio/sfdx-process-wrapper": "^1.0.2", - "@flxblio/sfp-logger": "^2.1.2", + "@flxblio/sfdx-process-wrapper": "^1.0.3", + "@flxblio/sfp-logger": "^2.1.3", "find-java-home": "2.0.0", "fs-extra": "11.1.1" }, diff --git a/packages/forcemula/package.json b/packages/forcemula/package.json index 0574a1680..fbe0942d5 100644 --- a/packages/forcemula/package.json +++ b/packages/forcemula/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/forcemula", - "version": "1.0.0", + "version": "1.0.1", "description": "Extract fields from Salesforce formulas", "main": "src/index.js", "scripts": { diff --git a/packages/sfdx-process-wrapper/package.json b/packages/sfdx-process-wrapper/package.json index 45327da68..00d74f6b5 100644 --- a/packages/sfdx-process-wrapper/package.json +++ b/packages/sfdx-process-wrapper/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/sfdx-process-wrapper", - "version": "1.0.2", + "version": "1.0.3", "description": "Wraps around SFDXCommand to exeute it using a subprocess", "author": "flxbl", "homepage": "https://github.com/flxbl-io/sfp#readme", @@ -11,7 +11,7 @@ "lib": "lib" }, "dependencies": { - "@flxblio/sfp-logger": "^2.1.2", + "@flxblio/sfp-logger": "^2.1.3", "fs-extra": "^9.1.0" }, "devDependencies": { diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 94f768333..58d348d78 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.2", + "version": "30.0.3", "license": "MIT", "author": "flxblio", "release": "January 24", @@ -14,39 +14,36 @@ "access": "public" }, "dependencies": { - "@flxblio/apexlink": "^1.0.2", + "@flxblio/apexlink": "^1.0.3", + "@flxblio/sfdx-process-wrapper": "^1.0.3", + "@flxblio/sfp-logger": "^2.1.3", + "@flxblio/sfprofiles": "^2.0.9", "@newrelic/telemetry-sdk": "^0.6.0", - "@salesforce/apex-node": "2.1.0", - "@salesforce/packaging": "2.3.3", - "@salesforce/source-deploy-retrieve": "9.7.24", - "@salesforce/source-tracking": "4.2.16", - "apex-parser": "2.13.0", - "axios": "^1.4.0", - "datadog-metrics": "^0.9.3", - "fast-xml-parser": "4.2.7", - "hot-shots": "^8.5.0", - "ignore": "^5.1.6", - "tar": "^6.1.9", - "tmp": "^0.2.1", - "xml2js": "^0.6.0", - "@flxblio/sfdx-process-wrapper": "^1.0.2", - "@flxblio/sfp-logger": "^2.1.2", - "@flxblio/sfprofiles": "^2.0.8", "@oclif/core": "2.11.8", "@oclif/plugin-commands": "^3.0.3", "@oclif/plugin-help": "5.2.17", + "@salesforce/apex-node": "2.1.0", "@salesforce/core": "5.3.9", "@salesforce/kit": "3.0.13", + "@salesforce/packaging": "2.3.3", + "@salesforce/source-deploy-retrieve": "9.7.24", + "@salesforce/source-tracking": "4.2.16", "adm-zip": "^0.5.10", "ajv": "8.11.0", + "apex-parser": "2.13.0", "async-retry": "^1.3.1", + "axios": "^1.4.0", "bottleneck": "^2.19.5", "chalk": "^4.1.2", "cli-table": "0.3.11", + "datadog-metrics": "^0.9.3", "dotenv": "16.3.1", + "fast-xml-parser": "4.2.7", "fs-extra": "^11.1.1", "glob": "^10.3.3", "handlebars": "^4.7.7", + "hot-shots": "^8.5.0", + "ignore": "^5.1.6", "js-yaml": "^4.0.0", "jsforce": "2.0.0-beta.27", "lodash": "^4.17.21", @@ -58,7 +55,10 @@ "object-hash": "^2.1.1", "rimraf": "^5.0.1", "semver": "7.5.2", - "simple-git": "3.19.1" + "simple-git": "3.19.1", + "tar": "^6.1.9", + "tmp": "^0.2.1", + "xml2js": "^0.6.0" }, "devDependencies": { "@babel/core": "7.18.2", @@ -71,6 +71,7 @@ "@salesforce/ts-sinon": "^1.3.21", "@salesforce/ts-types": "2.0.5", "@types/adm-zip": "^0.4.33", + "@types/fs-extra": "11.0.4", "@types/jest": "^29.5.3", "@types/js-yaml": "^4.0.5", "@types/marked": "4.0.2", @@ -78,7 +79,6 @@ "oclif": "^3.10.0", "ts-jest": "29.1.1", "ts-node": "10.7.0", - "@types/fs-extra": "11.0.4", "typescript": "^5" }, "engines": { diff --git a/packages/sfplogger/package.json b/packages/sfplogger/package.json index 1061f8409..4fa39c493 100644 --- a/packages/sfplogger/package.json +++ b/packages/sfplogger/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/sfp-logger", - "version": "2.1.2", + "version": "2.1.3", "description": "sfp logger library", "main": "lib/SFPLogger.js", "types": "lib/SFPLogger.d.ts", diff --git a/packages/sfprofiles/package.json b/packages/sfprofiles/package.json index a3661e674..83ba90fd3 100644 --- a/packages/sfprofiles/package.json +++ b/packages/sfprofiles/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/sfprofiles", - "version": "2.0.8", + "version": "2.0.9", "description": "Salesforce Profile management", "keywords": [ "sfdx-plugin", @@ -59,7 +59,7 @@ "typescript": "^5" }, "dependencies": { - "@flxblio/sfp-logger": "^2.1.2", + "@flxblio/sfp-logger": "^2.1.3", "@salesforce/core": "5.3.9", "@salesforce/source-deploy-retrieve": "9.7.24", "async-retry": "^1.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ee561811..bf7e884e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,11510 +1,15795 @@ lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - - .: - dependencies: - neverthrow: - specifier: ^4.2.1 - version: 4.2.1 - xml-formatter: - specifier: ^3.3.2 - version: 3.3.2 - devDependencies: - '@commitlint/cli': - specifier: ^15.0.0 - version: 15.0.0 - '@commitlint/config-conventional': - specifier: ^15.0.0 - version: 15.0.0 - '@types/async-retry': - specifier: ^1.4.2 - version: 1.4.2 - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/mocha': - specifier: ^5.2.7 - version: 5.2.7 - '@types/node': - specifier: ^10 - version: 10.0.0 - '@types/q': - specifier: ^1.5.2 - version: 1.5.2 - '@types/xml2js': - specifier: ^0.4.5 - version: 0.4.5 - lerna: - specifier: ^7.1.4 - version: 7.1.4 - lerna-update-wizard: - specifier: ^1.1.0 - version: 1.1.0 - prettier: - specifier: ^2.0.5 - version: 2.0.5 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - semver: - specifier: 7.5.2 - version: 7.5.2 - ts-loader: - specifier: ~9.4.2 - version: 9.4.2(typescript@5.0.2)(webpack@5.88.2) - ts-node: - specifier: ^9 - version: 9.1.1(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/apexlink: - dependencies: - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.2 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - find-java-home: - specifier: 2.0.0 - version: 2.0.0 - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - jest: - specifier: 29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/forcemula: - devDependencies: - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - - packages/sfdx-process-wrapper: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - devDependencies: - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/node': - specifier: ^10 - version: 10.0.0 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfp-cli: - dependencies: - '@flxblio/apexlink': - specifier: ^1.0.2 - version: link:../apexlink - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.2 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - '@flxblio/sfprofiles': - specifier: ^2.0.8 - version: link:../sfprofiles - '@newrelic/telemetry-sdk': - specifier: ^0.6.0 - version: 0.6.0 - '@oclif/core': - specifier: 2.11.8 - version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-commands': - specifier: ^3.0.3 - version: 3.0.3 - '@oclif/plugin-help': - specifier: 5.2.17 - version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/apex-node': - specifier: 2.1.0 - version: 2.1.0 - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/kit': - specifier: 3.0.13 - version: 3.0.13 - '@salesforce/packaging': - specifier: 2.3.3 - version: 2.3.3(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - '@salesforce/source-tracking': - specifier: 4.2.16 - version: 4.2.16 - adm-zip: - specifier: ^0.5.10 - version: 0.5.10 - ajv: - specifier: 8.11.0 - version: 8.11.0 - apex-parser: - specifier: 2.13.0 - version: 2.13.0 - async-retry: - specifier: ^1.3.1 - version: 1.3.3 - axios: - specifier: ^1.4.0 - version: 1.4.0 - bottleneck: - specifier: ^2.19.5 - version: 2.19.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - cli-table: - specifier: 0.3.11 - version: 0.3.11 - datadog-metrics: - specifier: ^0.9.3 - version: 0.9.3 - dotenv: - specifier: 16.3.1 - version: 16.3.1 - fast-xml-parser: - specifier: 4.2.7 - version: 4.2.7 - fs-extra: - specifier: ^11.1.1 - version: 11.1.1 - glob: - specifier: ^10.3.3 - version: 10.3.3 - handlebars: - specifier: ^4.7.7 - version: 4.7.7 - hot-shots: - specifier: ^8.5.0 - version: 8.5.0 - ignore: - specifier: ^5.1.6 - version: 5.2.4 - js-yaml: - specifier: ^4.0.0 - version: 4.1.0 - jsforce: - specifier: 2.0.0-beta.27 - version: 2.0.0-beta.27 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - markdown-table: - specifier: ^2.0.0 - version: 2.0.0 - markdown-table-ts: - specifier: ^1.0.3 - version: 1.0.3 - marked: - specifier: 4.0.16 - version: 4.0.16 - marked-terminal: - specifier: 5.1.1 - version: 5.1.1(marked@4.0.16) - neverthrow: - specifier: 4.4.2 - version: 4.4.2 - object-hash: - specifier: ^2.1.1 - version: 2.1.1 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - semver: - specifier: 7.5.2 - version: 7.5.2 - simple-git: - specifier: 3.19.1 - version: 3.19.1 - tar: - specifier: ^6.1.9 - version: 6.1.15 - tmp: - specifier: ^0.2.1 - version: 0.2.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@oclif/plugin-command-snapshot': - specifier: ^3 - version: 3.0.0(@oclif/config@1.18.15) - '@oclif/test': - specifier: ^2 - version: 2.0.0 - '@salesforce/dev-config': - specifier: 3.0.1 - version: 3.0.1 - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.5 - version: 2.0.5 - '@types/adm-zip': - specifier: ^0.4.33 - version: 0.4.33 - '@types/fs-extra': - specifier: 11.0.4 - version: 11.0.4 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/marked': - specifier: 4.0.2 - version: 4.0.2 - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - oclif: - specifier: ^3.10.0 - version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfplogger: - dependencies: - chalk: - specifier: ^4.1.2 - version: 4.1.2 - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - strip-ansi: - specifier: ^6.0.0 - version: 6.0.1 - devDependencies: - '@types/node': - specifier: ^14.14.7 - version: 14.14.7 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfprofiles: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.2 - version: link:../sfplogger - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - async-retry: - specifier: ^1.3.3 - version: 1.3.3 - better-sqlite3: - specifier: 8.4.0 - version: 8.4.0 - chalk: - specifier: ^4.1.0 - version: 4.1.0 - diff-match-patch: - specifier: ^1.0.5 - version: 1.0.5 - fs-extra: - specifier: ^11.1.0 - version: 11.1.0 - glob: - specifier: 10.3.3 - version: 10.3.3 - ignore: - specifier: ^5.1.8 - version: 5.2.4 - jsforce: - specifier: ^2.0.0-beta.27 - version: 2.0.0-beta.27 - node-cache: - specifier: ^5.1.2 - version: 5.1.2 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - simple-git: - specifier: ^3.16.0 - version: 3.16.0 - tslib: - specifier: 2.1.0 - version: 2.1.0 - xml-formatter: - specifier: ^3.4.1 - version: 3.4.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.7 - version: 2.0.7 - '@types/async-retry': - specifier: 1.4.5 - version: 1.4.5 - '@types/datadog-metrics': - specifier: ^0.6.1 - version: 0.6.1 - '@types/diff-match-patch': - specifier: ^1.0.32 - version: 1.0.32 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/lodash': - specifier: ^4.14.191 - version: 4.14.191 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - '@types/node': - specifier: 20.4.4 - version: 20.4.4 - '@types/rimraf': - specifier: ^3.0.2 - version: 3.0.2 - '@typescript-eslint/eslint-plugin': - specifier: ^5.53.0 - version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/parser': - specifier: ^5.53.0 - version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) - eslint: - specifier: ^8.33.0 - version: 8.33.0 - jest: - specifier: ^29.5.3 - version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: ^9.1.1 - version: 9.1.1(typescript@5.0.2) - tsc-alias: - specifier: ^1.8.3 - version: 1.8.3 - typescript: - specifier: ^5 - version: 5.0.2 + .: + dependencies: + neverthrow: + specifier: ^4.2.1 + version: 4.2.1 + xml-formatter: + specifier: ^3.3.2 + version: 3.3.2 + devDependencies: + '@commitlint/cli': + specifier: ^15.0.0 + version: 15.0.0 + '@commitlint/config-conventional': + specifier: ^15.0.0 + version: 15.0.0 + '@types/async-retry': + specifier: ^1.4.2 + version: 1.4.2 + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/mocha': + specifier: ^5.2.7 + version: 5.2.7 + '@types/node': + specifier: ^10 + version: 10.0.0 + '@types/q': + specifier: ^1.5.2 + version: 1.5.2 + '@types/xml2js': + specifier: ^0.4.5 + version: 0.4.5 + lerna: + specifier: ^7.1.4 + version: 7.1.4 + lerna-update-wizard: + specifier: ^1.1.0 + version: 1.1.0 + prettier: + specifier: ^2.0.5 + version: 2.0.5 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + semver: + specifier: 7.5.2 + version: 7.5.2 + ts-loader: + specifier: ~9.4.2 + version: 9.4.2(typescript@5.0.2)(webpack@5.88.2) + ts-node: + specifier: ^9 + version: 9.1.1(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/apexlink: + dependencies: + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + find-java-home: + specifier: 2.0.0 + version: 2.0.0 + fs-extra: + specifier: 11.1.1 + version: 11.1.1 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + jest: + specifier: 29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/forcemula: + devDependencies: + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + + packages/sfdx-process-wrapper: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + devDependencies: + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/node': + specifier: ^10 + version: 10.0.0 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfp-cli: + dependencies: + '@flxblio/apexlink': + specifier: ^1.0.3 + version: link:../apexlink + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@flxblio/sfprofiles': + specifier: ^2.0.9 + version: link:../sfprofiles + '@newrelic/telemetry-sdk': + specifier: ^0.6.0 + version: 0.6.0 + '@oclif/core': + specifier: 2.11.8 + version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-commands': + specifier: ^3.0.3 + version: 3.0.3 + '@oclif/plugin-help': + specifier: 5.2.17 + version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/apex-node': + specifier: 2.1.0 + version: 2.1.0 + '@salesforce/core': + specifier: 5.3.9 + version: 5.3.9 + '@salesforce/kit': + specifier: 3.0.13 + version: 3.0.13 + '@salesforce/packaging': + specifier: 2.3.3 + version: 2.3.3(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/source-deploy-retrieve': + specifier: 9.7.24 + version: 9.7.24 + '@salesforce/source-tracking': + specifier: 4.2.16 + version: 4.2.16 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + ajv: + specifier: 8.11.0 + version: 8.11.0 + apex-parser: + specifier: 2.13.0 + version: 2.13.0 + async-retry: + specifier: ^1.3.1 + version: 1.3.3 + axios: + specifier: ^1.4.0 + version: 1.4.0 + bottleneck: + specifier: ^2.19.5 + version: 2.19.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cli-table: + specifier: 0.3.11 + version: 0.3.11 + datadog-metrics: + specifier: ^0.9.3 + version: 0.9.3 + dotenv: + specifier: 16.3.1 + version: 16.3.1 + fast-xml-parser: + specifier: 4.2.7 + version: 4.2.7 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 + hot-shots: + specifier: ^8.5.0 + version: 8.5.0 + ignore: + specifier: ^5.1.6 + version: 5.2.4 + js-yaml: + specifier: ^4.0.0 + version: 4.1.0 + jsforce: + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + markdown-table: + specifier: ^2.0.0 + version: 2.0.0 + markdown-table-ts: + specifier: ^1.0.3 + version: 1.0.3 + marked: + specifier: 4.0.16 + version: 4.0.16 + marked-terminal: + specifier: 5.1.1 + version: 5.1.1(marked@4.0.16) + neverthrow: + specifier: 4.4.2 + version: 4.4.2 + object-hash: + specifier: ^2.1.1 + version: 2.1.1 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + semver: + specifier: 7.5.2 + version: 7.5.2 + simple-git: + specifier: 3.19.1 + version: 3.19.1 + tar: + specifier: ^6.1.9 + version: 6.1.15 + tmp: + specifier: ^0.2.1 + version: 0.2.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@oclif/plugin-command-snapshot': + specifier: ^3 + version: 3.0.0(@oclif/config@1.18.15) + '@oclif/test': + specifier: ^2 + version: 2.0.0 + '@salesforce/dev-config': + specifier: 3.0.1 + version: 3.0.1 + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.5 + version: 2.0.5 + '@types/adm-zip': + specifier: ^0.4.33 + version: 0.4.33 + '@types/fs-extra': + specifier: 11.0.4 + version: 11.0.4 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/marked': + specifier: 4.0.2 + version: 4.0.2 + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + oclif: + specifier: ^3.10.0 + version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) + ts-jest: + specifier: 29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfplogger: + dependencies: + chalk: + specifier: ^4.1.2 + version: 4.1.2 + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + strip-ansi: + specifier: ^6.0.0 + version: 6.0.1 + devDependencies: + '@types/node': + specifier: ^14.14.7 + version: 14.14.7 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfprofiles: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@salesforce/core': + specifier: 5.3.9 + version: 5.3.9 + '@salesforce/source-deploy-retrieve': + specifier: 9.7.24 + version: 9.7.24 + async-retry: + specifier: ^1.3.3 + version: 1.3.3 + better-sqlite3: + specifier: 8.4.0 + version: 8.4.0 + chalk: + specifier: ^4.1.0 + version: 4.1.0 + diff-match-patch: + specifier: ^1.0.5 + version: 1.0.5 + fs-extra: + specifier: ^11.1.0 + version: 11.1.0 + glob: + specifier: 10.3.3 + version: 10.3.3 + ignore: + specifier: ^5.1.8 + version: 5.2.4 + jsforce: + specifier: ^2.0.0-beta.27 + version: 2.0.0-beta.27 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + simple-git: + specifier: ^3.16.0 + version: 3.16.0 + tslib: + specifier: 2.1.0 + version: 2.1.0 + xml-formatter: + specifier: ^3.4.1 + version: 3.4.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.7 + version: 2.0.7 + '@types/async-retry': + specifier: 1.4.5 + version: 1.4.5 + '@types/datadog-metrics': + specifier: ^0.6.1 + version: 0.6.1 + '@types/diff-match-patch': + specifier: ^1.0.32 + version: 1.0.32 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + '@types/node': + specifier: 20.4.4 + version: 20.4.4 + '@types/rimraf': + specifier: ^3.0.2 + version: 3.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.53.0 + version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.53.0 + version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) + eslint: + specifier: ^8.33.0 + version: 8.33.0 + jest: + specifier: ^29.5.3 + version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: ^9.1.1 + version: 9.1.1(typescript@5.0.2) + tsc-alias: + specifier: ^1.8.3 + version: 1.8.3 + typescript: + specifier: ^5 + version: 5.0.2 packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.18.2: - resolution: {integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.18.2 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.22.6: - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): - resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): - resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime-corejs3@7.22.6: - resolution: {integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.31.1 - regenerator-runtime: 0.13.11 - dev: false - - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: false - optional: true - - /@commitlint/cli@15.0.0: - resolution: {integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==} - engines: {node: '>=v12'} - hasBin: true - dependencies: - '@commitlint/format': 15.0.0 - '@commitlint/lint': 15.0.0 - '@commitlint/load': 15.0.0 - '@commitlint/read': 15.0.0 - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - dev: true - - /@commitlint/config-conventional@15.0.0: - resolution: {integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==} - engines: {node: '>=v12'} - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/ensure@15.0.0: - resolution: {integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule@15.0.0: - resolution: {integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/format@15.0.0: - resolution: {integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@15.0.0: - resolution: {integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - semver: 7.3.5 - dev: true - - /@commitlint/lint@15.0.0: - resolution: {integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/is-ignored': 15.0.0 - '@commitlint/parse': 15.0.0 - '@commitlint/rules': 15.0.0 - '@commitlint/types': 15.0.0 - dev: true - - /@commitlint/load@15.0.0: - resolution: {integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/execute-rule': 15.0.0 - '@commitlint/resolve-extends': 15.0.0 - '@commitlint/types': 15.0.0 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) - chalk: 4.1.2 - cosmiconfig: 7.1.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.9.5 - dev: true - - /@commitlint/message@15.0.0: - resolution: {integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/parse@15.0.0: - resolution: {integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read@15.0.0: - resolution: {integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/top-level': 15.0.0 - '@commitlint/types': 15.0.0 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends@15.0.0: - resolution: {integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==} - engines: {node: '>=v12'} - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules@15.0.0: - resolution: {integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/ensure': 15.0.0 - '@commitlint/message': 15.0.0 - '@commitlint/to-lines': 15.0.0 - '@commitlint/types': 15.0.0 - execa: 5.1.1 - dev: true - - /@commitlint/to-lines@15.0.0: - resolution: {integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/top-level@15.0.0: - resolution: {integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==} - engines: {node: '>=v12'} - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types@15.0.0: - resolution: {integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==} - engines: {node: '>=v12'} - dependencies: - chalk: 4.1.2 - dev: true - - /@cspotcode/source-map-consumer@0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} - dev: true - - /@cspotcode/source-map-support@0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} - dependencies: - '@cspotcode/source-map-consumer': 0.8.0 - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): - resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} - engines: {node: '>=10.0.0'} - peerDependencies: - cosmiconfig: '>=6' - dependencies: - cosmiconfig: 7.1.0 - lodash.get: 4.4.2 - make-error: 1.3.6 - ts-node: 9.1.1(typescript@4.9.5) - tslib: 2.1.0 - transitivePeerDependencies: - - typescript - dev: true - - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: true - - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@isaacs/string-locale-compare@1.1.0: - resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console@29.6.1: - resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/core@29.6.1(ts-node@10.7.0): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/core@29.6.1(ts-node@9.1.1): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.6.1: - resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - dev: true - - /@jest/expect-utils@29.6.1: - resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.1: - resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.6.1 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.6.1: - resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 14.14.7 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /@jest/globals@29.6.1: - resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/types': 29.6.1 - jest-mock: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.6.1: - resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 14.14.7 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - jest-worker: 29.6.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.6.1: - resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.6.1: - resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/transform@29.6.1: - resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.18.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.1: - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 14.14.7 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: false - - /@lerna/child-process@7.1.4: - resolution: {integrity: sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA==} - engines: {node: ^14.17.0 || >=16.0.0} - dependencies: - chalk: 4.1.2 - execa: 5.1.1 - strong-log-transformer: 2.1.0 - dev: true - - /@lerna/create@7.1.4: - resolution: {integrity: sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw==} - engines: {node: ^14.17.0 || >=16.0.0} - dependencies: - '@lerna/child-process': 7.1.4 - dedent: 0.7.0 - fs-extra: 11.1.1 - init-package-json: 5.0.0 - npm-package-arg: 8.1.1 - p-reduce: 2.1.0 - pacote: 15.2.0 - pify: 5.0.0 - semver: 7.5.2 - slash: 3.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@newrelic/telemetry-sdk@0.6.0: - resolution: {integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/arborist@4.3.1: - resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/map-workspaces': 2.0.4 - '@npmcli/metavuln-calculator': 2.0.0 - '@npmcli/move-file': 1.1.2 - '@npmcli/name-from-folder': 1.0.1 - '@npmcli/node-gyp': 1.0.3 - '@npmcli/package-json': 1.0.1 - '@npmcli/run-script': 2.0.0 - bin-links: 3.0.3 - cacache: 15.3.0 - common-ancestor-path: 1.0.1 - json-parse-even-better-errors: 2.3.1 - json-stringify-nice: 1.1.4 - mkdirp: 1.0.4 - mkdirp-infer-owner: 2.0.0 - npm-install-checks: 4.0.0 - npm-package-arg: 8.1.5 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - pacote: 12.0.3 - parse-conflict-json: 2.0.2 - proc-log: 1.0.0 - promise-all-reject-late: 1.0.1 - promise-call-limit: 1.0.2 - read-package-json-fast: 2.0.3 - readdir-scoped-modules: 1.1.0 - rimraf: 3.0.2 - semver: 7.5.2 - ssri: 8.0.1 - treeverse: 1.0.4 - walk-up-path: 1.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/fs@1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.2 - dev: true - - /@npmcli/git@2.1.0: - resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} - dependencies: - '@npmcli/promise-spawn': 1.3.2 - lru-cache: 6.0.0 - mkdirp: 1.0.4 - npm-pick-manifest: 6.1.1 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@1.0.7: - resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/map-workspaces@2.0.4: - resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/name-from-folder': 1.0.1 - glob: 8.1.0 - minimatch: 5.1.6 - read-package-json-fast: 2.0.3 - dev: true - - /@npmcli/metavuln-calculator@2.0.0: - resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - cacache: 15.3.0 - json-parse-even-better-errors: 2.3.1 - pacote: 12.0.3 - semver: 7.5.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/move-file@1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/name-from-folder@1.0.1: - resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} - dev: true - - /@npmcli/node-gyp@1.0.3: - resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/package-json@1.0.1: - resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} - dependencies: - json-parse-even-better-errors: 2.3.1 - dev: true - - /@npmcli/promise-spawn@1.3.2: - resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} - dependencies: - infer-owner: 1.0.4 - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/run-script@2.0.0: - resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} - dependencies: - '@npmcli/node-gyp': 1.0.3 - '@npmcli/promise-spawn': 1.3.2 - node-gyp: 8.4.1 - read-package-json-fast: 2.0.3 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@nrwl/devkit@16.5.5(nx@16.5.5): - resolution: {integrity: sha512-4ho9Vfg1YzRYZ4SMygYI9Yz1avpujd81gy/Um2Z0q8Q7Twp6Q/uG1KY9Hb7EzVXgrRcgGWdIPXuw41DpmnfWug==} - dependencies: - '@nx/devkit': 16.5.5(nx@16.5.5) - transitivePeerDependencies: - - nx - dev: true - - /@nrwl/tao@16.5.5: - resolution: {integrity: sha512-6SYG3rlKkYvy/wauPwoUXQuN0PTJi95hCEC7lGfCEGye2Y/61UwJQf2xixMxafUM2X84WdEStEz3Jty85gVqkQ==} - hasBin: true - dependencies: - nx: 16.5.5 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - dev: true - - /@nx/devkit@16.5.5(nx@16.5.5): - resolution: {integrity: sha512-9YaQ3s5VMgTXo5cEuaVc2b6btZU2REmHsgn/V4Gi3nSmwBHvIn86gtlh4BoBFinHpqge1chG/dC+B7yoXioQmQ==} - peerDependencies: - nx: '>= 15 <= 17' - dependencies: - '@nrwl/devkit': 16.5.5(nx@16.5.5) - ejs: 3.1.9 - ignore: 5.2.4 - nx: 16.5.5 - semver: 7.5.3 - tmp: 0.2.1 - tslib: 2.6.2 - dev: true - - /@nx/nx-darwin-arm64@16.5.5: - resolution: {integrity: sha512-Zzwy7pkSDFTiWcBk78qDe4VzygO9kemtz/kbbLvpisZkUlZX9nIQnLHT80Ms++iqA0enIQAwdTcJiaIHLVd5JQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-darwin-x64@16.5.5: - resolution: {integrity: sha512-d5O8BD5HFI2hJnMgVVV1pl2A+hlUmn4GxCZTmx2Tr329TYGdpvyXm8NnDFEAigZ77QVMHwFN6vqS07HARu+uVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-freebsd-x64@16.5.5: - resolution: {integrity: sha512-SqTvbz21iUc8DHKgisX9pPuXc7/DngbiZxInlEHPXi8zUtyUOqZI3yQk4NVj3dqLBMLwEOZDgvXs0XxzB5nn+g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm-gnueabihf@16.5.5: - resolution: {integrity: sha512-8C2KVFHqcyGViEgUicYo1frEgQARbD+CicIos6A5WRYLaxS+upb9FDblKU0eGYIwDp8oCagVjUjNX8d1WHLX7w==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm64-gnu@16.5.5: - resolution: {integrity: sha512-AGq4wp3Wn8bE0h2c7/bHj2wQWfp08DYJemwTNLkwLcoJWkUidLOBQePRvLxqPeo42Zmt3GYMi+fi5XtKCmvcjg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm64-musl@16.5.5: - resolution: {integrity: sha512-xPTYjDCPnXLPXZThAzugiithZaIHk42rTxussMZA00Cx0iEkh5zohqtC0vGBnaAPNcMv0uyCiWABhL4RRUVp2w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-x64-gnu@16.5.5: - resolution: {integrity: sha512-Rq55OWD4SObfo4sWpjvaijWg33dm+cOf8e2cO06t2EmLMdOyyVnpNdtpjXh6A9tSi3EU5xPfYiy3I9O6gWOnuw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-x64-musl@16.5.5: - resolution: {integrity: sha512-fnkSPv+VIKmQQOEQxFrGx5DlkHGxeH9Fzme6jwuDwmsvs+8Vv/uUnfcxkDZfJxKK+p27w37q3PQCfZGrFXE1cw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-win32-arm64-msvc@16.5.5: - resolution: {integrity: sha512-9nWm+d+tlbxFMLvTLJqIfpTLDuSVDXfSBCSBampyeoI1mUALvq/6CVvWVBDlNqjmrZsYm0sudNqI4Ss7w3BUCQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-win32-x64-msvc@16.5.5: - resolution: {integrity: sha512-fB8miPr887GIGBDhyT6VX7MWX5aC40izEi+4GGSk38oh5dOUK9TLwjAEW/3vBE01fj5Hjcy0CPN7RA45fh/WUw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@oclif/color@1.0.9: - resolution: {integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==} - engines: {node: '>=12.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - ansi-styles: 4.3.0 - chalk: 4.1.2 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - tslib: 2.1.0 - dev: true - - /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): - resolution: {integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==} - engines: {node: '>=12.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@oclif/config': ^1 - dependencies: - '@oclif/config': 1.18.15 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.13(supports-color@8.1.1) - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.14(supports-color@8.1.1): - resolution: {integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.15: - resolution: {integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/core@0.5.41(@oclif/config@1.18.15): - resolution: {integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-ux: 5.6.7(@oclif/config@1.18.15) - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lodash.template: 4.5.0 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tslib: 2.1.0 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==} - engines: {node: '>=14.0.0'} - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.4 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/core@3.3.2: - resolution: {integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==} - engines: {node: '>=18.0.0'} - dependencies: - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - dev: false - - /@oclif/errors@1.3.6: - resolution: {integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /@oclif/help@1.0.13(supports-color@8.1.1): - resolution: {integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/config': 1.18.14(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/linewrap@1.0.0: - resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} - dev: true - - /@oclif/parser@3.8.15: - resolution: {integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - tslib: 2.6.2 - dev: true - - /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): - resolution: {integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 0.5.41(@oclif/config@1.18.15) - chalk: 4.1.2 - just-diff: 3.1.1 - semver: 7.5.2 - sinon: 11.1.2 - ts-json-schema-generator: 0.93.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/plugin-commands@3.0.3: - resolution: {integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==} - engines: {node: '>=18.0.0'} - dependencies: - '@oclif/core': 3.3.2 - lodash.pickby: 4.6.0 - lodash.sortby: 4.7.0 - lodash.template: 4.5.0 - lodash.uniqby: 4.7.0 - dev: false - - /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/color': 1.0.9 - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: true - - /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - http-call: 5.3.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - - /@oclif/screen@1.0.4: - resolution: {integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==} - engines: {node: '>=8.0.0'} - deprecated: Deprecated in favor of @oclif/core - dev: true - - /@oclif/test@2.0.0: - resolution: {integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==} - engines: {node: '>=8.0.0'} - dependencies: - fancy-test: 1.4.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@octokit/auth-token@2.5.0: - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} - dependencies: - '@octokit/types': 6.41.0 - dev: true - - /@octokit/auth-token@3.0.4: - resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} - engines: {node: '>= 14'} - dev: true - - /@octokit/core@3.6.0: - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} - dependencies: - '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/core@4.2.4: - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} - dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/endpoint@7.0.6: - resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/graphql@4.8.0: - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} - dependencies: - '@octokit/request': 5.6.3 - '@octokit/types': 6.41.0 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/graphql@5.0.6: - resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/request': 6.2.8 - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/openapi-types@12.11.0: - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} - dev: true - - /@octokit/openapi-types@18.0.0: - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} - dev: true - - /@octokit/plugin-enterprise-rest@6.0.1: - resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - dev: true - - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} - peerDependencies: - '@octokit/core': '>=2' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: true - - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=4' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - dev: true - - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - dev: true - - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true - - /@octokit/request-error@2.1.0: - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} - dependencies: - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request-error@3.0.3: - resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@5.6.3: - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} - dependencies: - '@octokit/endpoint': 6.0.12 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/request@6.2.8: - resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@18.12.0: - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} - dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@19.0.11: - resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/tsconfig@1.0.2: - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: true - - /@octokit/types@10.0.0: - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@octokit/types@6.41.0: - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} - dependencies: - '@octokit/openapi-types': 12.11.0 - dev: true - - /@octokit/types@9.3.2: - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@parcel/watcher@2.0.4: - resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==} - engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.6.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true - - /@salesforce/apex-node@2.1.0: - resolution: {integrity: sha512-W7OcqcBNHhf2wQMiPWOx/MED7ao1ZlML4vX5+A6hMDZTCZ5g34rj5wwVUQFOOAxHnS5F8jQUU5VpxpKo01jrTQ==} - engines: {node: '>=16.13.0'} - dependencies: - '@salesforce/core': 5.3.9 - '@types/istanbul-reports': 3.0.1 - faye: 1.4.0 - glob: 8.1.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/core@5.3.9: - resolution: {integrity: sha512-/HX0PiXq3Sjc5eVJ0EaYetcDGsKU9O9Nj8jFGw5qYlITx8zogfxc0j07liH67tQXS1KbTysYoj/MQ2zbHSNkPA==} - engines: {node: '>=16.0.0'} - dependencies: - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/ts-types': 2.0.8 - '@types/semver': 7.5.3 - ajv: 8.12.0 - change-case: 4.1.2 - faye: 1.4.0 - form-data: 4.0.0 - js2xmlparser: 4.0.2 - jsforce: 2.0.0-beta.27 - jsonwebtoken: 9.0.2 - jszip: 3.10.1 - pino: 8.16.0 - pino-abstract-transport: 1.1.0 - pino-pretty: 10.2.3 - proper-lockfile: 4.1.2 - semver: 7.5.4 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/dev-config@3.0.1: - resolution: {integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==} - dev: true - - /@salesforce/kit@3.0.13: - resolution: {integrity: sha512-HLQ5L5bBi0tsMeH5ZHJAhHUpvNUNPQoNJt2O82Jf6C60GGsrlzwzQ5ONAHGNBgKSZ7HLr0UGL5xaA+hE9uOcgw==} - dependencies: - '@salesforce/ts-types': 2.0.8 - tslib: 2.6.2 - dev: false - - /@salesforce/packaging@2.3.3(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-gGxN4FA5mX85B6960sUOrUz9KYAC7Iw5GXPYV/0YoBSU4M42I0V4pgWcOQOiRwW8gbe8wpSKB/Ccv6NSjNCuBQ==} - engines: {node: '>=16.0.0'} - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.7 - fast-xml-parser: 4.2.7 - globby: 11.1.0 - graphology: 0.25.4(graphology-types@0.24.7) - graphology-traversal: 0.3.1(graphology-types@0.24.7) - graphology-types: 0.24.7 - jsforce: 2.0.0-beta.27 - jszip: 3.10.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - encoding - - supports-color - - typescript - dev: false - - /@salesforce/schemas@1.6.0: - resolution: {integrity: sha512-SwhDTLucj/GRbPpxlEoDZeqlX22o+G6fiebTXTu1cZKmd1oE0W2L7SlTTgJnWck8bhTeBIgQi9cpD8c2t5ISKA==} - dev: false - - /@salesforce/source-deploy-retrieve@9.7.24: - resolution: {integrity: sha512-nkP9KgzuCoV6LtdDxgxt7KRnoQ6ZS12DJgXErCBXm7Swmr0dnbo1LhxrH05C4UFFe0JuvSta+u+Oor8jxSGaCQ==} - engines: {node: '>=16.0.0'} - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/ts-types': 2.0.7 - fast-levenshtein: 3.0.0 - fast-xml-parser: 4.3.2 - got: 11.8.6 - graceful-fs: 4.2.11 - ignore: 5.2.4 - jszip: 3.10.1 - mime: 2.6.0 - minimatch: 5.1.6 - proxy-agent: 6.3.1 - unzipper: 0.10.14 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/source-tracking@4.2.16: - resolution: {integrity: sha512-HAuLaY+RrdKvWjx9FVYMrYlIUW4JyQtF/TA5hbDpy4Rw8IUOgrYyt+IaoiAAtMyRqU8En8fJBUqiq4qFvhdpCA==} - engines: {node: '>=16.0.0'} - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.8 - fast-xml-parser: 4.2.7 - graceful-fs: 4.2.11 - isomorphic-git: 1.23.0 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/ts-sinon@1.3.21: - resolution: {integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==} - dependencies: - '@salesforce/ts-types': 1.7.3 - sinon: 5.1.1 - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@1.7.3: - resolution: {integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==} - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.5: - resolution: {integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.7: - resolution: {integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - - /@salesforce/ts-types@2.0.8: - resolution: {integrity: sha512-vuzLcxtThBhpuhmnoh8GFrVU8XjdoNyQm9gPtmcjUyUD/9nQIBTAX8oGoUvCiiq93c4LFEmSua+xm3yu0bbNfg==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - - /@sigstore/bundle@1.0.0: - resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - dev: true - - /@sigstore/protobuf-specs@0.2.0: - resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@sigstore/tuf@1.0.3: - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@sinonjs/fake-timers@7.1.2: - resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/formatio@2.0.0: - resolution: {integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==} - dependencies: - samsam: 1.3.0 - dev: true - - /@sinonjs/formatio@3.2.2: - resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/samsam': 3.3.3 - dev: true - - /@sinonjs/samsam@3.3.3: - resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - array-from: 2.1.1 - lodash: 4.17.21 - dev: true - - /@sinonjs/samsam@6.1.3: - resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding@0.7.2: - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.3 - dev: true - - /@types/adm-zip@0.4.33: - resolution: {integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/async-retry@1.4.2: - resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/async-retry@1.4.5: - resolution: {integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==} - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 14.14.7 - '@types/responselike': 1.0.0 - - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true - - /@types/cli-progress@3.11.0: - resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} - dependencies: - '@types/node': 14.14.7 - - /@types/datadog-metrics@0.6.1: - resolution: {integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==} - dev: true - - /@types/diff-match-patch@1.0.32: - resolution: {integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==} - dev: true - - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.44.0 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.44.0: - resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true - - /@types/expect@1.20.4: - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - dev: true - - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 14.14.7 - dev: true - - /@types/fs-extra@9.0.11: - resolution: {integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==} - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 14.14.7 - dev: true - - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/http-cache-semantics@4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - - /@types/jest@29.5.3: - resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} - dependencies: - expect: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: true - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 14.14.7 - - /@types/lodash@4.14.191: - resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} - dev: true - - /@types/lodash@4.14.195: - resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} - dev: true - - /@types/marked@4.0.2: - resolution: {integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==} - dev: true - - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true - - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/mocha@5.2.7: - resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==} - dev: true - - /@types/mocha@9.1.0: - resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} - dev: true - - /@types/node@10.0.0: - resolution: {integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==} - dev: true - - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false - - /@types/node@14.14.7: - resolution: {integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==} - - /@types/node@15.14.9: - resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - dev: true - - /@types/node@20.4.4: - resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} - dev: true - - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true - - /@types/q@1.5.2: - resolution: {integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==} - dev: true - - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 14.14.7 - - /@types/retry@0.12.2: - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - dev: true - - /@types/rimraf@3.0.2: - resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} - dependencies: - '@types/glob': 8.1.0 - '@types/node': 14.14.7 - dev: true - - /@types/semver@7.5.2: - resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} - dev: true - - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - dev: false - - /@types/sinon@10.0.15: - resolution: {integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==} - dependencies: - '@types/sinonjs__fake-timers': 8.1.2 - dev: true - - /@types/sinonjs__fake-timers@8.1.2: - resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} - dev: true - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/vinyl@2.0.7: - resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} - dependencies: - '@types/expect': 1.20.4 - '@types/node': 14.14.7 - dev: true - - /@types/xml2js@0.4.5: - resolution: {integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==} - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.53.0: - resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - dev: true - - /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.53.0: - resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): - resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - eslint: 8.33.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.53.0: - resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.53.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true - - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - dev: true - - /@zkochan/js-yaml@0.0.6: - resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true - - /adm-zip@0.5.10: - resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} - engines: {node: '>=6.0'} - dev: false - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - depd: 2.0.0 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: false - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - /ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - /antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /apex-parser@2.13.0: - resolution: {integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==} - engines: {node: '>=8.0.0'} - dependencies: - antlr4ts: 0.5.0-alpha.4 - node-dir: 0.1.17 - dev: false - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: true - - /array-from@2.1.1: - resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} - dev: true - - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.1.0 - dev: false - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - /async-lock@1.4.0: - resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} - dev: false - - /async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - dependencies: - retry: 0.13.1 - dev: false - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /aws-sdk@2.1421.0: - resolution: {integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==} - engines: {node: '>= 10.0.0'} - dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.5.0 - dev: true - - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - /babel-jest@29.6.1(@babel/core@7.18.2): - resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.18.2 - '@jest/transform': 29.6.1 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.18.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.18.2): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64url@3.0.1: - resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} - engines: {node: '>=6.0.0'} - dev: false - - /basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} - engines: {node: '>=10.0.0'} - dev: false - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: true - - /better-sqlite3@8.4.0: - resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: false - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: false - - /bignumber.js@9.1.1: - resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} - dev: false - - /bin-links@3.0.3: - resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - cmd-shim: 5.0.0 - mkdirp-infer-owner: 2.0.0 - npm-normalize-package-bin: 2.0.0 - read-cmd-shim: 3.0.1 - rimraf: 3.0.2 - write-file-atomic: 4.0.2 - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: false - - /binaryextensions@4.18.0: - resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} - engines: {node: '>=0.8'} - dev: true - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - dev: false - - /bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.469 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - dev: false - - /buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - dev: false - - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true - - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.5.2 - dev: true - - /byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} - dev: true - - /cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.1.15 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.3 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.1.0 - dev: false - - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001517: - resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} - dev: true - - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /cardinal@2.1.1: - resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} - hasBin: true - dependencies: - ansicolors: 0.3.2 - redeyed: 2.1.1 - - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - dependencies: - traverse: 0.3.9 - dev: false - - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.0: - resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true - - /clean-git-ref@2.0.1: - resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} - dev: false - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /clean-stack@3.0.1: - resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 4.0.0 - - /cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - dev: true - - /cli-cursor@2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - - /cli-progress@3.12.0: - resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} - engines: {node: '>=4'} - dependencies: - string-width: 4.2.3 - - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true - - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: true - - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: false - - /cli-table@0.3.11: - resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} - engines: {node: '>= 0.2.0'} - dependencies: - colors: 1.0.3 - - /cli-ux@5.6.7(@oclif/config@1.18.15): - resolution: {integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - '@oclif/screen': 1.0.4 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - extract-stack: 2.0.0 - fs-extra: 8.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - lodash: 4.17.21 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - dev: true - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} - dev: true - - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - - /clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: true - - /cmd-shim@5.0.0: - resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - mkdirp-infer-owner: 2.0.0 - dev: true - - /cmd-shim@6.0.1: - resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true - - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false - - /colors@1.0.3: - resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} - engines: {node: '>=0.1.90'} - - /columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - - /commander@7.1.0: - resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} - engines: {node: '>= 10'} - dev: true - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - dev: true - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - requiresBuild: true - - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: true - - /concurrently@7.6.0: - resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} - engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case: 2.0.2 - dev: false - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-angular@6.0.0: - resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} - engines: {node: '>=14'} - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-changelog-core@5.0.1: - resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} - engines: {node: '>=14'} - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 - git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - dev: true - - /conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} - dev: true - - /conventional-changelog-writer@6.0.1: - resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} - engines: {node: '>=14'} - hasBin: true - dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 - handlebars: 4.7.7 - json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.5.2 - split: 1.0.1 - dev: true - - /conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /core-js-pure@3.31.1: - resolution: {integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==} - requiresBuild: true - dev: false - - /core-js@3.31.1: - resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} - requiresBuild: true - dev: false - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /csprng@0.1.2: - resolution: {integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==} - engines: {node: '>=0.6.0'} - dependencies: - sequin: 0.1.1 - dev: false - - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: false - - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: false - - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true - - /data-uri-to-buffer@5.0.1: - resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} - engines: {node: '>= 14'} - dev: false - - /datadog-metrics@0.9.3: - resolution: {integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==} - dependencies: - debug: 3.1.0 - dogapi: 2.8.4 - transitivePeerDependencies: - - supports-color - dev: false - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.22.6 - dev: true - - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true - - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: true - - /detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} - dev: true - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: true - - /diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dev: false - - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff3@0.0.3: - resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} - dev: false - - /diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dogapi@2.8.4: - resolution: {integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==} - hasBin: true - dependencies: - extend: 3.0.2 - json-bigint: 1.0.0 - lodash: 4.17.21 - minimist: 1.2.8 - rc: 1.2.8 - dev: false - - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: false - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - jake: 10.8.7 - - /electron-to-chromium@1.4.469: - resolution: {integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==} - dev: true - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true - optional: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - dev: true - - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error@10.4.0: - resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} - dev: true - - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.1: - resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.33.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.33.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.33.0: - resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-utils: 3.0.0(eslint@8.33.0) - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events@1.1.1: - resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} - engines: {node: '>=0.4.x'} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /execa@5.0.0: - resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execution-time@1.4.1: - resolution: {integrity: sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==} - dependencies: - pretty-hrtime: 1.0.3 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false - - /expect@29.6.1: - resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.6.1 - '@types/node': 14.14.7 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - dev: true - - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /extract-stack@2.0.0: - resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} - engines: {node: '>=8'} - dev: true - - /fancy-test@1.4.10: - resolution: {integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/chai': 4.3.5 - '@types/lodash': 4.14.195 - '@types/node': 14.14.7 - '@types/sinon': 10.0.15 - lodash: 4.17.21 - mock-stdin: 1.0.0 - nock: 13.3.2 - stdout-stderr: 0.1.13 - transitivePeerDependencies: - - supports-color - dev: true - - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.2.7: - resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} - engines: {node: '>=8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-levenshtein@3.0.0: - resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - dependencies: - fastest-levenshtein: 1.0.16 - - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false - - /fast-xml-parser@4.2.7: - resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fast-xml-parser@4.3.2: - resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: false - - /faye@1.4.0: - resolution: {integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==} - engines: {node: '>=0.8.0'} - dependencies: - asap: 2.0.6 - csprng: 0.1.2 - faye-websocket: 0.11.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - dev: false - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false - - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-java-home@2.0.0: - resolution: {integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==} - dependencies: - which: 1.0.9 - winreg: 1.2.4 - dev: false - - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - - /find-yarn-workspace-root@2.0.0: - resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} - dependencies: - micromatch: 4.0.5 - dev: true - - /first-chunk-stream@2.0.0: - resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} - engines: {node: '>=0.10.0'} - dependencies: - readable-stream: 2.3.8 - dev: true - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /@ampproject/remapping@2.2.1: + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame@7.22.5: + resolution: + { + integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/highlight': 7.22.5 + dev: true + + /@babel/compat-data@7.22.9: + resolution: + { + integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/core@7.18.2: + resolution: + { + integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.9: + resolution: + { + integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): + resolution: + { + integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.18.2 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: + { + integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: + { + integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: + { + integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): + resolution: + { + integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: + { + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: + { + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: + { + integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: + { + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: + { + integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: + { + integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: + { + integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helpers@7.22.6: + resolution: + { + integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.5: + resolution: + { + integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.7: + resolution: + { + integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==, + } + engines: { node: '>=6.0.0' } + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): + resolution: + { + integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): + resolution: + { + integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==, + } + engines: { node: '>=6.9.0' } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime-corejs3@7.22.6: + resolution: + { + integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==, + } + engines: { node: '>=6.9.0' } + dependencies: + core-js-pure: 3.31.1 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime@7.22.6: + resolution: + { + integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.22.5: + resolution: + { + integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@babel/traverse@7.22.8: + resolution: + { + integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.5: + resolution: + { + integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } + dev: true + + /@colors/colors@1.5.0: + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: '>=0.1.90' } + requiresBuild: true + dev: false optional: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.0.2 - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - - /fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: false - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true - - /get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - - /get-stream@6.0.0: - resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} - engines: {node: '>=10'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-uri@6.0.1: - resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} - engines: {node: '>= 14'} - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} - hasBin: true - dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - dev: true - - /git-semver-tags@5.0.1: - resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - meow: 8.1.2 - semver: 7.5.2 - dev: true - - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: true - - /git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} - dependencies: - git-up: 7.0.0 - dev: true - - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - dependencies: - ini: 1.3.8 - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false - - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true - - /github-username@6.0.0: - resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} - engines: {node: '>=10'} - dependencies: - '@octokit/rest': 18.12.0 - transitivePeerDependencies: - - encoding - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.2 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - - /glob@7.1.4: - resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: true - - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /graphology-indices@0.17.0(graphology-types@0.24.7): - resolution: {integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==} - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - mnemonist: 0.39.5 - dev: false - - /graphology-traversal@0.3.1(graphology-types@0.24.7): - resolution: {integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==} - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-indices: 0.17.0(graphology-types@0.24.7) - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - dev: false - - /graphology-types@0.24.7: - resolution: {integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==} - dev: false - - /graphology-utils@2.5.2(graphology-types@0.24.7): - resolution: {integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==} - peerDependencies: - graphology-types: '>=0.23.0' - dependencies: - graphology-types: 0.24.7 - dev: false - - /graphology@0.25.4(graphology-types@0.24.7): - resolution: {integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==} - peerDependencies: - graphology-types: '>=0.24.0' - dependencies: - events: 3.3.0 - graphology-types: 0.24.7 - obliterator: 2.0.4 - dev: false - - /grouped-queue@2.0.0: - resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} - engines: {node: '>=8.0.0'} - dev: true - - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - dependencies: - capital-case: 1.0.4 - tslib: 2.1.0 - dev: false - - /help-me@4.2.0: - resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - dev: false - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /hosted-git-info@3.0.8: - resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - lru-cache: 7.18.3 - dev: true - - /hot-shots@8.5.0: - resolution: {integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==} - engines: {node: '>=6.0.0'} - optionalDependencies: - unix-dgram: 2.0.6 - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - /http-call@5.3.0: - resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} - engines: {node: '>=8.0.0'} - dependencies: - content-type: 1.0.5 - debug: 4.3.4(supports-color@8.1.1) - is-retry-allowed: 1.2.0 - is-stream: 2.0.1 - parse-json: 4.0.0 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: false - - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: true - - /hyperlinker@1.0.0: - resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} - engines: {node: '>=4'} - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dependencies: - safer-buffer: 2.1.2 - dev: true - optional: true - - /ieee754@1.1.13: - resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore-walk@4.0.1: - resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} - engines: {node: '>=10'} - dependencies: - minimatch: 3.1.2 - dev: true - - /ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minimatch: 5.1.6 - dev: true - - /ignore-walk@6.0.3: - resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minimatch: 9.0.3 - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - /init-package-json@5.0.0: - resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-package-arg: 10.1.0 - promzard: 1.0.0 - read: 2.1.0 - read-package-json: 6.0.4 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - dev: true - - /inquirer-autocomplete-prompt@1.4.0(inquirer@7.3.3): - resolution: {integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==} - engines: {node: '>=10'} - peerDependencies: - inquirer: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - figures: 3.2.0 - inquirer: 7.3.3 - run-async: 2.4.1 - rxjs: 6.6.7 - dev: true - - /inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: false - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.8.0 - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - - /is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-scoped@2.1.0: - resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} - engines: {node: '>=8'} - dependencies: - scoped-regex: 2.1.0 - dev: true - - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - dependencies: - protocols: 2.0.1 - dev: true - - /is-stream@2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} - engines: {node: '>=8'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true - - /isbinaryfile@5.0.0: - resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} - engines: {node: '>= 14.0.0'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isomorphic-git@1.23.0: - resolution: {integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==} - engines: {node: '>=12'} - hasBin: true - dependencies: - async-lock: 1.4.0 - clean-git-ref: 2.0.1 - crc-32: 1.2.2 - diff3: 0.0.3 - ignore: 5.2.4 - minimisted: 2.0.1 - pako: 1.0.11 - pify: 4.0.1 - readable-stream: 3.6.2 - sha.js: 2.4.11 - simple-get: 4.0.1 - dev: false - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.18.2 - '@babel/parser': 7.22.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - /jackspeak@2.2.2: - resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.6.1: - resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.6.1 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - p-limit: 3.1.0 - pretty-format: 29.6.1 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 10.0.0 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 20.4.4 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.6.1: - resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.6.1: - resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /jest-environment-node@29.6.1: - resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.6.1: - resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 14.14.7 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - jest-worker: 29.6.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.1: - resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-matcher-utils@29.6.1: - resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.6.1: - resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.6.1: - resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-util: 29.6.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.6.1 - dev: true - - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.6.1: - resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.6.1: - resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.6.1: - resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/environment': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.1 - jest-haste-map: 29.6.1 - jest-leak-detector: 29.6.1 - jest-message-util: 29.6.1 - jest-resolve: 29.6.1 - jest-runtime: 29.6.1 - jest-util: 29.6.1 - jest-watcher: 29.6.1 - jest-worker: 29.6.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.6.1: - resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/globals': 29.6.1 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.6.1: - resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.18.2 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - chalk: 4.1.2 - expect: 29.6.1 - graceful-fs: 4.2.11 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - natural-compare: 1.4.0 - pretty-format: 29.6.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.6.1: - resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.6.1: - resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.1 - dev: true - - /jest-watcher@29.6.1: - resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.6.1 - string-length: 4.0.2 - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 14.14.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest-worker@29.6.1: - resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 14.14.7 - jest-util: 29.6.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: + /@commitlint/cli@15.0.0: + resolution: + { + integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==, + } + engines: { node: '>=v12' } + hasBin: true + dependencies: + '@commitlint/format': 15.0.0 + '@commitlint/lint': 15.0.0 + '@commitlint/load': 15.0.0 + '@commitlint/read': 15.0.0 + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + dev: true + + /@commitlint/config-conventional@15.0.0: + resolution: + { + integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==, + } + engines: { node: '>=v12' } + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/ensure@15.0.0: + resolution: + { + integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule@15.0.0: + resolution: + { + integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/format@15.0.0: + resolution: + { + integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@15.0.0: + resolution: + { + integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + semver: 7.3.5 + dev: true + + /@commitlint/lint@15.0.0: + resolution: + { + integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/is-ignored': 15.0.0 + '@commitlint/parse': 15.0.0 + '@commitlint/rules': 15.0.0 + '@commitlint/types': 15.0.0 + dev: true + + /@commitlint/load@15.0.0: + resolution: + { + integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/execute-rule': 15.0.0 + '@commitlint/resolve-extends': 15.0.0 + '@commitlint/types': 15.0.0 + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) + chalk: 4.1.2 + cosmiconfig: 7.1.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.9.5 + dev: true + + /@commitlint/message@15.0.0: + resolution: + { + integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/parse@15.0.0: + resolution: + { + integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@15.0.0: + resolution: + { + integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/top-level': 15.0.0 + '@commitlint/types': 15.0.0 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends@15.0.0: + resolution: + { + integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==, + } + engines: { node: '>=v12' } + dependencies: + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@15.0.0: + resolution: + { + integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/ensure': 15.0.0 + '@commitlint/message': 15.0.0 + '@commitlint/to-lines': 15.0.0 + '@commitlint/types': 15.0.0 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@15.0.0: + resolution: + { + integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/top-level@15.0.0: + resolution: + { + integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==, + } + engines: { node: '>=v12' } + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@15.0.0: + resolution: + { + integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==, + } + engines: { node: '>=v12' } + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: + { + integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==, + } + engines: { node: '>= 12' } + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: + { + integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==, + } + engines: { node: '>=12' } + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): + resolution: + { + integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==, + } + engines: { node: '>=10.0.0' } + peerDependencies: + cosmiconfig: '>=6' + dependencies: + cosmiconfig: 7.1.0 + lodash.get: 4.4.2 + make-error: 1.3.6 + ts-node: 9.1.1(typescript@4.9.5) + tslib: 2.1.0 + transitivePeerDependencies: + - typescript + dev: true + + /@eslint/eslintrc@1.4.1: + resolution: + { + integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify@1.1.3: + resolution: + { + integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, + } + dev: true + + /@humanwhocodes/config-array@0.11.10: + resolution: + { + integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + } + engines: { node: '>=10.10.0' } + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: + { + integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@isaacs/cliui@8.0.2: + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/string-locale-compare@1.1.0: + resolution: + { + integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, + } + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + } + engines: { node: '>=8' } + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } + dev: true + + /@jest/console@29.6.1: + resolution: + { + integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/core@29.6.1(ts-node@10.7.0): + resolution: + { + integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@9.1.1): + resolution: + { + integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment@29.6.1: + resolution: + { + integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + dev: true + + /@jest/expect-utils@29.6.1: + resolution: + { + integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect@29.6.1: + resolution: + { + integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + expect: 29.6.1 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.6.1: + resolution: + { + integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.14.7 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /@jest/globals@29.6.1: + resolution: + { + integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/types': 29.6.1 + jest-mock: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.6.1: + resolution: + { + integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 14.14.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + jest-worker: 29.6.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.0: + resolution: + { + integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.0: + resolution: + { + integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.6.1: + resolution: + { + integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.6.1 + '@jest/types': 29.6.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.6.1: + resolution: + { + integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.6.1 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/transform@29.6.1: + resolution: + { + integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.18.2 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.1: + resolution: + { + integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 14.14.7 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: + { + integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, + } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: '>=6.0.0' } + + /@jridgewell/set-array@1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: + { + integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, + } + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: + { + integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, + } + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + /@jridgewell/trace-mapping@0.3.18: + resolution: + { + integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, + } + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@kwsites/file-exists@1.1.1: + resolution: + { + integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==, + } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@kwsites/promise-deferred@1.1.1: + resolution: + { + integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==, + } + dev: false + + /@lerna/child-process@7.1.4: + resolution: + { + integrity: sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA==, + } + engines: { node: ^14.17.0 || >=16.0.0 } + dependencies: + chalk: 4.1.2 + execa: 5.1.1 + strong-log-transformer: 2.1.0 + dev: true + + /@lerna/create@7.1.4: + resolution: + { + integrity: sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw==, + } + engines: { node: ^14.17.0 || >=16.0.0 } + dependencies: + '@lerna/child-process': 7.1.4 + dedent: 0.7.0 + fs-extra: 11.1.1 + init-package-json: 5.0.0 + npm-package-arg: 8.1.1 + p-reduce: 2.1.0 + pacote: 15.2.0 + pify: 5.0.0 + semver: 7.5.2 + slash: 3.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@newrelic/telemetry-sdk@0.6.0: + resolution: + { + integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==, + } + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/arborist@4.3.1: + resolution: + { + integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + hasBin: true + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/map-workspaces': 2.0.4 + '@npmcli/metavuln-calculator': 2.0.0 + '@npmcli/move-file': 1.1.2 + '@npmcli/name-from-folder': 1.0.1 + '@npmcli/node-gyp': 1.0.3 + '@npmcli/package-json': 1.0.1 + '@npmcli/run-script': 2.0.0 + bin-links: 3.0.3 + cacache: 15.3.0 + common-ancestor-path: 1.0.1 + json-parse-even-better-errors: 2.3.1 + json-stringify-nice: 1.1.4 + mkdirp: 1.0.4 + mkdirp-infer-owner: 2.0.0 + npm-install-checks: 4.0.0 + npm-package-arg: 8.1.5 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + pacote: 12.0.3 + parse-conflict-json: 2.0.2 + proc-log: 1.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 1.0.2 + read-package-json-fast: 2.0.3 + readdir-scoped-modules: 1.1.0 + rimraf: 3.0.2 + semver: 7.5.2 + ssri: 8.0.1 + treeverse: 1.0.4 + walk-up-path: 1.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/fs@1.1.1: + resolution: + { + integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, + } + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@2.1.2: + resolution: + { + integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@3.1.0: + resolution: + { + integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + semver: 7.5.2 + dev: true + + /@npmcli/git@2.1.0: + resolution: + { + integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==, + } + dependencies: + '@npmcli/promise-spawn': 1.3.2 + lru-cache: 6.0.0 + mkdirp: 1.0.4 + npm-pick-manifest: 6.1.1 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@4.1.0: + resolution: + { + integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.1 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@1.0.7: + resolution: + { + integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==, + } + engines: { node: '>= 10' } + hasBin: true + dependencies: + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: + { + integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/map-workspaces@2.0.4: + resolution: + { + integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@npmcli/name-from-folder': 1.0.1 + glob: 8.1.0 + minimatch: 5.1.6 + read-package-json-fast: 2.0.3 + dev: true + + /@npmcli/metavuln-calculator@2.0.0: + resolution: + { + integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + dependencies: + cacache: 15.3.0 + json-parse-even-better-errors: 2.3.1 + pacote: 12.0.3 + semver: 7.5.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/move-file@1.1.2: + resolution: + { + integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==, + } + engines: { node: '>=10' } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: + { + integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/name-from-folder@1.0.1: + resolution: + { + integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==, + } + dev: true + + /@npmcli/node-gyp@1.0.3: + resolution: + { + integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==, + } + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: + { + integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@npmcli/package-json@1.0.1: + resolution: + { + integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==, + } + dependencies: + json-parse-even-better-errors: 2.3.1 + dev: true + + /@npmcli/promise-spawn@1.3.2: + resolution: + { + integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==, + } + dependencies: + infer-owner: 1.0.4 + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: + { + integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/run-script@2.0.0: + resolution: + { + integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==, + } + dependencies: + '@npmcli/node-gyp': 1.0.3 + '@npmcli/promise-spawn': 1.3.2 + node-gyp: 8.4.1 + read-package-json-fast: 2.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/run-script@6.0.2: + resolution: + { + integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@nrwl/devkit@16.5.5(nx@16.5.5): + resolution: + { + integrity: sha512-4ho9Vfg1YzRYZ4SMygYI9Yz1avpujd81gy/Um2Z0q8Q7Twp6Q/uG1KY9Hb7EzVXgrRcgGWdIPXuw41DpmnfWug==, + } + dependencies: + '@nx/devkit': 16.5.5(nx@16.5.5) + transitivePeerDependencies: + - nx + dev: true + + /@nrwl/tao@16.5.5: + resolution: + { + integrity: sha512-6SYG3rlKkYvy/wauPwoUXQuN0PTJi95hCEC7lGfCEGye2Y/61UwJQf2xixMxafUM2X84WdEStEz3Jty85gVqkQ==, + } + hasBin: true + dependencies: + nx: 16.5.5 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + + /@nx/devkit@16.5.5(nx@16.5.5): + resolution: + { + integrity: sha512-9YaQ3s5VMgTXo5cEuaVc2b6btZU2REmHsgn/V4Gi3nSmwBHvIn86gtlh4BoBFinHpqge1chG/dC+B7yoXioQmQ==, + } + peerDependencies: + nx: '>= 15 <= 17' + dependencies: + '@nrwl/devkit': 16.5.5(nx@16.5.5) + ejs: 3.1.9 + ignore: 5.2.4 + nx: 16.5.5 + semver: 7.5.3 + tmp: 0.2.1 + tslib: 2.6.2 + dev: true + + /@nx/nx-darwin-arm64@16.5.5: + resolution: + { + integrity: sha512-Zzwy7pkSDFTiWcBk78qDe4VzygO9kemtz/kbbLvpisZkUlZX9nIQnLHT80Ms++iqA0enIQAwdTcJiaIHLVd5JQ==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false - - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /js2xmlparser@4.0.2: - resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} - dependencies: - xmlcreate: 2.0.4 - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /jsforce@2.0.0-beta.27: - resolution: {integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==} - engines: {node: '>=8.0'} - hasBin: true - dependencies: - '@babel/runtime': 7.22.6 - '@babel/runtime-corejs3': 7.22.6 - '@types/node': 12.20.55 - abort-controller: 3.0.0 - base64url: 3.0.1 - commander: 4.1.1 - core-js: 3.31.1 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - faye: 1.4.0 - form-data: 4.0.0 - fs-extra: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 7.3.3 - multistream: 3.1.0 - node-fetch: 2.6.12 - open: 7.4.2 - regenerator-runtime: 0.13.11 - strip-ansi: 6.0.1 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - dependencies: - bignumber.js: 9.1.1 - dev: false - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json-stable-stringify@1.0.2: - resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} - dependencies: - jsonify: 0.0.1 - dev: true - - /json-stringify-nice@1.1.4: - resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - dev: true - - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.5.4 - dev: false - - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /just-diff-apply@5.5.0: - resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} - dev: true - - /just-diff@3.1.1: - resolution: {integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==} - dev: true - - /just-diff@5.2.0: - resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} - dev: true - - /just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - dev: true - - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /lerna-update-wizard@1.1.0: - resolution: {integrity: sha512-V6VtJFbt4BS1HKsNDsyBMeAU86CYRoQSikZsJyEMVc2x/yqH/hX+Z79fI0J3gSiWFkkIKrLj/vPUf6Zvn/79jw==} - engines: {node: '>=12'} - hasBin: true - dependencies: - chalk: 4.1.2 - cli-cursor: 2.1.0 - execution-time: 1.4.1 - fs-extra: 7.0.1 - globby: 11.1.0 - inquirer: 7.3.3 - inquirer-autocomplete-prompt: 1.4.0(inquirer@7.3.3) - lodash: 4.17.21 - meow: 9.0.0 - minimist: 1.2.8 - semver-compare: 1.0.0 - dev: true - - /lerna@7.1.4: - resolution: {integrity: sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw==} - engines: {node: ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@lerna/child-process': 7.1.4 - '@lerna/create': 7.1.4 - '@npmcli/run-script': 6.0.2 - '@nx/devkit': 16.5.5(nx@16.5.5) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.1 - columnify: 1.6.0 - conventional-changelog-angular: 6.0.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 8.2.0 - dedent: 0.7.0 - envinfo: 7.8.1 - execa: 5.0.0 - fs-extra: 11.1.1 - get-port: 5.1.1 - get-stream: 6.0.0 - git-url-parse: 13.1.0 - glob-parent: 5.1.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - import-local: 3.1.0 - ini: 1.3.8 - init-package-json: 5.0.0 - inquirer: 8.2.5 - is-ci: 3.0.1 - is-stream: 2.0.0 - jest-diff: 29.6.1 - js-yaml: 4.1.0 - libnpmaccess: 7.0.2 - libnpmpublish: 7.3.0 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 3.1.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7 - npm-package-arg: 8.1.1 - npm-packlist: 5.1.1 - npm-registry-fetch: 14.0.5 - npmlog: 6.0.2 - nx: 16.5.5 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-pipe: 3.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - p-waterfall: 2.1.1 - pacote: 15.2.0 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - read-package-json: 6.0.4 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.5.2 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 9.0.1 - strong-log-transformer: 2.1.0 - tar: 6.1.11 - temp-dir: 1.0.0 - typescript: 5.0.2 - upath: 2.0.1 - uuid: 9.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - bluebird - - debug - - encoding - - supports-color - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /libnpmaccess@7.0.2: - resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - transitivePeerDependencies: - - supports-color - dev: true - - /libnpmpublish@7.3.0: - resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ci-info: 3.8.0 - normalize-package-data: 5.0.0 - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - semver: 7.5.2 - sigstore: 1.8.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - dev: false - - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - dev: true - - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false - - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false - - /lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} - dev: false - - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false - - /lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - dependencies: - lodash._reinterpolate: 3.0.0 - - /lodash.uniqby@4.7.0: - resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /lolex@2.7.5: - resolution: {integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==} - dev: true - - /lolex@5.1.2: - resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.1.0 - dev: false - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - /lru-cache@10.0.0: - resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} - engines: {node: 14 || >=16.14} - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - agentkeepalive: 4.3.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} - dependencies: - agentkeepalive: 4.3.0 - cacache: 15.3.0 - http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - - /markdown-table-ts@1.0.3: - resolution: {integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==} - dev: false - - /markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - dependencies: - repeat-string: 1.6.1 - dev: false - - /marked-terminal@5.1.1(marked@4.0.16): - resolution: {integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==} - engines: {node: '>=14.13.1 || >=16.0.0'} - peerDependencies: - marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - ansi-escapes: 5.0.0 - cardinal: 2.1.1 - chalk: 5.3.0 - cli-table3: 0.6.3 - marked: 4.0.16 - node-emoji: 1.11.0 - supports-hyperlinks: 2.3.0 - dev: false - - /marked@4.0.16: - resolution: {integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==} - engines: {node: '>= 12'} - hasBin: true - dev: false - - /mem-fs-editor@9.7.0(mem-fs@2.3.0): - resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} - engines: {node: '>=12.10.0'} - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true - dependencies: - binaryextensions: 4.18.0 - commondir: 1.0.1 - deep-extend: 0.6.0 - ejs: 3.1.9 - globby: 11.1.0 - isbinaryfile: 5.0.0 - mem-fs: 2.3.0 - minimatch: 7.4.6 - multimatch: 5.0.0 - normalize-path: 3.0.0 - textextensions: 5.16.0 - dev: true - - /mem-fs@2.3.0: - resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} - engines: {node: '>=12'} - dependencies: - '@types/node': 15.14.9 - '@types/vinyl': 2.0.7 - vinyl: 2.2.1 - vinyl-file: 3.0.0 - dev: true - - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.0.5: - resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /minimisted@2.0.1: - resolution: {integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==} - dependencies: - minimist: 1.2.8 - dev: false - - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - dev: true - - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - /minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} - engines: {node: '>=16 || 14 >=14.17'} - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /mkdirp-infer-owner@2.0.0: - resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - infer-owner: 1.0.4 - mkdirp: 1.0.4 - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - /mnemonist@0.39.5: - resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} - dependencies: - obliterator: 2.0.4 - dev: false - - /mock-stdin@1.0.0: - resolution: {integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==} - dev: true - - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /multistream@3.1.0: - resolution: {integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /mylas@2.1.13: - resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} - engines: {node: '>=12.0.0'} - dev: true - - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} - requiresBuild: true - dev: false - optional: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /natural-orderby@2.0.3: - resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: false - - /neverthrow@4.2.1: - resolution: {integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==} - dev: false - - /neverthrow@4.4.2: - resolution: {integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==} - dev: false - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - /nise@1.5.3: - resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} - dependencies: - '@sinonjs/formatio': 3.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - lolex: 5.1.2 - path-to-regexp: 1.8.0 - dev: true - - /nise@5.1.4: - resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} - dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - dev: true - - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.1.0 - dev: false - - /nock@13.3.2: - resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} - engines: {node: '>= 10.13'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.2 - dev: false - - /node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - dev: true - - /node-cache@5.1.2: - resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} - engines: {node: '>= 8.0.0'} - dependencies: - clone: 2.1.2 - dev: false - - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - dependencies: - minimatch: 3.1.2 - dev: false - - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - dependencies: - lodash: 4.17.21 - dev: false - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - dev: true - - /node-gyp@8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /node-gyp@9.4.0: - resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 11.1.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - /npm-bundled@1.1.2: - resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} - dependencies: - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-normalize-package-bin: 3.0.1 - dev: true - - /npm-install-checks@4.0.0: - resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.2 - dev: true - - /npm-install-checks@6.1.1: - resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.2 - dev: true - - /npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} - dev: true - - /npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.2 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-package-arg@8.1.1: - resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 3.0.8 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-package-arg@8.1.5: - resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-packlist@3.0.0: - resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - glob: 7.2.3 - ignore-walk: 4.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@5.1.1: - resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - glob: 8.1.0 - ignore-walk: 5.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ignore-walk: 6.0.3 - dev: true - - /npm-pick-manifest@6.1.1: - resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} - dependencies: - npm-install-checks: 4.0.0 - npm-normalize-package-bin: 1.0.1 - npm-package-arg: 8.1.5 - semver: 7.5.2 - dev: true - - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.5.2 - dev: true - - /npm-registry-fetch@12.0.2: - resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - make-fetch-happen: 10.2.1 - minipass: 3.3.6 - minipass-fetch: 1.4.1 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 8.1.5 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true - - /nx@16.5.5: - resolution: {integrity: sha512-DHwoUtkirI52JIlCtRK78UI/Ik/VgCtM6FlkfPnFsy8PVyTYMQ40KoG6aZLHjqj5qxoGG2CUjcsbFjGXYrjDbw==} - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.4.2 - '@swc/core': ^1.2.173 - peerDependenciesMeta: - '@swc-node/register': + + /@nx/nx-darwin-x64@16.5.5: + resolution: + { + integrity: sha512-d5O8BD5HFI2hJnMgVVV1pl2A+hlUmn4GxCZTmx2Tr329TYGdpvyXm8NnDFEAigZ77QVMHwFN6vqS07HARu+uVA==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - '@swc/core': + + /@nx/nx-freebsd-x64@16.5.5: + resolution: + { + integrity: sha512-SqTvbz21iUc8DHKgisX9pPuXc7/DngbiZxInlEHPXi8zUtyUOqZI3yQk4NVj3dqLBMLwEOZDgvXs0XxzB5nn+g==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - dependencies: - '@nrwl/tao': 16.5.5 - '@parcel/watcher': 2.0.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 - axios: 1.4.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 7.0.4 - dotenv: 10.0.0 - enquirer: 2.3.6 - fast-glob: 3.2.7 - figures: 3.2.0 - flat: 5.0.2 - fs-extra: 11.1.1 - glob: 7.1.4 - ignore: 5.2.4 - js-yaml: 4.1.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 3.0.5 - npm-run-path: 4.0.1 - open: 8.4.2 - semver: 7.5.3 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - v8-compile-cache: 2.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 16.5.5 - '@nx/nx-darwin-x64': 16.5.5 - '@nx/nx-freebsd-x64': 16.5.5 - '@nx/nx-linux-arm-gnueabihf': 16.5.5 - '@nx/nx-linux-arm64-gnu': 16.5.5 - '@nx/nx-linux-arm64-musl': 16.5.5 - '@nx/nx-linux-x64-gnu': 16.5.5 - '@nx/nx-linux-x64-musl': 16.5.5 - '@nx/nx-win32-arm64-msvc': 16.5.5 - '@nx/nx-win32-x64-msvc': 16.5.5 - transitivePeerDependencies: - - debug - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-hash@2.1.1: - resolution: {integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==} - engines: {node: '>= 6'} - dev: false - - /object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false - - /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) - aws-sdk: 2.1421.0 - concurrently: 7.6.0 - debug: 4.3.4(supports-color@8.1.1) - find-yarn-workspace-root: 2.0.0 - fs-extra: 8.1.0 - github-slugger: 1.5.0 - got: 11.8.6 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - semver: 7.5.2 - shelljs: 0.8.5 - tslib: 2.6.2 - yeoman-environment: 3.19.3 - yeoman-generator: 5.9.0(yeoman-environment@3.19.3) - yosay: 2.0.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bluebird - - encoding - - mem-fs - - supports-color - - typescript - dev: true - - /on-exit-leak-free@2.1.0: - resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - dependencies: - p-limit: 1.3.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map-series@2.1.0: - resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} - engines: {node: '>=8'} - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-pipe@3.1.0: - resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} - engines: {node: '>=8'} - dev: true - - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: true - - /p-reduce@2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} - dev: true - - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - dependencies: - p-finally: 1.0.0 - dev: true - - /p-transform@1.3.0: - resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} - engines: {node: '>=12.10.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - p-queue: 6.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /p-waterfall@2.1.1: - resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} - engines: {node: '>=8'} - dependencies: - p-reduce: 2.1.0 - dev: true - - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} - engines: {node: '>= 14'} - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - dev: false - - /pacote@12.0.3: - resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true - dependencies: - '@npmcli/git': 2.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/promise-spawn': 1.3.2 - '@npmcli/run-script': 2.0.0 - cacache: 15.3.0 - chownr: 2.0.0 - fs-minipass: 2.1.0 - infer-owner: 1.0.4 - minipass: 3.3.6 - mkdirp: 1.0.4 - npm-package-arg: 8.1.5 - npm-packlist: 3.0.0 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - promise-retry: 2.0.1 - read-package-json-fast: 2.0.3 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.8.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pad-component@0.0.1: - resolution: {integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==} - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-conflict-json@2.0.2: - resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - json-parse-even-better-errors: 2.3.1 - just-diff: 5.2.0 - just-diff-apply: 5.5.0 - dev: true - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - dependencies: - protocols: 2.0.1 - dev: true - - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - dependencies: - parse-path: 7.0.0 - dev: true - - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /password-prompt@1.1.2: - resolution: {integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==} - dependencies: - ansi-escapes: 3.2.0 - cross-spawn: 6.0.5 - - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 - - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 - dev: true - - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: true - - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - dev: false - - /pino-pretty@10.2.3: - resolution: {integrity: sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==} - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.4.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.7.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false - - /pino@8.16.0: - resolution: {integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 2.2.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.7.0 - thread-stream: 2.4.0 - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /plimit-lit@1.5.0: - resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} - dependencies: - queue-lit: 1.5.0 - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.45.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier@2.0.5: - resolution: {integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - - /pretty-format@29.6.1: - resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true - - /proc-log@1.0.0: - resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} - dev: true - - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - /process-warning@2.2.0: - resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} - dev: false - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - /promise-all-reject-late@1.0.1: - resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} - dev: true - - /promise-call-limit@1.0.2: - resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} - dev: true - - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: + + /@nx/nx-linux-arm-gnueabihf@16.5.5: + resolution: + { + integrity: sha512-8C2KVFHqcyGViEgUicYo1frEgQARbD+CicIos6A5WRYLaxS+upb9FDblKU0eGYIwDp8oCagVjUjNX8d1WHLX7w==, + } + engines: { node: '>= 10' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true - dev: true - - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - read: 2.1.0 - dev: true - - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: true - - /proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - dev: false - - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: true - - /proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - dev: true - - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true - - /querystring@0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-lit@1.5.0: - resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false - - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /read-cmd-shim@3.0.1: - resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true - - /read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /read-package-json-fast@2.0.3: - resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} - engines: {node: '>=10'} - dependencies: - json-parse-even-better-errors: 2.3.1 - npm-normalize-package-bin: 1.0.1 - dev: true - - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - glob: 10.3.3 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read@2.1.0: - resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - mute-stream: 1.0.0 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - /readdir-scoped-modules@1.1.0: - resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - debuglog: 1.0.1 - dezalgo: 1.0.4 - graceful-fs: 4.2.11 - once: 1.4.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false - - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.2 - dev: true - - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /redeyed@2.1.1: - resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} - dependencies: - esprima: 4.0.1 - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: true - - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false - - /replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - - /restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 9.3.5 - dev: true - - /rimraf@5.0.1: - resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 10.3.3 - dev: false - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.1.0 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /samsam@1.3.0: - resolution: {integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==} - deprecated: This package has been deprecated in favour of @sinonjs/samsam - dev: true - - /sax@1.2.1: - resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - dev: true - - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /scoped-regex@2.1.0: - resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} - engines: {node: '>=8'} - dev: true - - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: false - - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.2: - resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /sequin@0.1.1: - resolution: {integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==} - engines: {node: '>=0.4.0'} - dev: false - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} - engines: {node: '>=14'} - - /sigstore@1.8.0: - resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@sigstore/bundle': 1.0.0 - '@sigstore/protobuf-specs': 0.2.0 - '@sigstore/tuf': 1.0.3 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - - /simple-git@3.16.0: - resolution: {integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==} - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /simple-git@3.19.1: - resolution: {integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==} - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /sinon@11.1.2: - resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} - deprecated: 16.1.1 - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/samsam': 6.1.3 - diff: 5.1.0 - nise: 5.1.4 - supports-color: 7.2.0 - dev: true - - /sinon@5.1.1: - resolution: {integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==} - dependencies: - '@sinonjs/formatio': 2.0.0 - diff: 3.5.0 - lodash.get: 4.4.2 - lolex: 2.7.5 - nise: 1.5.3 - supports-color: 5.5.0 - type-detect: 4.0.8 - dev: true - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: false - - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sonic-boom@3.7.0: - resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} - dependencies: - atomic-sleep: 1.0.0 - dev: false - - /sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /sort-keys@4.2.0: - resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} - engines: {node: '>=8'} - dependencies: - is-plain-obj: 2.1.0 - dev: true - - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /spawn-command@0.0.2-1: - resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true - - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.2 - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: false - - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - /ssri@10.0.4: - resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stdout-stderr@0.1.13: - resolution: {integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==} - engines: {node: '>=8.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - - /strip-bom-buf@1.0.0: - resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} - engines: {node: '>=4'} - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom-stream@2.0.0: - resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} - engines: {node: '>=0.10.0'} - dependencies: - first-chunk-stream: 2.0.0 - strip-bom: 2.0.0 - dev: true - - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - - /strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - dev: true - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /taketalk@1.0.0: - resolution: {integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==} - dependencies: - get-stdin: 4.0.1 - minimist: 1.2.8 - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - /temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': + + /@nx/nx-linux-arm64-gnu@16.5.5: + resolution: + { + integrity: sha512-AGq4wp3Wn8bE0h2c7/bHj2wQWfp08DYJemwTNLkwLcoJWkUidLOBQePRvLxqPeo42Zmt3GYMi+fi5XtKCmvcjg==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - esbuild: + + /@nx/nx-linux-arm64-musl@16.5.5: + resolution: + { + integrity: sha512-xPTYjDCPnXLPXZThAzugiithZaIHk42rTxussMZA00Cx0iEkh5zohqtC0vGBnaAPNcMv0uyCiWABhL4RRUVp2w==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - uglify-js: + + /@nx/nx-linux-x64-gnu@16.5.5: + resolution: + { + integrity: sha512-Rq55OWD4SObfo4sWpjvaijWg33dm+cOf8e2cO06t2EmLMdOyyVnpNdtpjXh6A9tSi3EU5xPfYiy3I9O6gWOnuw==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2 - dev: true - - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /textextensions@5.16.0: - resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} - engines: {node: '>=0.8'} - dev: true - - /thread-stream@2.4.0: - resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} - dependencies: - real-require: 0.2.0 - dev: false - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.2 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - dev: false - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /treeverse@1.0.4: - resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': + + /@nx/nx-linux-x64-musl@16.5.5: + resolution: + { + integrity: sha512-fnkSPv+VIKmQQOEQxFrGx5DlkHGxeH9Fzme6jwuDwmsvs+8Vv/uUnfcxkDZfJxKK+p27w37q3PQCfZGrFXE1cw==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@jest/types': + + /@nx/nx-win32-arm64-msvc@16.5.5: + resolution: + { + integrity: sha512-9nWm+d+tlbxFMLvTLJqIfpTLDuSVDXfSBCSBampyeoI1mUALvq/6CVvWVBDlNqjmrZsYm0sudNqI4Ss7w3BUCQ==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - babel-jest: + + /@nx/nx-win32-x64-msvc@16.5.5: + resolution: + { + integrity: sha512-fB8miPr887GIGBDhyT6VX7MWX5aC40izEi+4GGSk38oh5dOUK9TLwjAEW/3vBE01fj5Hjcy0CPN7RA45fh/WUw==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - esbuild: + + /@oclif/color@1.0.9: + resolution: + { + integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==, + } + engines: { node: '>=12.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + ansi-styles: 4.3.0 + chalk: 4.1.2 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + tslib: 2.1.0 + dev: true + + /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): + resolution: + { + integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==, + } + engines: { node: '>=12.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@oclif/config': ^1 + dependencies: + '@oclif/config': 1.18.15 + '@oclif/errors': 1.3.6 + '@oclif/help': 1.0.13(supports-color@8.1.1) + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.14(supports-color@8.1.1): + resolution: + { + integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.15: + resolution: + { + integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/core@0.5.41(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-ux: 5.6.7(@oclif/config@1.18.15) + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lodash.template: 4.5.0 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.1.0 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==, + } + engines: { node: '>=14.0.0' } + dependencies: + '@types/cli-progress': 3.11.0 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.4 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/core@3.3.2: + resolution: + { + integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==, + } + engines: { node: '>=18.0.0' } + dependencies: + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/errors@1.3.6: + resolution: + { + integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + clean-stack: 3.0.1 + fs-extra: 8.1.0 + indent-string: 4.0.0 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /@oclif/help@1.0.13(supports-color@8.1.1): + resolution: + { + integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/config': 1.18.14(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + chalk: 4.1.2 + indent-string: 4.0.0 + lodash: 4.17.21 + string-width: 4.2.3 + strip-ansi: 6.0.1 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/linewrap@1.0.0: + resolution: + { + integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==, + } + dev: true + + /@oclif/parser@3.8.15: + resolution: + { + integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + tslib: 2.6.2 + dev: true + + /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 0.5.41(@oclif/config@1.18.15) + chalk: 4.1.2 + just-diff: 3.1.1 + semver: 7.5.2 + sinon: 11.1.2 + ts-json-schema-generator: 0.93.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/plugin-commands@3.0.3: + resolution: + { + integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@oclif/core': 3.3.2 + lodash.pickby: 4.6.0 + lodash.sortby: 4.7.0 + lodash.template: 4.5.0 + lodash.uniqby: 4.7.0 + dev: false + + /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/color': 1.0.9 + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + http-call: 5.3.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + dev: true + + /@oclif/screen@1.0.4: + resolution: + { + integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==, + } + engines: { node: '>=8.0.0' } + deprecated: Deprecated in favor of @oclif/core + dev: true + + /@oclif/test@2.0.0: + resolution: + { + integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==, + } + engines: { node: '>=8.0.0' } + dependencies: + fancy-test: 1.4.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@octokit/auth-token@2.5.0: + resolution: + { + integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, + } + dependencies: + '@octokit/types': 6.41.0 + dev: true + + /@octokit/auth-token@3.0.4: + resolution: + { + integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==, + } + engines: { node: '>= 14' } + dev: true + + /@octokit/core@3.6.0: + resolution: + { + integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, + } + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/core@4.2.4: + resolution: + { + integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@6.0.12: + resolution: + { + integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, + } + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/endpoint@7.0.6: + resolution: + { + integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql@4.8.0: + resolution: + { + integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, + } + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/graphql@5.0.6: + resolution: + { + integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@12.11.0: + resolution: + { + integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, + } + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: + { + integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==, + } + dev: true + + /@octokit/plugin-enterprise-rest@6.0.1: + resolution: + { + integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, + } + dev: true + + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, + } + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==, + } + engines: { node: '>= 14' } + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==, + } + engines: { node: '>= 14' } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@2.1.0: + resolution: + { + integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, + } + dependencies: + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: + { + integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@5.6.3: + resolution: + { + integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, + } + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/request@6.2.8: + resolution: + { + integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@18.12.0: + resolution: + { + integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==, + } + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.11: + resolution: + { + integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: + { + integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==, + } + dev: true + + /@octokit/types@10.0.0: + resolution: + { + integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==, + } + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@octokit/types@6.41.0: + resolution: + { + integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, + } + dependencies: + '@octokit/openapi-types': 12.11.0 + dev: true + + /@octokit/types@9.3.2: + resolution: + { + integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==, + } + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@parcel/watcher@2.0.4: + resolution: + { + integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==, + } + engines: { node: '>= 10.0.0' } + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.6.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } + requiresBuild: true optional: true - dependencies: - '@babel/core': 7.18.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.0.2 - yargs-parser: 21.1.1 - dev: true - - /ts-json-schema-generator@0.93.0: - resolution: {integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - '@types/json-schema': 7.0.12 - commander: 7.2.0 - fast-json-stable-stringify: 2.1.0 - glob: 7.2.3 - json-stable-stringify: 1.0.2 - typescript: 4.3.5 - dev: true - - /ts-loader@9.4.2(typescript@5.0.2)(webpack@5.88.2): - resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.2 - typescript: 5.0.2 - webpack: 5.88.2 - dev: true - - /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': + + /@salesforce/apex-node@2.1.0: + resolution: + { + integrity: sha512-W7OcqcBNHhf2wQMiPWOx/MED7ao1ZlML4vX5+A6hMDZTCZ5g34rj5wwVUQFOOAxHnS5F8jQUU5VpxpKo01jrTQ==, + } + engines: { node: '>=16.13.0' } + dependencies: + '@salesforce/core': 5.3.9 + '@types/istanbul-reports': 3.0.1 + faye: 1.4.0 + glob: 8.1.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/core@5.3.9: + resolution: + { + integrity: sha512-/HX0PiXq3Sjc5eVJ0EaYetcDGsKU9O9Nj8jFGw5qYlITx8zogfxc0j07liH67tQXS1KbTysYoj/MQ2zbHSNkPA==, + } + engines: { node: '>=16.0.0' } + dependencies: + '@salesforce/kit': 3.0.13 + '@salesforce/schemas': 1.6.0 + '@salesforce/ts-types': 2.0.8 + '@types/semver': 7.5.3 + ajv: 8.12.0 + change-case: 4.1.2 + faye: 1.4.0 + form-data: 4.0.0 + js2xmlparser: 4.0.2 + jsforce: 2.0.0-beta.27 + jsonwebtoken: 9.0.2 + jszip: 3.10.1 + pino: 8.16.0 + pino-abstract-transport: 1.1.0 + pino-pretty: 10.2.3 + proper-lockfile: 4.1.2 + semver: 7.5.4 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/dev-config@3.0.1: + resolution: + { + integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==, + } + dev: true + + /@salesforce/kit@3.0.13: + resolution: + { + integrity: sha512-HLQ5L5bBi0tsMeH5ZHJAhHUpvNUNPQoNJt2O82Jf6C60GGsrlzwzQ5ONAHGNBgKSZ7HLr0UGL5xaA+hE9uOcgw==, + } + dependencies: + '@salesforce/ts-types': 2.0.8 + tslib: 2.6.2 + dev: false + + /@salesforce/packaging@2.3.3(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-gGxN4FA5mX85B6960sUOrUz9KYAC7Iw5GXPYV/0YoBSU4M42I0V4pgWcOQOiRwW8gbe8wpSKB/Ccv6NSjNCuBQ==, + } + engines: { node: '>=16.0.0' } + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/schemas': 1.6.0 + '@salesforce/source-deploy-retrieve': 9.7.24 + '@salesforce/ts-types': 2.0.7 + fast-xml-parser: 4.2.7 + globby: 11.1.0 + graphology: 0.25.4(graphology-types@0.24.7) + graphology-traversal: 0.3.1(graphology-types@0.24.7) + graphology-types: 0.24.7 + jsforce: 2.0.0-beta.27 + jszip: 3.10.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - encoding + - supports-color + - typescript + dev: false + + /@salesforce/schemas@1.6.0: + resolution: + { + integrity: sha512-SwhDTLucj/GRbPpxlEoDZeqlX22o+G6fiebTXTu1cZKmd1oE0W2L7SlTTgJnWck8bhTeBIgQi9cpD8c2t5ISKA==, + } + dev: false + + /@salesforce/source-deploy-retrieve@9.7.24: + resolution: + { + integrity: sha512-nkP9KgzuCoV6LtdDxgxt7KRnoQ6ZS12DJgXErCBXm7Swmr0dnbo1LhxrH05C4UFFe0JuvSta+u+Oor8jxSGaCQ==, + } + engines: { node: '>=16.0.0' } + dependencies: + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/ts-types': 2.0.7 + fast-levenshtein: 3.0.0 + fast-xml-parser: 4.3.2 + got: 11.8.6 + graceful-fs: 4.2.11 + ignore: 5.2.4 + jszip: 3.10.1 + mime: 2.6.0 + minimatch: 5.1.6 + proxy-agent: 6.3.1 + unzipper: 0.10.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/source-tracking@4.2.16: + resolution: + { + integrity: sha512-HAuLaY+RrdKvWjx9FVYMrYlIUW4JyQtF/TA5hbDpy4Rw8IUOgrYyt+IaoiAAtMyRqU8En8fJBUqiq4qFvhdpCA==, + } + engines: { node: '>=16.0.0' } + dependencies: + '@salesforce/core': 5.3.9 + '@salesforce/kit': 3.0.13 + '@salesforce/source-deploy-retrieve': 9.7.24 + '@salesforce/ts-types': 2.0.8 + fast-xml-parser: 4.2.7 + graceful-fs: 4.2.11 + isomorphic-git: 1.23.0 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/ts-sinon@1.3.21: + resolution: + { + integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==, + } + dependencies: + '@salesforce/ts-types': 1.7.3 + sinon: 5.1.1 + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@1.7.3: + resolution: + { + integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==, + } + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.5: + resolution: + { + integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.7: + resolution: + { + integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + + /@salesforce/ts-types@2.0.8: + resolution: + { + integrity: sha512-vuzLcxtThBhpuhmnoh8GFrVU8XjdoNyQm9gPtmcjUyUD/9nQIBTAX8oGoUvCiiq93c4LFEmSua+xm3yu0bbNfg==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + dev: false + + /@sigstore/bundle@1.0.0: + resolution: + { + integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + dev: true + + /@sigstore/protobuf-specs@0.2.0: + resolution: + { + integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@sigstore/tuf@1.0.3: + resolution: + { + integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + dev: true + + /@sindresorhus/is@4.6.0: + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: '>=10' } + + /@sinonjs/commons@1.8.6: + resolution: + { + integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@2.0.0: + resolution: + { + integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: + { + integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: + { + integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, + } + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/fake-timers@7.1.2: + resolution: + { + integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/formatio@2.0.0: + resolution: + { + integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==, + } + dependencies: + samsam: 1.3.0 + dev: true + + /@sinonjs/formatio@3.2.2: + resolution: + { + integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam': 3.3.3 + dev: true + + /@sinonjs/samsam@3.3.3: + resolution: + { + integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + array-from: 2.1.1 + lodash: 4.17.21 + dev: true + + /@sinonjs/samsam@6.1.3: + resolution: + { + integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: + { + integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, + } + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: + { + integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, + } + engines: { node: '>=10' } + dependencies: + defer-to-connect: 2.0.1 + + /@tootallnate/once@1.1.2: + resolution: + { + integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, + } + engines: { node: '>= 6' } + dev: true + + /@tootallnate/once@2.0.0: + resolution: + { + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + } + engines: { node: '>= 10' } + dev: true + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: + { + integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, + } + dev: false + + /@tsconfig/node10@1.0.9: + resolution: + { + integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, + } + + /@tsconfig/node12@1.0.11: + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } + + /@tsconfig/node14@1.0.3: + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } + + /@tsconfig/node16@1.0.4: + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } + + /@tufjs/canonical-json@1.0.0: + resolution: + { + integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@tufjs/models@1.0.4: + resolution: + { + integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.3 + dev: true + + /@types/adm-zip@0.4.33: + resolution: + { + integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/async-retry@1.4.2: + resolution: + { + integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==, + } + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/async-retry@1.4.5: + resolution: + { + integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==, + } + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/babel__core@7.20.1: + resolution: + { + integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==, + } + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: + { + integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, + } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/babel__template@7.4.1: + resolution: + { + integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, + } + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: + { + integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==, + } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: + { + integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, + } + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 14.14.7 + '@types/responselike': 1.0.0 + + /@types/chai@4.3.5: + resolution: + { + integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==, + } + dev: true + + /@types/cli-progress@3.11.0: + resolution: + { + integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/datadog-metrics@0.6.1: + resolution: + { + integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==, + } + dev: true + + /@types/diff-match-patch@1.0.32: + resolution: + { + integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==, + } + dev: true + + /@types/eslint-scope@3.7.4: + resolution: + { + integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==, + } + dependencies: + '@types/eslint': 8.44.0 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.0: + resolution: + { + integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==, + } + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.1: + resolution: + { + integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, + } + dev: true + + /@types/expect@1.20.4: + resolution: + { + integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==, + } + dev: true + + /@types/fs-extra@11.0.4: + resolution: + { + integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==, + } + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 14.14.7 + dev: true + + /@types/fs-extra@9.0.11: + resolution: + { + integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==, + } + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/glob@8.1.0: + resolution: + { + integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==, + } + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 14.14.7 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: + { + integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/http-cache-semantics@4.0.1: + resolution: + { + integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, + } + + /@types/istanbul-lib-coverage@2.0.4: + resolution: + { + integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, + } + + /@types/istanbul-lib-report@3.0.0: + resolution: + { + integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, + } + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + + /@types/istanbul-reports@3.0.1: + resolution: + { + integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, + } + dependencies: + '@types/istanbul-lib-report': 3.0.0 + + /@types/jest@29.5.3: + resolution: + { + integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==, + } + dependencies: + expect: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /@types/js-yaml@4.0.5: + resolution: + { + integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==, + } + dev: true + + /@types/json-schema@7.0.12: + resolution: + { + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + } + dev: true + + /@types/jsonfile@6.1.4: + resolution: + { + integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/keyv@3.1.4: + resolution: + { + integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/lodash@4.14.191: + resolution: + { + integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==, + } + dev: true + + /@types/lodash@4.14.195: + resolution: + { + integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==, + } + dev: true + + /@types/marked@4.0.2: + resolution: + { + integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==, + } + dev: true + + /@types/minimatch@3.0.5: + resolution: + { + integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, + } + dev: true + + /@types/minimatch@5.1.2: + resolution: + { + integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, + } + dev: true + + /@types/minimist@1.2.2: + resolution: + { + integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, + } + dev: true + + /@types/mocha@5.2.7: + resolution: + { + integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==, + } + dev: true + + /@types/mocha@9.1.0: + resolution: + { + integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==, + } + dev: true + + /@types/node@10.0.0: + resolution: + { + integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==, + } + dev: true + + /@types/node@12.20.55: + resolution: + { + integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, + } + dev: false + + /@types/node@14.14.7: + resolution: + { + integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==, + } + + /@types/node@15.14.9: + resolution: + { + integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==, + } + dev: true + + /@types/node@20.4.4: + resolution: + { + integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==, + } + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: + { + integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, + } + dev: true + + /@types/parse-json@4.0.0: + resolution: + { + integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, + } + dev: true + + /@types/prettier@2.7.3: + resolution: + { + integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, + } + dev: true + + /@types/q@1.5.2: + resolution: + { + integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==, + } + dev: true + + /@types/responselike@1.0.0: + resolution: + { + integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/retry@0.12.2: + resolution: + { + integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, + } + dev: true + + /@types/rimraf@3.0.2: + resolution: + { + integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==, + } + dependencies: + '@types/glob': 8.1.0 + '@types/node': 14.14.7 + dev: true + + /@types/semver@7.5.2: + resolution: + { + integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, + } + dev: true + + /@types/semver@7.5.3: + resolution: + { + integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==, + } + dev: false + + /@types/sinon@10.0.15: + resolution: + { + integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==, + } + dependencies: + '@types/sinonjs__fake-timers': 8.1.2 + dev: true + + /@types/sinonjs__fake-timers@8.1.2: + resolution: + { + integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==, + } + dev: true + + /@types/stack-utils@2.0.1: + resolution: + { + integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, + } + dev: true + + /@types/vinyl@2.0.7: + resolution: + { + integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==, + } + dependencies: + '@types/expect': 1.20.4 + '@types/node': 14.14.7 + dev: true + + /@types/xml2js@0.4.5: + resolution: + { + integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==, + } + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: + { + integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, + } + dev: true + + /@types/yargs@17.0.24: + resolution: + { + integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==, + } + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.53.0: + resolution: + { + integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.53.0: + resolution: + { + integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): + resolution: + { + integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.2 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + eslint: 8.33.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.33.0) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.53.0: + resolution: + { + integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: + { + integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==, + } + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: + { + integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + } + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: + { + integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + } + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: + { + integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==, + } + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: + { + integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + } + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: + { + integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + } + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: + { + integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: + { + integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + } + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: + { + integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + } + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: + { + integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + } + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: + { + integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: + { + integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: + { + integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: + { + integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: + { + integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } + dev: true + + /@xtuc/long@4.2.2: + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: + { + integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, + } + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: + { + integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==, + } + engines: { node: '>=14.15.0' } + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: + { + integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /JSONStream@1.3.5: + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abbrev@1.1.1: + resolution: + { + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, + } + dev: true + + /abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: '>=6.5' } + dependencies: + event-target-shim: 5.0.1 + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: + { + integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, + } + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: '>=0.4.0' } + + /acorn@8.10.0: + resolution: + { + integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, + } + engines: { node: '>=0.4.0' } + hasBin: true + + /add-stream@1.0.0: + resolution: + { + integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, + } + dev: true + + /adm-zip@0.5.10: + resolution: + { + integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==, + } + engines: { node: '>=6.0' } + dev: false + + /agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: '>= 6.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agent-base@7.1.0: + resolution: + { + integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, + } + engines: { node: '>= 14' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /agentkeepalive@4.3.0: + resolution: + { + integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==, + } + engines: { node: '>= 8.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: '>=8' } + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.11.0: + resolution: + { + integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-colors@4.1.3: + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } + dev: true + + /ansi-escapes@3.2.0: + resolution: + { + integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, + } + engines: { node: '>=4' } + + /ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } + dependencies: + type-fest: 0.21.3 + + /ansi-escapes@5.0.0: + resolution: + { + integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, + } + engines: { node: '>=12' } + dependencies: + type-fest: 1.4.0 + dev: false + + /ansi-regex@2.1.1: + resolution: + { + integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ansi-regex@3.0.1: + resolution: + { + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, + } + engines: { node: '>=4' } + dev: true + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } + + /ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: '>=12' } + + /ansi-styles@2.2.1: + resolution: + { + integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } + dev: true + + /ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } + + /ansicolors@0.3.2: + resolution: + { + integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, + } + + /antlr4ts@0.5.0-alpha.4: + resolution: + { + integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==, + } + dev: false + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /apex-parser@2.13.0: + resolution: + { + integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==, + } + engines: { node: '>=8.0.0' } + dependencies: + antlr4ts: 0.5.0-alpha.4 + node-dir: 0.1.17 + dev: false + + /aproba@2.0.0: + resolution: + { + integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, + } + dev: true + + /are-we-there-yet@2.0.0: + resolution: + { + integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, + } + engines: { node: '>=10' } + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /are-we-there-yet@3.0.1: + resolution: + { + integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } + + /argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-differ@3.0.0: + resolution: + { + integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, + } + engines: { node: '>=8' } + dev: true + + /array-from@2.1.1: + resolution: + { + integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, + } + dev: true + + /array-ify@1.0.0: + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } + dev: true + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: '>=8' } + + /arrify@1.0.1: + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /arrify@2.0.1: + resolution: + { + integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, + } + engines: { node: '>=8' } + dev: true + + /asap@2.0.6: + resolution: + { + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, + } + + /ast-types@0.13.4: + resolution: + { + integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, + } + engines: { node: '>=4' } + dependencies: + tslib: 2.1.0 + dev: false + + /astral-regex@2.0.0: + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: '>=8' } + + /async-lock@1.4.0: + resolution: + { + integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==, + } + dev: false + + /async-retry@1.3.3: + resolution: + { + integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, + } + dependencies: + retry: 0.13.1 + dev: false + + /async@3.2.4: + resolution: + { + integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, + } + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + /at-least-node@1.0.0: + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: '>= 4.0.0' } + + /atomic-sleep@1.0.0: + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: '>=8.0.0' } + dev: false + + /available-typed-arrays@1.0.5: + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + } + engines: { node: '>= 0.4' } + dev: true + + /aws-sdk@2.1421.0: + resolution: + { + integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==, + } + engines: { node: '>= 10.0.0' } + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: 0.12.5 + uuid: 8.0.0 + xml2js: 0.5.0 + dev: true + + /axios@1.4.0: + resolution: + { + integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, + } + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /babel-jest@29.6.1(@babel/core@7.18.2): + resolution: + { + integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.18.2 + '@jest/transform': 29.6.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0(@babel/core@7.18.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + } + engines: { node: '>=8' } + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.5.0: + resolution: + { + integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): + resolution: + { + integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, + } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.18.2): + resolution: + { + integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + dev: true + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + /base64url@3.0.1: + resolution: + { + integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, + } + engines: { node: '>=6.0.0' } + dev: false + + /basic-ftp@5.0.3: + resolution: + { + integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, + } + engines: { node: '>=10.0.0' } + dev: false + + /before-after-hook@2.2.3: + resolution: + { + integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, + } + dev: true + + /better-sqlite3@8.4.0: + resolution: + { + integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, + } + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + + /big-integer@1.6.51: + resolution: + { + integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, + } + engines: { node: '>=0.6' } + dev: false + + /bignumber.js@9.1.1: + resolution: + { + integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==, + } + dev: false + + /bin-links@3.0.3: + resolution: + { + integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + cmd-shim: 5.0.0 + mkdirp-infer-owner: 2.0.0 + npm-normalize-package-bin: 2.0.0 + read-cmd-shim: 3.0.1 + rimraf: 3.0.2 + write-file-atomic: 4.0.2 + dev: true + + /binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: '>=8' } + dev: true + + /binary@0.3.0: + resolution: + { + integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, + } + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + dev: false + + /binaryextensions@4.18.0: + resolution: + { + integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==, + } + engines: { node: '>=0.8' } + dev: true + + /bindings@1.5.0: + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bluebird@3.4.7: + resolution: + { + integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, + } + dev: false + + /bottleneck@2.19.5: + resolution: + { + integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, + } + dev: false + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: '>=8' } + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.9: + resolution: + { + integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.469 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + + /bs-logger@0.2.6: + resolution: + { + integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, + } + engines: { node: '>= 6' } + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + } + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: + { + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, + } + dev: false + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer-indexof-polyfill@1.0.2: + resolution: + { + integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, + } + engines: { node: '>=0.10' } + dev: false + + /buffer@4.9.2: + resolution: + { + integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffers@0.1.1: + resolution: + { + integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, + } + engines: { node: '>=0.2.0' } + dev: false + + /builtins@1.0.3: + resolution: + { + integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, + } + dev: true + + /builtins@5.0.1: + resolution: + { + integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, + } + dependencies: + semver: 7.5.2 + dev: true + + /byte-size@8.1.1: + resolution: + { + integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, + } + engines: { node: '>=12.17' } + dev: true + + /cacache@15.3.0: + resolution: + { + integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==, + } + engines: { node: '>= 10' } + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@16.1.3: + resolution: + { + integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.15 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.3: + resolution: + { + integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacheable-lookup@5.0.4: + resolution: + { + integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, + } + engines: { node: '>=10.6.0' } + + /cacheable-request@7.0.4: + resolution: + { + integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, + } + engines: { node: '>=8' } + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.3 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-bind@1.0.2: + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } + dev: true + + /camel-case@4.1.2: + resolution: + { + integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + } + dependencies: + pascal-case: 3.1.2 + tslib: 2.1.0 + dev: false + + /camelcase-keys@6.2.2: + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: '>=8' } + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } + dev: true + + /camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } + dev: true + + /caniuse-lite@1.0.30001517: + resolution: + { + integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==, + } + dev: true + + /capital-case@1.0.4: + resolution: + { + integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /cardinal@2.1.1: + resolution: + { + integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, + } + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + /chainsaw@0.1.0: + resolution: + { + integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, + } + dependencies: + traverse: 0.3.9 + dev: false + + /chalk@1.1.3: + resolution: + { + integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.0: + resolution: + { + integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: false + + /change-case@4.1.2: + resolution: + { + integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==, + } + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /char-regex@1.0.2: + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: '>=10' } + dev: true + + /chardet@0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: '>= 8.10.0' } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /chownr@2.0.0: + resolution: + { + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + } + engines: { node: '>=10' } + + /chrome-trace-event@1.0.3: + resolution: + { + integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, + } + engines: { node: '>=6.0' } + dev: true + + /ci-info@3.8.0: + resolution: + { + integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, + } + engines: { node: '>=8' } + dev: true + + /cjs-module-lexer@1.2.3: + resolution: + { + integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==, + } + dev: true + + /clean-git-ref@2.0.1: + resolution: + { + integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==, + } + dev: false + + /clean-stack@2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: '>=6' } + dev: true + + /clean-stack@3.0.1: + resolution: + { + integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==, + } + engines: { node: '>=10' } + dependencies: + escape-string-regexp: 4.0.0 + + /cli-boxes@1.0.0: + resolution: + { + integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /cli-cursor@2.1.0: + resolution: + { + integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, + } + engines: { node: '>=4' } + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: '>=8' } + dependencies: + restore-cursor: 3.1.0 + + /cli-progress@3.12.0: + resolution: + { + integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==, + } + engines: { node: '>=4' } + dependencies: + string-width: 4.2.3 + + /cli-spinners@2.6.1: + resolution: + { + integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, + } + engines: { node: '>=6' } + dev: true + + /cli-spinners@2.9.0: + resolution: + { + integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==, + } + engines: { node: '>=6' } + dev: true + + /cli-table3@0.6.3: + resolution: + { + integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, + } + engines: { node: 10.* || >= 12.* } + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: false + + /cli-table@0.3.11: + resolution: + { + integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==, + } + engines: { node: '>= 0.2.0' } + dependencies: + colors: 1.0.3 + + /cli-ux@5.6.7(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + '@oclif/screen': 1.0.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + extract-stack: 2.0.0 + fs-extra: 8.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + dev: true + + /cli-width@3.0.0: + resolution: + { + integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, + } + engines: { node: '>= 10' } + + /cliui@7.0.4: + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: + { + integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, + } + engines: { node: '>= 0.10' } + dev: true + + /clone-deep@4.0.1: + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: '>=6' } + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-response@1.0.3: + resolution: + { + integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, + } + dependencies: + mimic-response: 1.0.1 + + /clone-stats@1.0.0: + resolution: + { + integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, + } + dev: true + + /clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: '>=0.8' } + dev: true + + /clone@2.1.2: + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: '>=0.8' } + + /cloneable-readable@1.1.3: + resolution: + { + integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, + } + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /cmd-shim@5.0.0: + resolution: + { + integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + mkdirp-infer-owner: 2.0.0 + dev: true + + /cmd-shim@6.0.1: + resolution: + { + integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /co@4.6.0: + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } + dev: true + + /code-point-at@1.1.0: + resolution: + { + integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /collect-v8-coverage@1.0.2: + resolution: + { + integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, + } + dev: true + + /color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + dev: true + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /color-support@1.1.3: + resolution: + { + integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, + } + hasBin: true + dev: true + + /colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + dev: false + + /colors@1.0.3: + resolution: + { + integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==, + } + engines: { node: '>=0.1.90' } + + /columnify@1.6.0: + resolution: + { + integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, + } + engines: { node: '>=8.0.0' } + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + dev: true + + /commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } + dev: false + + /commander@7.1.0: + resolution: + { + integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==, + } + engines: { node: '>= 10' } + dev: true + + /commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: '>= 10' } + dev: true + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /common-ancestor-path@1.0.1: + resolution: + { + integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, + } + dev: true + + /commondir@1.0.1: + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } + dev: true + + /compare-func@2.0.0: + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + requiresBuild: true + + /concat-stream@2.0.0: + resolution: + { + integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, + } + engines: { '0': node >= 6.0 } + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: + { + integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==, + } + engines: { node: ^12.20.0 || ^14.13.0 || >=16.0.0 } + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /console-control-strings@1.1.0: + resolution: + { + integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, + } + dev: true + + /constant-case@3.0.4: + resolution: + { + integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case: 2.0.2 + dev: false + + /content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: + { + integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, + } + engines: { node: '>=10' } + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@6.0.0: + resolution: + { + integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==, + } + engines: { node: '>=14' } + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: + { + integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, + } + engines: { node: '>=10' } + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@5.0.1: + resolution: + { + integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, + } + engines: { node: '>=14' } + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: true + + /conventional-changelog-preset-loader@3.0.0: + resolution: + { + integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, + } + engines: { node: '>=14' } + dev: true + + /conventional-changelog-writer@6.0.1: + resolution: + { + integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.2 + split: 1.0.1 + dev: true + + /conventional-commits-filter@3.0.0: + resolution: + { + integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, + } + engines: { node: '>=14' } + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: + { + integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: + { + integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: + { + integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: true + + /convert-source-map@1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + dev: true + + /convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + dev: true + + /core-js-pure@3.31.1: + resolution: + { + integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==, + } + requiresBuild: true + dev: false + + /core-js@3.31.1: + resolution: + { + integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==, + } + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + /cosmiconfig@7.1.0: + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.2.0: + resolution: + { + integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==, + } + engines: { node: '>=14' } + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /crc-32@1.2.2: + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: '>=0.8' } + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } + + /cross-spawn@6.0.5: + resolution: + { + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, + } + engines: { node: '>=4.8' } + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: '>= 8' } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /csprng@0.1.2: + resolution: + { + integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==, + } + engines: { node: '>=0.6.0' } + dependencies: + sequin: 0.1.1 + dev: false + + /csv-parse@4.16.3: + resolution: + { + integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, + } + dev: false + + /csv-stringify@5.6.5: + resolution: + { + integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, + } + dev: false + + /dargs@7.0.0: + resolution: + { + integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + } + engines: { node: '>=8' } + dev: true + + /data-uri-to-buffer@5.0.1: + resolution: + { + integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==, + } + engines: { node: '>= 14' } + dev: false + + /datadog-metrics@0.9.3: + resolution: + { + integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==, + } + dependencies: + debug: 3.1.0 + dogapi: 2.8.4 + transitivePeerDependencies: + - supports-color + dev: false + + /date-fns@2.30.0: + resolution: + { + integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, + } + engines: { node: '>=0.11' } + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /dateformat@3.0.3: + resolution: + { + integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, + } + dev: true + + /dateformat@4.6.3: + resolution: + { + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, + } + + /debug@3.1.0: + resolution: + { + integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, + } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /debuglog@1.0.1: + resolution: + { + integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==, + } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /decamelize-keys@1.1.1: + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: '>=0.10.0' } + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: '>=10' } + dependencies: + mimic-response: 3.1.0 + + /dedent@0.7.0: + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: '>=4.0.0' } + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + dev: true + + /deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: '>=0.10.0' } + dev: true + + /defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: '>=10' } + + /define-lazy-prop@2.0.0: + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } + dev: true + + /degenerator@5.0.1: + resolution: + { + integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, + } + engines: { node: '>= 14' } + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } + + /delegates@1.0.0: + resolution: + { + integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, + } + dev: true + + /depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } + dev: true + + /deprecation@2.3.1: + resolution: + { + integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, + } + dev: true + + /detect-indent@5.0.0: + resolution: + { + integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, + } + engines: { node: '>=4' } + dev: true + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: '>=8' } + dev: false + + /detect-newline@3.1.0: + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: '>=8' } + dev: true + + /dezalgo@1.0.4: + resolution: + { + integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==, + } + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-match-patch@1.0.5: + resolution: + { + integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, + } + dev: false + + /diff-sequences@29.4.3: + resolution: + { + integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /diff3@0.0.3: + resolution: + { + integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==, + } + dev: false + + /diff@3.5.0: + resolution: + { + integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, + } + engines: { node: '>=0.3.1' } + dev: true + + /diff@4.0.2: + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } + + /diff@5.1.0: + resolution: + { + integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, + } + engines: { node: '>=0.3.1' } + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: '>=8' } + dependencies: + path-type: 4.0.0 + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: '>=6.0.0' } + dependencies: + esutils: 2.0.3 + dev: true + + /dogapi@2.8.4: + resolution: + { + integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==, + } + hasBin: true + dependencies: + extend: 3.0.2 + json-bigint: 1.0.0 + lodash: 4.17.21 + minimist: 1.2.8 + rc: 1.2.8 + dev: false + + /dot-case@3.0.4: + resolution: + { + integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /dot-prop@5.3.0: + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: '>=8' } + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv@10.0.0: + resolution: + { + integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, + } + engines: { node: '>=10' } + dev: true + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: '>=12' } + dev: false + + /duplexer2@0.1.4: + resolution: + { + integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, + } + dependencies: + readable-stream: 2.3.8 + dev: false + + /duplexer@0.1.2: + resolution: + { + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, + } + dev: true + + /eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + /ecdsa-sig-formatter@1.0.11: + resolution: + { + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ejs@3.1.9: + resolution: + { + integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, + } + engines: { node: '>=0.10.0' } + hasBin: true + dependencies: + jake: 10.8.7 + + /electron-to-chromium@1.4.469: + resolution: + { + integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==, + } + dev: true + + /emittery@0.13.1: + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + } + engines: { node: '>=12' } + dev: true + + /emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + /emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + /encoding@0.1.13: + resolution: + { + integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, + } + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true optional: true - '@swc/wasm': + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + + /enhanced-resolve@5.15.0: + resolution: + { + integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, + } + engines: { node: '>=10.13.0' } + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: + { + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, + } + engines: { node: '>=8.6' } + dependencies: + ansi-colors: 4.1.3 + dev: true + + /env-paths@2.2.1: + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: '>=6' } + dev: true + + /envinfo@7.8.1: + resolution: + { + integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==, + } + engines: { node: '>=4' } + hasBin: true + dev: true + + /err-code@2.0.3: + resolution: + { + integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, + } + dev: true + + /error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error@10.4.0: + resolution: + { + integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==, + } + dev: true + + /es-module-lexer@1.3.0: + resolution: + { + integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==, + } + dev: true + + /escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: '>=6' } + dev: true + + /escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } + + /escape-string-regexp@2.0.0: + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + } + engines: { node: '>=8' } + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } + + /escodegen@2.1.0: + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + } + engines: { node: '>=6.0' } + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-scope@5.1.1: + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: '>=8.0.0' } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.1: + resolution: + { + integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.33.0): + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: '>=10' } + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: + { + integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /eslint@8.33.0: + resolution: + { + integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.1 + eslint-utils: 3.0.0(eslint@8.33.0) + eslint-visitor-keys: 3.4.1 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.2 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: true + + /esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } + hasBin: true + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: '>=0.10' } + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: '>=4.0' } + dev: true + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } + + /esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } + + /event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: '>=6' } + + /eventemitter3@4.0.7: + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } + dev: true + + /events@1.1.1: + resolution: + { + integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==, + } + engines: { node: '>=0.4.x' } + dev: true + + /events@3.3.0: + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: '>=0.8.x' } + + /execa@5.0.0: + resolution: + { + integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, + } + engines: { node: '>=10' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execution-time@1.4.1: + resolution: + { + integrity: sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==, + } + dependencies: + pretty-hrtime: 1.0.3 + dev: true + + /exit@0.1.2: + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + } + engines: { node: '>= 0.8.0' } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: '>=6' } + dev: false + + /expect@29.6.1: + resolution: + { + integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/expect-utils': 29.6.1 + '@types/node': 14.14.7 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + dev: true + + /exponential-backoff@3.1.1: + resolution: + { + integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==, + } + dev: true + + /extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + dev: false + + /external-editor@3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: '>=4' } + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + /extract-stack@2.0.0: + resolution: + { + integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==, + } + engines: { node: '>=8' } + dev: true + + /fancy-test@1.4.10: + resolution: + { + integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==, + } + engines: { node: '>=8.0.0' } + dependencies: + '@types/chai': 4.3.5 + '@types/lodash': 4.14.195 + '@types/node': 14.14.7 + '@types/sinon': 10.0.15 + lodash: 4.17.21 + mock-stdin: 1.0.0 + nock: 13.3.2 + stdout-stderr: 0.1.13 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-copy@3.0.1: + resolution: + { + integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==, + } + dev: false + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.2.7: + resolution: + { + integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==, + } + engines: { node: '>=8' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-glob@3.3.1: + resolution: + { + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + } + engines: { node: '>=8.6.0' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + dev: true + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + dev: true + + /fast-levenshtein@3.0.0: + resolution: + { + integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==, + } + dependencies: + fastest-levenshtein: 1.0.16 + + /fast-redact@3.3.0: + resolution: + { + integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==, + } + engines: { node: '>=6' } + dev: false + + /fast-safe-stringify@2.1.1: + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } + dev: false + + /fast-xml-parser@4.2.7: + resolution: + { + integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==, + } + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fast-xml-parser@4.3.2: + resolution: + { + integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==, + } + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fastest-levenshtein@1.0.16: + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: '>= 4.9.1' } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: '>=0.8.0' } + dependencies: + websocket-driver: 0.7.4 + dev: false + + /faye@1.4.0: + resolution: + { + integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==, + } + engines: { node: '>=0.8.0' } + dependencies: + asap: 2.0.6 + csprng: 0.1.2 + faye-websocket: 0.11.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + dev: false + + /fb-watchman@2.0.2: + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + } + dependencies: + bser: 2.1.1 + dev: true + + /figures@3.2.0: + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: '>=8' } + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + dev: false + + /filelist@1.0.4: + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + } + dependencies: + minimatch: 5.1.6 + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: '>=8' } + dependencies: + to-regex-range: 5.0.1 + + /find-java-home@2.0.0: + resolution: + { + integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==, + } + dependencies: + which: 1.0.9 + winreg: 1.2.4 + dev: false + + /find-up@2.1.0: + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: '>=4' } + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /find-yarn-workspace-root@2.0.0: + resolution: + { + integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, + } + dependencies: + micromatch: 4.0.5 + dev: true + + /first-chunk-stream@2.0.0: + resolution: + { + integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==, + } + engines: { node: '>=0.10.0' } + dependencies: + readable-stream: 2.3.8 + dev: true + + /flat-cache@3.0.4: + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } + hasBin: true + dev: true + + /flatted@3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + dev: true + + /follow-redirects@1.15.2: + resolution: + { + integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, + } + engines: { node: '>=4.0' } + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + } + engines: { node: '>=14' } + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: '>= 6' } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + + /fs-extra@10.1.0: + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.0: + resolution: + { + integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, + } + engines: { node: '>=14.14' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra@11.1.1: + resolution: + { + integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, + } + engines: { node: '>=14.14' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@7.0.1: + resolution: + { + integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, + } + engines: { node: '>=6 <7 || >=8' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: '>=6 <7 || >=8' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@9.1.0: + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: '>=10' } + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: + { + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + + /fs-minipass@3.0.2: + resolution: + { + integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.2: + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': + + /fstream@1.0.12: + resolution: + { + integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, + } + engines: { node: '>=0.6' } + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: false + + /function-bind@1.1.1: + resolution: + { + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + } + dev: true + + /gauge@3.0.2: + resolution: + { + integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, + } + engines: { node: '>=10' } + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gauge@4.0.4: + resolution: + { + integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } + dev: true + + /get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + dev: true + + /get-intrinsic@1.2.1: + resolution: + { + integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, + } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-package-type@0.1.0: + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + } + engines: { node: '>=8.0.0' } + + /get-pkg-repo@4.2.1: + resolution: + { + integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, + } + engines: { node: '>=6.9.0' } + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port@5.1.1: + resolution: + { + integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, + } + engines: { node: '>=8' } + dev: true + + /get-stdin@4.0.1: + resolution: + { + integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /get-stream@5.2.0: + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: '>=8' } + dependencies: + pump: 3.0.0 + + /get-stream@6.0.0: + resolution: + { + integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, + } + engines: { node: '>=10' } + dev: true + + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } + dev: true + + /get-uri@6.0.1: + resolution: + { + integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==, + } + engines: { node: '>= 14' } + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /git-raw-commits@2.0.11: + resolution: + { + integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-raw-commits@3.0.0: + resolution: + { + integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: + { + integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, + } + engines: { node: '>=4' } + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@5.0.1: + resolution: + { + integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.5.2 + dev: true + + /git-up@7.0.0: + resolution: + { + integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, + } + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: + { + integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==, + } + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: + { + integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, + } + dependencies: + ini: 1.3.8 + dev: true + + /github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + dev: false + + /github-slugger@1.5.0: + resolution: + { + integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, + } + dev: true + + /github-username@6.0.0: + resolution: + { + integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==, + } + engines: { node: '>=10' } + dependencies: + '@octokit/rest': 18.12.0 + transitivePeerDependencies: + - encoding + dev: true + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@10.3.3: + resolution: + { + integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==, + } + engines: { node: '>=16 || 14 >=14.17' } + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@7.1.4: + resolution: + { + integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: '>=12' } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /glob@9.3.5: + resolution: + { + integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + + /global-dirs@0.1.1: + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: '>=4' } + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: '>=4' } + dev: true + + /globals@13.20.0: + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: '>=8' } + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: '>=10' } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /got@11.8.6: + resolution: + { + integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, + } + engines: { node: '>=10.19.0' } + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + /grapheme-splitter@1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } + dev: true + + /graphology-indices@0.17.0(graphology-types@0.24.7): + resolution: + { + integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==, + } + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + mnemonist: 0.39.5 + dev: false + + /graphology-traversal@0.3.1(graphology-types@0.24.7): + resolution: + { + integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==, + } + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-indices: 0.17.0(graphology-types@0.24.7) + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + dev: false + + /graphology-types@0.24.7: + resolution: + { + integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==, + } + dev: false + + /graphology-utils@2.5.2(graphology-types@0.24.7): + resolution: + { + integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==, + } + peerDependencies: + graphology-types: '>=0.23.0' + dependencies: + graphology-types: 0.24.7 + dev: false + + /graphology@0.25.4(graphology-types@0.24.7): + resolution: + { + integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==, + } + peerDependencies: + graphology-types: '>=0.24.0' + dependencies: + events: 3.3.0 + graphology-types: 0.24.7 + obliterator: 2.0.4 + dev: false + + /grouped-queue@2.0.0: + resolution: + { + integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==, + } + engines: { node: '>=8.0.0' } + dev: true + + /handlebars@4.7.7: + resolution: + { + integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, + } + engines: { node: '>=0.4.7' } + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + /hard-rejection@2.1.0: + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: '>=6' } + dev: true + + /has-ansi@2.0.0: + resolution: + { + integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } + + /has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: '>= 0.4' } + dev: true + + /has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: '>= 0.4' } + dev: true + + /has-tostringtag@1.0.0: + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + } + engines: { node: '>= 0.4' } + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: + { + integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, + } + dev: true + + /has@1.0.3: + resolution: + { + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + } + engines: { node: '>= 0.4.0' } + dependencies: + function-bind: 1.1.1 + dev: true + + /header-case@2.0.4: + resolution: + { + integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==, + } + dependencies: + capital-case: 1.0.4 + tslib: 2.1.0 + dev: false + + /help-me@4.2.0: + resolution: + { + integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==, + } + dependencies: + glob: 8.1.0 + readable-stream: 3.6.2 + dev: false + + /hosted-git-info@2.8.9: + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + dev: true + + /hosted-git-info@3.0.8: + resolution: + { + integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, + } + engines: { node: '>=10' } + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@4.1.0: + resolution: + { + integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, + } + engines: { node: '>=10' } + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: + { + integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + lru-cache: 7.18.3 + dev: true + + /hot-shots@8.5.0: + resolution: + { + integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==, + } + engines: { node: '>=6.0.0' } + optionalDependencies: + unix-dgram: 2.0.6 + dev: false + + /html-escaper@2.0.2: + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } + + /http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + /http-call@5.3.0: + resolution: + { + integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==, + } + engines: { node: '>=8.0.0' } + dependencies: + content-type: 1.0.5 + debug: 4.3.4(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /http-parser-js@0.5.8: + resolution: + { + integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, + } + dev: false + + /http-proxy-agent@4.0.1: + resolution: + { + integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, + } + engines: { node: '>= 6' } + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@5.0.0: + resolution: + { + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + } + engines: { node: '>= 6' } + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /http2-wrapper@1.0.3: + resolution: + { + integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, + } + engines: { node: '>=10.19.0' } + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: '>= 6' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@7.0.2: + resolution: + { + integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } + dev: true + + /humanize-ms@1.2.1: + resolution: + { + integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, + } + dependencies: + ms: 2.1.3 + dev: true + + /hyperlinker@1.0.0: + resolution: + { + integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==, + } + engines: { node: '>=4' } + + /iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true optional: true - '@swc/wasm': + + /ieee754@1.1.13: + resolution: + { + integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==, + } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + /ignore-walk@4.0.1: + resolution: + { + integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==, + } + engines: { node: '>=10' } + dependencies: + minimatch: 3.1.2 + dev: true + + /ignore-walk@5.0.1: + resolution: + { + integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minimatch: 5.1.6 + dev: true + + /ignore-walk@6.0.3: + resolution: + { + integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: '>= 4' } + + /immediate@3.0.6: + resolution: + { + integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, + } + dev: false + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: '>=6' } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: + { + integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, + } + engines: { node: '>=8' } + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } + dev: true + + /indent-string@4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } + + /infer-owner@1.0.4: + resolution: + { + integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, + } + dev: true + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + /init-package-json@5.0.0: + resolution: + { + integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-package-arg: 10.1.0 + promzard: 1.0.0 + read: 2.1.0 + read-package-json: 6.0.4 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + dev: true + + /inquirer-autocomplete-prompt@1.4.0(inquirer@7.3.3): + resolution: + { + integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==, + } + engines: { node: '>=10' } + peerDependencies: + inquirer: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + figures: 3.2.0 + inquirer: 7.3.3 + run-async: 2.4.1 + rxjs: 6.6.7 + dev: true + + /inquirer@7.3.3: + resolution: + { + integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, + } + engines: { node: '>=8.0.0' } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + /inquirer@8.2.5: + resolution: + { + integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, + } + engines: { node: '>=12.0.0' } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /interpret@1.4.0: + resolution: + { + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + } + engines: { node: '>= 0.10' } + dev: true + + /ip@1.1.8: + resolution: + { + integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, + } + dev: false + + /ip@2.0.0: + resolution: + { + integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, + } + + /is-arguments@1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + dev: true + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: '>=8' } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } + dev: true + + /is-ci@3.0.1: + resolution: + { + integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, + } + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.12.1: + resolution: + { + integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==, + } + dependencies: + has: 1.0.3 + dev: true + + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } + hasBin: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } + + /is-fullwidth-code-point@1.0.0: + resolution: + { + integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, + } + engines: { node: '>=0.10.0' } + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: + { + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, + } + engines: { node: '>=4' } + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } + + /is-generator-fn@2.1.0: + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + } + engines: { node: '>=6' } + dev: true + + /is-generator-function@1.0.10: + resolution: + { + integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, + } + engines: { node: '>= 0.4' } + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: '>=8' } + dev: true + + /is-lambda@1.0.1: + resolution: + { + integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, + } + dev: true + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } + + /is-obj@2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: '>=8' } + dev: true + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: '>=8' } + dev: true + + /is-plain-obj@1.1.0: + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-plain-obj@2.1.0: + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + } + engines: { node: '>=8' } + dev: true + + /is-plain-object@2.0.4: + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: '>=0.10.0' } + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-retry-allowed@1.2.0: + resolution: + { + integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-scoped@2.1.0: + resolution: + { + integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==, + } + engines: { node: '>=8' } + dependencies: + scoped-regex: 2.1.0 + dev: true + + /is-ssh@1.4.0: + resolution: + { + integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==, + } + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@2.0.0: + resolution: + { + integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, + } + engines: { node: '>=8' } + dev: true + + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } + dev: true + + /is-text-path@1.0.1: + resolution: + { + integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, + } + engines: { node: '>=0.10.0' } + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.12: + resolution: + { + integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, + } + engines: { node: '>= 0.4' } + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: '>=10' } + dev: true + + /is-utf8@0.2.1: + resolution: + { + integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, + } + dev: true + + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } + dependencies: + is-docker: 2.2.1 + + /isarray@0.0.1: + resolution: + { + integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, + } + dev: true + + /isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + /isbinaryfile@4.0.10: + resolution: + { + integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, + } + engines: { node: '>= 8.0.0' } + dev: true + + /isbinaryfile@5.0.0: + resolution: + { + integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==, + } + engines: { node: '>= 14.0.0' } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /isobject@3.0.1: + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /isomorphic-git@1.23.0: + resolution: + { + integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==, + } + engines: { node: '>=12' } + hasBin: true + dependencies: + async-lock: 1.4.0 + clean-git-ref: 2.0.1 + crc-32: 1.2.2 + diff3: 0.0.3 + ignore: 5.2.4 + minimisted: 2.0.1 + pako: 1.0.11 + pify: 4.0.1 + readable-stream: 3.6.2 + sha.js: 2.4.11 + simple-get: 4.0.1 + dev: false + + /istanbul-lib-coverage@3.2.0: + resolution: + { + integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, + } + engines: { node: '>=8' } + + /istanbul-lib-instrument@5.2.1: + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + } + engines: { node: '>=8' } + dependencies: + '@babel/core': 7.18.2 + '@babel/parser': 7.22.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps@4.0.1: + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + } + engines: { node: '>=10' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: + { + integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==, + } + engines: { node: '>=8' } + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /jackspeak@2.2.2: + resolution: + { + integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==, + } + engines: { node: '>=14' } + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.8.7: + resolution: + { + integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + /jest-changed-files@29.5.0: + resolution: + { + integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.6.1: + resolution: + { + integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.6.1 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + p-limit: 3.1.0 + pretty-format: 29.6.1 + pure-rand: 6.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 10.0.0 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 20.4.4 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff@29.6.1: + resolution: + { + integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-docblock@29.4.3: + resolution: + { + integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.6.1: + resolution: + { + integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /jest-environment-node@29.6.1: + resolution: + { + integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /jest-get-type@29.4.3: + resolution: + { + integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-haste-map@29.6.1: + resolution: + { + integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 14.14.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + jest-worker: 29.6.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector@29.6.1: + resolution: + { + integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-matcher-utils@29.6.1: + resolution: + { + integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-message-util@29.6.1: + resolution: + { + integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.6.1: + resolution: + { + integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-util: 29.6.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + } + engines: { node: '>=6' } + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.6.1 + dev: true + + /jest-regex-util@29.4.3: + resolution: + { + integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-resolve-dependencies@29.6.1: + resolution: + { + integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.6.1: + resolution: + { + integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.6.1: + resolution: + { + integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.6.1 + '@jest/environment': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.6.1 + jest-haste-map: 29.6.1 + jest-leak-detector: 29.6.1 + jest-message-util: 29.6.1 + jest-resolve: 29.6.1 + jest-runtime: 29.6.1 + jest-util: 29.6.1 + jest-watcher: 29.6.1 + jest-worker: 29.6.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.6.1: + resolution: + { + integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/globals': 29.6.1 + '@jest/source-map': 29.6.0 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.6.1: + resolution: + { + integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.18.2 + '@babel/generator': 7.22.9 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) + '@babel/types': 7.22.5 + '@jest/expect-utils': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + chalk: 4.1.2 + expect: 29.6.1 + graceful-fs: 4.2.11 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + natural-compare: 1.4.0 + pretty-format: 29.6.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.6.1: + resolution: + { + integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.6.1: + resolution: + { + integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.6.1 + dev: true + + /jest-watcher@29.6.1: + resolution: + { + integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.6.1 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: '>= 10.13.0' } + dependencies: + '@types/node': 14.14.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.6.1: + resolution: + { + integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@types/node': 14.14.7 + jest-util: 29.6.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jmespath@0.16.0: + resolution: + { + integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==, + } + engines: { node: '>= 0.6.0' } + dev: true + + /joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } + dev: false + + /js-sdsl@4.4.2: + resolution: + { + integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==, + } + dev: true + + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: true + + /js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /js2xmlparser@4.0.2: + resolution: + { + integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, + } + dependencies: + xmlcreate: 2.0.4 + dev: false + + /jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: '>=4' } + hasBin: true + dev: true + + /jsforce@2.0.0-beta.27: + resolution: + { + integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==, + } + engines: { node: '>=8.0' } + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /json-bigint@1.0.0: + resolution: + { + integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, + } + dependencies: + bignumber.js: 9.1.1 + dev: false + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /json-parse-better-errors@1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + dev: true + + /json-parse-even-better-errors@3.0.0: + resolution: + { + integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + dev: true + + /json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + dev: true + + /json-stable-stringify@1.0.2: + resolution: + { + integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==, + } + dependencies: + jsonify: 0.0.1 + dev: true + + /json-stringify-nice@1.1.4: + resolution: + { + integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, + } + dev: true + + /json-stringify-safe@5.0.1: + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } + dev: true + + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: + { + integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==, + } + dev: true + + /jsonparse@1.3.1: + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { '0': node >= 0.2.0 } + dev: true + + /jsonwebtoken@9.0.2: + resolution: + { + integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, + } + engines: { node: '>=12', npm: '>=6' } + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /jszip@3.10.1: + resolution: + { + integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, + } + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /just-diff-apply@5.5.0: + resolution: + { + integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, + } + dev: true + + /just-diff@3.1.1: + resolution: + { + integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==, + } + dev: true + + /just-diff@5.2.0: + resolution: + { + integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==, + } + dev: true + + /just-extend@4.2.1: + resolution: + { + integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, + } + dev: true + + /jwa@1.4.1: + resolution: + { + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, + } + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: + { + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, + } + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keyv@4.5.3: + resolution: + { + integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + } + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } + dev: true + + /lerna-update-wizard@1.1.0: + resolution: + { + integrity: sha512-V6VtJFbt4BS1HKsNDsyBMeAU86CYRoQSikZsJyEMVc2x/yqH/hX+Z79fI0J3gSiWFkkIKrLj/vPUf6Zvn/79jw==, + } + engines: { node: '>=12' } + hasBin: true + dependencies: + chalk: 4.1.2 + cli-cursor: 2.1.0 + execution-time: 1.4.1 + fs-extra: 7.0.1 + globby: 11.1.0 + inquirer: 7.3.3 + inquirer-autocomplete-prompt: 1.4.0(inquirer@7.3.3) + lodash: 4.17.21 + meow: 9.0.0 + minimist: 1.2.8 + semver-compare: 1.0.0 + dev: true + + /lerna@7.1.4: + resolution: + { + integrity: sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw==, + } + engines: { node: ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + '@lerna/child-process': 7.1.4 + '@lerna/create': 7.1.4 + '@npmcli/run-script': 6.0.2 + '@nx/devkit': 16.5.5(nx@16.5.5) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-angular: 6.0.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + envinfo: 7.8.1 + execa: 5.0.0 + fs-extra: 11.1.1 + get-port: 5.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + import-local: 3.1.0 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + libnpmaccess: 7.0.2 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 3.1.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 16.5.5 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-pipe: 3.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + pacote: 15.2.0 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + typescript: 5.0.2 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: '>=6' } + dev: true + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libnpmaccess@7.0.2: + resolution: + { + integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish@7.3.0: + resolution: + { + integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + ci-info: 3.8.0 + normalize-package-data: 5.0.0 + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + semver: 7.5.2 + sigstore: 1.8.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /lie@3.3.0: + resolution: + { + integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, + } + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + dev: true + + /lines-and-columns@2.0.3: + resolution: + { + integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /listenercount@1.0.1: + resolution: + { + integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, + } + dev: false + + /load-json-file@4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@6.2.0: + resolution: + { + integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, + } + engines: { node: '>=8' } + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /load-yaml-file@0.2.0: + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: '>=6' } + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: '>=6.11.5' } + dev: true + + /locate-path@2.0.0: + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: '>=4' } + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash._reinterpolate@3.0.0: + resolution: + { + integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==, + } + + /lodash.get@4.4.2: + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } + dev: true + + /lodash.includes@4.3.0: + resolution: + { + integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, + } + dev: false + + /lodash.isboolean@3.0.3: + resolution: + { + integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, + } + dev: false + + /lodash.isinteger@4.0.4: + resolution: + { + integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, + } + dev: false + + /lodash.ismatch@4.4.0: + resolution: + { + integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, + } + dev: true + + /lodash.isnumber@3.0.3: + resolution: + { + integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, + } + dev: false + + /lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + dev: false + + /lodash.isstring@4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + dev: false + + /lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + dev: true + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + dev: true + + /lodash.once@4.1.1: + resolution: + { + integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, + } + dev: false + + /lodash.pickby@4.6.0: + resolution: + { + integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, + } + dev: false + + /lodash.sortby@4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + dev: false + + /lodash.template@4.5.0: + resolution: + { + integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==, + } + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + + /lodash.templatesettings@4.2.0: + resolution: + { + integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==, + } + dependencies: + lodash._reinterpolate: 3.0.0 + + /lodash.uniqby@4.7.0: + resolution: + { + integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, + } + dev: false + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + /log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /lolex@2.7.5: + resolution: + { + integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==, + } + dev: true + + /lolex@5.1.2: + resolution: + { + integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /lower-case@2.0.2: + resolution: + { + integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /lowercase-keys@2.0.0: + resolution: + { + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, + } + engines: { node: '>=8' } + + /lru-cache@10.0.0: + resolution: + { + integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==, + } + engines: { node: 14 || >=16.14 } + + /lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: '>=10' } + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: '>=12' } + + /make-dir@2.1.0: + resolution: + { + integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, + } + engines: { node: '>=6' } + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@3.1.0: + resolution: + { + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, + } + engines: { node: '>=8' } + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.4 + + /make-error@1.3.6: + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } + + /make-fetch-happen@10.2.1: + resolution: + { + integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + agentkeepalive: 4.3.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: + { + integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + agentkeepalive: 4.3.0 + cacache: 17.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@9.1.0: + resolution: + { + integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==, + } + engines: { node: '>= 10' } + dependencies: + agentkeepalive: 4.3.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } + dependencies: + tmpl: 1.0.5 + dev: true + + /map-obj@1.0.1: + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /map-obj@4.3.0: + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: '>=8' } + dev: true + + /markdown-table-ts@1.0.3: + resolution: + { + integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==, + } + dev: false + + /markdown-table@2.0.0: + resolution: + { + integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==, + } + dependencies: + repeat-string: 1.6.1 + dev: false + + /marked-terminal@5.1.1(marked@4.0.16): + resolution: + { + integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, + } + engines: { node: '>=14.13.1 || >=16.0.0' } + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + ansi-escapes: 5.0.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 4.0.16 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + dev: false + + /marked@4.0.16: + resolution: + { + integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==, + } + engines: { node: '>= 12' } + hasBin: true + dev: false + + /mem-fs-editor@9.7.0(mem-fs@2.3.0): + resolution: + { + integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==, + } + engines: { node: '>=12.10.0' } + peerDependencies: + mem-fs: ^2.1.0 + peerDependenciesMeta: + mem-fs: + optional: true + dependencies: + binaryextensions: 4.18.0 + commondir: 1.0.1 + deep-extend: 0.6.0 + ejs: 3.1.9 + globby: 11.1.0 + isbinaryfile: 5.0.0 + mem-fs: 2.3.0 + minimatch: 7.4.6 + multimatch: 5.0.0 + normalize-path: 3.0.0 + textextensions: 5.16.0 + dev: true + + /mem-fs@2.3.0: + resolution: + { + integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==, + } + engines: { node: '>=12' } + dependencies: + '@types/node': 15.14.9 + '@types/vinyl': 2.0.7 + vinyl: 2.2.1 + vinyl-file: 3.0.0 + dev: true + + /meow@8.1.2: + resolution: + { + integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, + } + engines: { node: '>=10' } + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /meow@9.0.0: + resolution: + { + integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, + } + engines: { node: '>=10' } + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: '>=8.6' } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } + dependencies: + mime-db: 1.52.0 + + /mime@2.6.0: + resolution: + { + integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, + } + engines: { node: '>=4.0.0' } + hasBin: true + dev: false + + /mimic-fn@1.2.0: + resolution: + { + integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, + } + engines: { node: '>=4' } + dev: true + + /mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } + + /mimic-response@1.0.1: + resolution: + { + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, + } + engines: { node: '>=4' } + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: '>=10' } + + /min-indent@1.0.1: + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } + dev: true + + /minimatch@3.0.5: + resolution: + { + integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, + } + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: '>=10' } + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: '>=10' } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: + { + integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: '>= 6' } + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + /minimisted@2.0.1: + resolution: + { + integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==, + } + dependencies: + minimist: 1.2.8 + dev: false + + /minipass-collect@1.0.2: + resolution: + { + integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-fetch@1.4.1: + resolution: + { + integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@2.1.2: + resolution: + { + integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.3: + resolution: + { + integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: + { + integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: + { + integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==, + } + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: + { + integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: + { + integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: + { + integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + } + engines: { node: '>=8' } + dependencies: + yallist: 4.0.0 + + /minipass@4.2.8: + resolution: + { + integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, + } + engines: { node: '>=8' } + dev: true + + /minipass@5.0.0: + resolution: + { + integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + } + engines: { node: '>=8' } + + /minipass@7.0.2: + resolution: + { + integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==, + } + engines: { node: '>=16 || 14 >=14.17' } + + /minizlib@2.1.2: + resolution: + { + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /mkdirp-infer-owner@2.0.0: + resolution: + { + integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==, + } + engines: { node: '>=10' } + dependencies: + chownr: 2.0.0 + infer-owner: 1.0.4 + mkdirp: 1.0.4 + dev: true + + /mkdirp@0.5.6: + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: '>=10' } + hasBin: true + + /mnemonist@0.39.5: + resolution: + { + integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==, + } + dependencies: + obliterator: 2.0.4 + dev: false + + /mock-stdin@1.0.0: + resolution: + { + integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==, + } + dev: true + + /modify-values@1.0.1: + resolution: + { + integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + /multimatch@5.0.0: + resolution: + { + integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, + } + engines: { node: '>=10' } + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + + /multistream@3.1.0: + resolution: + { + integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==, + } + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /mute-stream@0.0.8: + resolution: + { + integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, + } + + /mute-stream@1.0.0: + resolution: + { + integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /mylas@2.1.13: + resolution: + { + integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==, + } + engines: { node: '>=12.0.0' } + dev: true + + /nan@2.17.0: + resolution: + { + integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, + } + requiresBuild: true + dev: false optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /ts-node@9.1.1(typescript@4.9.5): - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} - engines: {node: '>=10.0.0'} - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.9.5 - yn: 3.1.1 - dev: true - - /ts-node@9.1.1(typescript@5.0.2): - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} - engines: {node: '>=10.0.0'} - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 5.0.2 - yn: 3.1.1 - dev: true - - /ts-retry-promise@0.7.1: - resolution: {integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==} - engines: {node: '>=6'} - dev: false - - /tsc-alias@1.8.3: - resolution: {integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==} - hasBin: true - dependencies: - chokidar: 3.5.3 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.5.0 - dev: true - - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - /tslib@2.1.0: - resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsutils@3.21.0(typescript@5.0.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.2 - dev: true - - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4(supports-color@8.1.1) - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - /type-fest@0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: false - - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true - - /typescript@4.3.5: - resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - optional: true - - /unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - dependencies: - unique-slug: 2.0.2 - dev: true - - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - unique-slug: 3.0.0 - dev: true - - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - unique-slug: 4.0.0 - dev: true - - /unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - - /unix-dgram@2.0.6: - resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} - engines: {node: '>=0.10.48'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: false - optional: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - dependencies: - big-integer: 1.6.51 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.1.0 - dev: false - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.1.0 - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url@0.10.3: - resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - - /uuid@8.0.0: - resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} - hasBin: true - dev: true - - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - /v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - dependencies: - builtins: 1.0.3 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - builtins: 5.0.1 - dev: true - - /vinyl-file@3.0.0: - resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - strip-bom-buf: 1.0.0 - strip-bom-stream: 2.0.0 - vinyl: 2.2.1 - dev: true - - /vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 - dev: true - - /walk-up-path@1.0.0: - resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} - dev: true - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: + + /napi-build-utils@1.0.2: + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } + dev: false + + /natural-compare-lite@1.4.0: + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } + dev: true + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + dev: true + + /natural-orderby@2.0.3: + resolution: + { + integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==, + } + + /negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } + dev: true + + /neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + + /netmask@2.0.2: + resolution: + { + integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, + } + engines: { node: '>= 0.4.0' } + dev: false + + /neverthrow@4.2.1: + resolution: + { + integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==, + } + dev: false + + /neverthrow@4.4.2: + resolution: + { + integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==, + } + dev: false + + /nice-try@1.0.5: + resolution: + { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } + + /nise@1.5.3: + resolution: + { + integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==, + } + dependencies: + '@sinonjs/formatio': 3.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + lolex: 5.1.2 + path-to-regexp: 1.8.0 + dev: true + + /nise@5.1.4: + resolution: + { + integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==, + } + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: + { + integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, + } + dependencies: + lower-case: 2.0.2 + tslib: 2.1.0 + dev: false + + /nock@13.3.2: + resolution: + { + integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==, + } + engines: { node: '>= 10.13' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /node-abi@3.45.0: + resolution: + { + integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.2 + dev: false + + /node-addon-api@3.2.1: + resolution: + { + integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==, + } + dev: true + + /node-cache@5.1.2: + resolution: + { + integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==, + } + engines: { node: '>= 8.0.0' } + dependencies: + clone: 2.1.2 + dev: false + + /node-dir@0.1.17: + resolution: + { + integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==, + } + engines: { node: '>= 0.10.5' } + dependencies: + minimatch: 3.1.2 + dev: false + + /node-emoji@1.11.0: + resolution: + { + integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, + } + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.12: + resolution: + { + integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@2.6.7: + resolution: + { + integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp-build@4.6.0: + resolution: + { + integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==, + } + hasBin: true + dev: true + + /node-gyp@8.4.1: + resolution: + { + integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==, + } + engines: { node: '>= 10.12.0' } + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-gyp@9.4.0: + resolution: + { + integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==, + } + engines: { node: ^12.13 || ^14.13 || >=16 } + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 11.1.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } + dev: true + + /node-releases@2.0.13: + resolution: + { + integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, + } + dev: true + + /nopt@5.0.0: + resolution: + { + integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, + } + engines: { node: '>=6' } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: + { + integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data@2.5.0: + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: + { + integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: + { + integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /normalize-url@6.1.0: + resolution: + { + integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, + } + engines: { node: '>=10' } + + /npm-bundled@1.1.2: + resolution: + { + integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==, + } + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-bundled@3.0.0: + resolution: + { + integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@4.0.0: + resolution: + { + integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.2 + dev: true + + /npm-install-checks@6.1.1: + resolution: + { + integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + semver: 7.5.2 + dev: true + + /npm-normalize-package-bin@1.0.1: + resolution: + { + integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==, + } + dev: true + + /npm-normalize-package-bin@2.0.0: + resolution: + { + integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: + { + integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /npm-package-arg@10.1.0: + resolution: + { + integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@8.1.1: + resolution: + { + integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 3.0.8 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-package-arg@8.1.5: + resolution: + { + integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 4.1.0 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist@3.0.0: + resolution: + { + integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 4.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@5.1.1: + resolution: + { + integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@7.0.4: + resolution: + { + integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-pick-manifest@6.1.1: + resolution: + { + integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==, + } + dependencies: + npm-install-checks: 4.0.0 + npm-normalize-package-bin: 1.0.1 + npm-package-arg: 8.1.5 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@8.0.1: + resolution: + { + integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.5.2 + dev: true + + /npm-registry-fetch@12.0.2: + resolution: + { + integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + dependencies: + make-fetch-happen: 10.2.1 + minipass: 3.3.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /npm-registry-fetch@14.0.5: + resolution: + { + integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } + dependencies: + path-key: 3.1.1 + dev: true + + /npmlog@5.0.1: + resolution: + { + integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, + } + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /npmlog@6.0.2: + resolution: + { + integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /number-is-nan@1.0.1: + resolution: + { + integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, + } + engines: { node: '>=0.10.0' } + dev: true + + /nx@16.5.5: + resolution: + { + integrity: sha512-DHwoUtkirI52JIlCtRK78UI/Ik/VgCtM6FlkfPnFsy8PVyTYMQ40KoG6aZLHjqj5qxoGG2CUjcsbFjGXYrjDbw==, + } + hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.4.2 + '@swc/core': ^1.2.173 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + dependencies: + '@nrwl/tao': 16.5.5 + '@parcel/watcher': 2.0.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.4.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 7.0.4 + dotenv: 10.0.0 + enquirer: 2.3.6 + fast-glob: 3.2.7 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.1.1 + glob: 7.1.4 + ignore: 5.2.4 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 3.0.5 + npm-run-path: 4.0.1 + open: 8.4.2 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.1 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + v8-compile-cache: 2.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 16.5.5 + '@nx/nx-darwin-x64': 16.5.5 + '@nx/nx-freebsd-x64': 16.5.5 + '@nx/nx-linux-arm-gnueabihf': 16.5.5 + '@nx/nx-linux-arm64-gnu': 16.5.5 + '@nx/nx-linux-arm64-musl': 16.5.5 + '@nx/nx-linux-x64-gnu': 16.5.5 + '@nx/nx-linux-x64-musl': 16.5.5 + '@nx/nx-win32-arm64-msvc': 16.5.5 + '@nx/nx-win32-x64-msvc': 16.5.5 + transitivePeerDependencies: + - debug + dev: true + + /object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /object-hash@2.1.1: + resolution: + { + integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==, + } + engines: { node: '>= 6' } + dev: false + + /object-treeify@1.1.33: + resolution: + { + integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==, + } + engines: { node: '>= 10' } + + /obliterator@2.0.4: + resolution: + { + integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, + } + dev: false + + /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==, + } + engines: { node: '>=12.0.0' } + hasBin: true + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) + aws-sdk: 2.1421.0 + concurrently: 7.6.0 + debug: 4.3.4(supports-color@8.1.1) + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 1.5.0 + got: 11.8.6 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + semver: 7.5.2 + shelljs: 0.8.5 + tslib: 2.6.2 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0(yeoman-environment@3.19.3) + yosay: 2.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bluebird + - encoding + - mem-fs + - supports-color + - typescript + dev: true + + /on-exit-leak-free@2.1.0: + resolution: + { + integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==, + } + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@2.0.1: + resolution: + { + integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, + } + engines: { node: '>=4' } + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } + dependencies: + mimic-fn: 2.1.0 + + /open@7.4.2: + resolution: + { + integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, + } + engines: { node: '>=8' } + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /open@8.4.2: + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: '>= 0.8.0' } + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: '>=10' } + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: '>=0.10.0' } + + /p-cancelable@2.1.1: + resolution: + { + integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, + } + engines: { node: '>=8' } + + /p-finally@1.0.0: + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: '>=4' } + dev: true + + /p-limit@1.3.0: + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: '>=4' } + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: '>=4' } + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map-series@2.1.0: + resolution: + { + integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, + } + engines: { node: '>=8' } + dev: true + + /p-map@4.0.0: + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: '>=10' } + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: + { + integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, + } + engines: { node: '>=8' } + dev: true + + /p-queue@6.6.2: + resolution: + { + integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, + } + engines: { node: '>=8' } + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce@2.1.0: + resolution: + { + integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, + } + engines: { node: '>=8' } + dev: true + + /p-timeout@3.2.0: + resolution: + { + integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, + } + engines: { node: '>=8' } + dependencies: + p-finally: 1.0.0 + dev: true + + /p-transform@1.3.0: + resolution: + { + integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==, + } + engines: { node: '>=12.10.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + p-queue: 6.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /p-try@1.0.0: + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: '>=4' } + dev: true + + /p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } + dev: true + + /p-waterfall@2.1.1: + resolution: + { + integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, + } + engines: { node: '>=8' } + dependencies: + p-reduce: 2.1.0 + dev: true + + /pac-proxy-agent@7.0.1: + resolution: + { + integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, + } + engines: { node: '>= 14' } + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver@7.0.0: + resolution: + { + integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, + } + engines: { node: '>= 14' } + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /pacote@12.0.3: + resolution: + { + integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + hasBin: true + dependencies: + '@npmcli/git': 2.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/promise-spawn': 1.3.2 + '@npmcli/run-script': 2.0.0 + cacache: 15.3.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + infer-owner: 1.0.4 + minipass: 3.3.6 + mkdirp: 1.0.4 + npm-package-arg: 8.1.5 + npm-packlist: 3.0.0 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + promise-retry: 2.0.1 + read-package-json-fast: 2.0.3 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@15.2.0: + resolution: + { + integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.3 + fs-minipass: 3.0.2 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.1 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.8.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pad-component@0.0.1: + resolution: + { + integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==, + } + dev: true + + /pako@1.0.11: + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } + dev: false + + /param-case@3.0.4: + resolution: + { + integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } + dependencies: + callsites: 3.1.0 + dev: true + + /parse-conflict-json@2.0.2: + resolution: + { + integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + json-parse-even-better-errors: 2.3.1 + just-diff: 5.2.0 + just-diff-apply: 5.5.0 + dev: true + + /parse-json@4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-path@7.0.0: + resolution: + { + integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, + } + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url@8.1.0: + resolution: + { + integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, + } + dependencies: + parse-path: 7.0.0 + dev: true + + /pascal-case@3.1.2: + resolution: + { + integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /password-prompt@1.1.2: + resolution: + { + integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==, + } + dependencies: + ansi-escapes: 3.2.0 + cross-spawn: 6.0.5 + + /path-case@3.0.4: + resolution: + { + integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /path-exists@3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: '>=4' } + dev: true + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } + dev: true + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } + + /path-key@2.0.1: + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: '>=4' } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: true + + /path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + + /path-to-regexp@1.8.0: + resolution: + { + integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, + } + dependencies: + isarray: 0.0.1 + dev: true + + /path-type@3.0.0: + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: true + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } + + /pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } + dev: true + + /pify@3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } + dev: true + + /pify@4.0.1: + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: '>=6' } + + /pify@5.0.0: + resolution: + { + integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, + } + engines: { node: '>=10' } + dev: true + + /pino-abstract-transport@1.1.0: + resolution: + { + integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==, + } + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.2.3: + resolution: + { + integrity: sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==, + } + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 4.2.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.7.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: + { + integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==, + } + dev: false + + /pino@8.16.0: + resolution: + { + integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==, + } + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.7.0 + thread-stream: 2.4.0 + dev: false + + /pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: '>= 6' } + dev: true + + /pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + dev: true + + /plimit-lit@1.5.0: + resolution: + { + integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==, + } + dependencies: + queue-lit: 1.5.0 + dev: true + + /prebuild-install@7.1.1: + resolution: + { + integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.45.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.0.3: + resolution: + { + integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, + } + engines: { node: '>=10' } + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } + dev: true + + /prettier@2.0.5: + resolution: + { + integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==, + } + engines: { node: '>=10.13.0' } + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: '>=6' } + dev: true + + /pretty-format@29.6.1: + resolution: + { + integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: + resolution: + { + integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, + } + engines: { node: '>= 0.8' } + dev: true + + /proc-log@1.0.0: + resolution: + { + integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==, + } + dev: true + + /proc-log@3.0.0: + resolution: + { + integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + /process-warning@2.2.0: + resolution: + { + integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==, + } + dev: false + + /process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } + + /promise-all-reject-late@1.0.1: + resolution: + { + integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, + } + dev: true + + /promise-call-limit@1.0.2: + resolution: + { + integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==, + } + dev: true + + /promise-inflight@1.0.1: + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: + { + integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, + } + engines: { node: '>=10' } + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard@1.0.0: + resolution: + { + integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + read: 2.1.0 + dev: true + + /propagate@2.0.1: + resolution: + { + integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==, + } + engines: { node: '>= 8' } + dev: true + + /proper-lockfile@4.1.2: + resolution: + { + integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, + } + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocols@2.0.1: + resolution: + { + integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, + } + dev: true + + /proxy-agent@6.3.1: + resolution: + { + integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + + /psl@1.9.0: + resolution: + { + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, + } + dev: false + + /pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@1.3.2: + resolution: + { + integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, + } + dev: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: '>=6' } + + /pure-rand@6.0.2: + resolution: + { + integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==, + } + dev: true + + /q@1.5.1: + resolution: + { + integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, + } + engines: { node: '>=0.6.0', teleport: '>=0.2.0' } + dev: true + + /querystring@0.2.0: + resolution: + { + integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, + } + engines: { node: '>=0.4.x' } + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystringify@2.2.0: + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + } + dev: false + + /queue-lit@1.5.0: + resolution: + { + integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==, + } + dev: true + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /quick-format-unescaped@4.0.4: + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } + dev: false + + /quick-lru@4.0.1: + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: '>=8' } + dev: true + + /quick-lru@5.1.1: + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: '>=10' } + + /randombytes@2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-is@18.2.0: + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + } + dev: true + + /read-cmd-shim@3.0.1: + resolution: + { + integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dev: true + + /read-cmd-shim@4.0.0: + resolution: + { + integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /read-package-json-fast@2.0.3: + resolution: + { + integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==, + } + engines: { node: '>=10' } + dependencies: + json-parse-even-better-errors: 2.3.1 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json-fast@3.0.2: + resolution: + { + integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: + { + integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: + { + integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, + } + engines: { node: '>=4' } + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: '>=8' } + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read@2.1.0: + resolution: + { + integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + mute-stream: 1.0.0 + dev: true + + /readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: + { + integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readdir-scoped-modules@1.1.0: + resolution: + { + integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==, + } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: true + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: '>=8.10.0' } + dependencies: + picomatch: 2.3.1 + dev: true + + /real-require@0.2.0: + resolution: + { + integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, + } + engines: { node: '>= 12.13.0' } + dev: false + + /rechoir@0.6.2: + resolution: + { + integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, + } + engines: { node: '>= 0.10' } + dependencies: + resolve: 1.22.2 + dev: true + + /redent@3.0.0: + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed@2.1.1: + resolution: + { + integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, + } + dependencies: + esprima: 4.0.1 + + /regenerator-runtime@0.13.11: + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } + + /regexpp@3.2.0: + resolution: + { + integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, + } + engines: { node: '>=8' } + dev: true + + /remove-trailing-separator@1.1.0: + resolution: + { + integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, + } + dev: true + + /repeat-string@1.6.1: + resolution: + { + integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, + } + engines: { node: '>=0.10' } + dev: false + + /replace-ext@1.0.1: + resolution: + { + integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, + } + engines: { node: '>= 0.10' } + dev: true + + /require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } + dev: true + + /require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } + dev: false + + /requires-port@1.0.0: + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } + dev: false + + /resolve-alpn@1.2.1: + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } + + /resolve-cwd@3.0.0: + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: '>=8' } + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } + dev: true + + /resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } + dev: true + + /resolve-global@1.0.0: + resolution: + { + integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, + } + engines: { node: '>=8' } + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve.exports@2.0.2: + resolution: + { + integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, + } + engines: { node: '>=10' } + dev: true + + /resolve@1.22.2: + resolution: + { + integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==, + } + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: + { + integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, + } + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@2.0.0: + resolution: + { + integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, + } + engines: { node: '>=4' } + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /retry@0.12.0: + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: '>= 4' } + + /retry@0.13.1: + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: '>= 4' } + dev: false + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + + /rimraf@2.7.1: + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: + { + integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /rimraf@5.0.1: + resolution: + { + integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + glob: 10.3.3 + dev: false + + /run-async@2.4.1: + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: '>=0.12.0' } + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: + { + integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, + } + engines: { npm: '>=2.0.0' } + dependencies: + tslib: 1.14.1 + + /rxjs@7.8.1: + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } + dependencies: + tslib: 2.1.0 + dev: true + + /safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + /safe-stable-stringify@2.4.3: + resolution: + { + integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, + } + engines: { node: '>=10' } + dev: false + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + /samsam@1.3.0: + resolution: + { + integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==, + } + deprecated: This package has been deprecated in favour of @sinonjs/samsam + dev: true + + /sax@1.2.1: + resolution: + { + integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==, + } + dev: true + + /sax@1.2.4: + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } + + /schema-utils@3.3.0: + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: '>= 10.13.0' } + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /scoped-regex@2.1.0: + resolution: + { + integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==, + } + engines: { node: '>=8' } + dev: true + + /secure-json-parse@2.7.0: + resolution: + { + integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, + } + dev: false + + /semver-compare@1.0.0: + resolution: + { + integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==, + } + dev: true + + /semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + + /semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + dev: true + + /semver@7.3.5: + resolution: + { + integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.2: + resolution: + { + integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.5.3: + resolution: + { + integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /sentence-case@3.0.4: + resolution: + { + integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /sequin@0.1.1: + resolution: + { + integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==, + } + engines: { node: '>=0.4.0' } + dev: false + + /serialize-javascript@6.0.1: + resolution: + { + integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==, + } + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + dev: true + + /setimmediate@1.0.5: + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } + dev: false + + /sha.js@2.4.11: + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallow-clone@3.0.1: + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: '>=8' } + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: '>=0.10.0' } + dependencies: + shebang-regex: 1.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: '>=0.10.0' } + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + + /shell-quote@1.8.1: + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } + dev: true + + /shelljs@0.8.5: + resolution: + { + integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + /signal-exit@4.0.2: + resolution: + { + integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==, + } + engines: { node: '>=14' } + + /sigstore@1.8.0: + resolution: + { + integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-git@3.16.0: + resolution: + { + integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==, + } + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-git@3.19.1: + resolution: + { + integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==, + } + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /sinon@11.1.2: + resolution: + { + integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==, + } + deprecated: 16.1.1 + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.1.3 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true + + /sinon@5.1.1: + resolution: + { + integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==, + } + dependencies: + '@sinonjs/formatio': 2.0.0 + diff: 3.5.0 + lodash.get: 4.4.2 + lolex: 2.7.5 + nise: 1.5.3 + supports-color: 5.5.0 + type-detect: 4.0.8 + dev: true + + /sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + dev: true + + /slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } + + /slice-ansi@4.0.0: + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /smart-buffer@4.2.0: + resolution: + { + integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, + } + engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } + + /snake-case@3.0.4: + resolution: + { + integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /socks-proxy-agent@6.2.1: + resolution: + { + integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==, + } + engines: { node: '>= 10' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==, + } + engines: { node: '>= 10' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@8.0.2: + resolution: + { + integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks@2.7.1: + resolution: + { + integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, + } + engines: { node: '>= 10.13.0', npm: '>= 3.0.0' } + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + + /sonic-boom@3.7.0: + resolution: + { + integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==, + } + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sort-keys@2.0.0: + resolution: + { + integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, + } + engines: { node: '>=4' } + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys@4.2.0: + resolution: + { + integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==, + } + engines: { node: '>=8' } + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /source-map-support@0.5.13: + resolution: + { + integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } + + /spawn-command@0.0.2-1: + resolution: + { + integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==, + } + dev: true + + /spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + } + dev: true + + /spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: + { + integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, + } + dev: true + + /split2@3.2.2: + resolution: + { + integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, + } + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: '>= 10.x' } + dev: false + + /split@1.0.1: + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + + /ssri@10.0.4: + resolution: + { + integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + dev: true + + /ssri@8.0.1: + resolution: + { + integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /ssri@9.0.1: + resolution: + { + integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minipass: 3.3.6 + dev: true + + /stack-utils@2.0.6: + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + } + engines: { node: '>=10' } + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stdout-stderr@0.1.13: + resolution: + { + integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==, + } + engines: { node: '>=8.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /string-length@4.0.2: + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + } + engines: { node: '>=10' } + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: + { + integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, + } + engines: { node: '>=0.10.0' } + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: + { + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, + } + engines: { node: '>=4' } + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@3.0.1: + resolution: + { + integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: + { + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, + } + engines: { node: '>=4' } + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-buf@1.0.0: + resolution: + { + integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==, + } + engines: { node: '>=4' } + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom-stream@2.0.0: + resolution: + { + integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==, + } + engines: { node: '>=0.10.0' } + dependencies: + first-chunk-stream: 2.0.0 + strip-bom: 2.0.0 + dev: true + + /strip-bom@2.0.0: + resolution: + { + integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, + } + engines: { node: '>=0.10.0' } + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } + dev: true + + /strip-bom@4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: '>=8' } + dev: true + + /strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } + dev: true + + /strip-indent@3.0.0: + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: '>=0.10.0' } + dev: false + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } + + /strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + dev: false + + /strong-log-transformer@2.1.0: + resolution: + { + integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + + /supports-color@2.0.0: + resolution: + { + integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, + } + engines: { node: '>=0.8.0' } + dev: true + + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: + { + integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, + } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } + dev: true + + /taketalk@1.0.0: + resolution: + { + integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==, + } + dependencies: + get-stdin: 4.0.1 + minimist: 1.2.8 + dev: true + + /tapable@2.2.1: + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: '>=6' } + dev: true + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: '>=6' } + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /tar@6.1.11: + resolution: + { + integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==, + } + engines: { node: '>= 10' } + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@6.1.15: + resolution: + { + integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==, + } + engines: { node: '>=10' } + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /temp-dir@1.0.0: + resolution: + { + integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, + } + engines: { node: '>=4' } + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: + { + integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==, + } + engines: { node: '>= 10.13.0' } + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: + { + integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: '>=8' } + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: + { + integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, + } + engines: { node: '>=0.10' } + dev: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + dev: true + + /textextensions@5.16.0: + resolution: + { + integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==, + } + engines: { node: '>=0.8' } + dev: true + + /thread-stream@2.4.0: + resolution: + { + integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==, + } + dependencies: + real-require: 0.2.0 + dev: false + + /through2@2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + /tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: '>=0.6.0' } + dependencies: + os-tmpdir: 1.0.2 + + /tmp@0.2.1: + resolution: + { + integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==, + } + engines: { node: '>=8.17.0' } + dependencies: + rimraf: 3.0.2 + + /tmpl@1.0.5: + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } + dev: true + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: '>=4' } + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + dependencies: + is-number: 7.0.0 + + /tough-cookie@4.1.3: + resolution: + { + integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, + } + engines: { node: '>=6' } + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + /traverse@0.3.9: + resolution: + { + integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, + } + dev: false + + /tree-kill@1.2.2: + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true + dev: true + + /treeverse@1.0.4: + resolution: + { + integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==, + } + dev: true + + /trim-newlines@3.0.1: + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: '>=8' } + dev: true + + /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): + resolution: + { + integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.18.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.0.2 + yargs-parser: 21.1.1 + dev: true + + /ts-json-schema-generator@0.93.0: + resolution: + { + integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==, + } + engines: { node: '>=10.0.0' } + hasBin: true + dependencies: + '@types/json-schema': 7.0.12 + commander: 7.2.0 + fast-json-stable-stringify: 2.1.0 + glob: 7.2.3 + json-stable-stringify: 1.0.2 + typescript: 4.3.5 + dev: true + + /ts-loader@9.4.2(typescript@5.0.2)(webpack@5.88.2): + resolution: + { + integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.2 + typescript: 5.0.2 + webpack: 5.88.2 + dev: true + + /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, + } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, + } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@9.1.1(typescript@4.9.5): + resolution: + { + integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, + } + engines: { node: '>=10.0.0' } + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 4.9.5 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@5.0.2): + resolution: + { + integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, + } + engines: { node: '>=10.0.0' } + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 5.0.2 + yn: 3.1.1 + dev: true + + /ts-retry-promise@0.7.1: + resolution: + { + integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==, + } + engines: { node: '>=6' } + dev: false + + /tsc-alias@1.8.3: + resolution: + { + integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==, + } + hasBin: true + dependencies: + chokidar: 3.5.3 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.5.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: '>=6' } + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + + /tslib@2.1.0: + resolution: + { + integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==, + } + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + /tsutils@3.21.0(typescript@5.0.2): + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: '>= 6' } + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tuf-js@1.1.7: + resolution: + { + integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } + dev: true + + /type-fest@0.18.1: + resolution: + { + integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, + } + engines: { node: '>=10' } + dev: true + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: '>=10' } + dev: true + + /type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } + + /type-fest@0.4.1: + resolution: + { + integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, + } + engines: { node: '>=6' } + dev: true + + /type-fest@0.6.0: + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: '>=8' } + dev: true + + /type-fest@0.8.1: + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: '>=8' } + dev: true + + /type-fest@1.4.0: + resolution: + { + integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, + } + engines: { node: '>=10' } + dev: false + + /typedarray@0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + dev: true + + /typescript@4.3.5: + resolution: + { + integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==, + } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: + { + integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: + { + integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, + } + engines: { node: '>=12.20' } + hasBin: true + + /uglify-js@3.17.4: + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + } + engines: { node: '>=0.8.0' } + hasBin: true + requiresBuild: true optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: false - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true - - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@1.0.9: - resolution: {integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==} - hasBin: true - dev: false - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: true - - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - dependencies: - string-width: 4.2.3 - - /winreg@1.2.4: - resolution: {integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==} - dev: false - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.0.2 - dev: true - - /write-json-file@3.2.0: - resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} - engines: {node: '>=6'} - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.2.11 - make-dir: 2.1.0 - pify: 4.0.1 - sort-keys: 2.0.0 - write-file-atomic: 2.4.3 - dev: true - - /write-pkg@4.0.0: - resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} - engines: {node: '>=8'} - dependencies: - sort-keys: 2.0.0 - type-fest: 0.4.1 - write-json-file: 3.2.0 - dev: true - - /xml-formatter@3.3.2: - resolution: {integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==} - engines: {node: '>= 14'} - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-formatter@3.4.1: - resolution: {integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==} - engines: {node: '>= 14'} - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-parser-xo@4.1.1: - resolution: {integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==} - engines: {node: '>= 14'} - dev: false - - /xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - - /xml2js@0.6.0: - resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - /xmlcreate@2.0.4: - resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} - dev: false - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yeoman-environment@3.19.3: - resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} - engines: {node: '>=12.10.0'} - hasBin: true - dependencies: - '@npmcli/arborist': 4.3.1 - are-we-there-yet: 2.0.0 - arrify: 2.0.1 - binaryextensions: 4.18.0 - chalk: 4.1.2 - cli-table: 0.3.11 - commander: 7.1.0 - dateformat: 4.6.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.1.0 - error: 10.4.0 - escape-string-regexp: 4.0.0 - execa: 5.1.1 - find-up: 5.0.0 - globby: 11.1.0 - grouped-queue: 2.0.0 - inquirer: 8.2.5 - is-scoped: 2.1.0 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log-symbols: 4.1.0 - mem-fs: 2.3.0 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimatch: 3.1.2 - npmlog: 5.0.1 - p-queue: 6.6.2 - p-transform: 1.3.0 - pacote: 12.0.3 - preferred-pm: 3.0.3 - pretty-bytes: 5.6.0 - readable-stream: 4.4.2 - semver: 7.5.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - text-table: 0.2.0 - textextensions: 5.16.0 - untildify: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /yeoman-generator@5.9.0(yeoman-environment@3.19.3): - resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} - engines: {node: '>=12.10.0'} - peerDependencies: - yeoman-environment: ^3.2.0 - peerDependenciesMeta: - yeoman-environment: + + /unique-filename@1.1.1: + resolution: + { + integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, + } + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-filename@2.0.1: + resolution: + { + integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: + { + integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@2.0.2: + resolution: + { + integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, + } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@3.0.0: + resolution: + { + integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: + { + integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universal-user-agent@6.0.0: + resolution: + { + integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, + } + dev: true + + /universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } + + /universalify@0.2.0: + resolution: + { + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + } + engines: { node: '>= 4.0.0' } + dev: false + + /universalify@2.0.0: + resolution: + { + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, + } + engines: { node: '>= 10.0.0' } + + /unix-dgram@2.0.6: + resolution: + { + integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==, + } + engines: { node: '>=0.10.48' } + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: false optional: true - dependencies: - chalk: 4.1.2 - dargs: 7.0.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 5.1.1 - github-username: 6.0.0 - lodash: 4.17.21 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimist: 1.2.8 - pacote: 15.2.0 - read-pkg-up: 7.0.1 - run-async: 2.4.1 - semver: 7.5.2 - shelljs: 0.8.5 - sort-keys: 4.2.0 - text-table: 0.2.0 - yeoman-environment: 3.19.3 - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - supports-color - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yosay@2.0.2: - resolution: {integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - ansi-regex: 2.1.1 - ansi-styles: 3.2.1 - chalk: 1.1.3 - cli-boxes: 1.0.0 - pad-component: 0.0.1 - string-width: 2.1.1 - strip-ansi: 3.0.1 - taketalk: 1.0.0 - wrap-ansi: 2.1.0 - dev: true + + /untildify@4.0.0: + resolution: + { + integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, + } + engines: { node: '>=8' } + dev: true + + /unzipper@0.10.14: + resolution: + { + integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, + } + dependencies: + big-integer: 1.6.51 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /upath@2.0.1: + resolution: + { + integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, + } + engines: { node: '>=4' } + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: + { + integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, + } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: + { + integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /upper-case@2.0.2: + resolution: + { + integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + + /url-parse@1.5.10: + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + } + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /url@0.10.3: + resolution: + { + integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==, + } + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + /util@0.12.5: + resolution: + { + integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, + } + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: true + + /uuid@8.0.0: + resolution: + { + integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==, + } + hasBin: true + dev: true + + /uuid@9.0.0: + resolution: + { + integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==, + } + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } + + /v8-compile-cache@2.3.0: + resolution: + { + integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, + } + dev: true + + /v8-to-istanbul@9.1.0: + resolution: + { + integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==, + } + engines: { node: '>=10.12.0' } + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@3.0.0: + resolution: + { + integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, + } + dependencies: + builtins: 1.0.3 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: + { + integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + builtins: 5.0.1 + dev: true + + /vinyl-file@3.0.0: + resolution: + { + integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==, + } + engines: { node: '>=4' } + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + strip-bom-buf: 1.0.0 + strip-bom-stream: 2.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl@2.2.1: + resolution: + { + integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, + } + engines: { node: '>= 0.10' } + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /walk-up-path@1.0.0: + resolution: + { + integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==, + } + dev: true + + /walker@1.0.8: + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: + { + integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, + } + engines: { node: '>=10.13.0' } + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + /webpack-sources@3.2.3: + resolution: + { + integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + } + engines: { node: '>=10.13.0' } + dev: true + + /webpack@5.88.2: + resolution: + { + integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==, + } + engines: { node: '>=10.13.0' } + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver@0.7.4: + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: '>=0.8.0' } + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: '>=0.8.0' } + dev: false + + /whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-pm@2.0.0: + resolution: + { + integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, + } + engines: { node: '>=8.15' } + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.11: + resolution: + { + integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==, + } + engines: { node: '>= 0.4' } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.0.9: + resolution: + { + integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==, + } + hasBin: true + dev: false + + /which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@3.0.1: + resolution: + { + integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align@1.1.5: + resolution: + { + integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, + } + dependencies: + string-width: 4.2.3 + dev: true + + /widest-line@3.1.0: + resolution: + { + integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, + } + engines: { node: '>=8' } + dependencies: + string-width: 4.2.3 + + /winreg@1.2.4: + resolution: + { + integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==, + } + dev: false + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + + /wrap-ansi@2.1.0: + resolution: + { + integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, + } + engines: { node: '>=0.10.0' } + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /write-file-atomic@2.4.3: + resolution: + { + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, + } + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@4.0.2: + resolution: + { + integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@5.0.1: + resolution: + { + integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.0.2 + dev: true + + /write-json-file@3.2.0: + resolution: + { + integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, + } + engines: { node: '>=6' } + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.11 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-pkg@4.0.0: + resolution: + { + integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, + } + engines: { node: '>=8' } + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /xml-formatter@3.3.2: + resolution: + { + integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, + } + engines: { node: '>= 14' } + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-formatter@3.4.1: + resolution: + { + integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==, + } + engines: { node: '>= 14' } + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-parser-xo@4.1.1: + resolution: + { + integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, + } + engines: { node: '>= 14' } + dev: false + + /xml2js@0.5.0: + resolution: + { + integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==, + } + engines: { node: '>=4.0.0' } + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + + /xml2js@0.6.0: + resolution: + { + integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, + } + engines: { node: '>=4.0.0' } + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: + { + integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, + } + engines: { node: '>=4.0' } + + /xmlcreate@2.0.4: + resolution: + { + integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, + } + dev: false + + /xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: '>=0.4' } + dev: true + + /y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } + dev: true + + /yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yaml@1.10.2: + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } + dev: true + + /yargs-parser@20.2.4: + resolution: + { + integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, + } + engines: { node: '>=10' } + dev: true + + /yargs-parser@20.2.9: + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: '>=10' } + dev: true + + /yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } + dev: true + + /yargs@16.2.0: + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: '>=10' } + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: '>=12' } + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yeoman-environment@3.19.3: + resolution: + { + integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==, + } + engines: { node: '>=12.10.0' } + hasBin: true + dependencies: + '@npmcli/arborist': 4.3.1 + are-we-there-yet: 2.0.0 + arrify: 2.0.1 + binaryextensions: 4.18.0 + chalk: 4.1.2 + cli-table: 0.3.11 + commander: 7.1.0 + dateformat: 4.6.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.1.0 + error: 10.4.0 + escape-string-regexp: 4.0.0 + execa: 5.1.1 + find-up: 5.0.0 + globby: 11.1.0 + grouped-queue: 2.0.0 + inquirer: 8.2.5 + is-scoped: 2.1.0 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log-symbols: 4.1.0 + mem-fs: 2.3.0 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimatch: 3.1.2 + npmlog: 5.0.1 + p-queue: 6.6.2 + p-transform: 1.3.0 + pacote: 12.0.3 + preferred-pm: 3.0.3 + pretty-bytes: 5.6.0 + readable-stream: 4.4.2 + semver: 7.5.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 + textextensions: 5.16.0 + untildify: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /yeoman-generator@5.9.0(yeoman-environment@3.19.3): + resolution: + { + integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==, + } + engines: { node: '>=12.10.0' } + peerDependencies: + yeoman-environment: ^3.2.0 + peerDependenciesMeta: + yeoman-environment: + optional: true + dependencies: + chalk: 4.1.2 + dargs: 7.0.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 5.1.1 + github-username: 6.0.0 + lodash: 4.17.21 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimist: 1.2.8 + pacote: 15.2.0 + read-pkg-up: 7.0.1 + run-async: 2.4.1 + semver: 7.5.2 + shelljs: 0.8.5 + sort-keys: 4.2.0 + text-table: 0.2.0 + yeoman-environment: 3.19.3 + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - supports-color + dev: true + + /yn@3.1.1: + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } + dev: true + + /yosay@2.0.2: + resolution: + { + integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + ansi-regex: 2.1.1 + ansi-styles: 3.2.1 + chalk: 1.1.3 + cli-boxes: 1.0.0 + pad-component: 0.0.1 + string-width: 2.1.1 + strip-ansi: 3.0.1 + taketalk: 1.0.0 + wrap-ansi: 2.1.0 + dev: true From 028a179cb73aeca339694fde4cbddf03412e4903 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Wed, 20 Dec 2023 07:33:42 +1100 Subject: [PATCH 19/95] fix(envvar): revert env var to use SFPOWERSCRIPTS nomenclature for backward compatibility --- packages/sfp-cli/package.json | 2 +- packages/sfp-cli/src/SfpCommand.ts | 26 ++++++++-------- .../sfp-cli/src/commands/metrics/report.ts | 8 ++--- .../src/commands/orchestrator/publish.ts | 4 +-- .../src/commands/package/source/install.ts | 8 ++--- .../src/commands/pool/metrics/publish.ts | 8 ++--- .../src/core/artifacts/ArtifactFetcher.ts | 14 ++++----- .../artifacts/generators/ArtifactGenerator.ts | 2 +- packages/sfp-cli/src/core/git/Git.ts | 4 +-- packages/sfp-cli/src/core/git/GitIdentity.ts | 8 ++--- .../sfp-cli/src/core/stats/SFPStatsSender.ts | 12 ++++---- .../sfp-cli/src/core/utils/DefaultShell.ts | 8 ++--- .../impl/artifacts/FetchAnArtifactFromNPM.ts | 4 +-- .../sfp-cli/src/impl/prepare/PrepareOrgJob.ts | 14 ++++----- .../sfp-cli/src/impl/validate/ValidateImpl.ts | 4 +-- .../artifacts/ArtifactsFromFileSystem.test.ts | 30 +++++++++---------- 16 files changed, 78 insertions(+), 78 deletions(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 58d348d78..cd0da82bd 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.3", + "version": "30.0.4", "license": "MIT", "author": "flxblio", "release": "January 24", diff --git a/packages/sfp-cli/src/SfpCommand.ts b/packages/sfp-cli/src/SfpCommand.ts index 03048231b..2d92e93ce 100644 --- a/packages/sfp-cli/src/SfpCommand.ts +++ b/packages/sfp-cli/src/SfpCommand.ts @@ -39,7 +39,7 @@ export default abstract class sfpCommand extends Command { */ async run(): Promise { //Always enable color by default - if (process.env.sfp_NOCOLOR) SFPLogger.disableColor(); + if (process.env.SFPOWERSCRIPTS_NOCOLOR) SFPLogger.disableColor(); else SFPLogger.enableColor(); @@ -121,32 +121,32 @@ export default abstract class sfpCommand extends Command { private initializeStatsD() { - if (process.env.sfp_STATSD) { + if (process.env.SFPOWERSCRIPTS_STATSD) { SFPStatsSender.initialize( - process.env.sfp_STATSD_PORT, - process.env.sfp_STATSD_HOST, - process.env.sfp_STATSD_PROTOCOL + process.env.SFPOWERSCRIPTS_STATSD_PORT, + process.env.SFPOWERSCRIPTS_STATSD_HOST, + process.env.SFPOWERSCRIPTS_STATSD_PROTOCOL ); } - if (process.env.sfp_DATADOG) { + if (process.env.SFPOWERSCRIPTS_DATADOG) { SFPStatsSender.initializeNativeMetrics( 'DataDog', - process.env.sfp_DATADOG_HOST, - process.env.sfp_DATADOG_API_KEY, + process.env.SFPOWERSCRIPTS_DATADOG_HOST, + process.env.SFPOWERSCRIPTS_DATADOG_API_KEY, new ConsoleLogger() ); - } else if (process.env.sfp_NEWRELIC) { + } else if (process.env.SFPOWERSCRIPTS_NEWRELIC) { SFPStatsSender.initializeNativeMetrics( 'NewRelic', null, - process.env.sfp_NEWRELIC_API_KEY, + process.env.SFPOWERSCRIPTS_NEWRELIC_API_KEY, new ConsoleLogger() ); - } else if (process.env.sfp_SPLUNK) { + } else if (process.env.SFPOWERSCRIPTS_SPLUNK) { SFPStatsSender.initializeNativeMetrics( 'Splunk', - process.env.sfp_SPLUNK_HOST, - process.env.sfp_SPLUNK_API_KEY, + process.env.SFPOWERSCRIPTS_SPLUNK_HOST, + process.env.SFPOWERSCRIPTS_SPLUNK_API_KEY, new ConsoleLogger() ); } diff --git a/packages/sfp-cli/src/commands/metrics/report.ts b/packages/sfp-cli/src/commands/metrics/report.ts index 6b5b0a3a7..75c8e2d28 100644 --- a/packages/sfp-cli/src/commands/metrics/report.ts +++ b/packages/sfp-cli/src/commands/metrics/report.ts @@ -75,10 +75,10 @@ export default class Report extends sfpCommand { private validateEnvVars() { if ( !( - process.env.sfp_STATSD || - process.env.sfp_DATADOG || - process.env.sfp_NEWRELIC || - process.env.sfp_SPLUNK + process.env.SFPOWERSCRIPTS_STATSD || + process.env.SFPOWERSCRIPTS_STATSD_DATADOG || + process.env.SFPOWERSCRIPTS_STATSD_NEWRELIC || + process.env.SFPOWERSCRIPTS_STATSD_SPLUNK ) ) { throw new Error('Environment variable not set for metrics. No metrics will be published.'); diff --git a/packages/sfp-cli/src/commands/orchestrator/publish.ts b/packages/sfp-cli/src/commands/orchestrator/publish.ts index 1ceb82900..4afa79d0f 100644 --- a/packages/sfp-cli/src/commands/orchestrator/publish.ts +++ b/packages/sfp-cli/src/commands/orchestrator/publish.ts @@ -140,7 +140,7 @@ export default class Promote extends sfpCommand { let artifactFilePaths = ArtifactFetcher.fetchArtifacts(this.flags.artifactdir); // Pattern captures two named groups, the "package" name and "version" number - let pattern = new RegExp('(?^.*)(?:_sfp_artifact_)(?.*)(?:\\.zip)'); + let pattern = new RegExp('(?^.*)(?:_sfpowerscripts_artifact_)(?.*)(?:\\.zip)'); for (let artifact of artifacts) { let packageName: string; let packageVersionNumber: string; @@ -261,7 +261,7 @@ export default class Promote extends sfpCommand { let artifactRootDirectory = path.dirname(sfpPackage.sourceDir); // NPM does not accept packages with uppercase characters - let name: string = sfpPackage.packageName.toLowerCase() + '_sfp_artifact'; + let name: string = sfpPackage.packageName.toLowerCase() + '_sfpowerscriptsartifact'; //Check whether the user has already passed in @ diff --git a/packages/sfp-cli/src/commands/package/source/install.ts b/packages/sfp-cli/src/commands/package/source/install.ts index 14746c316..b8f4aeaa1 100644 --- a/packages/sfp-cli/src/commands/package/source/install.ts +++ b/packages/sfp-cli/src/commands/package/source/install.ts @@ -106,19 +106,19 @@ export default class InstallSourcePackage extends InstallPackageCommand { if (this.flags.refname) { fs.writeFileSync( '.env', - `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, + `${this.flags.refname}_sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}\n`, { flag: 'a' } ); console.log( - `${this.flags.refname}_sfp_installsourcepackage_deployment_id=${result.deploy_id}` + `${this.flags.refname}_sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}` ); } else { fs.writeFileSync( '.env', - `sfp_installsourcepackage_deployment_id=${result.deploy_id}\n`, + `sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}\n`, { flag: 'a' } ); - console.log(`sfp_installsourcepackage_deployment_id=${result.deploy_id}`); + console.log(`sfpowerscripts_installsourcepackage_deployment_id=${result.deploy_id}`); } } } diff --git a/packages/sfp-cli/src/commands/pool/metrics/publish.ts b/packages/sfp-cli/src/commands/pool/metrics/publish.ts index 6a0251f65..6ff13e294 100644 --- a/packages/sfp-cli/src/commands/pool/metrics/publish.ts +++ b/packages/sfp-cli/src/commands/pool/metrics/publish.ts @@ -114,10 +114,10 @@ export default class Publish extends sfpCommand { private validateEnvVars() { if ( !( - process.env.sfp_STATSD || - process.env.sfp_DATADOG || - process.env.sfp_NEWRELIC || - process.env.sfp_SPLUNK + process.env.SFPOWERSCRIPTS_STATSD || + process.env.SFPOWERSCRIPTS_DATADOG || + process.env.SFPOWERSCRIPTS_NEWRELIC || + process.env.SFPOWERSCRIPTS_SPLUNK ) ) { throw new Error('Environment variable not set for metrics. No metrics will be published.'); diff --git a/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts index fd0c94644..18623bbd2 100644 --- a/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts +++ b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts @@ -72,7 +72,7 @@ export default class ArtifactFetcher { // Overwrite existing files zip.extractAllTo(unzippedArtifactsDirectory, true); - let artifactName: string = path.basename(artifact).match(/.*sfp_artifact/)?.[0]; + let artifactName: string = path.basename(artifact).match(/.*sfpowerscripts_artifact/)?.[0]; if (artifactName == null) { throw new Error(`Failed to fetch artifact file paths for ${artifact}`); } @@ -128,16 +128,16 @@ export default class ArtifactFetcher { /** * Find zip and tarball artifacts * Artifact format/s: - * sfp_artifact_.zip, - * [sfdx_package]_sfp_artifact_[version].zip, - * [sfdx_package]_sfp_artifact_[version].tgz + * sfpowerscripts_artifact_.zip, + * [sfdx_package]_sfpowerscripts_artifact_[version].zip, + * [sfdx_package]_sfpowerscripts_artifact_[version].tgz */ public static findArtifacts(artifactDirectory: string, sfdx_package?: string): string[] { let pattern: string; if (sfdx_package) { - pattern = `**/*${sfdx_package}_sfp_artifact*.@(zip|tgz)`; + pattern = `**/*${sfdx_package}_sfpowerscripts_artifact*.@(zip|tgz)`; } else { - pattern = `**/*sfp_artifact*.@(zip|tgz)`; + pattern = `**/*sfpowerscripts_artifact*.@(zip|tgz)`; } let artifacts: string[] = globSync(pattern, { @@ -164,7 +164,7 @@ export default class ArtifactFetcher { return ext === '.zip' || ext === '.tgz'; }); - let pattern = new RegExp('(?:^.*)(?:_sfp_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); + let pattern = new RegExp('(?:^.*)(?:_sfpowerscripts_artifact[_-])(?.*)(?:\\.zip|\\.tgz)$'); let versions: string[] = artifacts.map((artifact) => { let match: RegExpMatchArray = path.basename(artifact).match(pattern); let version = match?.groups.version; diff --git a/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts b/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts index 6ce94ec2d..a50bfcfac 100644 --- a/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts +++ b/packages/sfp-cli/src/core/artifacts/generators/ArtifactGenerator.ts @@ -16,7 +16,7 @@ export default class ArtifactGenerator { ): Promise { try { // Artifact folder consisting of artifact metadata, changelog & source - let artifactFolder: string = `${sfpPackage.packageName}_sfp_artifact`; + let artifactFolder: string = `${sfpPackage.packageName}_sfpowerscripts_artifact`; // Absolute filepath of artifact let artifactFilepath: string; diff --git a/packages/sfp-cli/src/core/git/Git.ts b/packages/sfp-cli/src/core/git/Git.ts index 97089b71f..9b7e0e42b 100644 --- a/packages/sfp-cli/src/core/git/Git.ts +++ b/packages/sfp-cli/src/core/git/Git.ts @@ -189,9 +189,9 @@ export default class Git { async pushToRemote(branch: string, isForce: boolean) { if (!branch) branch = (await this._git.branch()).current; SFPLogger.log(`Pushing ${branch}`, LoggerLevel.INFO, this.logger); - if (process.env.sfp_OVERRIDE_ORIGIN_URL) { + if (process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL) { await this._git.removeRemote('origin'); - await this._git.addRemote('origin', process.env.sfp_OVERRIDE_ORIGIN_URL); + await this._git.addRemote('origin', process.env.SFPOWERSCRIPTS_OVERRIDE_ORIGIN_URL); } if (isForce) { diff --git a/packages/sfp-cli/src/core/git/GitIdentity.ts b/packages/sfp-cli/src/core/git/GitIdentity.ts index ecc806d82..16c1a6d1c 100644 --- a/packages/sfp-cli/src/core/git/GitIdentity.ts +++ b/packages/sfp-cli/src/core/git/GitIdentity.ts @@ -11,8 +11,8 @@ export default class GitIdentity { private async setUsername(): Promise { let username: string; - if (process.env.sfp_GIT_USERNAME) { - username = process.env.sfp_GIT_USERNAME; + if (process.env.SFPOWERSCRIPTS_GIT_USERNAME) { + username = process.env.SFPOWERSCRIPTS_GIT_USERNAME; } else { username = 'sfp'; } @@ -23,8 +23,8 @@ export default class GitIdentity { private async setEmail(): Promise { let email: string; - if (process.env.sfp_GIT_EMAIL) { - email = process.env.sfp_GIT_EMAIL; + if (process.env.SFPOWERSCRIPTS_GIT_EMAIL) { + email = process.env.SFPOWERSCRIPTS_GIT_EMAIL; } else { email = 'sfp@flxblio.io'; } diff --git a/packages/sfp-cli/src/core/stats/SFPStatsSender.ts b/packages/sfp-cli/src/core/stats/SFPStatsSender.ts index 24e0bd165..62dd344b2 100644 --- a/packages/sfp-cli/src/core/stats/SFPStatsSender.ts +++ b/packages/sfp-cli/src/core/stats/SFPStatsSender.ts @@ -17,7 +17,7 @@ export default class SFPStatsSender { host: host, port: port == null ? 8125 : Number(port), protocol: protocol == 'tcp' ? 'tcp' : 'udp', - prefix: 'sfp.', + prefix: 'sfpowerscripts.', }; SFPStatsSender.client = new StatsDClient(options); } @@ -46,8 +46,8 @@ export default class SFPStatsSender { static initializeLogBasedMetrics() { try { - fs.mkdirpSync('.sfp/logs'); - SFPStatsSender.metricsLogger = `.sfp/logs/metrics.log`; + fs.mkdirpSync('.sfpowerscripts/logs'); + SFPStatsSender.metricsLogger = `.sfpowerscripts/logs/metrics.log`; } catch (error) { console.log('Unable to initiate Log based metrics', error); } @@ -62,7 +62,7 @@ export default class SFPStatsSender { } let metrics = { - metric: `sfp.${metric}`, + metric: `sfpowerscripts.${metric}`, type: `timers`, value: elapsedMilliSeconds, timestamp: Date.now(), @@ -80,7 +80,7 @@ export default class SFPStatsSender { } let metrics = { - metric: `sfp.${metric}`, + metric: `sfpowerscripts.${metric}`, type: `guage`, value: value, timestamp: Date.now(), @@ -98,7 +98,7 @@ export default class SFPStatsSender { } let metrics = { - metric: `sfp.${metric}`, + metric: `sfpowerscripts.${metric}`, type: `count`, timestamp: Date.now(), tags: tags, diff --git a/packages/sfp-cli/src/core/utils/DefaultShell.ts b/packages/sfp-cli/src/core/utils/DefaultShell.ts index d8b4ae16a..63a1ddf8f 100644 --- a/packages/sfp-cli/src/core/utils/DefaultShell.ts +++ b/packages/sfp-cli/src/core/utils/DefaultShell.ts @@ -1,7 +1,7 @@ -const sfp_DEFAULT_SHELL = `sh`; +const SFPOWERSCRIPTS_DEFAULT_SHELL = `sh`; export default function defaultShell(): string { - return process.env.sfp_DEFAULT_SHELL - ? process.env.sfp_DEFAULT_SHELL - : sfp_DEFAULT_SHELL; + return process.env.SFPOWERSCRIPTS_DEFAULT_SHELL + ? process.env.SFPOWERSCRIPTS_DEFAULT_SHELL + : SFPOWERSCRIPTS_DEFAULT_SHELL; } diff --git a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts index 8e5cead2d..f22432972 100644 --- a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts +++ b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts @@ -40,8 +40,8 @@ export class FetchAnArtifactFromNPM implements FetchAnArtifact { packageName = packageName.toLowerCase(); let cmd: string; - if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfp_artifact`; - else cmd = `npm pack ${packageName}_sfp_artifact`; + if (this.scope) cmd = `npm pack @${this.scope.toLowerCase()}/${packageName}_sfpowerscripts_artifact`; + else cmd = `npm pack ${packageName}_sfpowerscripts_artifact`; cmd += `@${version}`; diff --git a/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts b/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts index eae028d18..052f47308 100644 --- a/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts +++ b/packages/sfp-cli/src/impl/prepare/PrepareOrgJob.ts @@ -25,7 +25,7 @@ import ProjectConfig from '../../core/project/ProjectConfig'; import { FileLogger } from '@flxblio/sfp-logger'; const fs = require('fs-extra'); -const sfp_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; +const SFPOWERSCRIPTS_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployHook { public constructor( protected pool: PoolConfig, @@ -145,22 +145,22 @@ export default class PrepareOrgJob extends PoolJobExecutor implements PreDeployH logger: Logger, packageCollectionInstaller: InstallUnlockedPackageCollection ) { - SFPLogger.log(`Installing sfp_artifact package to the ${scratchOrg.alias}`, null, logger); + SFPLogger.log(`Installing sfpowerscripts_artifact package to the ${scratchOrg.alias}`, null, logger); //Install sfp artifact package await packageCollectionInstaller.install( [ { - name: 'sfp_artifact2', - subscriberPackageVersionId: process.env.sfp_ARTIFACT_PACKAGE - ? process.env.sfp_ARTIFACT_PACKAGE - : sfp_ARTIFACT_PACKAGE, + name: 'SFPOWERSCRIPTS_artifact2', + subscriberPackageVersionId: process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE + ? process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE + : SFPOWERSCRIPTS_ARTIFACT_PACKAGE, }, ], true ); - SFPLogger.log(`Suscessfully Installed sfp_artifact package to the ${scratchOrg.alias}`, null, logger); + SFPLogger.log(`Suscessfully Installed SFPOWERSCRIPTS_artifact package to the ${scratchOrg.alias}`, null, logger); } private async invokeDeployImpl( diff --git a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts index 39e17c6ba..7d52ed3f4 100644 --- a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts +++ b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts @@ -107,9 +107,9 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { } else if ( this.props.validateAgainst === ValidateAgainst.PRECREATED_POOL ) { - if (process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG) + if (process.env.SFPOWERSCRIPTS_DEBUG_PREFETCHED_SCRATCHORG) scratchOrgUsername = - process.env.sfp_DEBUG_PREFETCHED_SCRATCHORG; + process.env.SFPOWERSCRIPTS_DEBUG_PREFETCHED_SCRATCHORG; else scratchOrgUsername = await this.fetchScratchOrgFromPool( this.props.pools, diff --git a/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts b/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts index f30a3ab4f..5e201822e 100644 --- a/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts +++ b/packages/sfp-cli/tests/core/artifacts/ArtifactsFromFileSystem.test.ts @@ -7,10 +7,10 @@ describe('Provided a path to the artifacts folder containing sfp artifact', () = jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { return [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core2_sfp_artifact_1.0.0-2.zip', - '/path/to/core3_sfp_artifact_1.0.0-3.zip', - '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', + '/path/to/core2_sfpowerscripts_artifact_1.0.0-2.zip', + '/path/to/core3_sfpowerscripts_artifact_1.0.0-3.zip', + '/path/to/my-package_sfpowerscripts_artifact_3.30.53-NEXT.tgz' ]; }); @@ -18,10 +18,10 @@ describe('Provided a path to the artifacts folder containing sfp artifact', () = let artifacts = ArtifactFetcher.findArtifacts('artifacts'); expect(artifacts).toEqual( [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core2_sfp_artifact_1.0.0-2.zip', - '/path/to/core3_sfp_artifact_1.0.0-3.zip', - '/path/to/my-package_sfp_artifact_3.30.53-NEXT.tgz' + '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', + '/path/to/core2_sfpowerscripts_artifact_1.0.0-2.zip', + '/path/to/core3_sfpowerscripts_artifact_1.0.0-3.zip', + '/path/to/my-package_sfpowerscripts_artifact_3.30.53-NEXT.tgz' ] ); }); @@ -29,24 +29,24 @@ describe('Provided a path to the artifacts folder containing sfp artifact', () = it('provided only one artifact exists for a package and a package name is provided, it should just return the one artifact', () => { jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { - return new Array('/path/to/core_sfp_artifact_1.0.0-2.zip'); + return new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip'); }); let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-2.zip')); + expect(artifacts).toEqual(new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip')); }); it('provided multiple artifacts of the same package exists and a package name is provied, it should return the latest', () => { jest.spyOn(globSync, 'globSync').mockImplementationOnce((pattern: string | string[], options: any) => { return [ - '/path/to/core_sfp_artifact_1.0.0-2.zip', - '/path/to/core_sfp_artifact_1.0.0-3.zip', - '/path/to/core_sfp_artifact_1.0.0-4.zip', - '/path/to/core_sfp_artifact_1.0.0-5.tgz' + '/path/to/core_sfpowerscripts_artifact_1.0.0-2.zip', + '/path/to/core_sfpowerscripts_artifact_1.0.0-3.zip', + '/path/to/core_sfpowerscripts_artifact_1.0.0-4.zip', + '/path/to/core_sfpowerscripts_artifact_1.0.0-5.tgz' ]; }); let artifacts = ArtifactFetcher.findArtifacts('artifacts', 'core'); - expect(artifacts).toEqual(new Array('/path/to/core_sfp_artifact_1.0.0-5.tgz')); + expect(artifacts).toEqual(new Array('/path/to/core_sfpowerscripts_artifact_1.0.0-5.tgz')); }); }); From 28c7642f00b3cde6b43fdb322046a99cbc13af4c Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Wed, 20 Dec 2023 07:40:19 +1100 Subject: [PATCH 20/95] fix(sfp): revert file locations to use .sfpowerscripts --- packages/sfp-cli/package.json | 2 +- packages/sfp-cli/src/InstallPackageCommand.ts | 2 +- packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts | 4 ++-- .../src/core/dependency/ChangedComponentsFetcher.ts | 2 +- .../src/core/deployers/DeploySourceToOrgImpl.ts | 2 +- packages/sfp-cli/src/core/metadata/MetadataFetcher.ts | 2 +- .../package/generators/SfpPackageContentGenerator.ts | 2 +- .../packageFormatConvertors/SourceToMDAPIConvertor.ts | 2 +- .../sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts | 2 +- .../src/core/scratchorg/pool/PoolJobExecutor.ts | 2 +- packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts | 10 +++++----- packages/sfp-cli/src/outputs/FileOutputHandler.ts | 2 +- .../tests/core/package/SFPackageBuilder.test.ts | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index cd0da82bd..5215f2164 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.4", + "version": "30.0.5", "license": "MIT", "author": "flxblio", "release": "January 24", diff --git a/packages/sfp-cli/src/InstallPackageCommand.ts b/packages/sfp-cli/src/InstallPackageCommand.ts index 835a574cd..5ee284493 100644 --- a/packages/sfp-cli/src/InstallPackageCommand.ts +++ b/packages/sfp-cli/src/InstallPackageCommand.ts @@ -86,6 +86,6 @@ export default abstract class InstallPackageCommand extends sfpCommand { */ private postInstall(): void { // Delete temp directory containing unzipped artifacts - rimraf.sync('.sfp/unzippedArtifacts'); + rimraf.sync('.sfpowerscripts/unzippedArtifacts'); } } diff --git a/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts index 18623bbd2..292998355 100644 --- a/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts +++ b/packages/sfp-cli/src/core/artifacts/ArtifactFetcher.ts @@ -64,7 +64,7 @@ export default class ArtifactFetcher { * @param artifact */ private static fetchArtifactFilePathsFromZipFile(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + let unzippedArtifactsDirectory: string = `.sfpowerscripts/unzippedArtifacts/${this.makefolderid(8)}`; fs.mkdirpSync(unzippedArtifactsDirectory); let zip = new AdmZip(artifact); @@ -99,7 +99,7 @@ export default class ArtifactFetcher { * @param artifact */ private static fetchArtifactFilePathsFromTarball(artifact: string): Artifact { - let unzippedArtifactsDirectory: string = `.sfp/unzippedArtifacts/${this.makefolderid(8)}`; + let unzippedArtifactsDirectory: string = `.sfpowerscripts/unzippedArtifacts/${this.makefolderid(8)}`; fs.mkdirpSync(unzippedArtifactsDirectory); tar.x({ diff --git a/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts b/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts index 253b64313..ebf654909 100644 --- a/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts +++ b/packages/sfp-cli/src/core/dependency/ChangedComponentsFetcher.ts @@ -80,7 +80,7 @@ export default class ChangedComponentsFetcher { private getComponentSuccessesFromReports(): any[] { let componentSuccesses: any[] = []; - const reportsDir: string = '.sfp/mdapiDeployReports'; + const reportsDir: string = '.sfpowerscripts/mdapiDeployReports'; if (fs.existsSync(reportsDir)) { let reports = fs.readdirSync(reportsDir); reports.forEach((report) => { diff --git a/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts b/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts index ea9f2c3d4..92c46f0ee 100644 --- a/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts +++ b/packages/sfp-cli/src/core/deployers/DeploySourceToOrgImpl.ts @@ -111,7 +111,7 @@ export default class DeploySourceToOrgImpl implements DeploymentExecutor { } private writeResultToReport(result: DeployResult) { - let deploymentReports = `.sfp/mdapiDeployReports`; + let deploymentReports = `.sfpowerscripts/mdapiDeployReports`; fs.mkdirpSync(deploymentReports); fs.writeFileSync( path.join(deploymentReports, `${result.response.id}.json`), diff --git a/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts b/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts index ef41f6061..b8af4a5ba 100644 --- a/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts +++ b/packages/sfp-cli/src/core/metadata/MetadataFetcher.ts @@ -29,7 +29,7 @@ export default class MetadataFetcher { if (!metadata_retrieve_result.zipFile) SFPLogger.log('Unable to find the requested metadata', LoggerLevel.ERROR, this.logger); - let retriveLocation = `.sfp/retrieved/${retrievedId.id}`; + let retriveLocation = `.sfpowerscripts/retrieved/${retrievedId.id}`; //Extract Security let zipFileName = `${retriveLocation}/unpackaged_${makeRandomId(8)}.zip`; fs.mkdirpSync(retriveLocation); diff --git a/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts b/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts index cf5e58c58..2ee30b326 100644 --- a/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts +++ b/packages/sfp-cli/src/core/package/generators/SfpPackageContentGenerator.ts @@ -23,7 +23,7 @@ export default class SfpPackageContentGenerator { revisionFrom?: string, revisionTo?: string ): Promise { - let artifactDirectory: string = `.sfp/${this.makefolderid(5)}_source`, + let artifactDirectory: string = `.sfpowerscripts/${this.makefolderid(5)}_source`, rootDirectory: string; if (projectDirectory) { diff --git a/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts b/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts index c58e992d7..102fc7161 100644 --- a/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts +++ b/packages/sfp-cli/src/core/package/packageFormatConvertors/SourceToMDAPIConvertor.ts @@ -11,7 +11,7 @@ export default class SourceToMDAPIConvertor { ) {} public async convert() { - let mdapiDir = `.sfp/${this.makefolderid(5)}_mdapi`; + let mdapiDir = `.sfpowerscripts/${this.makefolderid(5)}_mdapi`; //Create destination directory if (this.projectDirectory != null) mdapiDir = path.resolve(this.projectDirectory, mdapiDir); diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts index 12c0bcadf..81b3d1321 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts @@ -274,7 +274,7 @@ export default class PoolCreateImpl extends PoolBaseImpl { function addDescriptionToScratchOrg(pool: PoolConfig) { const configClonePath = path.join('.sfp','scratchorg-configs',`${ makeFileId(8)}.json`); - fs.mkdirpSync('.sfp/scratchorg-configs'); + fs.mkdirpSync('.sfpowerscripts/scratchorg-configs'); fs.copyFileSync(pool.configFilePath,configClonePath); const scratchOrgDefn = fs.readJSONSync(configClonePath); diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts index 1d70e4aff..57c853ada 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolJobExecutor.ts @@ -16,7 +16,7 @@ export default abstract class PoolJobExecutor { hubOrg: Org, logLevel: LoggerLevel ): Promise> { - this.logToFilePath = `.sfp/prepare_logs/${scratchOrg.alias}.log`; + this.logToFilePath = `.sfpowerscripts/prepare_logs/${scratchOrg.alias}.log`; //Create file logger fs.outputFileSync(this.logToFilePath, `sfp--log${EOL}`); SFPLogger.log(`Preparation Log files for ${scratchOrg.username} written to ${this.logToFilePath}`); diff --git a/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts b/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts index 5bc6a3e82..e2895b696 100644 --- a/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts +++ b/packages/sfp-cli/src/impl/parallelBuilder/BuildImpl.ts @@ -445,11 +445,11 @@ export default class BuildImpl { SFPLogger.log(COLOR_ERROR(`Package Creation Failed for ${pkg}, Here are the details:`)); try { // Append error to log file - fs.appendFileSync(`.sfp/logs/${pkg}`, reason.message, "utf8"); - let data = fs.readFileSync(`.sfp/logs/${pkg}`, "utf8"); + fs.appendFileSync(`.sfpowerscripts/logs/${pkg}`, reason.message, "utf8"); + let data = fs.readFileSync(`.sfpowerscripts/logs/${pkg}`, "utf8"); - const pathToMarkDownFile = `.sfp/outputs/build-error-info.md`; - fs.mkdirpSync(".sfp/outputs"); + 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`); @@ -755,7 +755,7 @@ export default class BuildImpl { return SfpPackageBuilder.buildPackageFromProjectDirectory( - new FileLogger(`.sfp/logs/${sfdx_package}`), + new FileLogger(`.sfpowerscripts/logs/${sfdx_package}`), this.props.projectDirectory, sfdx_package, { diff --git a/packages/sfp-cli/src/outputs/FileOutputHandler.ts b/packages/sfp-cli/src/outputs/FileOutputHandler.ts index 1d473cf3d..cba026c60 100644 --- a/packages/sfp-cli/src/outputs/FileOutputHandler.ts +++ b/packages/sfp-cli/src/outputs/FileOutputHandler.ts @@ -7,7 +7,7 @@ export default class FileOutputHandler { public static getInstance() { if (!FileOutputHandler.instance) - FileOutputHandler.instance = new FileOutputHandler('.sfp/outputs'); + FileOutputHandler.instance = new FileOutputHandler('.sfpowerscripts/outputs'); return FileOutputHandler.instance; } diff --git a/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts b/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts index fa6936479..b66eb824f 100644 --- a/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts +++ b/packages/sfp-cli/tests/core/package/SFPackageBuilder.test.ts @@ -52,7 +52,7 @@ jest.mock('../../../src/core/package/generators/SfpPackageContentGenerator', () configFilePath?: string, pathToReplacementForceIgnore?: string ): Promise { - return '.sfp/3sIRD_source'; + return '.sfpowerscripts/3sIRD_source'; } } From a23e023587a7a4716ab6511bd27e91b7be5f5a5d Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 17:40:24 +1100 Subject: [PATCH 21/95] fix(deploy): fix header being incorrectly displayed to console log Deploying during prepare incorrectly displays the header to console, it should be part of individual files --- packages/sfp-cli/src/impl/deploy/DeployImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts index 98851aaad..f71a48b78 100644 --- a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts +++ b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts @@ -388,7 +388,7 @@ export default class DeployImpl { } else alwaysDeployMessage = undefined; //Display header - SFPLogger.printHeaderLine('Installing Package',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('Installing Package',COLOR_HEADER,LoggerLevel.INFO,this.props.logger); SFPLogger.log(COLOR_HEADER(`Name: ${COLOR_KEY_MESSAGE(pkg)}`), LoggerLevel.INFO, this.props.logger); SFPLogger.log(`Type: ${COLOR_KEY_MESSAGE(sfpPackage.packageType)}`, LoggerLevel.INFO, this.props.logger); SFPLogger.log( From 8335a0913c3c91154c8fc81d2a1ff6f991717de5 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 17:40:36 +1100 Subject: [PATCH 22/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.0.6 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 5215f2164..0d83bf840 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.5", + "version": "30.0.6", "license": "MIT", "author": "flxblio", "release": "January 24", From a3b021f40335f7ac1d6bed519d54faae46025037 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 17:44:28 +1100 Subject: [PATCH 23/95] feat(prepare): add a log to display packages that are restricted as per release config --- packages/sfp-cli/src/impl/prepare/PrepareImpl.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts index 1087c6367..f438d7055 100644 --- a/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts +++ b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts @@ -69,6 +69,7 @@ export default class PrepareImpl { if (this.pool.releaseConfigFile) { restrictedPackages = await getArtifactsByGeneratingReleaseDefinitionFromConfig(this.pool.releaseConfigFile); + SFPLogger.log(`Restricted Packages: ${restrictedPackages}`, LoggerLevel.INFO); projectConfig = ProjectConfig.cleanupPackagesFromProjectDirectory(null, restrictedPackages); } From 75d72bd749ad612443981fd6489880c70e6c0bed Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 17:44:45 +1100 Subject: [PATCH 24/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.1.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 0d83bf840..8ec77e43f 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.0.6", + "version": "30.1.0", "license": "MIT", "author": "flxblio", "release": "January 24", From 256c6bb308d741b8be22ff0ebbe038dad0595822 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 18:14:34 +1100 Subject: [PATCH 25/95] fix(projectconfig): incorrect use of package.name while filtering project config project config filtering was incorrectly returning packages due to an incorrect predicate --- packages/sfp-cli/src/core/project/ProjectConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/core/project/ProjectConfig.ts b/packages/sfp-cli/src/core/project/ProjectConfig.ts index ebd7e1e20..b9d918460 100644 --- a/packages/sfp-cli/src/core/project/ProjectConfig.ts +++ b/packages/sfp-cli/src/core/project/ProjectConfig.ts @@ -244,7 +244,7 @@ export default class ProjectConfig { let originalPackageDirectory = projectConfig['packageDirectories']; for (let pkg of originalPackageDirectory) { for (const sfdxPackage of sfdxPackages) { - if (pkg.name == sfdxPackage) { + if (pkg.package == sfdxPackage) { pkg.default = false; revisedPackageDirectory.push(pkg); } From 53b091295f8df553294bfba3cb0cc512d5f06249 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 18:14:44 +1100 Subject: [PATCH 26/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.1.1 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 8ec77e43f..0df818172 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.1.0", + "version": "30.1.1", "license": "MIT", "author": "flxblio", "release": "January 24", From 625b39bf62c46c11571d333ca8b094cc2f2f7a39 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 18:34:28 +1100 Subject: [PATCH 27/95] fix(pool): revert path used to .sfpowerscripts for backward compatibility --- packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts index 81b3d1321..f968c97cc 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts @@ -273,7 +273,7 @@ export default class PoolCreateImpl extends PoolBaseImpl { function addDescriptionToScratchOrg(pool: PoolConfig) { - const configClonePath = path.join('.sfp','scratchorg-configs',`${ makeFileId(8)}.json`); + const configClonePath = path.join('.sfpowerscripts','scratchorg-configs',`${ makeFileId(8)}.json`); fs.mkdirpSync('.sfpowerscripts/scratchorg-configs'); fs.copyFileSync(pool.configFilePath,configClonePath); From b51f4eee6a4815579b495558cae119f84f74ed9c Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Mon, 8 Jan 2024 18:34:43 +1100 Subject: [PATCH 28/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.1.2 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 0df818172..cbaf9e7e6 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.1.1", + "version": "30.1.2", "license": "MIT", "author": "flxblio", "release": "January 24", From 3a5d87a558ad5ff592ff7cc9b2b12cd2575da0aa Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 13:54:19 +1100 Subject: [PATCH 29/95] feat(impact): add additional options to consider only changed files during release config impact This PR enhances the impact release config with additonal flags that allow to check for impact for changed files, useful during PR validation --- .../sfp-cli/messages/impact_release_config.json | 2 ++ .../sfp-cli/src/commands/impact/releaseconfig.ts | 14 ++++++++++++++ packages/sfp-cli/src/core/git/GitTags.ts | 9 +++++---- .../src/core/package/diff/PackageDiffImpl.ts | 12 +++++++++++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/sfp-cli/messages/impact_release_config.json b/packages/sfp-cli/messages/impact_release_config.json index d96edc890..8cd21e90e 100644 --- a/packages/sfp-cli/messages/impact_release_config.json +++ b/packages/sfp-cli/messages/impact_release_config.json @@ -1,7 +1,9 @@ { "commandDescription": "Figures out impacted release configurations of a project, due to a change,from the last known tags", "releaseConfigFileFlagDescription":"Path to the directory containing release defns", + "branchFlagDescription":"The branch on which the comparison is carried out", "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used from", "filterByFlagDescription": "Filter by a specific release config name", + "filterByChangesInBranchFlagDescription": "Filter packages by changes with the provided branches as opposed to tags", "explictDependencyCheckFlagDescription": "Activate to consider dependencyOn attribut while handling impact" } diff --git a/packages/sfp-cli/src/commands/impact/releaseconfig.ts b/packages/sfp-cli/src/commands/impact/releaseconfig.ts index b8e7bec9c..fa6090efa 100644 --- a/packages/sfp-cli/src/commands/impact/releaseconfig.ts +++ b/packages/sfp-cli/src/commands/impact/releaseconfig.ts @@ -18,6 +18,10 @@ const messages = Messages.loadMessages('@flxblio/sfp', 'impact_release_config'); export default class ReleaseConfig extends sfpCommand { public static flags = { loglevel, + branch: Flags.string({ + description: messages.getMessage('branchFlagDescription'), + required: true, + }), basebranch: Flags.string({ description: messages.getMessage('baseCommitOrBranchFlagDescription'), required: true, @@ -33,6 +37,9 @@ export default class ReleaseConfig extends sfpCommand { filterBy: Flags.string({ description: messages.getMessage('filterByFlagDescription'), }), + filterByChangesInBranch: Flags.boolean({ + description: messages.getMessage('filterByChangesInBranchFlagDescription'), + }), }; public static description = messages.getMessage('commandDescription'); @@ -52,6 +59,13 @@ export default class ReleaseConfig extends sfpCommand { }, }; + if(this.flags.filterByChangesInBranch) + { + this.props.diffOptions.useBranchCompare=true; + this.props.diffOptions.branch=this.flags.branch; + this.props.diffOptions.baseBranch=this.flags.basebranch; + } + const impactedPackageResolver = new ImpactedPackageResolver(this.props, new ConsoleLogger()); let packagesToBeBuiltWithReasons = await impactedPackageResolver.getImpactedPackages(); diff --git a/packages/sfp-cli/src/core/git/GitTags.ts b/packages/sfp-cli/src/core/git/GitTags.ts index 846585451..845806c6d 100644 --- a/packages/sfp-cli/src/core/git/GitTags.ts +++ b/packages/sfp-cli/src/core/git/GitTags.ts @@ -45,12 +45,13 @@ export default class GitTags { let refTagsPointingToBranch: string[] = refTags.filter((refTag) => commits.includes(refTag.substring(0, 40))); // Only match the name of the tags pointing to the branch - refTagsPointingToBranch = refTagsPointingToBranch.map( - (refTagPointingToBranch) => refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/)[1] - ); + refTagsPointingToBranch = refTagsPointingToBranch.map((refTagPointingToBranch) => { + const match = refTagPointingToBranch.match(/(?:refs\/tags\/)(.*)((?:-ALIGN)|(?:\^{}))/); + return match ? match[1] : null; + }); // Filter the sorted tags - only including tags that point to the branch - let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch.includes(tag)); + let tagsPointingToBranch: string[] = tags.filter((tag) => refTagsPointingToBranch?.includes(tag)); return tagsPointingToBranch; } diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts index e620bf96c..89a954c1b 100644 --- a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -15,6 +15,9 @@ export class PackageDiffOptions { useLatestGitTags?:boolean=true; packagesMappedToLastKnownCommitId?: { [p: string]: string }; pathToReplacementForceIgnore?: string; + useBranchCompare?: boolean = false; + branch?: string; + baseBranch?: string; } export default class PackageDiffImpl { @@ -52,7 +55,14 @@ export default class PackageDiffImpl { // Get the list of modified files between the tag and HEAD refs let modified_files: string[]; try { - modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); + if(this.diffOptions?.useBranchCompare) + { + modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}...${this.diffOptions.branch}`]); + } + else + { + modified_files = await git.diff([`${tag}`, `HEAD`, `--no-renames`, `--name-only`]); + } } catch (error) { SFPLogger.log(COLOR_ERROR(`Unable to compute diff, The head of the branch is not reachable from the commit id ${tag}`)); SFPLogger.log(COLOR_ERROR(`Check your current branch (in case of build) or the scratch org in case of validate command`)); From ff77c6e71ae0a8db216ef315a73032846b4f80cc Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 13:54:27 +1100 Subject: [PATCH 30/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index cbaf9e7e6..849005f84 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.1.2", + "version": "30.2.0", "license": "MIT", "author": "flxblio", "release": "January 24", From d89db617121e601c9f65a42efb2afce6b0f777dd Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 15:55:41 +1100 Subject: [PATCH 31/95] fix(impact): remove hard requirement on branch flag --- packages/sfp-cli/src/commands/impact/releaseconfig.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sfp-cli/src/commands/impact/releaseconfig.ts b/packages/sfp-cli/src/commands/impact/releaseconfig.ts index fa6090efa..2de90cad0 100644 --- a/packages/sfp-cli/src/commands/impact/releaseconfig.ts +++ b/packages/sfp-cli/src/commands/impact/releaseconfig.ts @@ -20,7 +20,6 @@ export default class ReleaseConfig extends sfpCommand { loglevel, branch: Flags.string({ description: messages.getMessage('branchFlagDescription'), - required: true, }), basebranch: Flags.string({ description: messages.getMessage('baseCommitOrBranchFlagDescription'), From c4f6cc09a2d997a8aa18e52f53ecaf6406999984 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 15:55:50 +1100 Subject: [PATCH 32/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.1 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 849005f84..6f6469bc2 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.0", + "version": "30.2.1", "license": "MIT", "author": "flxblio", "release": "January 24", From 2521a4168edcc5fb2488d79456ef42f007e99285 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 16:51:08 +1100 Subject: [PATCH 33/95] fix(impact): fix typo with explict dependency check flag --- packages/sfp-cli/messages/impact_release_config.json | 2 +- packages/sfp-cli/src/commands/impact/releaseconfig.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sfp-cli/messages/impact_release_config.json b/packages/sfp-cli/messages/impact_release_config.json index 8cd21e90e..0c9536c14 100644 --- a/packages/sfp-cli/messages/impact_release_config.json +++ b/packages/sfp-cli/messages/impact_release_config.json @@ -5,5 +5,5 @@ "baseCommitOrBranchFlagDescription": "The base branch on which the git tags should be used from", "filterByFlagDescription": "Filter by a specific release config name", "filterByChangesInBranchFlagDescription": "Filter packages by changes with the provided branches as opposed to tags", - "explictDependencyCheckFlagDescription": "Activate to consider dependencyOn attribut while handling impact" + "explicitDependencyCheckFlagDescription": "Activate to consider dependencyOn attribut while handling impact" } diff --git a/packages/sfp-cli/src/commands/impact/releaseconfig.ts b/packages/sfp-cli/src/commands/impact/releaseconfig.ts index 2de90cad0..2e5f1bcdf 100644 --- a/packages/sfp-cli/src/commands/impact/releaseconfig.ts +++ b/packages/sfp-cli/src/commands/impact/releaseconfig.ts @@ -29,8 +29,8 @@ export default class ReleaseConfig extends sfpCommand { description: messages.getMessage('releaseConfigFileFlagDescription'), default: 'config', }), - explictDependencyCheck: Flags.boolean({ - description: messages.getMessage('explictDependencyCheckFlagDescription'), + explicitDependencyCheck: Flags.boolean({ + description: messages.getMessage('explicitDependencyCheckFlagDescription'), default: false, }), filterBy: Flags.string({ @@ -80,7 +80,7 @@ export default class ReleaseConfig extends sfpCommand { let impactedReleaseConfigs = impactedReleaseConfigResolver.getImpactedReleaseConfigs( packagesToBeBuilt, this.flags.releaseconfig, - this.flags.explictDependencyCheck, + this.flags.explicitDependencyCheck, this.flags.filterBy ); From 1885fb2c4c3d348f409d38dec8e7d67feee98ab7 Mon Sep 17 00:00:00 2001 From: sfopsbot Date: Tue, 9 Jan 2024 16:51:26 +1100 Subject: [PATCH 34/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.2 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 6f6469bc2..2a27d24dd 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.1", + "version": "30.2.2", "license": "MIT", "author": "flxblio", "release": "January 24", From 507026625b798360523aed78d32d37151e1a57e9 Mon Sep 17 00:00:00 2001 From: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> Date: Tue, 9 Jan 2024 17:36:16 +1100 Subject: [PATCH 35/95] fix(diff):various fixes in diff to support branch compare - Mimic files changed in PR by most ci/cd systems using .. - Ignore packages with no tags unless they are modified --- .../src/core/package/diff/PackageDiffImpl.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts index 89a954c1b..21fe44c24 100644 --- a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -57,7 +57,7 @@ export default class PackageDiffImpl { try { if(this.diffOptions?.useBranchCompare) { - modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}...${this.diffOptions.branch}`]); + modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}..${this.diffOptions.branch}`]); } else { @@ -107,12 +107,34 @@ export default class PackageDiffImpl { return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; } else { - SFPLogger.log( - `Tag missing for ${this.sfdx_package}...marking package for build anyways`, - LoggerLevel.TRACE, - this.logger - ); - return { isToBeBuilt: true, reason: `Previous version not found` }; + + if(this.diffOptions?.useBranchCompare) + { + let modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}..${this.diffOptions.branch}`]); + // Check whether the package has been modified + for (let filename of modified_files) { + + let normalizedPkgPath = path.normalize(pkgDescriptor.path); + let normalizedFilename = path.normalize(filename); + + let relativePath = path.relative(normalizedPkgPath, normalizedFilename); + + if (!relativePath.startsWith('..')) { + SFPLogger.log(`Found change(s) in ${filename}`, LoggerLevel.TRACE, this.logger); + return { isToBeBuilt: true, reason: `Found change(s) in package`, tag: tag }; + } + } + return { isToBeBuilt: false, reason: `No changes found`, tag: tag }; + + } + else { + SFPLogger.log( + `Tag missing for ${this.sfdx_package}...marking package for build anyways`, + LoggerLevel.TRACE, + this.logger + ); + return { isToBeBuilt: true, reason: `Previous version not found` }; + } } } From 7a4ba7b3269c9bea288c0014b12870c00fd4144f Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 17:37:14 +1100 Subject: [PATCH 36/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.3 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 2a27d24dd..1d534cf6b 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.2", + "version": "30.2.3", "license": "MIT", "author": "flxblio", "release": "January 24", From 252c3a48ae3d867024104a23cb0903a7ecb2d62f Mon Sep 17 00:00:00 2001 From: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> Date: Tue, 9 Jan 2024 17:38:16 +1100 Subject: [PATCH 37/95] fix(impact): fix incorrect dependencyOnHandling --- packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts index 1af8798bc..f29fa9f69 100644 --- a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts +++ b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts @@ -28,9 +28,10 @@ export default class ImpactedRelaseConfigResolver { // handle dependencyOn, only do impact if there is atleast one package that is impacted if (releaseImpactedPackages.length>0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { - releaseImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => + let dependencyImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => impactedPackages.includes(artifact) ); + releaseImpactedPackages.push(dependencyImpactedPackages); } From 010834a146b35754159de801cec8e1d91edfcce5 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 17:38:32 +1100 Subject: [PATCH 38/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.4 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 1d534cf6b..96c149a5e 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.3", + "version": "30.2.4", "license": "MIT", "author": "flxblio", "release": "January 24", From 2be31ec916c5daa8016d04c43bc0f747865973a5 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 20:50:09 +1100 Subject: [PATCH 39/95] fix(impact): fix impacted files not accurately reported https://stackoverflow.com/questions/25071579/list-all-files-changed-in-a-pull-request-in-git-github --- packages/sfp-cli/src/core/git/Git.ts | 4 ++++ .../sfp-cli/src/core/package/diff/PackageDiffImpl.ts | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/sfp-cli/src/core/git/Git.ts b/packages/sfp-cli/src/core/git/Git.ts index 9b7e0e42b..b40fea1ce 100644 --- a/packages/sfp-cli/src/core/git/Git.ts +++ b/packages/sfp-cli/src/core/git/Git.ts @@ -166,6 +166,10 @@ export default class Git { return git; } + public raw(commands: string[]) { + return this._git.raw(commands); + } + public getRepositoryPath() { return this.repositoryLocation; } diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts index 21fe44c24..365f3ba71 100644 --- a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -57,7 +57,8 @@ export default class PackageDiffImpl { try { if(this.diffOptions?.useBranchCompare) { - modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}..${this.diffOptions.branch}`]); + const mergeBase = await git.raw(['merge-base', this.diffOptions.branch, this.diffOptions.baseBranch]); + modified_files = await git.diff(['--name-only', this.diffOptions.branch, mergeBase.trim()]); } else { @@ -110,8 +111,10 @@ export default class PackageDiffImpl { if(this.diffOptions?.useBranchCompare) { - let modified_files = await git.diff(['--name-only', `${this.diffOptions.baseBranch}..${this.diffOptions.branch}`]); - // Check whether the package has been modified + const mergeBase = await git.raw(['merge-base', this.diffOptions.branch, this.diffOptions.baseBranch]); + let modified_files = await git.diff(['--name-only', this.diffOptions.branch,, mergeBase.trim()]); + + // Check whether the package has been modified for (let filename of modified_files) { let normalizedPkgPath = path.normalize(pkgDescriptor.path); From 0482157d83daa21378f386875c0601d1923f755d Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 20:50:26 +1100 Subject: [PATCH 40/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.5 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 96c149a5e..eac6f0ee5 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.4", + "version": "30.2.5", "license": "MIT", "author": "flxblio", "release": "January 24", From 63ad7e4e3759a71e2a1f91a850159fbc88ec9d64 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 21:22:16 +1100 Subject: [PATCH 41/95] fix(diff): fix incorrect argument in diff calculation --- packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts index 365f3ba71..88750936b 100644 --- a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -112,7 +112,7 @@ export default class PackageDiffImpl { if(this.diffOptions?.useBranchCompare) { const mergeBase = await git.raw(['merge-base', this.diffOptions.branch, this.diffOptions.baseBranch]); - let modified_files = await git.diff(['--name-only', this.diffOptions.branch,, mergeBase.trim()]); + let modified_files = await git.diff(['--name-only', this.diffOptions.branch, mergeBase.trim()]); // Check whether the package has been modified for (let filename of modified_files) { From c28e812bbb7d912af00ec5a2a53c93015398e4b3 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 9 Jan 2024 21:22:39 +1100 Subject: [PATCH 42/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.6 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index eac6f0ee5..2a564b07f 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.5", + "version": "30.2.6", "license": "MIT", "author": "flxblio", "release": "January 24", From 8a594324b31a78f0bee7e707bc871d948749fc8e Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 10 Jan 2024 10:18:32 +1100 Subject: [PATCH 43/95] fix(diff): ensure --no-renames is used for branchcompare --- packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts index 88750936b..0db86d634 100644 --- a/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts +++ b/packages/sfp-cli/src/core/package/diff/PackageDiffImpl.ts @@ -58,7 +58,7 @@ export default class PackageDiffImpl { if(this.diffOptions?.useBranchCompare) { const mergeBase = await git.raw(['merge-base', this.diffOptions.branch, this.diffOptions.baseBranch]); - modified_files = await git.diff(['--name-only', this.diffOptions.branch, mergeBase.trim()]); + modified_files = await git.diff(['--no-renames','--name-only', this.diffOptions.branch, mergeBase.trim()]); } else { @@ -112,7 +112,7 @@ export default class PackageDiffImpl { if(this.diffOptions?.useBranchCompare) { const mergeBase = await git.raw(['merge-base', this.diffOptions.branch, this.diffOptions.baseBranch]); - let modified_files = await git.diff(['--name-only', this.diffOptions.branch, mergeBase.trim()]); + let modified_files = await git.diff(['--no-renames','--name-only', this.diffOptions.branch, mergeBase.trim()]); // Check whether the package has been modified for (let filename of modified_files) { From 7d0d863c0ff28fbbaeed3f844df303b15a636c7e Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 10 Jan 2024 10:18:41 +1100 Subject: [PATCH 44/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.7 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 2a564b07f..c702bd2c7 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.6", + "version": "30.2.7", "license": "MIT", "author": "flxblio", "release": "January 24", From e0725f4b7f94f82707f009e9b45ff5c88a94be5a Mon Sep 17 00:00:00 2001 From: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:57:54 +1100 Subject: [PATCH 45/95] fix(impact): incorporate configs of dependencyOn accurately Need a dual pass to incorporate packages that are impacted by dependenyOn --- .../src/impl/impact/ImpactedReleaseConfig.ts | 75 ++++++++++++------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts index f29fa9f69..9b0268235 100644 --- a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts +++ b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts @@ -4,62 +4,87 @@ import path from 'path'; export default class ImpactedRelaseConfigResolver { - public getImpactedReleaseConfigs(impactedPackages, configDir,isExplicitDependencyCheckEnabled:boolean=false, filterBy?: string) { + public getImpactedReleaseConfigs(impactedPackages, configDir, isExplicitDependencyCheckEnabled: boolean = false, filterBy?: string) { const impactedReleaseDefs = []; + let releaseImpactedPackages = []; + //Collect impacted packages fs.readdirSync(configDir).forEach((file) => { const filePath = path.join(configDir, file); const fileContent = fs.readFileSync(filePath, 'utf8'); const releaseConfig = yaml.load(fileContent); + if (releaseConfig.releaseName) { - let releaseImpactedPackages = []; + let packagesDetected = []; //Its a releasedefn, if (releaseConfig.includeOnlyArtifacts) { - releaseImpactedPackages = releaseConfig.includeOnlyArtifacts.filter((artifact) => + packagesDetected = releaseConfig.includeOnlyArtifacts.filter((artifact) => impactedPackages.includes(artifact) ); } else if (releaseConfig.excludeArtifacts) { - releaseImpactedPackages = impactedPackages.filter( + packagesDetected = impactedPackages.filter( (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) ); } - // handle dependencyOn, only do impact if there is atleast one package that is impacted - if (releaseImpactedPackages.length>0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { - let dependencyImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => - impactedPackages.includes(artifact) - ); - releaseImpactedPackages.push(dependencyImpactedPackages); + if (packagesDetected.length > 0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { + packagesDetected.push(...releaseConfig.dependencyOn); } + releaseImpactedPackages.push(...packagesDetected); + } + }); + - if (releaseImpactedPackages.length > 0) { - if (filterBy) { - if (releaseConfig.releaseName.includes(filterBy)) { + //Double pass to incorporate depedency on + if (releaseImpactedPackages.length > 0) { + fs.readdirSync(configDir).forEach((file) => { + const filePath = path.join(configDir, file); + const fileContent = fs.readFileSync(filePath, 'utf8'); + const releaseConfig = yaml.load(fileContent); + + if (releaseConfig.releaseName) { + + let packagesDetected = []; + //Its a releasedefn, + if (releaseConfig.includeOnlyArtifacts) { + packagesDetected = releaseConfig.includeOnlyArtifacts.filter((artifact) => + releaseImpactedPackages.includes(artifact) + ); + } else if (releaseConfig.excludeArtifacts) { + packagesDetected = releaseImpactedPackages.filter( + (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) + ); + } + + if (packagesDetected.length > 0) { + if (filterBy) { + if (releaseConfig.releaseName.includes(filterBy)) { + impactedReleaseDefs.push({ + releaseName: releaseConfig.releaseName, + pool: releaseConfig.pool + ? releaseConfig.pool + : releaseConfig.releaseName, + filePath: filePath, + impactedPackages: packagesDetected, // Including the impacted packages + }); + } + } else { impactedReleaseDefs.push({ releaseName: releaseConfig.releaseName, pool: releaseConfig.pool ? releaseConfig.pool : releaseConfig.releaseName, filePath: filePath, - impactedPackages: releaseImpactedPackages, // Including the impacted packages + impactedPackages: packagesDetected, // Including the impacted packages }); } - } else { - impactedReleaseDefs.push({ - releaseName: releaseConfig.releaseName, - pool: releaseConfig.pool - ? releaseConfig.pool - : releaseConfig.releaseName, - filePath: filePath, - impactedPackages: releaseImpactedPackages, // Including the impacted packages - }); } } - } - }); + }); + } const sortedImpactedReleaseDefs = impactedReleaseDefs.sort((a, b) => { if (!a.impactedPackages.length && !b.impactedPackages.length) return 0; From 2dd38676b9a1e91f0dac7e65c8e13520666491ca Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Fri, 12 Jan 2024 13:58:15 +1100 Subject: [PATCH 46/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.8 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index c702bd2c7..ef1f70929 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.7", + "version": "30.2.8", "license": "MIT", "author": "flxblio", "release": "January 24", From 718edeac6e9ce0812d207fba725d36f70c69da40 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Fri, 12 Jan 2024 15:12:56 +1100 Subject: [PATCH 47/95] Revert "fix(impact): incorporate configs of dependencyOn accurately" This reverts commit e0725f4b7f94f82707f009e9b45ff5c88a94be5a. --- .../src/impl/impact/ImpactedReleaseConfig.ts | 75 +++++++------------ 1 file changed, 25 insertions(+), 50 deletions(-) diff --git a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts index 9b0268235..f29fa9f69 100644 --- a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts +++ b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts @@ -4,87 +4,62 @@ import path from 'path'; export default class ImpactedRelaseConfigResolver { - public getImpactedReleaseConfigs(impactedPackages, configDir, isExplicitDependencyCheckEnabled: boolean = false, filterBy?: string) { + public getImpactedReleaseConfigs(impactedPackages, configDir,isExplicitDependencyCheckEnabled:boolean=false, filterBy?: string) { const impactedReleaseDefs = []; - let releaseImpactedPackages = []; - //Collect impacted packages fs.readdirSync(configDir).forEach((file) => { const filePath = path.join(configDir, file); const fileContent = fs.readFileSync(filePath, 'utf8'); const releaseConfig = yaml.load(fileContent); - if (releaseConfig.releaseName) { - let packagesDetected = []; + let releaseImpactedPackages = []; //Its a releasedefn, if (releaseConfig.includeOnlyArtifacts) { - packagesDetected = releaseConfig.includeOnlyArtifacts.filter((artifact) => + releaseImpactedPackages = releaseConfig.includeOnlyArtifacts.filter((artifact) => impactedPackages.includes(artifact) ); } else if (releaseConfig.excludeArtifacts) { - packagesDetected = impactedPackages.filter( + releaseImpactedPackages = impactedPackages.filter( (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) ); } + // handle dependencyOn, only do impact if there is atleast one package that is impacted - if (packagesDetected.length > 0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { - packagesDetected.push(...releaseConfig.dependencyOn); + if (releaseImpactedPackages.length>0 && isExplicitDependencyCheckEnabled && releaseConfig.dependencyOn) { + let dependencyImpactedPackages = releaseConfig.dependencyOn.filter((artifact) => + impactedPackages.includes(artifact) + ); + releaseImpactedPackages.push(dependencyImpactedPackages); } - releaseImpactedPackages.push(...packagesDetected); - } - }); - - //Double pass to incorporate depedency on - if (releaseImpactedPackages.length > 0) { - fs.readdirSync(configDir).forEach((file) => { - const filePath = path.join(configDir, file); - const fileContent = fs.readFileSync(filePath, 'utf8'); - const releaseConfig = yaml.load(fileContent); - - if (releaseConfig.releaseName) { - - let packagesDetected = []; - //Its a releasedefn, - if (releaseConfig.includeOnlyArtifacts) { - packagesDetected = releaseConfig.includeOnlyArtifacts.filter((artifact) => - releaseImpactedPackages.includes(artifact) - ); - } else if (releaseConfig.excludeArtifacts) { - packagesDetected = releaseImpactedPackages.filter( - (artifact) => !releaseConfig.excludeArtifacts.includes(artifact) - ); - } - - if (packagesDetected.length > 0) { - if (filterBy) { - if (releaseConfig.releaseName.includes(filterBy)) { - impactedReleaseDefs.push({ - releaseName: releaseConfig.releaseName, - pool: releaseConfig.pool - ? releaseConfig.pool - : releaseConfig.releaseName, - filePath: filePath, - impactedPackages: packagesDetected, // Including the impacted packages - }); - } - } else { + if (releaseImpactedPackages.length > 0) { + if (filterBy) { + if (releaseConfig.releaseName.includes(filterBy)) { impactedReleaseDefs.push({ releaseName: releaseConfig.releaseName, pool: releaseConfig.pool ? releaseConfig.pool : releaseConfig.releaseName, filePath: filePath, - impactedPackages: packagesDetected, // Including the impacted packages + impactedPackages: releaseImpactedPackages, // Including the impacted packages }); } + } else { + impactedReleaseDefs.push({ + releaseName: releaseConfig.releaseName, + pool: releaseConfig.pool + ? releaseConfig.pool + : releaseConfig.releaseName, + filePath: filePath, + impactedPackages: releaseImpactedPackages, // Including the impacted packages + }); } } - }); - } + } + }); const sortedImpactedReleaseDefs = impactedReleaseDefs.sort((a, b) => { if (!a.impactedPackages.length && !b.impactedPackages.length) return 0; From c63c1db46ae10c620e23622813e52dc6cf92ac88 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Fri, 12 Jan 2024 15:13:13 +1100 Subject: [PATCH 48/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.2.9 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index ef1f70929..b9550d3bd 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.8", + "version": "30.2.9", "license": "MIT", "author": "flxblio", "release": "January 24", From b06123ffad42d673a2d94a25f41b95cc4bb95f0b Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 12:13:30 +1100 Subject: [PATCH 49/95] feat(changelog): add commit links in changelog markdown only implemented for github and only availble for new artifacts --- .../impl/changelog/ChangelogMarkdownGenerator.ts | 15 ++++++++++++++- .../src/impl/changelog/ReleaseChangelog.ts | 5 +++++ .../src/impl/changelog/ReleaseChangelogUpdater.ts | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts index 4c1b487e3..e5c795b25 100644 --- a/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts +++ b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts @@ -96,10 +96,23 @@ export default class ChangelogMarkdownGenerator { let tableOfCommits = [['Date', 'Time', 'Commit ID', 'Commit Message']]; for (let commit of artifact.commits) { let commitDate: Date = new Date(commit.date); + let specificCommitURL: string; + if (artifact.repoUrl != null) { + if(artifact.repoUrl.startsWith("git")) + { + specificCommitURL=""; //no http url available + } + else if (artifact.repoUrl.includes("github.com")) { + let repoUrl = artifact.repoUrl.split('.git')[0]; + specificCommitURL = `${repoUrl}/commit/${commit.commitId}`; + } else { + specificCommitURL=""; //other git providers are not supported + } + } tableOfCommits.push([ this.getDate(commitDate), this.getTime(commitDate), - commit.commitId, + artifact.repoUrl?`[${commit.commitId}](${specificCommitURL})`:commit.commitId, commit.message, ]); } diff --git a/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts index 456d8544f..eb905fbbc 100644 --- a/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts +++ b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts @@ -65,6 +65,11 @@ export interface Artifact extends Changelog { */ latestCommitId: string; + /** + * Repository URL where the artifact was generated + */ + repoUrl: string; + /** * Commits between previous artifact's package changelog and current artifact's package changelog */ diff --git a/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts b/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts index 4a8808c4b..2e2505f8b 100644 --- a/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts +++ b/packages/sfp-cli/src/impl/changelog/ReleaseChangelogUpdater.ts @@ -168,6 +168,7 @@ export default class ReleaseChangelogUpdater { from: undefined, to: sfpPackage.sourceVersion?.slice(0, 8), version: sfpPackage.package_version_number, + repoUrl: sfpPackage.repository_url, latestCommitId: undefined, commits: undefined, }; From aab8e1ff132e08ee43b0719e382ec5ded6fab73f Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 12:14:06 +1100 Subject: [PATCH 50/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.3.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index b9550d3bd..ed28f8a79 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.2.9", + "version": "30.3.0", "license": "MIT", "author": "flxblio", "release": "January 24", From 5b34c625b70b529f07baa6b440cea9f57f3dfdf6 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 12:15:12 +1100 Subject: [PATCH 51/95] feat(changelog): display commits in changelog for dryrun --- packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts index 1326bec90..4333aa1fa 100644 --- a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts +++ b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts @@ -145,7 +145,7 @@ export default class ChangelogImpl { if(this.isDryRun) { const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,true).generate())); + outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,false).generate())); } From 10fbdb2ba905094c27aebf86f2eb54e4a32a1848 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 12:36:24 +1100 Subject: [PATCH 52/95] fix(changelog): make repoUrl optional --- packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts index eb905fbbc..1042e919c 100644 --- a/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts +++ b/packages/sfp-cli/src/impl/changelog/ReleaseChangelog.ts @@ -68,7 +68,7 @@ export interface Artifact extends Changelog { /** * Repository URL where the artifact was generated */ - repoUrl: string; + repoUrl?: string; /** * Commits between previous artifact's package changelog and current artifact's package changelog From bd8e89497e6f0d6c4e2dc3256d2bcf24243f9492 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 14:54:56 +1100 Subject: [PATCH 53/95] fix(publish): fix artifact nomenclature used while publishing --- packages/sfp-cli/src/commands/orchestrator/publish.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/commands/orchestrator/publish.ts b/packages/sfp-cli/src/commands/orchestrator/publish.ts index 4afa79d0f..65256ffaa 100644 --- a/packages/sfp-cli/src/commands/orchestrator/publish.ts +++ b/packages/sfp-cli/src/commands/orchestrator/publish.ts @@ -261,7 +261,7 @@ export default class Promote extends sfpCommand { let artifactRootDirectory = path.dirname(sfpPackage.sourceDir); // NPM does not accept packages with uppercase characters - let name: string = sfpPackage.packageName.toLowerCase() + '_sfpowerscriptsartifact'; + let name: string = sfpPackage.packageName.toLowerCase() + '_sfpowerscripts_artifact'; //Check whether the user has already passed in @ From b31b5f33bc2882ac6005453c03b03fa8637f8194 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:01:57 +1100 Subject: [PATCH 54/95] chore: update versions --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index ed28f8a79..53fa88d0c 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.0", + "version": "30.3.1", "license": "MIT", "author": "flxblio", "release": "January 24", From 319a412a2f2b21d277179c95b2fc3fa3de704cee Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:03:58 +1100 Subject: [PATCH 55/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.3.2 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 53fa88d0c..6d337d77f 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.1", + "version": "30.3.2", "license": "MIT", "author": "flxblio", "release": "January 24", From dfff417e1c3c9be181ab168c7d8984d18b178554 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:32:44 +1100 Subject: [PATCH 56/95] fix(metrics): switch back to sfpowerscripts as prefix for backward maintainability --- .../core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts | 2 +- .../core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts index b1e6cb574..bec060661 100644 --- a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts +++ b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/DataDogMetricSender.ts @@ -14,7 +14,7 @@ export class DataDogMetricsSender extends NativeMetricSender { this.nativeDataDogMetricsLogger = new BufferedMetricsLogger({ apiHost: apiHost, apiKey: apiKey, - prefix: 'sfp.', + prefix: 'sfpowerscripts.', flushIntervalSeconds: 0, }); } catch (error) { diff --git a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts index bc6d6130d..7e1e83d1b 100644 --- a/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts +++ b/packages/sfp-cli/src/core/stats/nativeMetricSenderImpl/NewRelicMetricSender.ts @@ -25,7 +25,7 @@ export class NewRelicMetricSender extends NativeMetricSender { } public sendGaugeMetric(metric: string, value: number, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; + metric = `sfpowerscripts.${metric}`; const guageMetric = new GaugeMetric(metric, value); guageMetric.attributes = tags as { [key: string]: string }; const batch = new MetricBatch({}, Date.now(), 1); @@ -44,7 +44,7 @@ export class NewRelicMetricSender extends NativeMetricSender { } public sendCountMetric(metric: string, tags: string[] | { [key: string]: string }) { - metric = `sfp.${metric}`; + metric = `sfpowerscripts.${metric}`; const countMetric = new CountMetric(metric); countMetric.record(1); countMetric.attributes = tags as { [key: string]: string }; From 90d8aecf31179f5eee57b8abe4cbffff2082fbeb Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:34:56 +1100 Subject: [PATCH 57/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.3.3 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 6d337d77f..08aa526be 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.2", + "version": "30.3.3", "license": "MIT", "author": "flxblio", "release": "January 24", From d450bb6e9615a4d22d42c11442c2e1ba45ef9ea8 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:43:51 +1100 Subject: [PATCH 58/95] fix(readme): update license and readme --- LICENSE | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 57e4dfbd0..cd17a41af 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 dxatscale +Copyright (c) 2024 flxbl.io Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index a664255a7..552e5b68e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxlblio) -A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxlblio.io +A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxlbl.io #### Features @@ -39,7 +39,7 @@ used by using the [docker image](https://github.com/flxlblio/sfp/pkgs/container/ - Need for artifact driven build system for package based development models especially on complex and large programs -- Providing additional functionality that is either not supported by the sfdx-cli, such as data packages or automatically understanding tests in a given package +- Providing additional functionality that is either not supported by the sf cli, such as data packages or automatically understanding tests in a given package - Ease of use, one should not be spending too much time scripting a pipeline. From 3d2bfba70ce639a8016e76898f6d0bbecc1b3b01 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:52:04 +1100 Subject: [PATCH 59/95] fix(deploy): fix blank logger being printed during prepare by deploy command --- packages/sfp-cli/src/impl/deploy/DeployImpl.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts index f71a48b78..b164ac397 100644 --- a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts +++ b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts @@ -373,9 +373,9 @@ export default class DeployImpl { private displayRetryHeader(isRetryOnFailure: boolean, count: number) { if (isRetryOnFailure && count > 1) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.props.logger); SFPLogger.log(`Retrying On Failure Attempt: ${count}`, LoggerLevel.INFO, this.props.logger); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.props.logger); } } @@ -428,7 +428,7 @@ export default class DeployImpl { } if (alwaysDeployMessage) SFPLogger.log(alwaysDeployMessage, LoggerLevel.INFO, this.props.logger); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO,this.props.logger); } private displayTestInfoHeader(sfpPackage: SfpPackage) { From ddcbd2c7ecfc017c97043a69fdd537ed4c14a9df Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 17 Jan 2024 15:52:15 +1100 Subject: [PATCH 60/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.3.4 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 08aa526be..40ad198df 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.3", + "version": "30.3.4", "license": "MIT", "author": "flxblio", "release": "January 24", From 549c334d05954650d8227f1582101fb79dd3f23b Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 25 Jan 2024 16:04:29 +1100 Subject: [PATCH 61/95] fix(metrics): fix incorrect variable used in metrics --- packages/sfp-cli/src/commands/metrics/report.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sfp-cli/src/commands/metrics/report.ts b/packages/sfp-cli/src/commands/metrics/report.ts index 75c8e2d28..5bd99e558 100644 --- a/packages/sfp-cli/src/commands/metrics/report.ts +++ b/packages/sfp-cli/src/commands/metrics/report.ts @@ -76,9 +76,9 @@ export default class Report extends sfpCommand { if ( !( process.env.SFPOWERSCRIPTS_STATSD || - process.env.SFPOWERSCRIPTS_STATSD_DATADOG || - process.env.SFPOWERSCRIPTS_STATSD_NEWRELIC || - process.env.SFPOWERSCRIPTS_STATSD_SPLUNK + process.env.SFPOWERSCRIPTS_DATADOG || + process.env.SFPOWERSCRIPTS_NEWRELIC || + process.env.SFPOWERSCRIPTS_SPLUNK ) ) { throw new Error('Environment variable not set for metrics. No metrics will be published.'); From 45a73ed40d34a71248a44e16a6caf2afd0192e4e Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 25 Jan 2024 16:04:56 +1100 Subject: [PATCH 62/95] chore(publish): update versions and publish to npm - @flxblio/sfp@30.3.5 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 40ad198df..6b61e4e31 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.4", + "version": "30.3.5", "license": "MIT", "author": "flxblio", "release": "January 24", From 9e714293effa3e0aac8ff1011515793fc0df097a Mon Sep 17 00:00:00 2001 From: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> Date: Tue, 30 Jan 2024 10:58:51 +1100 Subject: [PATCH 63/95] feat(deps): update to v6 of salesforce dependencies (#3) Update to v6 of salesforce dependencies --- .github/pull_request_template.md | 6 +- .github/workflows/buildPackages.yml | 7 +- .github/workflows/review.yml | 8 +- .gitignore | 1 + dockerfiles/sfp.Dockerfile | 12 +- package.json | 7 +- packages/apexlink/package.json | 2 - packages/sfp-cli/package.json | 14 +- .../sfp-cli/src/commands/pool/org/delete.ts | 3 +- .../src/core/scratchorg/pool/PoolFetchImpl.ts | 6 +- packages/sfp-cli/src/flags/sfdxflags.ts | 3 +- packages/sfprofiles/package.json | 6 +- pnpm-lock.yaml | 27685 +++++++--------- 13 files changed, 11954 insertions(+), 15806 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 34f75418c..6388efbb7 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,14 +1,12 @@ -reviewpad:summary - #### Checklist All items have to be completed before a PR is merged -- [x] Adhere to [Contribution Guidelines](https://docs.dxatscale.io/about-us/contributing-to-dx-scale) +- [x] Adhere to [Contribution Guidelines](https://docs.flxbl.io/about-us/contributing-to-fxlbl) - [ ] Updates to Decision Records considered? -- [ ] Updates to documentation at [DX@Scale Guide](https://github.com/dxatscale/dxatscale-guide) considered? +- [ ] Updates to documentation at [flxbl-sfp Guide](https://github.com/flxbl-io/sfp-docs) considered? - [ ] Tested changes? - [ ] Unit Tests new and existing passing locally? diff --git a/.github/workflows/buildPackages.yml b/.github/workflows/buildPackages.yml index 125243382..7b3769796 100644 --- a/.github/workflows/buildPackages.yml +++ b/.github/workflows/buildPackages.yml @@ -59,9 +59,12 @@ jobs: if: ${{ inputs.publish == true }} run: npx lerna run test -- --colors - - name: Upload to Codecov - uses: codecov/codecov-action@v1 + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + - name: 'Publish CLI/Core' if: ${{ inputs.publish == true }} run: 'npx lerna publish from-package --yes --dist-tag ${{ inputs.version }}' diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml index 38ce13ed1..29a549217 100644 --- a/.github/workflows/review.yml +++ b/.github/workflows/review.yml @@ -19,7 +19,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '18' registry-url: 'https://registry.npmjs.org' - uses: pnpm/action-setup@v2 with: @@ -29,6 +29,10 @@ jobs: run: pnpm i - run: npx lerna run build - run: npx lerna run test -- --colors - - run: bash <(curl -s https://codecov.io/bash) -v + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 65caa22eb..68d368d1a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ packages/apexlink/coverage packages/sfp-cli/oclif.manifest.json packages/apexlink/tests/resources/core-crm/apexlink.json packages/apexlink/tests/resources/feature-mgmt/apexlink.json +.nx \ No newline at end of file diff --git a/dockerfiles/sfp.Dockerfile b/dockerfiles/sfp.Dockerfile index 3061ba50f..5c1c720ce 100644 --- a/dockerfiles/sfp.Dockerfile +++ b/dockerfiles/sfp.Dockerfile @@ -2,9 +2,9 @@ FROM ubuntu:22.04 ARG SFPOWERSCRIPTS_VERSION=alpha -ARG SF_CLI_VERSION=2.17.14 -ARG BROWSERFORCE_VERSION=0.0.3 -ARG SFDMU_VERSION=4.18.2 +ARG SF_CLI_VERSION=2.25.7 +ARG BROWSERFORCE_VERSION=4.0.0 +ARG SFDMU_VERSION=4.32.2 ARG GIT_COMMIT ARG NODE_MAJOR=18 @@ -13,9 +13,9 @@ LABEL org.opencontainers.image.licenses "MIT" LABEL org.opencontainers.image.url "https://github.com/flxbl-io/sfp" LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" LABEL org.opencontainers.image.revision $GIT_COMMIT -LABEL org.opencontainers.image.vendor "DX@Scale" +LABEL org.opencontainers.image.vendor "Flxbl" LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" -LABEL org.opencontainers.image.title "DX@Scale sfpowercripts docker image - January 24" +LABEL org.opencontainers.image.title "Flxbl sfp docker image - January 24" ENV DEBIAN_FRONTEND=noninteractive @@ -103,7 +103,7 @@ RUN mkdir -p $XDG_DATA_HOME && \ # Install sfdx plugins -RUN echo 'y' | sf plugins:install @dxatscale/browserforce@${BROWSERFORCE_VERSION} \ +RUN echo 'y' | sf plugins:install sfdx-browserforce-plugin@${BROWSERFORCE_VERSION} \ && echo 'y' | sf plugins:install sfdmu@${SFDMU_VERSION} \ && echo 'y' | sf plugins:install @salesforce/plugin-signups@1.5.0 \ && echo 'y' | sf plugins:install @salesforce/sfdx-scanner@3.16.0 \ diff --git a/package.json b/package.json index 765768d1a..f50272d7f 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,12 @@ "@types/node": "^10", "@types/q": "^1.5.2", "@types/xml2js": "^0.4.5", - "lerna": "^7.1.4", - "lerna-update-wizard": "^1.1.0", + "lerna": "8.0.2", "prettier": "^2.0.5", "rimraf": "^3.0.2", "semver": "7.5.2", - "ts-loader": "~9.4.2", - "ts-node": "^9", + "ts-loader": "~9.5.1", + "ts-node": "10.9.2", "typescript": "^5" }, "dependencies": { diff --git a/packages/apexlink/package.json b/packages/apexlink/package.json index 4de8c4351..59a60f94e 100644 --- a/packages/apexlink/package.json +++ b/packages/apexlink/package.json @@ -19,8 +19,6 @@ }, "devDependencies": { "@babel/core": "7.18.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-optional-chaining": "7.17.12", "@jest/globals": "^29.6.1", "@types/jest": "^29.5.3", "@types/mocha": "9.1.0", diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 6b61e4e31..41e888172 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -22,12 +22,12 @@ "@oclif/core": "2.11.8", "@oclif/plugin-commands": "^3.0.3", "@oclif/plugin-help": "5.2.17", - "@salesforce/apex-node": "2.1.0", - "@salesforce/core": "5.3.9", - "@salesforce/kit": "3.0.13", - "@salesforce/packaging": "2.3.3", - "@salesforce/source-deploy-retrieve": "9.7.24", - "@salesforce/source-tracking": "4.2.16", + "@salesforce/apex-node": "3.0.2", + "@salesforce/core": "6.5.1", + "@salesforce/kit": "3.0.15", + "@salesforce/packaging": "3.2.5", + "@salesforce/source-deploy-retrieve": "10.2.13", + "@salesforce/source-tracking": "5.1.7", "adm-zip": "^0.5.10", "ajv": "8.11.0", "apex-parser": "2.13.0", @@ -82,7 +82,7 @@ "typescript": "^5" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "files": [ "/lib", diff --git a/packages/sfp-cli/src/commands/pool/org/delete.ts b/packages/sfp-cli/src/commands/pool/org/delete.ts index 98916f405..e1a0f649d 100644 --- a/packages/sfp-cli/src/commands/pool/org/delete.ts +++ b/packages/sfp-cli/src/commands/pool/org/delete.ts @@ -9,7 +9,8 @@ import { targetdevhubusername, requiredUserNameFlag, } from '../../../flags/sfdxflags'; -import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; +import { AliasAccessor } from '@salesforce/core/lib/stateAggregator/accessors/aliasAccessor'; + // Initialize Messages with the current plugin directory Messages.importMessagesDirectory(__dirname); diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts index 77a2c3566..2dd8671f7 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolFetchImpl.ts @@ -225,10 +225,8 @@ export default class PoolFetchImpl extends PoolBaseImpl { setDefaultDevHub: false, }); - const result = authInfo.getFields(true); - // ensure the clientSecret field... even if it is empty - // as per https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/auth/sfdxurl/store.ts - result.clientSecret = result.clientSecret ?? ''; + //https://github.com/salesforcecli/plugin-auth/blob/main/src/commands/org/login/sfdx-url.ts + const result = { clientSecret: '', ...authInfo.getFields(true) }; await AuthInfo.identifyPossibleScratchOrgs(result, authInfo); return true; diff --git a/packages/sfp-cli/src/flags/sfdxflags.ts b/packages/sfp-cli/src/flags/sfdxflags.ts index 9d73f98da..12e60f655 100644 --- a/packages/sfp-cli/src/flags/sfdxflags.ts +++ b/packages/sfp-cli/src/flags/sfdxflags.ts @@ -14,7 +14,8 @@ import { Flags } from '@oclif/core'; import { Lifecycle, Messages, Org, OrgConfigProperties } from '@salesforce/core'; import { orgApiVersionFlag } from './orgApiVersion'; -import { AliasAccessor } from '@salesforce/core/lib/stateAggregator'; +import { AliasAccessor } from '@salesforce/core/lib/stateAggregator/accessors/aliasAccessor'; + /** * Adds an alias for the orgApiVersionFlag diff --git a/packages/sfprofiles/package.json b/packages/sfprofiles/package.json index 83ba90fd3..27d5303ba 100644 --- a/packages/sfprofiles/package.json +++ b/packages/sfprofiles/package.json @@ -60,8 +60,8 @@ }, "dependencies": { "@flxblio/sfp-logger": "^2.1.3", - "@salesforce/core": "5.3.9", - "@salesforce/source-deploy-retrieve": "9.7.24", + "@salesforce/core": "6.5.1", + "@salesforce/source-deploy-retrieve": "10.2.13", "async-retry": "^1.3.3", "better-sqlite3": "8.4.0", "chalk": "^4.1.0", @@ -69,7 +69,7 @@ "fs-extra": "^11.1.0", "glob": "10.3.3", "ignore": "^5.1.8", - "jsforce": "^2.0.0-beta.27", + "jsforce": "^2.0.0-beta.29", "node-cache": "^5.1.2", "rimraf": "^5.0.1", "simple-git": "^3.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf7e884e2..0652c7c39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,15795 +1,11940 @@ lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - .: - dependencies: - neverthrow: - specifier: ^4.2.1 - version: 4.2.1 - xml-formatter: - specifier: ^3.3.2 - version: 3.3.2 - devDependencies: - '@commitlint/cli': - specifier: ^15.0.0 - version: 15.0.0 - '@commitlint/config-conventional': - specifier: ^15.0.0 - version: 15.0.0 - '@types/async-retry': - specifier: ^1.4.2 - version: 1.4.2 - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/mocha': - specifier: ^5.2.7 - version: 5.2.7 - '@types/node': - specifier: ^10 - version: 10.0.0 - '@types/q': - specifier: ^1.5.2 - version: 1.5.2 - '@types/xml2js': - specifier: ^0.4.5 - version: 0.4.5 - lerna: - specifier: ^7.1.4 - version: 7.1.4 - lerna-update-wizard: - specifier: ^1.1.0 - version: 1.1.0 - prettier: - specifier: ^2.0.5 - version: 2.0.5 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - semver: - specifier: 7.5.2 - version: 7.5.2 - ts-loader: - specifier: ~9.4.2 - version: 9.4.2(typescript@5.0.2)(webpack@5.88.2) - ts-node: - specifier: ^9 - version: 9.1.1(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/apexlink: - dependencies: - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.3 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - find-java-home: - specifier: 2.0.0 - version: 2.0.0 - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - jest: - specifier: 29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/forcemula: - devDependencies: - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - - packages/sfdx-process-wrapper: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - devDependencies: - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/node': - specifier: ^10 - version: 10.0.0 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfp-cli: - dependencies: - '@flxblio/apexlink': - specifier: ^1.0.3 - version: link:../apexlink - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.3 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - '@flxblio/sfprofiles': - specifier: ^2.0.9 - version: link:../sfprofiles - '@newrelic/telemetry-sdk': - specifier: ^0.6.0 - version: 0.6.0 - '@oclif/core': - specifier: 2.11.8 - version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-commands': - specifier: ^3.0.3 - version: 3.0.3 - '@oclif/plugin-help': - specifier: 5.2.17 - version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/apex-node': - specifier: 2.1.0 - version: 2.1.0 - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/kit': - specifier: 3.0.13 - version: 3.0.13 - '@salesforce/packaging': - specifier: 2.3.3 - version: 2.3.3(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - '@salesforce/source-tracking': - specifier: 4.2.16 - version: 4.2.16 - adm-zip: - specifier: ^0.5.10 - version: 0.5.10 - ajv: - specifier: 8.11.0 - version: 8.11.0 - apex-parser: - specifier: 2.13.0 - version: 2.13.0 - async-retry: - specifier: ^1.3.1 - version: 1.3.3 - axios: - specifier: ^1.4.0 - version: 1.4.0 - bottleneck: - specifier: ^2.19.5 - version: 2.19.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - cli-table: - specifier: 0.3.11 - version: 0.3.11 - datadog-metrics: - specifier: ^0.9.3 - version: 0.9.3 - dotenv: - specifier: 16.3.1 - version: 16.3.1 - fast-xml-parser: - specifier: 4.2.7 - version: 4.2.7 - fs-extra: - specifier: ^11.1.1 - version: 11.1.1 - glob: - specifier: ^10.3.3 - version: 10.3.3 - handlebars: - specifier: ^4.7.7 - version: 4.7.7 - hot-shots: - specifier: ^8.5.0 - version: 8.5.0 - ignore: - specifier: ^5.1.6 - version: 5.2.4 - js-yaml: - specifier: ^4.0.0 - version: 4.1.0 - jsforce: - specifier: 2.0.0-beta.27 - version: 2.0.0-beta.27 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - markdown-table: - specifier: ^2.0.0 - version: 2.0.0 - markdown-table-ts: - specifier: ^1.0.3 - version: 1.0.3 - marked: - specifier: 4.0.16 - version: 4.0.16 - marked-terminal: - specifier: 5.1.1 - version: 5.1.1(marked@4.0.16) - neverthrow: - specifier: 4.4.2 - version: 4.4.2 - object-hash: - specifier: ^2.1.1 - version: 2.1.1 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - semver: - specifier: 7.5.2 - version: 7.5.2 - simple-git: - specifier: 3.19.1 - version: 3.19.1 - tar: - specifier: ^6.1.9 - version: 6.1.15 - tmp: - specifier: ^0.2.1 - version: 0.2.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@oclif/plugin-command-snapshot': - specifier: ^3 - version: 3.0.0(@oclif/config@1.18.15) - '@oclif/test': - specifier: ^2 - version: 2.0.0 - '@salesforce/dev-config': - specifier: 3.0.1 - version: 3.0.1 - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.5 - version: 2.0.5 - '@types/adm-zip': - specifier: ^0.4.33 - version: 0.4.33 - '@types/fs-extra': - specifier: 11.0.4 - version: 11.0.4 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/marked': - specifier: 4.0.2 - version: 4.0.2 - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - oclif: - specifier: ^3.10.0 - version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfplogger: - dependencies: - chalk: - specifier: ^4.1.2 - version: 4.1.2 - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - strip-ansi: - specifier: ^6.0.0 - version: 6.0.1 - devDependencies: - '@types/node': - specifier: ^14.14.7 - version: 14.14.7 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfprofiles: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - '@salesforce/core': - specifier: 5.3.9 - version: 5.3.9 - '@salesforce/source-deploy-retrieve': - specifier: 9.7.24 - version: 9.7.24 - async-retry: - specifier: ^1.3.3 - version: 1.3.3 - better-sqlite3: - specifier: 8.4.0 - version: 8.4.0 - chalk: - specifier: ^4.1.0 - version: 4.1.0 - diff-match-patch: - specifier: ^1.0.5 - version: 1.0.5 - fs-extra: - specifier: ^11.1.0 - version: 11.1.0 - glob: - specifier: 10.3.3 - version: 10.3.3 - ignore: - specifier: ^5.1.8 - version: 5.2.4 - jsforce: - specifier: ^2.0.0-beta.27 - version: 2.0.0-beta.27 - node-cache: - specifier: ^5.1.2 - version: 5.1.2 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - simple-git: - specifier: ^3.16.0 - version: 3.16.0 - tslib: - specifier: 2.1.0 - version: 2.1.0 - xml-formatter: - specifier: ^3.4.1 - version: 3.4.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.7 - version: 2.0.7 - '@types/async-retry': - specifier: 1.4.5 - version: 1.4.5 - '@types/datadog-metrics': - specifier: ^0.6.1 - version: 0.6.1 - '@types/diff-match-patch': - specifier: ^1.0.32 - version: 1.0.32 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/lodash': - specifier: ^4.14.191 - version: 4.14.191 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - '@types/node': - specifier: 20.4.4 - version: 20.4.4 - '@types/rimraf': - specifier: ^3.0.2 - version: 3.0.2 - '@typescript-eslint/eslint-plugin': - specifier: ^5.53.0 - version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/parser': - specifier: ^5.53.0 - version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) - eslint: - specifier: ^8.33.0 - version: 8.33.0 - jest: - specifier: ^29.5.3 - version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: ^9.1.1 - version: 9.1.1(typescript@5.0.2) - tsc-alias: - specifier: ^1.8.3 - version: 1.8.3 - typescript: - specifier: ^5 - version: 5.0.2 + + .: + dependencies: + neverthrow: + specifier: ^4.2.1 + version: 4.2.1 + xml-formatter: + specifier: ^3.3.2 + version: 3.3.2 + devDependencies: + '@commitlint/cli': + specifier: ^15.0.0 + version: 15.0.0 + '@commitlint/config-conventional': + specifier: ^15.0.0 + version: 15.0.0 + '@types/async-retry': + specifier: ^1.4.2 + version: 1.4.2 + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/mocha': + specifier: ^5.2.7 + version: 5.2.7 + '@types/node': + specifier: ^10 + version: 10.0.0 + '@types/q': + specifier: ^1.5.2 + version: 1.5.2 + '@types/xml2js': + specifier: ^0.4.5 + version: 0.4.5 + lerna: + specifier: 8.0.2 + version: 8.0.2 + prettier: + specifier: ^2.0.5 + version: 2.0.5 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + semver: + specifier: 7.5.2 + version: 7.5.2 + ts-loader: + specifier: ~9.5.1 + version: 9.5.1(typescript@5.0.2)(webpack@5.88.2) + ts-node: + specifier: 10.9.2 + version: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/apexlink: + dependencies: + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + find-java-home: + specifier: 2.0.0 + version: 2.0.0 + fs-extra: + specifier: 11.1.1 + version: 11.1.1 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + jest: + specifier: 29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/forcemula: + devDependencies: + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + + packages/sfdx-process-wrapper: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + devDependencies: + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/node': + specifier: ^10 + version: 10.0.0 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfp-cli: + dependencies: + '@flxblio/apexlink': + specifier: ^1.0.3 + version: link:../apexlink + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@flxblio/sfprofiles': + specifier: ^2.0.9 + version: link:../sfprofiles + '@newrelic/telemetry-sdk': + specifier: ^0.6.0 + version: 0.6.0 + '@oclif/core': + specifier: 2.11.8 + version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-commands': + specifier: ^3.0.3 + version: 3.0.3 + '@oclif/plugin-help': + specifier: 5.2.17 + version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/apex-node': + specifier: 3.0.2 + version: 3.0.2 + '@salesforce/core': + specifier: 6.5.1 + version: 6.5.1 + '@salesforce/kit': + specifier: 3.0.15 + version: 3.0.15 + '@salesforce/packaging': + specifier: 3.2.5 + version: 3.2.5 + '@salesforce/source-deploy-retrieve': + specifier: 10.2.13 + version: 10.2.13 + '@salesforce/source-tracking': + specifier: 5.1.7 + version: 5.1.7 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + ajv: + specifier: 8.11.0 + version: 8.11.0 + apex-parser: + specifier: 2.13.0 + version: 2.13.0 + async-retry: + specifier: ^1.3.1 + version: 1.3.3 + axios: + specifier: ^1.4.0 + version: 1.4.0 + bottleneck: + specifier: ^2.19.5 + version: 2.19.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cli-table: + specifier: 0.3.11 + version: 0.3.11 + datadog-metrics: + specifier: ^0.9.3 + version: 0.9.3 + dotenv: + specifier: 16.3.1 + version: 16.3.1 + fast-xml-parser: + specifier: 4.2.7 + version: 4.2.7 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 + hot-shots: + specifier: ^8.5.0 + version: 8.5.0 + ignore: + specifier: ^5.1.6 + version: 5.2.4 + js-yaml: + specifier: ^4.0.0 + version: 4.1.0 + jsforce: + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + markdown-table: + specifier: ^2.0.0 + version: 2.0.0 + markdown-table-ts: + specifier: ^1.0.3 + version: 1.0.3 + marked: + specifier: 4.0.16 + version: 4.0.16 + marked-terminal: + specifier: 5.1.1 + version: 5.1.1(marked@4.0.16) + neverthrow: + specifier: 4.4.2 + version: 4.4.2 + object-hash: + specifier: ^2.1.1 + version: 2.1.1 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + semver: + specifier: 7.5.2 + version: 7.5.2 + simple-git: + specifier: 3.19.1 + version: 3.19.1 + tar: + specifier: ^6.1.9 + version: 6.1.15 + tmp: + specifier: ^0.2.1 + version: 0.2.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@oclif/plugin-command-snapshot': + specifier: ^3 + version: 3.0.0(@oclif/config@1.18.15) + '@oclif/test': + specifier: ^2 + version: 2.0.0 + '@salesforce/dev-config': + specifier: 3.0.1 + version: 3.0.1 + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.5 + version: 2.0.5 + '@types/adm-zip': + specifier: ^0.4.33 + version: 0.4.33 + '@types/fs-extra': + specifier: 11.0.4 + version: 11.0.4 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/marked': + specifier: 4.0.2 + version: 4.0.2 + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + oclif: + specifier: ^3.10.0 + version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) + ts-jest: + specifier: 29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfplogger: + dependencies: + chalk: + specifier: ^4.1.2 + version: 4.1.2 + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + strip-ansi: + specifier: ^6.0.0 + version: 6.0.1 + devDependencies: + '@types/node': + specifier: ^14.14.7 + version: 14.14.7 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfprofiles: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@salesforce/core': + specifier: 6.5.1 + version: 6.5.1 + '@salesforce/source-deploy-retrieve': + specifier: 10.2.13 + version: 10.2.13 + async-retry: + specifier: ^1.3.3 + version: 1.3.3 + better-sqlite3: + specifier: 8.4.0 + version: 8.4.0 + chalk: + specifier: ^4.1.0 + version: 4.1.0 + diff-match-patch: + specifier: ^1.0.5 + version: 1.0.5 + fs-extra: + specifier: ^11.1.0 + version: 11.1.0 + glob: + specifier: 10.3.3 + version: 10.3.3 + ignore: + specifier: ^5.1.8 + version: 5.2.4 + jsforce: + specifier: ^2.0.0-beta.29 + version: 2.0.0-beta.29 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + simple-git: + specifier: ^3.16.0 + version: 3.16.0 + tslib: + specifier: 2.1.0 + version: 2.1.0 + xml-formatter: + specifier: ^3.4.1 + version: 3.4.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.7 + version: 2.0.7 + '@types/async-retry': + specifier: 1.4.5 + version: 1.4.5 + '@types/datadog-metrics': + specifier: ^0.6.1 + version: 0.6.1 + '@types/diff-match-patch': + specifier: ^1.0.32 + version: 1.0.32 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + '@types/node': + specifier: 20.4.4 + version: 20.4.4 + '@types/rimraf': + specifier: ^3.0.2 + version: 3.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.53.0 + version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.53.0 + version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) + eslint: + specifier: ^8.33.0 + version: 8.33.0 + jest: + specifier: ^29.5.3 + version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: ^9.1.1 + version: 9.1.1(typescript@5.0.2) + tsc-alias: + specifier: ^1.8.3 + version: 1.8.3 + typescript: + specifier: ^5 + version: 5.0.2 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /@ampproject/remapping@2.2.1: - resolution: - { - integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@babel/code-frame@7.22.5: - resolution: - { - integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.9: - resolution: - { - integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/core@7.18.2: - resolution: - { - integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.9: - resolution: - { - integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): - resolution: - { - integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.18.2 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: - { - integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: - { - integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: - { - integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: - { - integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): - resolution: - { - integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: - { - integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: - { - integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: - { - integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: - { - integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: - { - integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: - { - integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: - { - integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helpers@7.22.6: - resolution: - { - integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: - { - integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.7: - resolution: - { - integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==, - } - engines: { node: '>=6.0.0' } - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): - resolution: - { - integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): - resolution: - { - integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==, - } - engines: { node: '>=6.9.0' } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): - resolution: - { - integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime-corejs3@7.22.6: - resolution: - { - integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==, - } - engines: { node: '>=6.9.0' } - dependencies: - core-js-pure: 3.31.1 - regenerator-runtime: 0.13.11 - dev: false - - /@babel/runtime@7.22.6: - resolution: - { - integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - regenerator-runtime: 0.13.11 - - /@babel/template@7.22.5: - resolution: - { - integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.8: - resolution: - { - integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: - { - integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - dev: true - - /@colors/colors@1.5.0: - resolution: - { - integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, - } - engines: { node: '>=0.1.90' } - requiresBuild: true - dev: false - optional: true - /@commitlint/cli@15.0.0: - resolution: - { - integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==, - } - engines: { node: '>=v12' } - hasBin: true - dependencies: - '@commitlint/format': 15.0.0 - '@commitlint/lint': 15.0.0 - '@commitlint/load': 15.0.0 - '@commitlint/read': 15.0.0 - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - dev: true - - /@commitlint/config-conventional@15.0.0: - resolution: - { - integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==, - } - engines: { node: '>=v12' } - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/ensure@15.0.0: - resolution: - { - integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule@15.0.0: - resolution: - { - integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/format@15.0.0: - resolution: - { - integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@15.0.0: - resolution: - { - integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - semver: 7.3.5 - dev: true - - /@commitlint/lint@15.0.0: - resolution: - { - integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/is-ignored': 15.0.0 - '@commitlint/parse': 15.0.0 - '@commitlint/rules': 15.0.0 - '@commitlint/types': 15.0.0 - dev: true - - /@commitlint/load@15.0.0: - resolution: - { - integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/execute-rule': 15.0.0 - '@commitlint/resolve-extends': 15.0.0 - '@commitlint/types': 15.0.0 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) - chalk: 4.1.2 - cosmiconfig: 7.1.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.9.5 - dev: true - - /@commitlint/message@15.0.0: - resolution: - { - integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/parse@15.0.0: - resolution: - { - integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/types': 15.0.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read@15.0.0: - resolution: - { - integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/top-level': 15.0.0 - '@commitlint/types': 15.0.0 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends@15.0.0: - resolution: - { - integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==, - } - engines: { node: '>=v12' } - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules@15.0.0: - resolution: - { - integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==, - } - engines: { node: '>=v12' } - dependencies: - '@commitlint/ensure': 15.0.0 - '@commitlint/message': 15.0.0 - '@commitlint/to-lines': 15.0.0 - '@commitlint/types': 15.0.0 - execa: 5.1.1 - dev: true - - /@commitlint/to-lines@15.0.0: - resolution: - { - integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==, - } - engines: { node: '>=v12' } - dev: true - - /@commitlint/top-level@15.0.0: - resolution: - { - integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==, - } - engines: { node: '>=v12' } - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types@15.0.0: - resolution: - { - integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==, - } - engines: { node: '>=v12' } - dependencies: - chalk: 4.1.2 - dev: true - - /@cspotcode/source-map-consumer@0.8.0: - resolution: - { - integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==, - } - engines: { node: '>= 12' } - dev: true - - /@cspotcode/source-map-support@0.7.0: - resolution: - { - integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==, - } - engines: { node: '>=12' } - dependencies: - '@cspotcode/source-map-consumer': 0.8.0 - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: - { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, - } - engines: { node: '>=12' } - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): - resolution: - { - integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==, - } - engines: { node: '>=10.0.0' } - peerDependencies: - cosmiconfig: '>=6' - dependencies: - cosmiconfig: 7.1.0 - lodash.get: 4.4.2 - make-error: 1.3.6 - ts-node: 9.1.1(typescript@4.9.5) - tslib: 2.1.0 - transitivePeerDependencies: - - typescript - dev: true - - /@eslint/eslintrc@1.4.1: - resolution: - { - integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@gar/promisify@1.1.3: - resolution: - { - integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, - } - dev: true - - /@humanwhocodes/config-array@0.11.10: - resolution: - { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, - } - engines: { node: '>=10.10.0' } - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - dev: true - - /@hutson/parse-repository-url@3.0.2: - resolution: - { - integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@isaacs/cliui@8.0.2: - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@isaacs/string-locale-compare@1.1.0: - resolution: - { - integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, - } - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: '>=8' } - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: '>=8' } - dev: true - - /@jest/console@29.6.1: - resolution: - { - integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/core@29.6.1(ts-node@10.7.0): - resolution: - { - integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/core@29.6.1(ts-node@9.1.1): - resolution: - { - integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.6.1: - resolution: - { - integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - dev: true - - /@jest/expect-utils@29.6.1: - resolution: - { - integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.1: - resolution: - { - integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - expect: 29.6.1 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.6.1: - resolution: - { - integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 14.14.7 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /@jest/globals@29.6.1: - resolution: - { - integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/types': 29.6.1 - jest-mock: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.6.1: - resolution: - { - integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 14.14.7 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - jest-worker: 29.6.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.0: - resolution: - { - integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: - { - integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.6.1: - resolution: - { - integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/console': 29.6.1 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.6.1: - resolution: - { - integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/test-result': 29.6.1 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/transform@29.6.1: - resolution: - { - integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/core': 7.18.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.1: - resolution: - { - integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 14.14.7 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: - { - integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: - { - integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: - { - integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, - } - engines: { node: '>=6.0.0' } - - /@jridgewell/set-array@1.1.2: - resolution: - { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: - { - integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, - } - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: - { - integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, - } - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, - } - - /@jridgewell/trace-mapping@0.3.18: - resolution: - { - integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@kwsites/file-exists@1.1.1: - resolution: - { - integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==, - } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /@kwsites/promise-deferred@1.1.1: - resolution: - { - integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==, - } - dev: false - - /@lerna/child-process@7.1.4: - resolution: - { - integrity: sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - dependencies: - chalk: 4.1.2 - execa: 5.1.1 - strong-log-transformer: 2.1.0 - dev: true - - /@lerna/create@7.1.4: - resolution: - { - integrity: sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - dependencies: - '@lerna/child-process': 7.1.4 - dedent: 0.7.0 - fs-extra: 11.1.1 - init-package-json: 5.0.0 - npm-package-arg: 8.1.1 - p-reduce: 2.1.0 - pacote: 15.2.0 - pify: 5.0.0 - semver: 7.5.2 - slash: 3.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@newrelic/telemetry-sdk@0.6.0: - resolution: - { - integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==, - } - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/arborist@4.3.1: - resolution: - { - integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - hasBin: true - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/map-workspaces': 2.0.4 - '@npmcli/metavuln-calculator': 2.0.0 - '@npmcli/move-file': 1.1.2 - '@npmcli/name-from-folder': 1.0.1 - '@npmcli/node-gyp': 1.0.3 - '@npmcli/package-json': 1.0.1 - '@npmcli/run-script': 2.0.0 - bin-links: 3.0.3 - cacache: 15.3.0 - common-ancestor-path: 1.0.1 - json-parse-even-better-errors: 2.3.1 - json-stringify-nice: 1.1.4 - mkdirp: 1.0.4 - mkdirp-infer-owner: 2.0.0 - npm-install-checks: 4.0.0 - npm-package-arg: 8.1.5 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - pacote: 12.0.3 - parse-conflict-json: 2.0.2 - proc-log: 1.0.0 - promise-all-reject-late: 1.0.1 - promise-call-limit: 1.0.2 - read-package-json-fast: 2.0.3 - readdir-scoped-modules: 1.1.0 - rimraf: 3.0.2 - semver: 7.5.2 - ssri: 8.0.1 - treeverse: 1.0.4 - walk-up-path: 1.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/fs@1.1.1: - resolution: - { - integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, - } - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@2.1.2: - resolution: - { - integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@3.1.0: - resolution: - { - integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - semver: 7.5.2 - dev: true - - /@npmcli/git@2.1.0: - resolution: - { - integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==, - } - dependencies: - '@npmcli/promise-spawn': 1.3.2 - lru-cache: 6.0.0 - mkdirp: 1.0.4 - npm-pick-manifest: 6.1.1 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/git@4.1.0: - resolution: - { - integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@1.0.7: - resolution: - { - integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==, - } - engines: { node: '>= 10' } - hasBin: true - dependencies: - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: - { - integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/map-workspaces@2.0.4: - resolution: - { - integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@npmcli/name-from-folder': 1.0.1 - glob: 8.1.0 - minimatch: 5.1.6 - read-package-json-fast: 2.0.3 - dev: true - - /@npmcli/metavuln-calculator@2.0.0: - resolution: - { - integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - dependencies: - cacache: 15.3.0 - json-parse-even-better-errors: 2.3.1 - pacote: 12.0.3 - semver: 7.5.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/move-file@1.1.2: - resolution: - { - integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==, - } - engines: { node: '>=10' } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/move-file@2.0.1: - resolution: - { - integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/name-from-folder@1.0.1: - resolution: - { - integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==, - } - dev: true - - /@npmcli/node-gyp@1.0.3: - resolution: - { - integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==, - } - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: - { - integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@npmcli/package-json@1.0.1: - resolution: - { - integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==, - } - dependencies: - json-parse-even-better-errors: 2.3.1 - dev: true - - /@npmcli/promise-spawn@1.3.2: - resolution: - { - integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==, - } - dependencies: - infer-owner: 1.0.4 - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: - { - integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/run-script@2.0.0: - resolution: - { - integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==, - } - dependencies: - '@npmcli/node-gyp': 1.0.3 - '@npmcli/promise-spawn': 1.3.2 - node-gyp: 8.4.1 - read-package-json-fast: 2.0.3 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/run-script@6.0.2: - resolution: - { - integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@nrwl/devkit@16.5.5(nx@16.5.5): - resolution: - { - integrity: sha512-4ho9Vfg1YzRYZ4SMygYI9Yz1avpujd81gy/Um2Z0q8Q7Twp6Q/uG1KY9Hb7EzVXgrRcgGWdIPXuw41DpmnfWug==, - } - dependencies: - '@nx/devkit': 16.5.5(nx@16.5.5) - transitivePeerDependencies: - - nx - dev: true - - /@nrwl/tao@16.5.5: - resolution: - { - integrity: sha512-6SYG3rlKkYvy/wauPwoUXQuN0PTJi95hCEC7lGfCEGye2Y/61UwJQf2xixMxafUM2X84WdEStEz3Jty85gVqkQ==, - } - hasBin: true - dependencies: - nx: 16.5.5 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - dev: true - - /@nx/devkit@16.5.5(nx@16.5.5): - resolution: - { - integrity: sha512-9YaQ3s5VMgTXo5cEuaVc2b6btZU2REmHsgn/V4Gi3nSmwBHvIn86gtlh4BoBFinHpqge1chG/dC+B7yoXioQmQ==, - } - peerDependencies: - nx: '>= 15 <= 17' - dependencies: - '@nrwl/devkit': 16.5.5(nx@16.5.5) - ejs: 3.1.9 - ignore: 5.2.4 - nx: 16.5.5 - semver: 7.5.3 - tmp: 0.2.1 - tslib: 2.6.2 - dev: true - - /@nx/nx-darwin-arm64@16.5.5: - resolution: - { - integrity: sha512-Zzwy7pkSDFTiWcBk78qDe4VzygO9kemtz/kbbLvpisZkUlZX9nIQnLHT80Ms++iqA0enIQAwdTcJiaIHLVd5JQ==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.5 + dev: true + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.18.2: + resolution: {integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.9: + resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): + resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.18.2 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): + resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): + resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime-corejs3@7.22.6: + resolution: {integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.31.1 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@babel/traverse@7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: false + optional: true + + /@commitlint/cli@15.0.0: + resolution: {integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==} + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': 15.0.0 + '@commitlint/lint': 15.0.0 + '@commitlint/load': 15.0.0 + '@commitlint/read': 15.0.0 + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + dev: true + + /@commitlint/config-conventional@15.0.0: + resolution: {integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==} + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/ensure@15.0.0: + resolution: {integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule@15.0.0: + resolution: {integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/format@15.0.0: + resolution: {integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@15.0.0: + resolution: {integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + semver: 7.3.5 + dev: true + + /@commitlint/lint@15.0.0: + resolution: {integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': 15.0.0 + '@commitlint/parse': 15.0.0 + '@commitlint/rules': 15.0.0 + '@commitlint/types': 15.0.0 + dev: true + + /@commitlint/load@15.0.0: + resolution: {integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/execute-rule': 15.0.0 + '@commitlint/resolve-extends': 15.0.0 + '@commitlint/types': 15.0.0 + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) + chalk: 4.1.2 + cosmiconfig: 7.1.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.9.5 + dev: true + + /@commitlint/message@15.0.0: + resolution: {integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/parse@15.0.0: + resolution: {integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 15.0.0 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@15.0.0: + resolution: {integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': 15.0.0 + '@commitlint/types': 15.0.0 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends@15.0.0: + resolution: {integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==} + engines: {node: '>=v12'} + dependencies: + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@15.0.0: + resolution: {integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': 15.0.0 + '@commitlint/message': 15.0.0 + '@commitlint/to-lines': 15.0.0 + '@commitlint/types': 15.0.0 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@15.0.0: + resolution: {integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/top-level@15.0.0: + resolution: {integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==} + engines: {node: '>=v12'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@15.0.0: + resolution: {integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==} + engines: {node: '>=v12'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): + resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} + engines: {node: '>=10.0.0'} + peerDependencies: + cosmiconfig: '>=6' + dependencies: + cosmiconfig: 7.1.0 + lodash.get: 4.4.2 + make-error: 1.3.6 + ts-node: 9.1.1(typescript@4.9.5) + tslib: 2.1.0 + transitivePeerDependencies: + - typescript + dev: true + + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/string-locale-compare@1.1.0: + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.6.1: + resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/core@29.6.1(ts-node@10.7.0): + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-darwin-x64@16.5.5: - resolution: - { - integrity: sha512-d5O8BD5HFI2hJnMgVVV1pl2A+hlUmn4GxCZTmx2Tr329TYGdpvyXm8NnDFEAigZ77QVMHwFN6vqS07HARu+uVA==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@10.9.2): + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-freebsd-x64@16.5.5: - resolution: - { - integrity: sha512-SqTvbz21iUc8DHKgisX9pPuXc7/DngbiZxInlEHPXi8zUtyUOqZI3yQk4NVj3dqLBMLwEOZDgvXs0XxzB5nn+g==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.9.2) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@9.1.1): + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-linux-arm-gnueabihf@16.5.5: - resolution: - { - integrity: sha512-8C2KVFHqcyGViEgUicYo1frEgQARbD+CicIos6A5WRYLaxS+upb9FDblKU0eGYIwDp8oCagVjUjNX8d1WHLX7w==, - } - engines: { node: '>= 10' } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment@29.6.1: + resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + dev: true + + /@jest/expect-utils@29.6.1: + resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect@29.6.1: + resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.6.1 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.6.1: + resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.14.7 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /@jest/globals@29.6.1: + resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/types': 29.6.1 + jest-mock: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.6.1: + resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /@nx/nx-linux-arm64-gnu@16.5.5: - resolution: - { - integrity: sha512-AGq4wp3Wn8bE0h2c7/bHj2wQWfp08DYJemwTNLkwLcoJWkUidLOBQePRvLxqPeo42Zmt3GYMi+fi5XtKCmvcjg==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 14.14.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + jest-worker: 29.6.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.0: + resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.6.1: + resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.6.1 + '@jest/types': 29.6.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.6.1: + resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.6.1 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/transform@29.6.1: + resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.2 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.1: + resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 14.14.7 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@kwsites/file-exists@1.1.1: + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@kwsites/promise-deferred@1.1.1: + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + dev: false + + /@lerna/create@8.0.2: + resolution: {integrity: sha512-AueSlfiYXqEmy9/EIc17mjlaHFuv734dfgVBegyoefIA7hdeoExtsXnACWf8Tw5af6gwyTL3KAp6QQyc1sTuZQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@npmcli/run-script': 7.0.2 + '@nx/devkit': 17.3.0(nx@17.3.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + execa: 5.0.0 + fs-extra: 11.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + js-yaml: 4.1.0 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 17.3.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + pacote: 17.0.6 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /@newrelic/telemetry-sdk@0.6.0: + resolution: {integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/agent@2.2.0: + resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.2.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/arborist@4.3.1: + resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/map-workspaces': 2.0.4 + '@npmcli/metavuln-calculator': 2.0.0 + '@npmcli/move-file': 1.1.2 + '@npmcli/name-from-folder': 1.0.1 + '@npmcli/node-gyp': 1.0.3 + '@npmcli/package-json': 1.0.1 + '@npmcli/run-script': 2.0.0 + bin-links: 3.0.3 + cacache: 15.3.0 + common-ancestor-path: 1.0.1 + json-parse-even-better-errors: 2.3.1 + json-stringify-nice: 1.1.4 + mkdirp: 1.0.4 + mkdirp-infer-owner: 2.0.0 + npm-install-checks: 4.0.0 + npm-package-arg: 8.1.5 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + pacote: 12.0.3 + parse-conflict-json: 2.0.2 + proc-log: 1.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 1.0.2 + read-package-json-fast: 2.0.3 + readdir-scoped-modules: 1.1.0 + rimraf: 3.0.2 + semver: 7.5.2 + ssri: 8.0.1 + treeverse: 1.0.4 + walk-up-path: 1.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.2 + dev: true + + /@npmcli/git@2.1.0: + resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + dependencies: + '@npmcli/promise-spawn': 1.3.2 + lru-cache: 6.0.0 + mkdirp: 1.0.4 + npm-pick-manifest: 6.1.1 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.1 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@5.0.4: + resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 7.0.1 + lru-cache: 10.2.0 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@1.0.7: + resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/map-workspaces@2.0.4: + resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/name-from-folder': 1.0.1 + glob: 8.1.0 + minimatch: 5.1.6 + read-package-json-fast: 2.0.3 + dev: true + + /@npmcli/metavuln-calculator@2.0.0: + resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + cacache: 15.3.0 + json-parse-even-better-errors: 2.3.1 + pacote: 12.0.3 + semver: 7.5.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/name-from-folder@1.0.1: + resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} + dev: true + + /@npmcli/node-gyp@1.0.3: + resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/package-json@1.0.1: + resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} + dependencies: + json-parse-even-better-errors: 2.3.1 + dev: true + + /@npmcli/promise-spawn@1.3.2: + resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + dependencies: + infer-owner: 1.0.4 + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/promise-spawn@7.0.1: + resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + which: 4.0.0 + dev: true + + /@npmcli/run-script@2.0.0: + resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} + dependencies: + '@npmcli/node-gyp': 1.0.3 + '@npmcli/promise-spawn': 1.3.2 + node-gyp: 8.4.1 + read-package-json-fast: 2.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/run-script@7.0.2: + resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 7.0.1 + node-gyp: 10.0.1 + read-package-json-fast: 3.0.2 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nrwl/devkit@17.3.0(nx@17.3.0): + resolution: {integrity: sha512-3QUCvRisp0Iwwl7VEFQPQUU7wpqGEv9kJBNBtgmhe68ydusdNPk+d0npwkvH23BYPuswTI2MUJyLkdeiB58Ovw==} + dependencies: + '@nx/devkit': 17.3.0(nx@17.3.0) + transitivePeerDependencies: + - nx + dev: true + + /@nrwl/tao@17.3.0: + resolution: {integrity: sha512-Bhz+MvAk8CjQtclpEOagGiKzgoziwe+35SlHtvFqzZClAuB8BAx+3ZDNJZcEpDRNfodKqodMUy2OEf6pbzw/LA==} + hasBin: true + dependencies: + nx: 17.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + + /@nx/devkit@17.3.0(nx@17.3.0): + resolution: {integrity: sha512-KPUkEwkGYrg5hDqqXc7sdv4PNXHyWtGwzkBZA3p/RjPieKcQSsTcUwTxQ+taOE4v877n0HuC7hcuLueLSbYGiQ==} + peerDependencies: + nx: '>= 16 <= 18' + dependencies: + '@nrwl/devkit': 17.3.0(nx@17.3.0) + ejs: 3.1.9 + enquirer: 2.3.6 + ignore: 5.3.0 + nx: 17.3.0 + semver: 7.5.3 + tmp: 0.2.1 + tslib: 2.6.2 + yargs-parser: 21.1.1 + dev: true + + /@nx/nx-darwin-arm64@17.3.0: + resolution: {integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-darwin-x64@17.3.0: + resolution: {integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-freebsd-x64@17.3.0: + resolution: {integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm-gnueabihf@17.3.0: + resolution: {integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-gnu@17.3.0: + resolution: {integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-musl@17.3.0: + resolution: {integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-gnu@17.3.0: + resolution: {integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-musl@17.3.0: + resolution: {integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-arm64-msvc@17.3.0: + resolution: {integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-x64-msvc@17.3.0: + resolution: {integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@oclif/color@1.0.9: + resolution: {integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==} + engines: {node: '>=12.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + ansi-styles: 4.3.0 + chalk: 4.1.2 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + tslib: 2.1.0 + dev: true + + /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): + resolution: {integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==} + engines: {node: '>=12.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@oclif/config': ^1 + dependencies: + '@oclif/config': 1.18.15 + '@oclif/errors': 1.3.6 + '@oclif/help': 1.0.13(supports-color@8.1.1) + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.14(supports-color@8.1.1): + resolution: {integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.15: + resolution: {integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/core@0.5.41(@oclif/config@1.18.15): + resolution: {integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-ux: 5.6.7(@oclif/config@1.18.15) + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lodash.template: 4.5.0 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.1.0 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/cli-progress': 3.11.0 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.4 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/core@3.18.1: + resolution: {integrity: sha512-l0LsjzGcqjbUEdeSBX6bdZieVmEv82Q0W3StiyaDMEnPZ9KLH28HrLpcZg6d50mCYW9CUZNzmRo6qrCHWrgLKw==} + engines: {node: '>=18.0.0'} + dependencies: + '@types/cli-progress': 3.11.5 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + color: 4.2.3 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.3 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/core@3.3.2: + resolution: {integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==} + engines: {node: '>=18.0.0'} + dependencies: + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/errors@1.3.6: + resolution: {integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + clean-stack: 3.0.1 + fs-extra: 8.1.0 + indent-string: 4.0.0 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /@oclif/help@1.0.13(supports-color@8.1.1): + resolution: {integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/config': 1.18.14(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + chalk: 4.1.2 + indent-string: 4.0.0 + lodash: 4.17.21 + string-width: 4.2.3 + strip-ansi: 6.0.1 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/linewrap@1.0.0: + resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} + dev: true + + /@oclif/parser@3.8.15: + resolution: {integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + tslib: 2.6.2 + dev: true + + /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): + resolution: {integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 0.5.41(@oclif/config@1.18.15) + chalk: 4.1.2 + just-diff: 3.1.1 + semver: 7.5.2 + sinon: 11.1.2 + ts-json-schema-generator: 0.93.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/plugin-commands@3.0.3: + resolution: {integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==} + engines: {node: '>=18.0.0'} + dependencies: + '@oclif/core': 3.3.2 + lodash.pickby: 4.6.0 + lodash.sortby: 4.7.0 + lodash.template: 4.5.0 + lodash.uniqby: 4.7.0 + dev: false + + /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/color': 1.0.9 + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==} + engines: {node: '>=12.0.0'} + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + http-call: 5.3.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + dev: true + + /@oclif/screen@1.0.4: + resolution: {integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==} + engines: {node: '>=8.0.0'} + deprecated: Deprecated in favor of @oclif/core + dev: true + + /@oclif/test@2.0.0: + resolution: {integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==} + engines: {node: '>=8.0.0'} + dependencies: + fancy-test: 1.4.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@octokit/auth-token@2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + dependencies: + '@octokit/types': 6.41.0 + dev: true + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@3.6.0: + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql@4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@12.11.0: + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + dev: true + + /@octokit/plugin-enterprise-rest@6.0.1: + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + dev: true + + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + dependencies: + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@5.6.3: + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@18.12.0: + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.11: + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@octokit/types@6.41.0: + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + dependencies: + '@octokit/openapi-types': 12.11.0 + dev: true + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@salesforce/apex-node@3.0.2: + resolution: {integrity: sha512-lHa7XnQCivuwTtO0RBTqw+nZ4Qm4ymodqpNJwefFLk6KBEva9sMV9Ksj2x6kBGGbLyO6ZiJiUMSAN6Gcny60zg==} + engines: {node: '>=18.18.2'} + dependencies: + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@types/istanbul-reports': 3.0.4 + faye: 1.4.0 + glob: 10.3.10 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + jsforce: 2.0.0-beta.29 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/core@6.5.1: + resolution: {integrity: sha512-u/R82JGdbJCMY0EN3UY5hQUxn0gPN+ParNQIm9YPB9lDpBQv82nKeZJuH6j2LsaaF6ygY3bm79kftPxpdKbggQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@salesforce/kit': 3.0.15 + '@salesforce/schemas': 1.6.1 + '@salesforce/ts-types': 2.0.9 + '@types/semver': 7.5.6 + ajv: 8.12.0 + change-case: 4.1.2 + faye: 1.4.0 + form-data: 4.0.0 + js2xmlparser: 4.0.2 + jsforce: 2.0.0-beta.29 + jsonwebtoken: 9.0.2 + jszip: 3.10.1 + pino: 8.17.2 + pino-abstract-transport: 1.1.0 + pino-pretty: 10.3.1 + proper-lockfile: 4.1.2 + semver: 7.5.4 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/dev-config@3.0.1: + resolution: {integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==} + dev: true + + /@salesforce/kit@3.0.15: + resolution: {integrity: sha512-XkA8jsuLvVnyP460dAbU3pBFP2IkmmmsVxMQVifcKKbNWaIBbZBzAfj+vdaQfnvZyflLhsrFT3q2xkb0vHouPg==} + dependencies: + '@salesforce/ts-types': 2.0.9 + tslib: 2.6.2 + dev: false + + /@salesforce/packaging@3.2.5: + resolution: {integrity: sha512-vEydpa7gjr8vn35MezRPxoJE3b7f/fzIU9uBwgONf8THCJ7PMhj9PPfWOXfNp+/7qorqmYIVCJxMFWpJrMStlQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@oclif/core': 3.3.2 + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/schemas': 1.6.1 + '@salesforce/source-deploy-retrieve': 10.2.13 + '@salesforce/ts-types': 2.0.9 + fast-xml-parser: 4.3.3 + globby: 11.1.0 + graphology: 0.25.4(graphology-types@0.24.7) + graphology-traversal: 0.3.1(graphology-types@0.24.7) + graphology-types: 0.24.7 + jsforce: 2.0.0-beta.29 + jszip: 3.10.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/schemas@1.6.1: + resolution: {integrity: sha512-eVy947ZMxCJReKJdgfddUIsBIbPTa/i8RwQGwxq4/ss38H5sLOAeSTaun9V7HpJ1hkpDznWKfgzYvjsst9K6ig==} + dev: false + + /@salesforce/source-deploy-retrieve@10.2.13: + resolution: {integrity: sha512-KreSALl+mr+Yd7AoG+e6CjtD0/2FT4IS6Zvs4R0bbK/blixONycwl+zGaLia2b0X2pvitUOszMouW6aM0SAgvQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/ts-types': 2.0.9 + fast-levenshtein: 3.0.0 + fast-xml-parser: 4.3.3 + got: 11.8.6 + graceful-fs: 4.2.11 + ignore: 5.3.0 + jszip: 3.10.1 + mime: 2.6.0 + minimatch: 5.1.6 + proxy-agent: 6.3.1 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/source-tracking@5.1.7: + resolution: {integrity: sha512-kkXWt4X+wxmYsLqG1OIWKgo3aFEg1f+1X6MBIHIrmjEmfMXIRiGX0dRyY+IjFl54w+CnOffNDQNsGSmnPImEYg==} + engines: {node: '>=18.0.0'} + dependencies: + '@oclif/core': 3.18.1 + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/source-deploy-retrieve': 10.2.13 + '@salesforce/ts-types': 2.0.9 + fast-xml-parser: 4.2.7 + graceful-fs: 4.2.11 + isomorphic-git: 1.23.0 + ts-retry-promise: 0.8.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/ts-sinon@1.3.21: + resolution: {integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==} + dependencies: + '@salesforce/ts-types': 1.7.3 + sinon: 5.1.1 + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@1.7.3: + resolution: {integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==} + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.5: + resolution: {integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.7: + resolution: {integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.9: + resolution: {integrity: sha512-boUD9jw5vQpTCPCCmK/NFTWjSuuW+lsaxOynkyNXLW+zxOc4GDjhtKc4j0vWZJQvolpafbyS8ZLFHZJvs12gYA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@sigstore/bundle@1.0.0: + resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + dev: true + + /@sigstore/bundle@2.1.1: + resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/core@0.2.0: + resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: true + + /@sigstore/protobuf-specs@0.2.0: + resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/sign@2.2.1: + resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@2.3.0: + resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/verify@0.1.0: + resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/fake-timers@7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/formatio@2.0.0: + resolution: {integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==} + dependencies: + samsam: 1.3.0 + dev: true + + /@sinonjs/formatio@3.2.2: + resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam': 3.3.3 + dev: true + + /@sinonjs/samsam@3.3.3: + resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + array-from: 2.1.1 + lodash: 4.17.21 + dev: true + + /@sinonjs/samsam@6.1.3: + resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + /@tufjs/canonical-json@1.0.0: + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@tufjs/canonical-json@2.0.0: + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: true + + /@tufjs/models@1.0.4: + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.3 + dev: true + + /@tufjs/models@2.0.0: + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 + dev: true + + /@types/adm-zip@0.4.33: + resolution: {integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/async-retry@1.4.2: + resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/async-retry@1.4.5: + resolution: {integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==} + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 14.14.7 + '@types/responselike': 1.0.0 + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/cli-progress@3.11.0: + resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} + dependencies: + '@types/node': 14.14.7 + + /@types/cli-progress@3.11.5: + resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==} + dependencies: + '@types/node': 14.14.7 + dev: false + + /@types/datadog-metrics@0.6.1: + resolution: {integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==} + dev: true + + /@types/diff-match-patch@1.0.32: + resolution: {integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==} + dev: true + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.0 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.0: + resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/expect@1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + dev: true + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 14.14.7 + dev: true + + /@types/fs-extra@9.0.11: + resolution: {integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==} + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 14.14.7 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: false + + /@types/jest@29.5.3: + resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} + dependencies: + expect: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /@types/js-yaml@4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 14.14.7 + + /@types/lodash@4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + dev: true + + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: true + + /@types/marked@4.0.2: + resolution: {integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/mocha@5.2.7: + resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==} + dev: true + + /@types/mocha@9.1.0: + resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} + dev: true + + /@types/node@10.0.0: + resolution: {integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@14.14.7: + resolution: {integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==} + + /@types/node@15.14.9: + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + dev: true + + /@types/node@20.4.4: + resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/q@1.5.2: + resolution: {integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==} + dev: true + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 14.14.7 + + /@types/retry@0.12.2: + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + dev: true + + /@types/rimraf@3.0.2: + resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + dependencies: + '@types/glob': 8.1.0 + '@types/node': 14.14.7 + dev: true + + /@types/semver@7.5.2: + resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} + dev: true + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false + + /@types/sinon@10.0.15: + resolution: {integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.2 + dev: true + + /@types/sinonjs__fake-timers@8.1.2: + resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} + dev: true + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/vinyl@2.0.7: + resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} + dependencies: + '@types/expect': 1.20.4 + '@types/node': 14.14.7 + dev: true + + /@types/xml2js@0.4.5: + resolution: {integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==} + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-arm64-musl@16.5.5: - resolution: - { - integrity: sha512-xPTYjDCPnXLPXZThAzugiithZaIHk42rTxussMZA00Cx0iEkh5zohqtC0vGBnaAPNcMv0uyCiWABhL4RRUVp2w==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-x64-gnu@16.5.5: - resolution: - { - integrity: sha512-Rq55OWD4SObfo4sWpjvaijWg33dm+cOf8e2cO06t2EmLMdOyyVnpNdtpjXh6A9tSi3EU5xPfYiy3I9O6gWOnuw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.53.0: + resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-linux-x64-musl@16.5.5: - resolution: - { - integrity: sha512-fnkSPv+VIKmQQOEQxFrGx5DlkHGxeH9Fzme6jwuDwmsvs+8Vv/uUnfcxkDZfJxKK+p27w37q3PQCfZGrFXE1cw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.53.0: + resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): + resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@nx/nx-win32-arm64-msvc@16.5.5: - resolution: - { - integrity: sha512-9nWm+d+tlbxFMLvTLJqIfpTLDuSVDXfSBCSBampyeoI1mUALvq/6CVvWVBDlNqjmrZsYm0sudNqI4Ss7w3BUCQ==, - } - engines: { node: '>= 10' } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.2 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + eslint: 8.33.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.33.0) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.53.0: + resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /adm-zip@0.5.10: + resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} + engines: {node: '>=6.0'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + /antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /apex-parser@2.13.0: + resolution: {integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==} + engines: {node: '>=8.0.0'} + dependencies: + antlr4ts: 0.5.0-alpha.4 + node-dir: 0.1.17 + dev: false + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + + /array-from@2.1.1: + resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.1.0 + dev: false + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + /async-lock@1.4.0: + resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} + dev: false + + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: false + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /aws-sdk@2.1421.0: + resolution: {integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==} + engines: {node: '>= 10.0.0'} + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: 0.12.5 + uuid: 8.0.0 + xml2js: 0.5.0 + dev: true + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /babel-jest@29.6.1(@babel/core@7.18.2): + resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.18.2 + '@jest/transform': 29.6.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0(@babel/core@7.18.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.18.2): + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + dev: false + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + + /better-sqlite3@8.4.0: + resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /bin-links@3.0.3: + resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + cmd-shim: 5.0.0 + mkdirp-infer-owner: 2.0.0 + npm-normalize-package-bin: 2.0.0 + read-cmd-shim: 3.0.1 + rimraf: 3.0.2 + write-file-atomic: 4.0.2 + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /binaryextensions@4.18.0: + resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} + engines: {node: '>=0.8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.469 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.2 + dev: true + + /byte-size@8.1.1: + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} + dev: true + + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.15 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.3: + resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacache@18.0.2: + resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 10.2.0 + minipass: 7.0.4 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.3 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.1.0 + dev: false + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001517: + resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} + dev: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.0: + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clean-git-ref@2.0.1: + resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 4.0.0 + + /cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + + /cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + dependencies: + string-width: 4.2.3 + + /cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: true + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: false + + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + dependencies: + colors: 1.0.3 + + /cli-ux@5.6.7(@oclif/config@1.18.15): + resolution: {integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==} + engines: {node: '>=8.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + '@oclif/screen': 1.0.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + extract-stack: 2.0.0 + fs-extra: 8.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + + /clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + /cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /cmd-shim@5.0.0: + resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + mkdirp-infer-owner: 2.0.0 + dev: true + + /cmd-shim@6.0.1: + resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + + /columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@7.1.0: + resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} + engines: {node: '>= 10'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + requiresBuild: true + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} + engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case: 2.0.2 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@5.0.1: + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: true + + /conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} + dev: true + + /conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.2 + split: 1.0.1 + dev: true + + /conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /core-js-pure@3.31.1: + resolution: {integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==} + requiresBuild: true + dev: false + + /core-js@3.31.1: + resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /csprng@0.1.2: + resolution: {integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==} + engines: {node: '>=0.6.0'} + dependencies: + sequin: 0.1.1 + dev: false + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: false + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: false + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /data-uri-to-buffer@5.0.1: + resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + engines: {node: '>= 14'} + dev: false + + /datadog-metrics@0.9.3: + resolution: {integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==} + dependencies: + debug: 3.1.0 + dogapi: 2.8.4 + transitivePeerDependencies: + - supports-color + dev: false + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@nx/nx-win32-x64-msvc@16.5.5: - resolution: - { - integrity: sha512-fB8miPr887GIGBDhyT6VX7MWX5aC40izEi+4GGSk38oh5dOUK9TLwjAEW/3vBE01fj5Hjcy0CPN7RA45fh/WUw==, - } - engines: { node: '>= 10' } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@oclif/color@1.0.9: - resolution: - { - integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==, - } - engines: { node: '>=12.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - ansi-styles: 4.3.0 - chalk: 4.1.2 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - tslib: 2.1.0 - dev: true - - /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): - resolution: - { - integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==, - } - engines: { node: '>=12.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@oclif/config': ^1 - dependencies: - '@oclif/config': 1.18.15 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.13(supports-color@8.1.1) - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.14(supports-color@8.1.1): - resolution: - { - integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.15: - resolution: - { - integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/core@0.5.41(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-ux: 5.6.7(@oclif/config@1.18.15) - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lodash.template: 4.5.0 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tslib: 2.1.0 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==, - } - engines: { node: '>=14.0.0' } - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.4 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/core@3.3.2: - resolution: - { - integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==, - } - engines: { node: '>=18.0.0' } - dependencies: - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - dev: false - - /@oclif/errors@1.3.6: - resolution: - { - integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /@oclif/help@1.0.13(supports-color@8.1.1): - resolution: - { - integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/config': 1.18.14(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/linewrap@1.0.0: - resolution: - { - integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==, - } - dev: true - - /@oclif/parser@3.8.15: - resolution: - { - integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - tslib: 2.6.2 - dev: true - - /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 0.5.41(@oclif/config@1.18.15) - chalk: 4.1.2 - just-diff: 3.1.1 - semver: 7.5.2 - sinon: 11.1.2 - ts-json-schema-generator: 0.93.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/plugin-commands@3.0.3: - resolution: - { - integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==, - } - engines: { node: '>=18.0.0' } - dependencies: - '@oclif/core': 3.3.2 - lodash.pickby: 4.6.0 - lodash.sortby: 4.7.0 - lodash.template: 4.5.0 - lodash.uniqby: 4.7.0 - dev: false - - /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/color': 1.0.9 - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: true - - /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==, - } - engines: { node: '>=12.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - http-call: 5.3.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - - /@oclif/screen@1.0.4: - resolution: - { - integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==, - } - engines: { node: '>=8.0.0' } - deprecated: Deprecated in favor of @oclif/core - dev: true - - /@oclif/test@2.0.0: - resolution: - { - integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==, - } - engines: { node: '>=8.0.0' } - dependencies: - fancy-test: 1.4.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@octokit/auth-token@2.5.0: - resolution: - { - integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, - } - dependencies: - '@octokit/types': 6.41.0 - dev: true - - /@octokit/auth-token@3.0.4: - resolution: - { - integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==, - } - engines: { node: '>= 14' } - dev: true - - /@octokit/core@3.6.0: - resolution: - { - integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, - } - dependencies: - '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/core@4.2.4: - resolution: - { - integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/endpoint@6.0.12: - resolution: - { - integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, - } - dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/endpoint@7.0.6: - resolution: - { - integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/graphql@4.8.0: - resolution: - { - integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, - } - dependencies: - '@octokit/request': 5.6.3 - '@octokit/types': 6.41.0 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/graphql@5.0.6: - resolution: - { - integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/request': 6.2.8 - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/openapi-types@12.11.0: - resolution: - { - integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, - } - dev: true - - /@octokit/openapi-types@18.0.0: - resolution: - { - integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==, - } - dev: true - - /@octokit/plugin-enterprise-rest@6.0.1: - resolution: - { - integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, - } - dev: true - - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, - } - peerDependencies: - '@octokit/core': '>=2' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: true - - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==, - } - engines: { node: '>= 14' } - peerDependencies: - '@octokit/core': '>=4' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - dev: true - - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: - { - integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, - } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - dev: true - - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: - { - integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==, - } - engines: { node: '>= 14' } - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true - - /@octokit/request-error@2.1.0: - resolution: - { - integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, - } - dependencies: - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request-error@3.0.3: - resolution: - { - integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@5.6.3: - resolution: - { - integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, - } - dependencies: - '@octokit/endpoint': 6.0.12 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/request@6.2.8: - resolution: - { - integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@18.12.0: - resolution: - { - integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==, - } - dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@19.0.11: - resolution: - { - integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==, - } - engines: { node: '>= 14' } - dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/tsconfig@1.0.2: - resolution: - { - integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==, - } - dev: true - - /@octokit/types@10.0.0: - resolution: - { - integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==, - } - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@octokit/types@6.41.0: - resolution: - { - integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, - } - dependencies: - '@octokit/openapi-types': 12.11.0 - dev: true - - /@octokit/types@9.3.2: - resolution: - { - integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==, - } - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@parcel/watcher@2.0.4: - resolution: - { - integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==, - } - engines: { node: '>= 10.0.0' } - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.6.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } - requiresBuild: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + dev: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff3@0.0.3: + resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} + dev: false + + /diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dogapi@2.8.4: + resolution: {integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==} + hasBin: true + dependencies: + extend: 3.0.2 + json-bigint: 1.0.0 + lodash: 4.17.21 + minimist: 1.2.8 + rc: 1.2.8 + dev: false + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + + /electron-to-chromium@1.4.469: + resolution: {integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /envinfo@7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error@10.4.0: + resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} + dev: true + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.1: + resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.33.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.33.0: + resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.1 + eslint-utils: 3.0.0(eslint@8.33.0) + eslint-visitor-keys: 3.4.1 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.2 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@1.1.1: + resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} + engines: {node: '>=0.4.x'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.0.0: + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /expect@29.6.1: + resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.6.1 + '@types/node': 14.14.7 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + dev: true + + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + /extract-stack@2.0.0: + resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} + engines: {node: '>=8'} + dev: true + + /fancy-test@1.4.10: + resolution: {integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/chai': 4.3.5 + '@types/lodash': 4.14.195 + '@types/node': 14.14.7 + '@types/sinon': 10.0.15 + lodash: 4.17.21 + mock-stdin: 1.0.0 + nock: 13.3.2 + stdout-stderr: 0.1.13 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + dependencies: + fastest-levenshtein: 1.0.16 + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-xml-parser@4.2.7: + resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fast-xml-parser@4.3.3: + resolution: {integrity: sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: false + + /faye@1.4.0: + resolution: {integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==} + engines: {node: '>=0.8.0'} + dependencies: + asap: 2.0.6 + csprng: 0.1.2 + faye-websocket: 0.11.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + dev: false + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-java-home@2.0.0: + resolution: {integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==} + dependencies: + which: 1.0.9 + winreg: 1.2.4 + dev: false + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: true + + /first-chunk-stream@2.0.0: + resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} + engines: {node: '>=0.10.0'} + dependencies: + readable-stream: 2.3.8 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: optional: true - - /@salesforce/apex-node@2.1.0: - resolution: - { - integrity: sha512-W7OcqcBNHhf2wQMiPWOx/MED7ao1ZlML4vX5+A6hMDZTCZ5g34rj5wwVUQFOOAxHnS5F8jQUU5VpxpKo01jrTQ==, - } - engines: { node: '>=16.13.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@types/istanbul-reports': 3.0.1 - faye: 1.4.0 - glob: 8.1.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/core@5.3.9: - resolution: - { - integrity: sha512-/HX0PiXq3Sjc5eVJ0EaYetcDGsKU9O9Nj8jFGw5qYlITx8zogfxc0j07liH67tQXS1KbTysYoj/MQ2zbHSNkPA==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/ts-types': 2.0.8 - '@types/semver': 7.5.3 - ajv: 8.12.0 - change-case: 4.1.2 - faye: 1.4.0 - form-data: 4.0.0 - js2xmlparser: 4.0.2 - jsforce: 2.0.0-beta.27 - jsonwebtoken: 9.0.2 - jszip: 3.10.1 - pino: 8.16.0 - pino-abstract-transport: 1.1.0 - pino-pretty: 10.2.3 - proper-lockfile: 4.1.2 - semver: 7.5.4 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/dev-config@3.0.1: - resolution: - { - integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==, - } - dev: true - - /@salesforce/kit@3.0.13: - resolution: - { - integrity: sha512-HLQ5L5bBi0tsMeH5ZHJAhHUpvNUNPQoNJt2O82Jf6C60GGsrlzwzQ5ONAHGNBgKSZ7HLr0UGL5xaA+hE9uOcgw==, - } - dependencies: - '@salesforce/ts-types': 2.0.8 - tslib: 2.6.2 - dev: false - - /@salesforce/packaging@2.3.3(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-gGxN4FA5mX85B6960sUOrUz9KYAC7Iw5GXPYV/0YoBSU4M42I0V4pgWcOQOiRwW8gbe8wpSKB/Ccv6NSjNCuBQ==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/schemas': 1.6.0 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.7 - fast-xml-parser: 4.2.7 - globby: 11.1.0 - graphology: 0.25.4(graphology-types@0.24.7) - graphology-traversal: 0.3.1(graphology-types@0.24.7) - graphology-types: 0.24.7 - jsforce: 2.0.0-beta.27 - jszip: 3.10.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - encoding - - supports-color - - typescript - dev: false - - /@salesforce/schemas@1.6.0: - resolution: - { - integrity: sha512-SwhDTLucj/GRbPpxlEoDZeqlX22o+G6fiebTXTu1cZKmd1oE0W2L7SlTTgJnWck8bhTeBIgQi9cpD8c2t5ISKA==, - } - dev: false - - /@salesforce/source-deploy-retrieve@9.7.24: - resolution: - { - integrity: sha512-nkP9KgzuCoV6LtdDxgxt7KRnoQ6ZS12DJgXErCBXm7Swmr0dnbo1LhxrH05C4UFFe0JuvSta+u+Oor8jxSGaCQ==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/ts-types': 2.0.7 - fast-levenshtein: 3.0.0 - fast-xml-parser: 4.3.2 - got: 11.8.6 - graceful-fs: 4.2.11 - ignore: 5.2.4 - jszip: 3.10.1 - mime: 2.6.0 - minimatch: 5.1.6 - proxy-agent: 6.3.1 - unzipper: 0.10.14 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/source-tracking@4.2.16: - resolution: - { - integrity: sha512-HAuLaY+RrdKvWjx9FVYMrYlIUW4JyQtF/TA5hbDpy4Rw8IUOgrYyt+IaoiAAtMyRqU8En8fJBUqiq4qFvhdpCA==, - } - engines: { node: '>=16.0.0' } - dependencies: - '@salesforce/core': 5.3.9 - '@salesforce/kit': 3.0.13 - '@salesforce/source-deploy-retrieve': 9.7.24 - '@salesforce/ts-types': 2.0.8 - fast-xml-parser: 4.2.7 - graceful-fs: 4.2.11 - isomorphic-git: 1.23.0 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/ts-sinon@1.3.21: - resolution: - { - integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==, - } - dependencies: - '@salesforce/ts-types': 1.7.3 - sinon: 5.1.1 - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@1.7.3: - resolution: - { - integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==, - } - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.5: - resolution: - { - integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.7: - resolution: - { - integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.2 - - /@salesforce/ts-types@2.0.8: - resolution: - { - integrity: sha512-vuzLcxtThBhpuhmnoh8GFrVU8XjdoNyQm9gPtmcjUyUD/9nQIBTAX8oGoUvCiiq93c4LFEmSua+xm3yu0bbNfg==, - } - engines: { node: '>=16.0.0' } - dependencies: - tslib: 2.6.2 - dev: false - - /@sigstore/bundle@1.0.0: - resolution: - { - integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - dev: true - - /@sigstore/protobuf-specs@0.2.0: - resolution: - { - integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@sigstore/tuf@1.0.3: - resolution: - { - integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@sinclair/typebox@0.27.8: - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } - dev: true - - /@sindresorhus/is@4.6.0: - resolution: - { - integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, - } - engines: { node: '>=10' } - - /@sinonjs/commons@1.8.6: - resolution: - { - integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@2.0.0: - resolution: - { - integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.0: - resolution: - { - integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: - { - integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, - } - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@sinonjs/fake-timers@7.1.2: - resolution: - { - integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/formatio@2.0.0: - resolution: - { - integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==, - } - dependencies: - samsam: 1.3.0 - dev: true - - /@sinonjs/formatio@3.2.2: - resolution: - { - integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/samsam': 3.3.3 - dev: true - - /@sinonjs/samsam@3.3.3: - resolution: - { - integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - array-from: 2.1.1 - lodash: 4.17.21 - dev: true - - /@sinonjs/samsam@6.1.3: - resolution: - { - integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding@0.7.2: - resolution: - { - integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, - } - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: - { - integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, - } - engines: { node: '>=10' } - dependencies: - defer-to-connect: 2.0.1 - - /@tootallnate/once@1.1.2: - resolution: - { - integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, - } - engines: { node: '>= 6' } - dev: true - - /@tootallnate/once@2.0.0: - resolution: - { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, - } - engines: { node: '>= 10' } - dev: true - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: - { - integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, - } - dev: false - - /@tsconfig/node10@1.0.9: - resolution: - { - integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, - } - - /@tsconfig/node12@1.0.11: - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } - - /@tsconfig/node14@1.0.3: - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } - - /@tsconfig/node16@1.0.4: - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } - - /@tufjs/canonical-json@1.0.0: - resolution: - { - integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /@tufjs/models@1.0.4: - resolution: - { - integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.3 - dev: true - - /@types/adm-zip@0.4.33: - resolution: - { - integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/async-retry@1.4.2: - resolution: - { - integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==, - } - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/async-retry@1.4.5: - resolution: - { - integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==, - } - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/babel__core@7.20.1: - resolution: - { - integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==, - } - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /@types/babel__generator@7.6.4: - resolution: - { - integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, - } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/babel__template@7.4.1: - resolution: - { - integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, - } - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@types/babel__traverse@7.20.1: - resolution: - { - integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==, - } - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: - { - integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, - } - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 14.14.7 - '@types/responselike': 1.0.0 - - /@types/chai@4.3.5: - resolution: - { - integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==, - } - dev: true - - /@types/cli-progress@3.11.0: - resolution: - { - integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/datadog-metrics@0.6.1: - resolution: - { - integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==, - } - dev: true - - /@types/diff-match-patch@1.0.32: - resolution: - { - integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==, - } - dev: true - - /@types/eslint-scope@3.7.4: - resolution: - { - integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==, - } - dependencies: - '@types/eslint': 8.44.0 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.44.0: - resolution: - { - integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==, - } - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: - { - integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, - } - dev: true - - /@types/expect@1.20.4: - resolution: - { - integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==, - } - dev: true - - /@types/fs-extra@11.0.4: - resolution: - { - integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==, - } - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 14.14.7 - dev: true - - /@types/fs-extra@9.0.11: - resolution: - { - integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==, - } - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/glob@8.1.0: - resolution: - { - integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==, - } - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 14.14.7 - dev: true - - /@types/graceful-fs@4.1.6: - resolution: - { - integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/http-cache-semantics@4.0.1: - resolution: - { - integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, - } - - /@types/istanbul-lib-coverage@2.0.4: - resolution: - { - integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, - } - - /@types/istanbul-lib-report@3.0.0: - resolution: - { - integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, - } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - /@types/istanbul-reports@3.0.1: - resolution: - { - integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, - } - dependencies: - '@types/istanbul-lib-report': 3.0.0 - - /@types/jest@29.5.3: - resolution: - { - integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==, - } - dependencies: - expect: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /@types/js-yaml@4.0.5: - resolution: - { - integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==, - } - dev: true - - /@types/json-schema@7.0.12: - resolution: - { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, - } - dev: true - - /@types/jsonfile@6.1.4: - resolution: - { - integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==, - } - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/keyv@3.1.4: - resolution: - { - integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/lodash@4.14.191: - resolution: - { - integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==, - } - dev: true - - /@types/lodash@4.14.195: - resolution: - { - integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==, - } - dev: true - - /@types/marked@4.0.2: - resolution: - { - integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==, - } - dev: true - - /@types/minimatch@3.0.5: - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } - dev: true - - /@types/minimatch@5.1.2: - resolution: - { - integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, - } - dev: true - - /@types/minimist@1.2.2: - resolution: - { - integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, - } - dev: true - - /@types/mocha@5.2.7: - resolution: - { - integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==, - } - dev: true - - /@types/mocha@9.1.0: - resolution: - { - integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==, - } - dev: true - - /@types/node@10.0.0: - resolution: - { - integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==, - } - dev: true - - /@types/node@12.20.55: - resolution: - { - integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, - } - dev: false - - /@types/node@14.14.7: - resolution: - { - integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==, - } - - /@types/node@15.14.9: - resolution: - { - integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==, - } - dev: true - - /@types/node@20.4.4: - resolution: - { - integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==, - } - dev: true - - /@types/normalize-package-data@2.4.1: - resolution: - { - integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, - } - dev: true - - /@types/parse-json@4.0.0: - resolution: - { - integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, - } - dev: true - - /@types/prettier@2.7.3: - resolution: - { - integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, - } - dev: true - - /@types/q@1.5.2: - resolution: - { - integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==, - } - dev: true - - /@types/responselike@1.0.0: - resolution: - { - integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, - } - dependencies: - '@types/node': 14.14.7 - - /@types/retry@0.12.2: - resolution: - { - integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, - } - dev: true - - /@types/rimraf@3.0.2: - resolution: - { - integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==, - } - dependencies: - '@types/glob': 8.1.0 - '@types/node': 14.14.7 - dev: true - - /@types/semver@7.5.2: - resolution: - { - integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, - } - dev: true - - /@types/semver@7.5.3: - resolution: - { - integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==, - } - dev: false - - /@types/sinon@10.0.15: - resolution: - { - integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==, - } - dependencies: - '@types/sinonjs__fake-timers': 8.1.2 - dev: true - - /@types/sinonjs__fake-timers@8.1.2: - resolution: - { - integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==, - } - dev: true - - /@types/stack-utils@2.0.1: - resolution: - { - integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, - } - dev: true - - /@types/vinyl@2.0.7: - resolution: - { - integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==, - } - dependencies: - '@types/expect': 1.20.4 - '@types/node': 14.14.7 - dev: true - - /@types/xml2js@0.4.5: - resolution: - { - integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==, - } - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: - { - integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, - } - dev: true - - /@types/yargs@17.0.24: - resolution: - { - integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==, - } - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.53.0: - resolution: - { - integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - dev: true - - /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.53.0: - resolution: - { - integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): - resolution: - { - integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: - { - integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - eslint: 8.33.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.53.0: - resolution: - { - integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.53.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: - { - integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==, - } - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: - { - integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, - } - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: - { - integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, - } - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: - { - integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==, - } - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: - { - integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, - } - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: - { - integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, - } - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: - { - integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: - { - integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, - } - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: - { - integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, - } - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: - { - integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, - } - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: - { - integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: - { - integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: - { - integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: - { - integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: - { - integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==, - } - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: - { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, - } - dev: true - - /@xtuc/long@4.2.2: - resolution: - { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, - } - dev: true - - /@yarnpkg/lockfile@1.1.0: - resolution: - { - integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, - } - dev: true - - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: - { - integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==, - } - engines: { node: '>=14.15.0' } - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - dev: true - - /@zkochan/js-yaml@0.0.6: - resolution: - { - integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abbrev@1.1.1: - resolution: - { - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, - } - dev: true - - /abort-controller@3.0.0: - resolution: - { - integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, - } - engines: { node: '>=6.5' } - dependencies: - event-target-shim: 5.0.1 - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: - { - integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, - } - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: '>=0.4.0' } - - /acorn@8.10.0: - resolution: - { - integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, - } - engines: { node: '>=0.4.0' } - hasBin: true - - /add-stream@1.0.0: - resolution: - { - integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, - } - dev: true - - /adm-zip@0.5.10: - resolution: - { - integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==, - } - engines: { node: '>=6.0' } - dev: false - - /agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: '>= 6.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /agent-base@7.1.0: - resolution: - { - integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, - } - engines: { node: '>= 14' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /agentkeepalive@4.3.0: - resolution: - { - integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==, - } - engines: { node: '>= 8.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - depd: 2.0.0 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: '>=8' } - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: - { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, - } - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.11.0: - resolution: - { - integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: '>=6' } - dev: true - - /ansi-escapes@3.2.0: - resolution: - { - integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, - } - engines: { node: '>=4' } - - /ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: '>=8' } - dependencies: - type-fest: 0.21.3 - - /ansi-escapes@5.0.0: - resolution: - { - integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, - } - engines: { node: '>=12' } - dependencies: - type-fest: 1.4.0 - dev: false - - /ansi-regex@2.1.1: - resolution: - { - integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ansi-regex@3.0.1: - resolution: - { - integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, - } - engines: { node: '>=4' } - dev: true - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } - - /ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - } - engines: { node: '>=12' } - - /ansi-styles@2.2.1: - resolution: - { - integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: '>=4' } - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } - dev: true - - /ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } - - /ansicolors@0.3.2: - resolution: - { - integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, - } - - /antlr4ts@0.5.0-alpha.4: - resolution: - { - integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==, - } - dev: false - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /apex-parser@2.13.0: - resolution: - { - integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==, - } - engines: { node: '>=8.0.0' } - dependencies: - antlr4ts: 0.5.0-alpha.4 - node-dir: 0.1.17 - dev: false - - /aproba@2.0.0: - resolution: - { - integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, - } - dev: true - - /are-we-there-yet@2.0.0: - resolution: - { - integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, - } - engines: { node: '>=10' } - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /are-we-there-yet@3.0.1: - resolution: - { - integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } - - /argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } - dependencies: - sprintf-js: 1.0.3 - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-differ@3.0.0: - resolution: - { - integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, - } - engines: { node: '>=8' } - dev: true - - /array-from@2.1.1: - resolution: - { - integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, - } - dev: true - - /array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } - dev: true - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: '>=8' } - - /arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /arrify@2.0.1: - resolution: - { - integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, - } - engines: { node: '>=8' } - dev: true - - /asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } - - /ast-types@0.13.4: - resolution: - { - integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, - } - engines: { node: '>=4' } - dependencies: - tslib: 2.1.0 - dev: false - - /astral-regex@2.0.0: - resolution: - { - integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, - } - engines: { node: '>=8' } - - /async-lock@1.4.0: - resolution: - { - integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==, - } - dev: false - - /async-retry@1.3.3: - resolution: - { - integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, - } - dependencies: - retry: 0.13.1 - dev: false - - /async@3.2.4: - resolution: - { - integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, - } - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - - /at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: '>= 4.0.0' } - - /atomic-sleep@1.0.0: - resolution: - { - integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, - } - engines: { node: '>=8.0.0' } - dev: false - - /available-typed-arrays@1.0.5: - resolution: - { - integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, - } - engines: { node: '>= 0.4' } - dev: true - - /aws-sdk@2.1421.0: - resolution: - { - integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==, - } - engines: { node: '>= 10.0.0' } - dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.5.0 - dev: true - - /axios@1.4.0: - resolution: - { - integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, - } - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - /babel-jest@29.6.1(@babel/core@7.18.2): - resolution: - { - integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.18.2 - '@jest/transform': 29.6.1 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.18.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - } - engines: { node: '>=8' } - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.5.0: - resolution: - { - integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): - resolution: - { - integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, - } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.18.2): - resolution: - { - integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - dev: true - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - - /base64url@3.0.1: - resolution: - { - integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, - } - engines: { node: '>=6.0.0' } - dev: false - - /basic-ftp@5.0.3: - resolution: - { - integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, - } - engines: { node: '>=10.0.0' } - dev: false - - /before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } - dev: true - - /better-sqlite3@8.4.0: - resolution: - { - integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, - } - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: false - - /big-integer@1.6.51: - resolution: - { - integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, - } - engines: { node: '>=0.6' } - dev: false - - /bignumber.js@9.1.1: - resolution: - { - integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==, - } - dev: false - - /bin-links@3.0.3: - resolution: - { - integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - cmd-shim: 5.0.0 - mkdirp-infer-owner: 2.0.0 - npm-normalize-package-bin: 2.0.0 - read-cmd-shim: 3.0.1 - rimraf: 3.0.2 - write-file-atomic: 4.0.2 - dev: true - - /binary-extensions@2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - } - engines: { node: '>=8' } - dev: true - - /binary@0.3.0: - resolution: - { - integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, - } - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: false - - /binaryextensions@4.18.0: - resolution: - { - integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==, - } - engines: { node: '>=0.8' } - dev: true - - /bindings@1.5.0: - resolution: - { - integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, - } - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /bluebird@3.4.7: - resolution: - { - integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, - } - dev: false - - /bottleneck@2.19.5: - resolution: - { - integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, - } - dev: false - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: '>=8' } - dependencies: - fill-range: 7.0.1 - - /browserslist@4.21.9: - resolution: - { - integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.469 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true - - /bs-logger@0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: '>= 6' } - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-equal-constant-time@1.0.1: - resolution: - { - integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, - } - dev: false - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer-indexof-polyfill@1.0.2: - resolution: - { - integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, - } - engines: { node: '>=0.10' } - dev: false - - /buffer@4.9.2: - resolution: - { - integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffer@6.0.3: - resolution: - { - integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffers@0.1.1: - resolution: - { - integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, - } - engines: { node: '>=0.2.0' } - dev: false - - /builtins@1.0.3: - resolution: - { - integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, - } - dev: true - - /builtins@5.0.1: - resolution: - { - integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, - } - dependencies: - semver: 7.5.2 - dev: true - - /byte-size@8.1.1: - resolution: - { - integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, - } - engines: { node: '>=12.17' } - dev: true - - /cacache@15.3.0: - resolution: - { - integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==, - } - engines: { node: '>= 10' } - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@16.1.3: - resolution: - { - integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.1.15 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@17.1.3: - resolution: - { - integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /cacheable-lookup@5.0.4: - resolution: - { - integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, - } - engines: { node: '>=10.6.0' } - - /cacheable-request@7.0.4: - resolution: - { - integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, - } - engines: { node: '>=8' } - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.3 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - /call-bind@1.0.2: - resolution: - { - integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, - } - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } - dev: true - - /camel-case@4.1.2: - resolution: - { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, - } - dependencies: - pascal-case: 3.1.2 - tslib: 2.1.0 - dev: false - - /camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: '>=8' } - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: '>=6' } - dev: true - - /camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: '>=10' } - dev: true - - /caniuse-lite@1.0.30001517: - resolution: - { - integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==, - } - dev: true - - /capital-case@1.0.4: - resolution: - { - integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /cardinal@2.1.1: - resolution: - { - integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, - } - hasBin: true - dependencies: - ansicolors: 0.3.2 - redeyed: 2.1.1 - - /chainsaw@0.1.0: - resolution: - { - integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, - } - dependencies: - traverse: 0.3.9 - dev: false - - /chalk@1.1.3: - resolution: - { - integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: '>=4' } - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.0: - resolution: - { - integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: false - - /change-case@4.1.2: - resolution: - { - integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==, - } - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: '>=10' } - dev: true - - /chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: '>= 8.10.0' } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: '>=10' } - - /chrome-trace-event@1.0.3: - resolution: - { - integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, - } - engines: { node: '>=6.0' } - dev: true - - /ci-info@3.8.0: - resolution: - { - integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, - } - engines: { node: '>=8' } - dev: true - - /cjs-module-lexer@1.2.3: - resolution: - { - integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==, - } - dev: true - - /clean-git-ref@2.0.1: - resolution: - { - integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==, - } - dev: false - - /clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: '>=6' } - dev: true - - /clean-stack@3.0.1: - resolution: - { - integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==, - } - engines: { node: '>=10' } - dependencies: - escape-string-regexp: 4.0.0 - - /cli-boxes@1.0.0: - resolution: - { - integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /cli-cursor@2.1.0: - resolution: - { - integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, - } - engines: { node: '>=4' } - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: '>=8' } - dependencies: - restore-cursor: 3.1.0 - - /cli-progress@3.12.0: - resolution: - { - integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==, - } - engines: { node: '>=4' } - dependencies: - string-width: 4.2.3 - - /cli-spinners@2.6.1: - resolution: - { - integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, - } - engines: { node: '>=6' } - dev: true - - /cli-spinners@2.9.0: - resolution: - { - integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==, - } - engines: { node: '>=6' } - dev: true - - /cli-table3@0.6.3: - resolution: - { - integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, - } - engines: { node: 10.* || >= 12.* } - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: false - - /cli-table@0.3.11: - resolution: - { - integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==, - } - engines: { node: '>= 0.2.0' } - dependencies: - colors: 1.0.3 - - /cli-ux@5.6.7(@oclif/config@1.18.15): - resolution: - { - integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==, - } - engines: { node: '>=8.0.0' } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - '@oclif/screen': 1.0.4 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - extract-stack: 2.0.0 - fs-extra: 8.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - lodash: 4.17.21 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - dev: true - - /cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: '>= 10' } - - /cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: '>=12' } - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-buffer@1.0.0: - resolution: - { - integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, - } - engines: { node: '>= 0.10' } - dev: true - - /clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone-response@1.0.3: - resolution: - { - integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, - } - dependencies: - mimic-response: 1.0.1 - - /clone-stats@1.0.0: - resolution: - { - integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, - } - dev: true - - /clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: '>=0.8' } - dev: true - - /clone@2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: '>=0.8' } - - /cloneable-readable@1.1.3: - resolution: - { - integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, - } - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: true - - /cmd-shim@5.0.0: - resolution: - { - integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - mkdirp-infer-owner: 2.0.0 - dev: true - - /cmd-shim@6.0.1: - resolution: - { - integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } - dev: true - - /code-point-at@1.1.0: - resolution: - { - integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /collect-v8-coverage@1.0.2: - resolution: - { - integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, - } - dev: true - - /color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - dev: true - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /color-support@1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } - hasBin: true - dev: true - - /colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - dev: false - - /colors@1.0.3: - resolution: - { - integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==, - } - engines: { node: '>=0.1.90' } - - /columnify@1.6.0: - resolution: - { - integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, - } - engines: { node: '>=8.0.0' } - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } - dependencies: - delayed-stream: 1.0.0 - - /commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - dev: true - - /commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: '>= 6' } - dev: false - - /commander@7.1.0: - resolution: - { - integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==, - } - engines: { node: '>= 10' } - dev: true - - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: '>= 10' } - dev: true - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /common-ancestor-path@1.0.1: - resolution: - { - integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, - } - dev: true - - /commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } - dev: true - - /compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - requiresBuild: true - - /concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { '0': node >= 6.0 } - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: true - - /concurrently@7.6.0: - resolution: - { - integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==, - } - engines: { node: ^12.20.0 || ^14.13.0 || >=16.0.0 } - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /console-control-strings@1.1.0: - resolution: - { - integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, - } - dev: true - - /constant-case@3.0.4: - resolution: - { - integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case: 2.0.2 - dev: false - - /content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } - dev: true - - /conventional-changelog-angular@5.0.13: - resolution: - { - integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, - } - engines: { node: '>=10' } - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-angular@6.0.0: - resolution: - { - integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==, - } - engines: { node: '>=14' } - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-changelog-conventionalcommits@4.6.3: - resolution: - { - integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, - } - engines: { node: '>=10' } - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-changelog-core@5.0.1: - resolution: - { - integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, - } - engines: { node: '>=14' } - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 - git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - dev: true - - /conventional-changelog-preset-loader@3.0.0: - resolution: - { - integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, - } - engines: { node: '>=14' } - dev: true - - /conventional-changelog-writer@6.0.1: - resolution: - { - integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 - handlebars: 4.7.7 - json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.5.2 - split: 1.0.1 - dev: true - - /conventional-commits-filter@3.0.0: - resolution: - { - integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, - } - engines: { node: '>=14' } - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - - /conventional-commits-parser@3.2.4: - resolution: - { - integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /conventional-commits-parser@4.0.0: - resolution: - { - integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /conventional-recommended-bump@7.0.1: - resolution: - { - integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 - dev: true - - /convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } - dev: true - - /convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } - dev: true - - /core-js-pure@3.31.1: - resolution: - { - integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==, - } - requiresBuild: true - dev: false - - /core-js@3.31.1: - resolution: - { - integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==, - } - requiresBuild: true - dev: false - - /core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - - /cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: '>=10' } - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /cosmiconfig@8.2.0: - resolution: - { - integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==, - } - engines: { node: '>=14' } - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /crc-32@1.2.2: - resolution: - { - integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, - } - engines: { node: '>=0.8' } - hasBin: true - dev: false - - /create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } - - /cross-spawn@6.0.5: - resolution: - { - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, - } - engines: { node: '>=4.8' } - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: '>= 8' } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /csprng@0.1.2: - resolution: - { - integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==, - } - engines: { node: '>=0.6.0' } - dependencies: - sequin: 0.1.1 - dev: false - - /csv-parse@4.16.3: - resolution: - { - integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, - } - dev: false - - /csv-stringify@5.6.5: - resolution: - { - integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, - } - dev: false - - /dargs@7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: '>=8' } - dev: true - - /data-uri-to-buffer@5.0.1: - resolution: - { - integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==, - } - engines: { node: '>= 14' } - dev: false - - /datadog-metrics@0.9.3: - resolution: - { - integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==, - } - dependencies: - debug: 3.1.0 - dogapi: 2.8.4 - transitivePeerDependencies: - - supports-color - dev: false - - /date-fns@2.30.0: - resolution: - { - integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, - } - engines: { node: '>=0.11' } - dependencies: - '@babel/runtime': 7.22.6 - dev: true - - /dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } - dev: true - - /dateformat@4.6.3: - resolution: - { - integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, - } - - /debug@3.1.0: - resolution: - { - integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@4.3.4(supports-color@8.1.1): - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - - /debuglog@1.0.1: - resolution: - { - integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==, - } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: '>=0.10.0' } - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } - dependencies: - mimic-response: 3.1.0 - - /dedent@0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } - dev: true - - /deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } - - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - dev: true - - /deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } - dev: true - - /defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@2.0.1: - resolution: - { - integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, - } - engines: { node: '>=10' } - - /define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } - dev: true - - /degenerator@5.0.1: - resolution: - { - integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, - } - engines: { node: '>= 14' } - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } - - /delegates@1.0.0: - resolution: - { - integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, - } - dev: true - - /depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: '>= 0.8' } - dev: true - - /deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } - dev: true - - /detect-indent@5.0.0: - resolution: - { - integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, - } - engines: { node: '>=4' } - dev: true - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: '>=8' } - dev: false - - /detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: '>=8' } - dev: true - - /dezalgo@1.0.4: - resolution: - { - integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==, - } - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: true - - /diff-match-patch@1.0.5: - resolution: - { - integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, - } - dev: false - - /diff-sequences@29.4.3: - resolution: - { - integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /diff3@0.0.3: - resolution: - { - integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==, - } - dev: false - - /diff@3.5.0: - resolution: - { - integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, - } - engines: { node: '>=0.3.1' } - dev: true - - /diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: '>=0.3.1' } - - /diff@5.1.0: - resolution: - { - integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, - } - engines: { node: '>=0.3.1' } - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: '>=8' } - dependencies: - path-type: 4.0.0 - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: '>=6.0.0' } - dependencies: - esutils: 2.0.3 - dev: true - - /dogapi@2.8.4: - resolution: - { - integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==, - } - hasBin: true - dependencies: - extend: 3.0.2 - json-bigint: 1.0.0 - lodash: 4.17.21 - minimist: 1.2.8 - rc: 1.2.8 - dev: false - - /dot-case@3.0.4: - resolution: - { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: '>=8' } - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv@10.0.0: - resolution: - { - integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, - } - engines: { node: '>=10' } - dev: true - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: '>=12' } - dev: false - - /duplexer2@0.1.4: - resolution: - { - integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, - } - dependencies: - readable-stream: 2.3.8 - dev: false - - /duplexer@0.1.2: - resolution: - { - integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, - } - dev: true - - /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - - /ecdsa-sig-formatter@1.0.11: - resolution: - { - integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /ejs@3.1.9: - resolution: - { - integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, - } - engines: { node: '>=0.10.0' } - hasBin: true - dependencies: - jake: 10.8.7 - - /electron-to-chromium@1.4.469: - resolution: - { - integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==, - } - dev: true - - /emittery@0.13.1: - resolution: - { - integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, - } - engines: { node: '>=12' } - dev: true - - /emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - - /emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - - /encoding@0.1.13: - resolution: - { - integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, - } - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true + dev: false + + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: optional: true - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - - /enhanced-resolve@5.15.0: - resolution: - { - integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, - } - engines: { node: '>=10.13.0' } - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /enquirer@2.3.6: - resolution: - { - integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, - } - engines: { node: '>=8.6' } - dependencies: - ansi-colors: 4.1.3 - dev: true - - /env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: '>=6' } - dev: true - - /envinfo@7.8.1: - resolution: - { - integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /err-code@2.0.3: - resolution: - { - integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, - } - dev: true - - /error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error@10.4.0: - resolution: - { - integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==, - } - dev: true - - /es-module-lexer@1.3.0: - resolution: - { - integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==, - } - dev: true - - /escalade@3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - } - engines: { node: '>=6' } - dev: true - - /escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: '>=0.8.0' } - - /escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: '>=8' } - dev: true - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } - - /escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - } - engines: { node: '>=6.0' } - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: '>=8.0.0' } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.1: - resolution: - { - integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.33.0): - resolution: - { - integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, - } - engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.33.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: '>=10' } - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: - { - integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /eslint@8.33.0: - resolution: - { - integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-utils: 3.0.0(eslint@8.33.0) - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 - dev: true - - /esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } - hasBin: true - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: '>=0.10' } - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: '>=4.0' } - dev: true - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } - - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } - - /event-target-shim@5.0.1: - resolution: - { - integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, - } - engines: { node: '>=6' } - - /eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } - dev: true - - /events@1.1.1: - resolution: - { - integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==, - } - engines: { node: '>=0.4.x' } - dev: true - - /events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } - - /execa@5.0.0: - resolution: - { - integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, - } - engines: { node: '>=10' } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: '>=10' } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execution-time@1.4.1: - resolution: - { - integrity: sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==, - } - dependencies: - pretty-hrtime: 1.0.3 - dev: true - - /exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: '>=6' } - dev: false - - /expect@29.6.1: - resolution: - { - integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/expect-utils': 29.6.1 - '@types/node': 14.14.7 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - dev: true - - /exponential-backoff@3.1.1: - resolution: - { - integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==, - } - dev: true - - /extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } - dev: false - - /external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: '>=4' } - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /extract-stack@2.0.0: - resolution: - { - integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==, - } - engines: { node: '>=8' } - dev: true - - /fancy-test@1.4.10: - resolution: - { - integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==, - } - engines: { node: '>=8.0.0' } - dependencies: - '@types/chai': 4.3.5 - '@types/lodash': 4.14.195 - '@types/node': 14.14.7 - '@types/sinon': 10.0.15 - lodash: 4.17.21 - mock-stdin: 1.0.0 - nock: 13.3.2 - stdout-stderr: 0.1.13 - transitivePeerDependencies: - - supports-color - dev: true - - /fast-copy@3.0.1: - resolution: - { - integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==, - } - dev: false - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.2.7: - resolution: - { - integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==, - } - engines: { node: '>=8' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: '>=8.6.0' } - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - dev: true - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - dev: true - - /fast-levenshtein@3.0.0: - resolution: - { - integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==, - } - dependencies: - fastest-levenshtein: 1.0.16 - - /fast-redact@3.3.0: - resolution: - { - integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==, - } - engines: { node: '>=6' } - dev: false - - /fast-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } - dev: false - - /fast-xml-parser@4.2.7: - resolution: - { - integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==, - } - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fast-xml-parser@4.3.2: - resolution: - { - integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==, - } - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fastest-levenshtein@1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: '>= 4.9.1' } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /faye-websocket@0.11.4: - resolution: - { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, - } - engines: { node: '>=0.8.0' } - dependencies: - websocket-driver: 0.7.4 - dev: false - - /faye@1.4.0: - resolution: - { - integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==, - } - engines: { node: '>=0.8.0' } - dependencies: - asap: 2.0.6 - csprng: 0.1.2 - faye-websocket: 0.11.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - dev: false - - /fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: '>=8' } - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.0.4 - dev: true - - /file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } - dev: false - - /filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } - dependencies: - minimatch: 5.1.6 - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: '>=8' } - dependencies: - to-regex-range: 5.0.1 - - /find-java-home@2.0.0: - resolution: - { - integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==, - } - dependencies: - which: 1.0.9 - winreg: 1.2.4 - dev: false - - /find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: '>=4' } - dependencies: - locate-path: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: - { - integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, - } - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - - /find-yarn-workspace-root@2.0.0: - resolution: - { - integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, - } - dependencies: - micromatch: 4.0.5 - dev: true - - /first-chunk-stream@2.0.0: - resolution: - { - integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==, - } - engines: { node: '>=0.10.0' } - dependencies: - readable-stream: 2.3.8 - dev: true - - /flat-cache@3.0.4: - resolution: - { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } - hasBin: true - dev: true - - /flatted@3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - dev: true - - /follow-redirects@1.15.2: - resolution: - { - integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, - } - engines: { node: '>=4.0' } - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - /for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - } - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: - { - integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, - } - engines: { node: '>=14' } - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.0.2 - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: '>= 6' } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - - /fs-extra@10.1.0: - resolution: - { - integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, - } - engines: { node: '>=12' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra@11.1.0: - resolution: - { - integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, - } - engines: { node: '>=14.14' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - - /fs-extra@11.1.1: - resolution: - { - integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, - } - engines: { node: '>=14.14' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@7.0.1: - resolution: - { - integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, - } - engines: { node: '>=6 <7 || >=8' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - } - engines: { node: '>=6 <7 || >=8' } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: '>=10' } - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - - /fs-minipass@3.0.2: - resolution: - { - integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /fs-minipass@3.0.2: + resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.0: + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-uri@6.0.1: + resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.5.2 + dev: true + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: true + + /github-username@6.0.0: + resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} + engines: {node: '>=10'} + dependencies: + '@octokit/rest': 18.12.0 + transitivePeerDependencies: + - encoding + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphology-indices@0.17.0(graphology-types@0.24.7): + resolution: {integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==} + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + mnemonist: 0.39.5 + dev: false + + /graphology-traversal@0.3.1(graphology-types@0.24.7): + resolution: {integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==} + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-indices: 0.17.0(graphology-types@0.24.7) + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + dev: false + + /graphology-types@0.24.7: + resolution: {integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==} + dev: false + + /graphology-utils@2.5.2(graphology-types@0.24.7): + resolution: {integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==} + peerDependencies: + graphology-types: '>=0.23.0' + dependencies: + graphology-types: 0.24.7 + dev: false + + /graphology@0.25.4(graphology-types@0.24.7): + resolution: {integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==} + peerDependencies: + graphology-types: '>=0.24.0' + dependencies: + events: 3.3.0 + graphology-types: 0.24.7 + obliterator: 2.0.4 + dev: false + + /grouped-queue@2.0.0: + resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} + engines: {node: '>=8.0.0'} + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.1.0 + dev: false + + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@3.0.8: + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + dev: true + + /hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.2.0 + dev: true + + /hot-shots@8.5.0: + resolution: {integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==} + engines: {node: '>=6.0.0'} + optionalDependencies: + unix-dgram: 2.0.6 + dev: false + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http-call@5.3.0: + resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} + engines: {node: '>=8.0.0'} + dependencies: + content-type: 1.0.5 + debug: 4.3.4(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: false + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /hyperlinker@1.0.0: + resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} + engines: {node: '>=4'} + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ieee754@1.1.13: + resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore-walk@4.0.1: + resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} + engines: {node: '>=10'} + dependencies: + minimatch: 3.1.2 + dev: true + + /ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minimatch: 5.1.6 + dev: true + + /ignore-walk@6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore-walk@6.0.4: + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /init-package-json@5.0.0: + resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + promzard: 1.0.0 + read: 2.1.0 + read-package-json: 6.0.4 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: false + + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-scoped@2.1.0: + resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} + engines: {node: '>=8'} + dependencies: + scoped-regex: 2.1.0 + dev: true + + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@2.0.0: + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: true + + /isbinaryfile@5.0.0: + resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} + engines: {node: '>= 14.0.0'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isomorphic-git@1.23.0: + resolution: {integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==} + engines: {node: '>=12'} + hasBin: true + dependencies: + async-lock: 1.4.0 + clean-git-ref: 2.0.1 + crc-32: 1.2.2 + diff3: 0.0.3 + ignore: 5.2.4 + minimisted: 2.0.1 + pako: 1.0.11 + pify: 4.0.1 + readable-stream: 3.6.2 + sha.js: 2.4.11 + simple-get: 4.0.1 + dev: false + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.18.2 + '@babel/parser': 7.22.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + /jest-changed-files@29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.6.1: + resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.6.1 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + p-limit: 3.1.0 + pretty-format: 29.6.1 + pure-rand: 6.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /fstream@1.0.12: - resolution: - { - integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, - } - engines: { node: '>=0.6' } - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: false - - /function-bind@1.1.1: - resolution: - { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, - } - dev: true - - /gauge@3.0.2: - resolution: - { - integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, - } - engines: { node: '>=10' } - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gauge@4.0.4: - resolution: - { - integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: '>=6.9.0' } - dev: true - - /get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } - dev: true - - /get-intrinsic@1.2.1: - resolution: - { - integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, - } - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } - - /get-pkg-repo@4.2.1: - resolution: - { - integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, - } - engines: { node: '>=6.9.0' } - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - - /get-port@5.1.1: - resolution: - { - integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, - } - engines: { node: '>=8' } - dev: true - - /get-stdin@4.0.1: - resolution: - { - integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /get-stream@5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - } - engines: { node: '>=8' } - dependencies: - pump: 3.0.0 - - /get-stream@6.0.0: - resolution: - { - integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, - } - engines: { node: '>=10' } - dev: true - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: '>=10' } - dev: true - - /get-uri@6.0.1: - resolution: - { - integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==, - } - engines: { node: '>= 14' } - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /git-raw-commits@2.0.11: - resolution: - { - integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /git-raw-commits@3.0.0: - resolution: - { - integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /git-remote-origin-url@2.0.0: - resolution: - { - integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, - } - engines: { node: '>=4' } - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - dev: true - - /git-semver-tags@5.0.1: - resolution: - { - integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - meow: 8.1.2 - semver: 7.5.2 - dev: true - - /git-up@7.0.0: - resolution: - { - integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, - } - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: true - - /git-url-parse@13.1.0: - resolution: - { - integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==, - } - dependencies: - git-up: 7.0.0 - dev: true - - /gitconfiglocal@1.0.0: - resolution: - { - integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, - } - dependencies: - ini: 1.3.8 - dev: true - - /github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } - dev: false - - /github-slugger@1.5.0: - resolution: - { - integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, - } - dev: true - - /github-username@6.0.0: - resolution: - { - integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==, - } - engines: { node: '>=10' } - dependencies: - '@octokit/rest': 18.12.0 - transitivePeerDependencies: - - encoding - dev: true - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@10.3.3: - resolution: - { - integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==, - } - engines: { node: '>=16 || 14 >=14.17' } - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.2 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - - /glob@7.1.4: - resolution: - { - integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: '>=12' } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /glob@9.3.5: - resolution: - { - integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: true - - /global-dirs@0.1.1: - resolution: - { - integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, - } - engines: { node: '>=4' } - dependencies: - ini: 1.3.8 - dev: true - - /globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } - dev: true - - /globals@13.20.0: - resolution: - { - integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, - } - engines: { node: '>=8' } - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: '>=10' } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /got@11.8.6: - resolution: - { - integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, - } - engines: { node: '>=10.19.0' } - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - - /grapheme-splitter@1.0.4: - resolution: - { - integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, - } - dev: true - - /graphology-indices@0.17.0(graphology-types@0.24.7): - resolution: - { - integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==, - } - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - mnemonist: 0.39.5 - dev: false - - /graphology-traversal@0.3.1(graphology-types@0.24.7): - resolution: - { - integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==, - } - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-indices: 0.17.0(graphology-types@0.24.7) - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - dev: false - - /graphology-types@0.24.7: - resolution: - { - integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==, - } - dev: false - - /graphology-utils@2.5.2(graphology-types@0.24.7): - resolution: - { - integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==, - } - peerDependencies: - graphology-types: '>=0.23.0' - dependencies: - graphology-types: 0.24.7 - dev: false - - /graphology@0.25.4(graphology-types@0.24.7): - resolution: - { - integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==, - } - peerDependencies: - graphology-types: '>=0.24.0' - dependencies: - events: 3.3.0 - graphology-types: 0.24.7 - obliterator: 2.0.4 - dev: false - - /grouped-queue@2.0.0: - resolution: - { - integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==, - } - engines: { node: '>=8.0.0' } - dev: true - - /handlebars@4.7.7: - resolution: - { - integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, - } - engines: { node: '>=0.4.7' } - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - - /hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: '>=6' } - dev: true - - /has-ansi@2.0.0: - resolution: - { - integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: '>=4' } - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } - - /has-proto@1.0.1: - resolution: - { - integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, - } - engines: { node: '>= 0.4' } - dev: true - - /has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: '>= 0.4' } - dev: true - - /has-tostringtag@1.0.0: - resolution: - { - integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, - } - engines: { node: '>= 0.4' } - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-unicode@2.0.1: - resolution: - { - integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, - } - dev: true - - /has@1.0.3: - resolution: - { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, - } - engines: { node: '>= 0.4.0' } - dependencies: - function-bind: 1.1.1 - dev: true - - /header-case@2.0.4: - resolution: - { - integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==, - } - dependencies: - capital-case: 1.0.4 - tslib: 2.1.0 - dev: false - - /help-me@4.2.0: - resolution: - { - integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==, - } - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - dev: false - - /hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } - dev: true - - /hosted-git-info@3.0.8: - resolution: - { - integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, - } - engines: { node: '>=10' } - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: '>=10' } - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@6.1.1: - resolution: - { - integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - lru-cache: 7.18.3 - dev: true - - /hot-shots@8.5.0: - resolution: - { - integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==, - } - engines: { node: '>=6.0.0' } - optionalDependencies: - unix-dgram: 2.0.6 - dev: false - - /html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } - - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - - /http-call@5.3.0: - resolution: - { - integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==, - } - engines: { node: '>=8.0.0' } - dependencies: - content-type: 1.0.5 - debug: 4.3.4(supports-color@8.1.1) - is-retry-allowed: 1.2.0 - is-stream: 2.0.1 - parse-json: 4.0.0 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /http-parser-js@0.5.8: - resolution: - { - integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, - } - dev: false - - /http-proxy-agent@4.0.1: - resolution: - { - integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, - } - engines: { node: '>= 6' } - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@5.0.0: - resolution: - { - integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, - } - engines: { node: '>= 6' } - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /http2-wrapper@1.0.3: - resolution: - { - integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, - } - engines: { node: '>=10.19.0' } - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - /https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: '>= 6' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: '>=10.17.0' } - dev: true - - /humanize-ms@1.2.1: - resolution: - { - integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, - } - dependencies: - ms: 2.1.3 - dev: true - - /hyperlinker@1.0.0: - resolution: - { - integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==, - } - engines: { node: '>=4' } - - /iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: '>=0.10.0' } - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } - requiresBuild: true - dependencies: - safer-buffer: 2.1.2 - dev: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.9.2) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /ieee754@1.1.13: - resolution: - { - integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==, - } - dev: true - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - - /ignore-walk@4.0.1: - resolution: - { - integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==, - } - engines: { node: '>=10' } - dependencies: - minimatch: 3.1.2 - dev: true - - /ignore-walk@5.0.1: - resolution: - { - integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minimatch: 5.1.6 - dev: true - - /ignore-walk@6.0.3: - resolution: - { - integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minimatch: 9.0.3 - dev: true - - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: '>= 4' } - - /immediate@3.0.6: - resolution: - { - integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, - } - dev: false - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: '>=6' } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: '>=8' } - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } - dev: true - - /indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: '>=8' } - - /infer-owner@1.0.4: - resolution: - { - integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, - } - dev: true - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - - /init-package-json@5.0.0: - resolution: - { - integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-package-arg: 10.1.0 - promzard: 1.0.0 - read: 2.1.0 - read-package-json: 6.0.4 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - dev: true - - /inquirer-autocomplete-prompt@1.4.0(inquirer@7.3.3): - resolution: - { - integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==, - } - engines: { node: '>=10' } - peerDependencies: - inquirer: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - figures: 3.2.0 - inquirer: 7.3.3 - run-async: 2.4.1 - rxjs: 6.6.7 - dev: true - - /inquirer@7.3.3: - resolution: - { - integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, - } - engines: { node: '>=8.0.0' } - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - - /inquirer@8.2.5: - resolution: - { - integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, - } - engines: { node: '>=12.0.0' } - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /interpret@1.4.0: - resolution: - { - integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, - } - engines: { node: '>= 0.10' } - dev: true - - /ip@1.1.8: - resolution: - { - integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, - } - dev: false - - /ip@2.0.0: - resolution: - { - integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, - } - - /is-arguments@1.1.1: - resolution: - { - integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } - dev: true - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } - dev: true - - /is-ci@3.0.1: - resolution: - { - integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, - } - hasBin: true - dependencies: - ci-info: 3.8.0 - dev: true - - /is-core-module@2.12.1: - resolution: - { - integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==, - } - dependencies: - has: 1.0.3 - dev: true - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } - hasBin: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } - - /is-fullwidth-code-point@1.0.0: - resolution: - { - integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, - } - engines: { node: '>=0.10.0' } - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: - { - integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, - } - engines: { node: '>=4' } - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } - - /is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: '>=6' } - dev: true - - /is-generator-function@1.0.10: - resolution: - { - integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, - } - engines: { node: '>= 0.4' } - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-extglob: 2.1.1 - - /is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: '>=8' } - dev: true - - /is-lambda@1.0.1: - resolution: - { - integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, - } - dev: true - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } - - /is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: '>=8' } - dev: true - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-plain-obj@2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object@5.0.0: - resolution: - { - integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-retry-allowed@1.2.0: - resolution: - { - integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-scoped@2.1.0: - resolution: - { - integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==, - } - engines: { node: '>=8' } - dependencies: - scoped-regex: 2.1.0 - dev: true - - /is-ssh@1.4.0: - resolution: - { - integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==, - } - dependencies: - protocols: 2.0.1 - dev: true - - /is-stream@2.0.0: - resolution: - { - integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, - } - engines: { node: '>=8' } - dev: true - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: '>=8' } - dev: true - - /is-text-path@1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: '>=0.10.0' } - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typed-array@1.1.12: - resolution: - { - integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, - } - engines: { node: '>= 0.4' } - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: '>=10' } - dev: true - - /is-utf8@0.2.1: - resolution: - { - integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, - } - dev: true - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } - dependencies: - is-docker: 2.2.1 - - /isarray@0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } - dev: true - - /isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - - /isbinaryfile@4.0.10: - resolution: - { - integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, - } - engines: { node: '>= 8.0.0' } - dev: true - - /isbinaryfile@5.0.0: - resolution: - { - integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==, - } - engines: { node: '>= 14.0.0' } - dev: true - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /isomorphic-git@1.23.0: - resolution: - { - integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==, - } - engines: { node: '>=12' } - hasBin: true - dependencies: - async-lock: 1.4.0 - clean-git-ref: 2.0.1 - crc-32: 1.2.2 - diff3: 0.0.3 - ignore: 5.2.4 - minimisted: 2.0.1 - pako: 1.0.11 - pify: 4.0.1 - readable-stream: 3.6.2 - sha.js: 2.4.11 - simple-get: 4.0.1 - dev: false - - /istanbul-lib-coverage@3.2.0: - resolution: - { - integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, - } - engines: { node: '>=8' } - - /istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: '>=8' } - dependencies: - '@babel/core': 7.18.2 - '@babel/parser': 7.22.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: '>=10' } - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - - /istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - } - engines: { node: '>=10' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: - { - integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==, - } - engines: { node: '>=8' } - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - /jackspeak@2.2.2: - resolution: - { - integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==, - } - engines: { node: '>=14' } - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jake@10.8.7: - resolution: - { - integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - /jest-changed-files@29.5.0: - resolution: - { - integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.6.1: - resolution: - { - integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.6.1 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - p-limit: 3.1.0 - pretty-format: 29.6.1 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 10.0.0 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 20.4.4 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.6.1: - resolution: - { - integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-docblock@29.4.3: - resolution: - { - integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.6.1: - resolution: - { - integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /jest-environment-node@29.6.1: - resolution: - { - integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /jest-get-type@29.4.3: - resolution: - { - integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /jest-haste-map@29.6.1: - resolution: - { - integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 14.14.7 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - jest-worker: 29.6.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.1: - resolution: - { - integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-matcher-utils@29.6.1: - resolution: - { - integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.6.1: - resolution: - { - integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.6.1: - resolution: - { - integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-util: 29.6.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - } - engines: { node: '>=6' } - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.6.1 - dev: true - - /jest-regex-util@29.4.3: - resolution: - { - integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - /jest-resolve-dependencies@29.6.1: - resolution: - { - integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.6.1: - resolution: - { - integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.6.1: - resolution: - { - integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/console': 29.6.1 - '@jest/environment': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.1 - jest-haste-map: 29.6.1 - jest-leak-detector: 29.6.1 - jest-message-util: 29.6.1 - jest-resolve: 29.6.1 - jest-runtime: 29.6.1 - jest-util: 29.6.1 - jest-watcher: 29.6.1 - jest-worker: 29.6.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.6.1: - resolution: - { - integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/globals': 29.6.1 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.6.1: - resolution: - { - integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@babel/core': 7.18.2 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - chalk: 4.1.2 - expect: 29.6.1 - graceful-fs: 4.2.11 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - natural-compare: 1.4.0 - pretty-format: 29.6.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.6.1: - resolution: - { - integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.6.1: - resolution: - { - integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.1 - dev: true - - /jest-watcher@29.6.1: - resolution: - { - integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.6.1 - string-length: 4.0.2 - dev: true - - /jest-worker@27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: '>= 10.13.0' } - dependencies: - '@types/node': 14.14.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest-worker@29.6.1: - resolution: - { - integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@types/node': 14.14.7 - jest-util: 29.6.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.6.1(@types/node@10.0.0)(ts-node@9.1.1): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: - { - integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jmespath@0.16.0: - resolution: - { - integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==, - } - engines: { node: '>= 0.6.0' } - dev: true - - /joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: '>=10' } - dev: false - - /js-sdsl@4.4.2: - resolution: - { - integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==, - } - dev: true - - /js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - dev: true - - /js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /js2xmlparser@4.0.2: - resolution: - { - integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, - } - dependencies: - xmlcreate: 2.0.4 - dev: false - - /jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /jsforce@2.0.0-beta.27: - resolution: - { - integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==, - } - engines: { node: '>=8.0' } - hasBin: true - dependencies: - '@babel/runtime': 7.22.6 - '@babel/runtime-corejs3': 7.22.6 - '@types/node': 12.20.55 - abort-controller: 3.0.0 - base64url: 3.0.1 - commander: 4.1.1 - core-js: 3.31.1 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - faye: 1.4.0 - form-data: 4.0.0 - fs-extra: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 7.3.3 - multistream: 3.1.0 - node-fetch: 2.6.12 - open: 7.4.2 - regenerator-runtime: 0.13.11 - strip-ansi: 6.0.1 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /json-bigint@1.0.0: - resolution: - { - integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, - } - dependencies: - bignumber.js: 9.1.1 - dev: false - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - dev: true - - /json-parse-even-better-errors@3.0.0: - resolution: - { - integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - dev: true - - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - dev: true - - /json-stable-stringify@1.0.2: - resolution: - { - integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==, - } - dependencies: - jsonify: 0.0.1 - dev: true - - /json-stringify-nice@1.1.4: - resolution: - { - integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, - } - dev: true - - /json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } - dev: true - - /json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - dev: true - - /jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - } - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonify@0.0.1: - resolution: - { - integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==, - } - dev: true - - /jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { '0': node >= 0.2.0 } - dev: true - - /jsonwebtoken@9.0.2: - resolution: - { - integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, - } - engines: { node: '>=12', npm: '>=6' } - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.5.4 - dev: false - - /jszip@3.10.1: - resolution: - { - integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, - } - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /just-diff-apply@5.5.0: - resolution: - { - integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, - } - dev: true - - /just-diff@3.1.1: - resolution: - { - integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==, - } - dev: true - - /just-diff@5.2.0: - resolution: - { - integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==, - } - dev: true - - /just-extend@4.2.1: - resolution: - { - integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, - } - dev: true - - /jwa@1.4.1: - resolution: - { - integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, - } - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: - { - integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, - } - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - - /keyv@4.5.3: - resolution: - { - integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, - } - dependencies: - json-buffer: 3.0.1 - - /kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } - dev: true - - /lerna-update-wizard@1.1.0: - resolution: - { - integrity: sha512-V6VtJFbt4BS1HKsNDsyBMeAU86CYRoQSikZsJyEMVc2x/yqH/hX+Z79fI0J3gSiWFkkIKrLj/vPUf6Zvn/79jw==, - } - engines: { node: '>=12' } - hasBin: true - dependencies: - chalk: 4.1.2 - cli-cursor: 2.1.0 - execution-time: 1.4.1 - fs-extra: 7.0.1 - globby: 11.1.0 - inquirer: 7.3.3 - inquirer-autocomplete-prompt: 1.4.0(inquirer@7.3.3) - lodash: 4.17.21 - meow: 9.0.0 - minimist: 1.2.8 - semver-compare: 1.0.0 - dev: true - - /lerna@7.1.4: - resolution: - { - integrity: sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw==, - } - engines: { node: ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - '@lerna/child-process': 7.1.4 - '@lerna/create': 7.1.4 - '@npmcli/run-script': 6.0.2 - '@nx/devkit': 16.5.5(nx@16.5.5) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.1 - columnify: 1.6.0 - conventional-changelog-angular: 6.0.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 8.2.0 - dedent: 0.7.0 - envinfo: 7.8.1 - execa: 5.0.0 - fs-extra: 11.1.1 - get-port: 5.1.1 - get-stream: 6.0.0 - git-url-parse: 13.1.0 - glob-parent: 5.1.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - import-local: 3.1.0 - ini: 1.3.8 - init-package-json: 5.0.0 - inquirer: 8.2.5 - is-ci: 3.0.1 - is-stream: 2.0.0 - jest-diff: 29.6.1 - js-yaml: 4.1.0 - libnpmaccess: 7.0.2 - libnpmpublish: 7.3.0 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 3.1.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7 - npm-package-arg: 8.1.1 - npm-packlist: 5.1.1 - npm-registry-fetch: 14.0.5 - npmlog: 6.0.2 - nx: 16.5.5 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-pipe: 3.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - p-waterfall: 2.1.1 - pacote: 15.2.0 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - read-package-json: 6.0.4 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.5.2 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 9.0.1 - strong-log-transformer: 2.1.0 - tar: 6.1.11 - temp-dir: 1.0.0 - typescript: 5.0.2 - upath: 2.0.1 - uuid: 9.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - bluebird - - debug - - encoding - - supports-color - dev: true - - /leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } - dev: true - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /libnpmaccess@7.0.2: - resolution: - { - integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - transitivePeerDependencies: - - supports-color - dev: true - - /libnpmpublish@7.3.0: - resolution: - { - integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - ci-info: 3.8.0 - normalize-package-data: 5.0.0 - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - semver: 7.5.2 - sigstore: 1.8.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /lie@3.3.0: - resolution: - { - integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, - } - dependencies: - immediate: 3.0.6 - dev: false - - /lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - dev: true - - /lines-and-columns@2.0.3: - resolution: - { - integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - /listenercount@1.0.1: - resolution: - { - integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, - } - dev: false - - /load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: '>=4' } - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /load-json-file@6.2.0: - resolution: - { - integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, - } - engines: { node: '>=8' } - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - dev: true - - /load-yaml-file@0.2.0: - resolution: - { - integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, - } - engines: { node: '>=6' } - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /loader-runner@4.3.0: - resolution: - { - integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, - } - engines: { node: '>=6.11.5' } - dev: true - - /locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: '>=4' } - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash._reinterpolate@3.0.0: - resolution: - { - integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==, - } - - /lodash.get@4.4.2: - resolution: - { - integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, - } - dev: true - - /lodash.includes@4.3.0: - resolution: - { - integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, - } - dev: false - - /lodash.isboolean@3.0.3: - resolution: - { - integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, - } - dev: false - - /lodash.isinteger@4.0.4: - resolution: - { - integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, - } - dev: false - - /lodash.ismatch@4.4.0: - resolution: - { - integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, - } - dev: true - - /lodash.isnumber@3.0.3: - resolution: - { - integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, - } - dev: false - - /lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } - dev: false - - /lodash.isstring@4.0.1: - resolution: - { - integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, - } - dev: false - - /lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } - dev: true - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - dev: true - - /lodash.once@4.1.1: - resolution: - { - integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, - } - dev: false - - /lodash.pickby@4.6.0: - resolution: - { - integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, - } - dev: false - - /lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } - dev: false - - /lodash.template@4.5.0: - resolution: - { - integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==, - } - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - /lodash.templatesettings@4.2.0: - resolution: - { - integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==, - } - dependencies: - lodash._reinterpolate: 3.0.0 - - /lodash.uniqby@4.7.0: - resolution: - { - integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, - } - dev: false - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - - /log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: '>=10' } - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /lolex@2.7.5: - resolution: - { - integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==, - } - dev: true - - /lolex@5.1.2: - resolution: - { - integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==, - } - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /lower-case@2.0.2: - resolution: - { - integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /lowercase-keys@2.0.0: - resolution: - { - integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, - } - engines: { node: '>=8' } - - /lru-cache@10.0.0: - resolution: - { - integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==, - } - engines: { node: 14 || >=16.14 } - - /lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: '>=10' } - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: '>=12' } - - /make-dir@2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: '>=6' } - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - - /make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: '>=8' } - dependencies: - semver: 6.3.1 - dev: true - - /make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.4 - - /make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } - - /make-fetch-happen@10.2.1: - resolution: - { - integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - agentkeepalive: 4.3.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /make-fetch-happen@11.1.1: - resolution: - { - integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /make-fetch-happen@9.1.0: - resolution: - { - integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==, - } - engines: { node: '>= 10' } - dependencies: - agentkeepalive: 4.3.0 - cacache: 15.3.0 - http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } - dependencies: - tmpl: 1.0.5 - dev: true - - /map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: '>=8' } - dev: true - - /markdown-table-ts@1.0.3: - resolution: - { - integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==, - } - dev: false - - /markdown-table@2.0.0: - resolution: - { - integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==, - } - dependencies: - repeat-string: 1.6.1 - dev: false - - /marked-terminal@5.1.1(marked@4.0.16): - resolution: - { - integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, - } - engines: { node: '>=14.13.1 || >=16.0.0' } - peerDependencies: - marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - ansi-escapes: 5.0.0 - cardinal: 2.1.1 - chalk: 5.3.0 - cli-table3: 0.6.3 - marked: 4.0.16 - node-emoji: 1.11.0 - supports-hyperlinks: 2.3.0 - dev: false - - /marked@4.0.16: - resolution: - { - integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==, - } - engines: { node: '>= 12' } - hasBin: true - dev: false - - /mem-fs-editor@9.7.0(mem-fs@2.3.0): - resolution: - { - integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==, - } - engines: { node: '>=12.10.0' } - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true - dependencies: - binaryextensions: 4.18.0 - commondir: 1.0.1 - deep-extend: 0.6.0 - ejs: 3.1.9 - globby: 11.1.0 - isbinaryfile: 5.0.0 - mem-fs: 2.3.0 - minimatch: 7.4.6 - multimatch: 5.0.0 - normalize-path: 3.0.0 - textextensions: 5.16.0 - dev: true - - /mem-fs@2.3.0: - resolution: - { - integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==, - } - engines: { node: '>=12' } - dependencies: - '@types/node': 15.14.9 - '@types/vinyl': 2.0.7 - vinyl: 2.2.1 - vinyl-file: 3.0.0 - dev: true - - /meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /meow@9.0.0: - resolution: - { - integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: true - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: '>=8.6' } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } - dependencies: - mime-db: 1.52.0 - - /mime@2.6.0: - resolution: - { - integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, - } - engines: { node: '>=4.0.0' } - hasBin: true - dev: false - - /mimic-fn@1.2.0: - resolution: - { - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, - } - engines: { node: '>=4' } - dev: true - - /mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: '>=6' } - - /mimic-response@1.0.1: - resolution: - { - integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, - } - engines: { node: '>=4' } - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } - - /min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: '>=4' } - dev: true - - /minimatch@3.0.5: - resolution: - { - integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, - } - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: '>=10' } - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: '>=10' } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@8.0.4: - resolution: - { - integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - brace-expansion: 2.0.1 - - /minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: '>= 6' } - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - /minimisted@2.0.1: - resolution: - { - integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==, - } - dependencies: - minimist: 1.2.8 - dev: false - - /minipass-collect@1.0.2: - resolution: - { - integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-fetch@1.4.1: - resolution: - { - integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@2.1.2: - resolution: - { - integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@3.0.3: - resolution: - { - integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: - { - integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-json-stream@1.0.1: - resolution: - { - integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==, - } - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - dev: true - - /minipass-pipeline@1.2.4: - resolution: - { - integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-sized@1.0.3: - resolution: - { - integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, - } - engines: { node: '>=8' } - dependencies: - minipass: 3.3.6 - dev: true - - /minipass@3.3.6: - resolution: - { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, - } - engines: { node: '>=8' } - dependencies: - yallist: 4.0.0 - - /minipass@4.2.8: - resolution: - { - integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, - } - engines: { node: '>=8' } - dev: true - - /minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: '>=8' } - - /minipass@7.0.2: - resolution: - { - integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==, - } - engines: { node: '>=16 || 14 >=14.17' } - - /minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /mkdirp-infer-owner@2.0.0: - resolution: - { - integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==, - } - engines: { node: '>=10' } - dependencies: - chownr: 2.0.0 - infer-owner: 1.0.4 - mkdirp: 1.0.4 - dev: true - - /mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } - hasBin: true - - /mnemonist@0.39.5: - resolution: - { - integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==, - } - dependencies: - obliterator: 2.0.4 - dev: false - - /mock-stdin@1.0.0: - resolution: - { - integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==, - } - dev: true - - /modify-values@1.0.1: - resolution: - { - integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - - /multimatch@5.0.0: - resolution: - { - integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /multistream@3.1.0: - resolution: - { - integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==, - } - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } - - /mute-stream@1.0.0: - resolution: - { - integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /mylas@2.1.13: - resolution: - { - integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==, - } - engines: { node: '>=12.0.0' } - dev: true - - /nan@2.17.0: - resolution: - { - integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, - } - requiresBuild: true - dev: false + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - /napi-build-utils@1.0.2: - resolution: - { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, - } - dev: false - - /natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } - dev: true - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - dev: true - - /natural-orderby@2.0.3: - resolution: - { - integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==, - } - - /negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: '>= 0.6' } - dev: true - - /neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - - /netmask@2.0.2: - resolution: - { - integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, - } - engines: { node: '>= 0.4.0' } - dev: false - - /neverthrow@4.2.1: - resolution: - { - integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==, - } - dev: false - - /neverthrow@4.4.2: - resolution: - { - integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==, - } - dev: false - - /nice-try@1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } - - /nise@1.5.3: - resolution: - { - integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==, - } - dependencies: - '@sinonjs/formatio': 3.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - lolex: 5.1.2 - path-to-regexp: 1.8.0 - dev: true - - /nise@5.1.4: - resolution: - { - integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==, - } - dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - dev: true - - /no-case@3.0.4: - resolution: - { - integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, - } - dependencies: - lower-case: 2.0.2 - tslib: 2.1.0 - dev: false - - /nock@13.3.2: - resolution: - { - integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==, - } - engines: { node: '>= 10.13' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /node-abi@3.45.0: - resolution: - { - integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.2 - dev: false - - /node-addon-api@3.2.1: - resolution: - { - integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==, - } - dev: true - - /node-cache@5.1.2: - resolution: - { - integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==, - } - engines: { node: '>= 8.0.0' } - dependencies: - clone: 2.1.2 - dev: false - - /node-dir@0.1.17: - resolution: - { - integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==, - } - engines: { node: '>= 0.10.5' } - dependencies: - minimatch: 3.1.2 - dev: false - - /node-emoji@1.11.0: - resolution: - { - integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, - } - dependencies: - lodash: 4.17.21 - dev: false - - /node-fetch@2.6.12: - resolution: - { - integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - - /node-fetch@2.6.7: - resolution: - { - integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-gyp-build@4.6.0: - resolution: - { - integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==, - } - hasBin: true - dev: true - - /node-gyp@8.4.1: - resolution: - { - integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==, - } - engines: { node: '>= 10.12.0' } - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /node-gyp@9.4.0: - resolution: - { - integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==, - } - engines: { node: ^12.13 || ^14.13 || >=16 } - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 11.1.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } - dev: true - - /node-releases@2.0.13: - resolution: - { - integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, - } - dev: true - - /nopt@5.0.0: - resolution: - { - integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, - } - engines: { node: '>=6' } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@6.0.0: - resolution: - { - integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@5.0.0: - resolution: - { - integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /normalize-url@6.1.0: - resolution: - { - integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, - } - engines: { node: '>=10' } - - /npm-bundled@1.1.2: - resolution: - { - integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==, - } - dependencies: - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-bundled@3.0.0: - resolution: - { - integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-normalize-package-bin: 3.0.1 - dev: true - - /npm-install-checks@4.0.0: - resolution: - { - integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==, - } - engines: { node: '>=10' } - dependencies: - semver: 7.5.2 - dev: true - - /npm-install-checks@6.1.1: - resolution: - { - integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - semver: 7.5.2 - dev: true - - /npm-normalize-package-bin@1.0.1: - resolution: - { - integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==, - } - dev: true - - /npm-normalize-package-bin@2.0.0: - resolution: - { - integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: - { - integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /npm-package-arg@10.1.0: - resolution: - { - integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.2 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-package-arg@8.1.1: - resolution: - { - integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 3.0.8 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-package-arg@8.1.5: - resolution: - { - integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==, - } - engines: { node: '>=10' } - dependencies: - hosted-git-info: 4.1.0 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-packlist@3.0.0: - resolution: - { - integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - glob: 7.2.3 - ignore-walk: 4.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@5.1.1: - resolution: - { - integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - glob: 8.1.0 - ignore-walk: 5.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@7.0.4: - resolution: - { - integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - ignore-walk: 6.0.3 - dev: true - - /npm-pick-manifest@6.1.1: - resolution: - { - integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==, - } - dependencies: - npm-install-checks: 4.0.0 - npm-normalize-package-bin: 1.0.1 - npm-package-arg: 8.1.5 - semver: 7.5.2 - dev: true - - /npm-pick-manifest@8.0.1: - resolution: - { - integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.5.2 - dev: true - - /npm-registry-fetch@12.0.2: - resolution: - { - integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - dependencies: - make-fetch-happen: 10.2.1 - minipass: 3.3.6 - minipass-fetch: 1.4.1 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 8.1.5 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /npm-registry-fetch@14.0.5: - resolution: - { - integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: '>=8' } - dependencies: - path-key: 3.1.1 - dev: true - - /npmlog@5.0.1: - resolution: - { - integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, - } - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - - /npmlog@6.0.2: - resolution: - { - integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /number-is-nan@1.0.1: - resolution: - { - integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /nx@16.5.5: - resolution: - { - integrity: sha512-DHwoUtkirI52JIlCtRK78UI/Ik/VgCtM6FlkfPnFsy8PVyTYMQ40KoG6aZLHjqj5qxoGG2CUjcsbFjGXYrjDbw==, - } - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.4.2 - '@swc/core': ^1.2.173 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true - dependencies: - '@nrwl/tao': 16.5.5 - '@parcel/watcher': 2.0.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 - axios: 1.4.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 7.0.4 - dotenv: 10.0.0 - enquirer: 2.3.6 - fast-glob: 3.2.7 - figures: 3.2.0 - flat: 5.0.2 - fs-extra: 11.1.1 - glob: 7.1.4 - ignore: 5.2.4 - js-yaml: 4.1.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 3.0.5 - npm-run-path: 4.0.1 - open: 8.4.2 - semver: 7.5.3 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - v8-compile-cache: 2.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 16.5.5 - '@nx/nx-darwin-x64': 16.5.5 - '@nx/nx-freebsd-x64': 16.5.5 - '@nx/nx-linux-arm-gnueabihf': 16.5.5 - '@nx/nx-linux-arm64-gnu': 16.5.5 - '@nx/nx-linux-arm64-musl': 16.5.5 - '@nx/nx-linux-x64-gnu': 16.5.5 - '@nx/nx-linux-x64-musl': 16.5.5 - '@nx/nx-win32-arm64-msvc': 16.5.5 - '@nx/nx-win32-x64-msvc': 16.5.5 - transitivePeerDependencies: - - debug - dev: true - - /object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /object-hash@2.1.1: - resolution: - { - integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==, - } - engines: { node: '>= 6' } - dev: false - - /object-treeify@1.1.33: - resolution: - { - integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==, - } - engines: { node: '>= 10' } - - /obliterator@2.0.4: - resolution: - { - integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, - } - dev: false - - /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==, - } - engines: { node: '>=12.0.0' } - hasBin: true - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) - aws-sdk: 2.1421.0 - concurrently: 7.6.0 - debug: 4.3.4(supports-color@8.1.1) - find-yarn-workspace-root: 2.0.0 - fs-extra: 8.1.0 - github-slugger: 1.5.0 - got: 11.8.6 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - semver: 7.5.2 - shelljs: 0.8.5 - tslib: 2.6.2 - yeoman-environment: 3.19.3 - yeoman-generator: 5.9.0(yeoman-environment@3.19.3) - yosay: 2.0.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bluebird - - encoding - - mem-fs - - supports-color - - typescript - dev: true - - /on-exit-leak-free@2.1.0: - resolution: - { - integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==, - } - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@2.0.1: - resolution: - { - integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, - } - engines: { node: '>=4' } - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: '>=6' } - dependencies: - mimic-fn: 2.1.0 - - /open@7.4.2: - resolution: - { - integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, - } - engines: { node: '>=8' } - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false - - /open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: '>=12' } - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: '>= 0.8.0' } - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: '>=10' } - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: '>=0.10.0' } - - /p-cancelable@2.1.1: - resolution: - { - integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, - } - engines: { node: '>=8' } - - /p-finally@1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: '>=4' } - dev: true - - /p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: '>=4' } - dependencies: - p-try: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: '>=4' } - dependencies: - p-limit: 1.3.0 - dev: true - - /p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map-series@2.1.0: - resolution: - { - integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, - } - engines: { node: '>=8' } - dev: true - - /p-map@4.0.0: - resolution: - { - integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, - } - engines: { node: '>=10' } - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-pipe@3.1.0: - resolution: - { - integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, - } - engines: { node: '>=8' } - dev: true - - /p-queue@6.6.2: - resolution: - { - integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, - } - engines: { node: '>=8' } - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: true - - /p-reduce@2.1.0: - resolution: - { - integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, - } - engines: { node: '>=8' } - dev: true - - /p-timeout@3.2.0: - resolution: - { - integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, - } - engines: { node: '>=8' } - dependencies: - p-finally: 1.0.0 - dev: true - - /p-transform@1.3.0: - resolution: - { - integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==, - } - engines: { node: '>=12.10.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - p-queue: 6.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: '>=4' } - dev: true - - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } - dev: true - - /p-waterfall@2.1.1: - resolution: - { - integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, - } - engines: { node: '>=8' } - dependencies: - p-reduce: 2.1.0 - dev: true - - /pac-proxy-agent@7.0.1: - resolution: - { - integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, - } - engines: { node: '>= 14' } - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /pac-resolver@7.0.0: - resolution: - { - integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, - } - engines: { node: '>= 14' } - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - dev: false - - /pacote@12.0.3: - resolution: - { - integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16 } - hasBin: true - dependencies: - '@npmcli/git': 2.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/promise-spawn': 1.3.2 - '@npmcli/run-script': 2.0.0 - cacache: 15.3.0 - chownr: 2.0.0 - fs-minipass: 2.1.0 - infer-owner: 1.0.4 - minipass: 3.3.6 - mkdirp: 1.0.4 - npm-package-arg: 8.1.5 - npm-packlist: 3.0.0 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - promise-retry: 2.0.1 - read-package-json-fast: 2.0.3 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pacote@15.2.0: - resolution: - { - integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.8.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pad-component@0.0.1: - resolution: - { - integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==, - } - dev: true - - /pako@1.0.11: - resolution: - { - integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, - } - dev: false - - /param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } - dependencies: - callsites: 3.1.0 - dev: true - - /parse-conflict-json@2.0.2: - resolution: - { - integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - json-parse-even-better-errors: 2.3.1 - just-diff: 5.2.0 - just-diff-apply: 5.5.0 - dev: true - - /parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-path@7.0.0: - resolution: - { - integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, - } - dependencies: - protocols: 2.0.1 - dev: true - - /parse-url@8.1.0: - resolution: - { - integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, - } - dependencies: - parse-path: 7.0.0 - dev: true - - /pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /password-prompt@1.1.2: - resolution: - { - integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==, - } - dependencies: - ansi-escapes: 3.2.0 - cross-spawn: 6.0.5 - - /path-case@3.0.4: - resolution: - { - integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } - dev: true - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } - dev: true - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } - - /path-key@2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: '>=4' } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /path-scurry@1.10.1: - resolution: - { - integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, - } - engines: { node: '>=16 || 14 >=14.17' } - dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 - - /path-to-regexp@1.8.0: - resolution: - { - integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, - } - dependencies: - isarray: 0.0.1 - dev: true - - /path-type@3.0.0: - resolution: - { - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, - } - engines: { node: '>=4' } - dependencies: - pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: true - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } - - /pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } - dev: true - - /pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: '>=4' } - dev: true - - /pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } - - /pify@5.0.0: - resolution: - { - integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, - } - engines: { node: '>=10' } - dev: true - - /pino-abstract-transport@1.1.0: - resolution: - { - integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==, - } - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - dev: false - - /pino-pretty@10.2.3: - resolution: - { - integrity: sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==, - } - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.4.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.7.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: - { - integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==, - } - dev: false - - /pino@8.16.0: - resolution: - { - integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==, - } - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 2.2.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.7.0 - thread-stream: 2.4.0 - dev: false - - /pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: '>= 6' } - dev: true - - /pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: '>=8' } - dependencies: - find-up: 4.1.0 - dev: true - - /plimit-lit@1.5.0: - resolution: - { - integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==, - } - dependencies: - queue-lit: 1.5.0 - dev: true - - /prebuild-install@7.1.1: - resolution: - { - integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.45.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /preferred-pm@3.0.3: - resolution: - { - integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, - } - engines: { node: '>=10' } - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /prettier@2.0.5: - resolution: - { - integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==, - } - engines: { node: '>=10.13.0' } - hasBin: true - dev: true - - /pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: '>=6' } - dev: true - - /pretty-format@29.6.1: - resolution: - { - integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-hrtime@1.0.3: - resolution: - { - integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, - } - engines: { node: '>= 0.8' } - dev: true - - /proc-log@1.0.0: - resolution: - { - integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==, - } - dev: true - - /proc-log@3.0.0: - resolution: - { - integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - - /process-warning@2.2.0: - resolution: - { - integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==, - } - dev: false - - /process@0.11.10: - resolution: - { - integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, - } - engines: { node: '>= 0.6.0' } - - /promise-all-reject-late@1.0.1: - resolution: - { - integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, - } - dev: true - - /promise-call-limit@1.0.2: - resolution: - { - integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==, - } - dev: true - - /promise-inflight@1.0.1: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true - - /promise-retry@2.0.1: - resolution: - { - integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, - } - engines: { node: '>=10' } - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - - /prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /promzard@1.0.0: - resolution: - { - integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - read: 2.1.0 - dev: true - - /propagate@2.0.1: - resolution: - { - integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==, - } - engines: { node: '>= 8' } - dev: true - - /proper-lockfile@4.1.2: - resolution: - { - integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, - } - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - dev: false - - /protocols@2.0.1: - resolution: - { - integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, - } - dev: true - - /proxy-agent@6.3.1: - resolution: - { - integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - - /psl@1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - } - dev: false - - /pump@3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - } - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@1.3.2: - resolution: - { - integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, - } - dev: true - - /punycode@2.3.0: - resolution: - { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, - } - engines: { node: '>=6' } - - /pure-rand@6.0.2: - resolution: - { - integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==, - } - dev: true - - /q@1.5.1: - resolution: - { - integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, - } - engines: { node: '>=0.6.0', teleport: '>=0.2.0' } - dev: true - - /querystring@0.2.0: - resolution: - { - integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, - } - engines: { node: '>=0.4.x' } - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - dev: false - - /queue-lit@1.5.0: - resolution: - { - integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==, - } - dev: true - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /quick-format-unescaped@4.0.4: - resolution: - { - integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, - } - dev: false - - /quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: '>=8' } - dev: true - - /quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - } - engines: { node: '>=10' } - - /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /react-is@18.2.0: - resolution: - { - integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, - } - dev: true - - /read-cmd-shim@3.0.1: - resolution: - { - integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dev: true - - /read-cmd-shim@4.0.0: - resolution: - { - integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - /read-package-json-fast@2.0.3: - resolution: - { - integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==, - } - engines: { node: '>=10' } - dependencies: - json-parse-even-better-errors: 2.3.1 - npm-normalize-package-bin: 1.0.1 - dev: true - - /read-package-json-fast@3.0.2: - resolution: - { - integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@6.0.4: - resolution: - { - integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - glob: 10.3.3 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-pkg-up@3.0.0: - resolution: - { - integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, - } - engines: { node: '>=4' } - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - - /read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: '>=8' } - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@3.0.0: - resolution: - { - integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, - } - engines: { node: '>=4' } - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: '>=8' } - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read@2.1.0: - resolution: - { - integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - mute-stream: 1.0.0 - dev: true - - /readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readable-stream@4.4.2: - resolution: - { - integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - /readdir-scoped-modules@1.1.0: - resolution: - { - integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==, - } - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - debuglog: 1.0.1 - dezalgo: 1.0.4 - graceful-fs: 4.2.11 - once: 1.4.0 - dev: true - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } - dependencies: - picomatch: 2.3.1 - dev: true - - /real-require@0.2.0: - resolution: - { - integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, - } - engines: { node: '>= 12.13.0' } - dev: false - - /rechoir@0.6.2: - resolution: - { - integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, - } - engines: { node: '>= 0.10' } - dependencies: - resolve: 1.22.2 - dev: true - - /redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: '>=8' } - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /redeyed@2.1.1: - resolution: - { - integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, - } - dependencies: - esprima: 4.0.1 - - /regenerator-runtime@0.13.11: - resolution: - { - integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, - } - - /regexpp@3.2.0: - resolution: - { - integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, - } - engines: { node: '>=8' } - dev: true - - /remove-trailing-separator@1.1.0: - resolution: - { - integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, - } - dev: true - - /repeat-string@1.6.1: - resolution: - { - integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, - } - engines: { node: '>=0.10' } - dev: false - - /replace-ext@1.0.1: - resolution: - { - integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, - } - engines: { node: '>= 0.10' } - dev: true - - /require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: '>=0.10.0' } - dev: false - - /requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } - dev: false - - /resolve-alpn@1.2.1: - resolution: - { - integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, - } - - /resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: '>=8' } - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } - dev: true - - /resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: '>=8' } - dev: true - - /resolve-global@1.0.0: - resolution: - { - integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, - } - engines: { node: '>=8' } - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve.exports@2.0.2: - resolution: - { - integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, - } - engines: { node: '>=10' } - dev: true - - /resolve@1.22.2: - resolution: - { - integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==, - } - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: - { - integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, - } - dependencies: - lowercase-keys: 2.0.0 - - /restore-cursor@2.0.0: - resolution: - { - integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, - } - engines: { node: '>=4' } - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: '>=8' } - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /retry@0.12.0: - resolution: - { - integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, - } - engines: { node: '>= 4' } - - /retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: '>= 4' } - dev: false - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } - - /rimraf@2.7.1: - resolution: - { - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, - } - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /rimraf@4.4.1: - resolution: - { - integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - glob: 9.3.5 - dev: true - - /rimraf@5.0.1: - resolution: - { - integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==, - } - engines: { node: '>=14' } - hasBin: true - dependencies: - glob: 10.3.3 - dev: false - - /run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: '>=0.12.0' } - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /rxjs@6.6.7: - resolution: - { - integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, - } - engines: { npm: '>=2.0.0' } - dependencies: - tslib: 1.14.1 - - /rxjs@7.8.1: - resolution: - { - integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, - } - dependencies: - tslib: 2.1.0 - dev: true - - /safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - /safe-stable-stringify@2.4.3: - resolution: - { - integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, - } - engines: { node: '>=10' } - dev: false - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - - /samsam@1.3.0: - resolution: - { - integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==, - } - deprecated: This package has been deprecated in favour of @sinonjs/samsam - dev: true - - /sax@1.2.1: - resolution: - { - integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==, - } - dev: true - - /sax@1.2.4: - resolution: - { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, - } - - /schema-utils@3.3.0: - resolution: - { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, - } - engines: { node: '>= 10.13.0' } - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /scoped-regex@2.1.0: - resolution: - { - integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==, - } - engines: { node: '>=8' } - dev: true - - /secure-json-parse@2.7.0: - resolution: - { - integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, - } - dev: false - - /semver-compare@1.0.0: - resolution: - { - integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==, - } - dev: true - - /semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } - hasBin: true - - /semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - dev: true - - /semver@7.3.5: - resolution: - { - integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.2: - resolution: - { - integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /semver@7.5.3: - resolution: - { - integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /sentence-case@3.0.4: - resolution: - { - integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /sequin@0.1.1: - resolution: - { - integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==, - } - engines: { node: '>=0.4.0' } - dev: false - - /serialize-javascript@6.0.1: - resolution: - { - integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==, - } - dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } - dev: true - - /setimmediate@1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - } - dev: false - - /sha.js@2.4.11: - resolution: - { - integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, - } - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command@1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: '>=0.10.0' } - dependencies: - shebang-regex: 1.0.0 - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: '>=0.10.0' } - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } - - /shell-quote@1.8.1: - resolution: - { - integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, - } - dev: true - - /shelljs@0.8.5: - resolution: - { - integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - - /signal-exit@4.0.2: - resolution: - { - integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==, - } - engines: { node: '>=14' } - - /sigstore@1.8.0: - resolution: - { - integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - '@sigstore/bundle': 1.0.0 - '@sigstore/protobuf-specs': 0.2.0 - '@sigstore/tuf': 1.0.3 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - - /simple-git@3.16.0: - resolution: - { - integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==, - } - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /simple-git@3.19.1: - resolution: - { - integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==, - } - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /sinon@11.1.2: - resolution: - { - integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==, - } - deprecated: 16.1.1 - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/samsam': 6.1.3 - diff: 5.1.0 - nise: 5.1.4 - supports-color: 7.2.0 - dev: true - - /sinon@5.1.1: - resolution: - { - integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==, - } - dependencies: - '@sinonjs/formatio': 2.0.0 - diff: 3.5.0 - lodash.get: 4.4.2 - lolex: 2.7.5 - nise: 1.5.3 - supports-color: 5.5.0 - type-detect: 4.0.8 - dev: true - - /sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } - dev: true - - /slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } - - /slice-ansi@4.0.0: - resolution: - { - integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - /smart-buffer@4.2.0: - resolution: - { - integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, - } - engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } - - /snake-case@3.0.4: - resolution: - { - integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /socks-proxy-agent@6.2.1: - resolution: - { - integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==, - } - engines: { node: '>= 10' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==, - } - engines: { node: '>= 10' } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@8.0.2: - resolution: - { - integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, - } - engines: { node: '>= 14' } - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: false - - /socks@2.7.1: - resolution: - { - integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, - } - engines: { node: '>= 10.13.0', npm: '>= 3.0.0' } - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sonic-boom@3.7.0: - resolution: - { - integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==, - } - dependencies: - atomic-sleep: 1.0.0 - dev: false - - /sort-keys@2.0.0: - resolution: - { - integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, - } - engines: { node: '>=4' } - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /sort-keys@4.2.0: - resolution: - { - integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==, - } - engines: { node: '>=8' } - dependencies: - is-plain-obj: 2.1.0 - dev: true - - /source-map-support@0.5.13: - resolution: - { - integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } - - /spawn-command@0.0.2-1: - resolution: - { - integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==, - } - dev: true - - /spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: - { - integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, - } - dev: true - - /spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: - { - integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, - } - dev: true - - /split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - - /split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } - dev: false - - /split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - - /ssri@10.0.4: - resolution: - { - integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - minipass: 5.0.0 - dev: true - - /ssri@8.0.1: - resolution: - { - integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, - } - engines: { node: '>= 8' } - dependencies: - minipass: 3.3.6 - dev: true - - /ssri@9.0.1: - resolution: - { - integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - minipass: 3.3.6 - dev: true - - /stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: '>=10' } - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stdout-stderr@0.1.13: - resolution: - { - integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==, - } - engines: { node: '>=8.0.0' } - dependencies: - debug: 4.3.4(supports-color@8.1.1) - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: '>=10' } - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@1.0.2: - resolution: - { - integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, - } - engines: { node: '>=0.10.0' } - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: - { - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, - } - engines: { node: '>=4' } - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } - dependencies: - safe-buffer: 5.1.2 - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@3.0.1: - resolution: - { - integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, - } - engines: { node: '>=0.10.0' } - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: - { - integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, - } - engines: { node: '>=4' } - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } - dependencies: - ansi-regex: 6.0.1 - - /strip-bom-buf@1.0.0: - resolution: - { - integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==, - } - engines: { node: '>=4' } - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom-stream@2.0.0: - resolution: - { - integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==, - } - engines: { node: '>=0.10.0' } - dependencies: - first-chunk-stream: 2.0.0 - strip-bom: 2.0.0 - dev: true - - /strip-bom@2.0.0: - resolution: - { - integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } - dev: true - - /strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: '>=8' } - dev: true - - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: '>=6' } - dev: true - - /strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: '>=8' } - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } - dev: false - - /strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } - - /strnum@1.0.5: - resolution: - { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, - } - dev: false - - /strong-log-transformer@2.1.0: - resolution: - { - integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - dev: true - - /supports-color@2.0.0: - resolution: - { - integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, - } - engines: { node: '>=0.8.0' } - dev: true - - /supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: '>=4' } - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } - dependencies: - has-flag: 4.0.0 - - /supports-hyperlinks@2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: '>=8' } - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } - dev: true - - /taketalk@1.0.0: - resolution: - { - integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==, - } - dependencies: - get-stdin: 4.0.1 - minimist: 1.2.8 - dev: true - - /tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: '>=6' } - dev: true - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /tar@6.1.11: - resolution: - { - integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==, - } - engines: { node: '>= 10' } - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tar@6.1.15: - resolution: - { - integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==, - } - engines: { node: '>=10' } - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - /temp-dir@1.0.0: - resolution: - { - integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, - } - engines: { node: '>=4' } - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: - { - integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==, - } - engines: { node: '>= 10.13.0' } - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2 - dev: true - - /terser@5.19.2: - resolution: - { - integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions@1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: '>=0.10' } - dev: true - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - dev: true - - /textextensions@5.16.0: - resolution: - { - integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==, - } - engines: { node: '>=0.8' } - dev: true - - /thread-stream@2.4.0: - resolution: - { - integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==, - } - dependencies: - real-require: 0.2.0 - dev: false - - /through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through2@4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - - /through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } - - /tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: '>=0.6.0' } - dependencies: - os-tmpdir: 1.0.2 - - /tmp@0.2.1: - resolution: - { - integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==, - } - engines: { node: '>=8.17.0' } - dependencies: - rimraf: 3.0.2 - - /tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } - dev: true - - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: '>=4' } - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } - dependencies: - is-number: 7.0.0 - - /tough-cookie@4.1.3: - resolution: - { - integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, - } - engines: { node: '>=6' } - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - - /traverse@0.3.9: - resolution: - { - integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, - } - dev: false - - /tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } - hasBin: true - dev: true - - /treeverse@1.0.4: - resolution: - { - integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==, - } - dev: true - - /trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: '>=8' } - dev: true - - /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): - resolution: - { - integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.18.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.0.2 - yargs-parser: 21.1.1 - dev: true - - /ts-json-schema-generator@0.93.0: - resolution: - { - integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==, - } - engines: { node: '>=10.0.0' } - hasBin: true - dependencies: - '@types/json-schema': 7.0.12 - commander: 7.2.0 - fast-json-stable-stringify: 2.1.0 - glob: 7.2.3 - json-stable-stringify: 1.0.2 - typescript: 4.3.5 - dev: true - - /ts-loader@9.4.2(typescript@5.0.2)(webpack@5.88.2): - resolution: - { - integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==, - } - engines: { node: '>=12.0.0' } - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.2 - typescript: 5.0.2 - webpack: 5.88.2 - dev: true - - /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): - resolution: - { - integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, - } - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /ts-node@9.1.1(typescript@4.9.5): - resolution: - { - integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, - } - engines: { node: '>=10.0.0' } - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.9.5 - yn: 3.1.1 - dev: true - - /ts-node@9.1.1(typescript@5.0.2): - resolution: - { - integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, - } - engines: { node: '>=10.0.0' } - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 5.0.2 - yn: 3.1.1 - dev: true - - /ts-retry-promise@0.7.1: - resolution: - { - integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==, - } - engines: { node: '>=6' } - dev: false - - /tsc-alias@1.8.3: - resolution: - { - integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==, - } - hasBin: true - dependencies: - chokidar: 3.5.3 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.5.0 - dev: true - - /tsconfig-paths@4.2.0: - resolution: - { - integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, - } - engines: { node: '>=6' } - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - - /tslib@2.1.0: - resolution: - { - integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==, - } - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsutils@3.21.0(typescript@5.0.2): - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: '>= 6' } - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.2 - dev: true - - /tuf-js@1.1.7: - resolution: - { - integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4(supports-color@8.1.1) - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: '>=4' } - dev: true - - /type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: '>=10' } - dev: true - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: '>=10' } - dev: true - - /type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: '>=10' } - - /type-fest@0.4.1: - resolution: - { - integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, - } - engines: { node: '>=6' } - dev: true - - /type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: '>=8' } - dev: true - - /type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: '>=8' } - dev: true - - /type-fest@1.4.0: - resolution: - { - integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, - } - engines: { node: '>=10' } - dev: false - - /typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - dev: true - - /typescript@4.3.5: - resolution: - { - integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==, - } - engines: { node: '>=4.2.0' } - hasBin: true - dev: true - - /typescript@4.9.5: - resolution: - { - integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, - } - engines: { node: '>=4.2.0' } - hasBin: true - dev: true - - /typescript@5.0.2: - resolution: - { - integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, - } - engines: { node: '>=12.20' } - hasBin: true - - /uglify-js@3.17.4: - resolution: - { - integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, - } - engines: { node: '>=0.8.0' } - hasBin: true - requiresBuild: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': optional: true - - /unique-filename@1.1.1: - resolution: - { - integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, - } - dependencies: - unique-slug: 2.0.2 - dev: true - - /unique-filename@2.0.1: - resolution: - { - integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - unique-slug: 3.0.0 - dev: true - - /unique-filename@3.0.0: - resolution: - { - integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - unique-slug: 4.0.0 - dev: true - - /unique-slug@2.0.2: - resolution: - { - integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, - } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@3.0.0: - resolution: - { - integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@4.0.0: - resolution: - { - integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universal-user-agent@6.0.0: - resolution: - { - integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, - } - dev: true - - /universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: '>= 4.0.0' } - - /universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: '>= 4.0.0' } - dev: false - - /universalify@2.0.0: - resolution: - { - integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, - } - engines: { node: '>= 10.0.0' } - - /unix-dgram@2.0.6: - resolution: - { - integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==, - } - engines: { node: '>=0.10.48' } - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: false + ts-node: optional: true - - /untildify@4.0.0: - resolution: - { - integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, - } - engines: { node: '>=8' } - dev: true - - /unzipper@0.10.14: - resolution: - { - integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, - } - dependencies: - big-integer: 1.6.51 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /upath@2.0.1: - resolution: - { - integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, - } - engines: { node: '>=4' } - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: - { - integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, - } - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /upper-case-first@2.0.2: - resolution: - { - integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /upper-case@2.0.2: - resolution: - { - integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==, - } - dependencies: - tslib: 2.1.0 - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.0 - - /url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url@0.10.3: - resolution: - { - integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==, - } - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - /util@0.12.5: - resolution: - { - integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, - } - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - - /uuid@8.0.0: - resolution: - { - integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==, - } - hasBin: true - dev: true - - /uuid@9.0.0: - resolution: - { - integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==, - } - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } - - /v8-compile-cache@2.3.0: - resolution: - { - integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, - } - dev: true - - /v8-to-istanbul@9.1.0: - resolution: - { - integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==, - } - engines: { node: '>=10.12.0' } - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@3.0.0: - resolution: - { - integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, - } - dependencies: - builtins: 1.0.3 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: - { - integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - builtins: 5.0.1 - dev: true - - /vinyl-file@3.0.0: - resolution: - { - integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==, - } - engines: { node: '>=4' } - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - strip-bom-buf: 1.0.0 - strip-bom-stream: 2.0.0 - vinyl: 2.2.1 - dev: true - - /vinyl@2.2.1: - resolution: - { - integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, - } - engines: { node: '>= 0.10' } - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 - dev: true - - /walk-up-path@1.0.0: - resolution: - { - integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==, - } - dev: true - - /walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } - dependencies: - makeerror: 1.0.12 - dev: true - - /watchpack@2.4.0: - resolution: - { - integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, - } - engines: { node: '>=10.13.0' } - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } - dependencies: - defaults: 1.0.4 - dev: true - - /webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - - /webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, - } - engines: { node: '>=10.13.0' } - dev: true - - /webpack@5.88.2: - resolution: - { - integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==, - } - engines: { node: '>=10.13.0' } - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: - { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, - } - engines: { node: '>=0.8.0' } - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: false - - /websocket-extensions@0.1.4: - resolution: - { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, - } - engines: { node: '>=0.8.0' } - dev: false - - /whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /which-pm@2.0.0: - resolution: - { - integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, - } - engines: { node: '>=8.15' } - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true - - /which-typed-array@1.1.11: - resolution: - { - integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==, - } - engines: { node: '>= 0.4' } - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@1.0.9: - resolution: - { - integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==, - } - hasBin: true - dev: false - - /which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@3.0.1: - resolution: - { - integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wide-align@1.1.5: - resolution: - { - integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, - } - dependencies: - string-width: 4.2.3 - dev: true - - /widest-line@3.1.0: - resolution: - { - integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, - } - engines: { node: '>=8' } - dependencies: - string-width: 4.2.3 - - /winreg@1.2.4: - resolution: - { - integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==, - } - dev: false - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - - /wrap-ansi@2.1.0: - resolution: - { - integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, - } - engines: { node: '>=0.10.0' } - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - - /wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: '>=8' } - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /write-file-atomic@2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@4.0.2: - resolution: - { - integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@5.0.1: - resolution: - { - integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.0.2 - dev: true - - /write-json-file@3.2.0: - resolution: - { - integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, - } - engines: { node: '>=6' } - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.2.11 - make-dir: 2.1.0 - pify: 4.0.1 - sort-keys: 2.0.0 - write-file-atomic: 2.4.3 - dev: true - - /write-pkg@4.0.0: - resolution: - { - integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, - } - engines: { node: '>=8' } - dependencies: - sort-keys: 2.0.0 - type-fest: 0.4.1 - write-json-file: 3.2.0 - dev: true - - /xml-formatter@3.3.2: - resolution: - { - integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, - } - engines: { node: '>= 14' } - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-formatter@3.4.1: - resolution: - { - integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==, - } - engines: { node: '>= 14' } - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-parser-xo@4.1.1: - resolution: - { - integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, - } - engines: { node: '>= 14' } - dev: false - - /xml2js@0.5.0: - resolution: - { - integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==, - } - engines: { node: '>=4.0.0' } - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - - /xml2js@0.6.0: - resolution: - { - integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, - } - engines: { node: '>=4.0.0' } - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: - { - integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, - } - engines: { node: '>=4.0' } - - /xmlcreate@2.0.4: - resolution: - { - integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, - } - dev: false - - /xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } - dev: true - - /y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } - dev: true - - /yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } - dev: true - - /yargs-parser@20.2.4: - resolution: - { - integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: '>=12' } - dev: true - - /yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: '>=12' } - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yeoman-environment@3.19.3: - resolution: - { - integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==, - } - engines: { node: '>=12.10.0' } - hasBin: true - dependencies: - '@npmcli/arborist': 4.3.1 - are-we-there-yet: 2.0.0 - arrify: 2.0.1 - binaryextensions: 4.18.0 - chalk: 4.1.2 - cli-table: 0.3.11 - commander: 7.1.0 - dateformat: 4.6.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.1.0 - error: 10.4.0 - escape-string-regexp: 4.0.0 - execa: 5.1.1 - find-up: 5.0.0 - globby: 11.1.0 - grouped-queue: 2.0.0 - inquirer: 8.2.5 - is-scoped: 2.1.0 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log-symbols: 4.1.0 - mem-fs: 2.3.0 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimatch: 3.1.2 - npmlog: 5.0.1 - p-queue: 6.6.2 - p-transform: 1.3.0 - pacote: 12.0.3 - preferred-pm: 3.0.3 - pretty-bytes: 5.6.0 - readable-stream: 4.4.2 - semver: 7.5.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - text-table: 0.2.0 - textextensions: 5.16.0 - untildify: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /yeoman-generator@5.9.0(yeoman-environment@3.19.3): - resolution: - { - integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==, - } - engines: { node: '>=12.10.0' } - peerDependencies: - yeoman-environment: ^3.2.0 - peerDependenciesMeta: - yeoman-environment: - optional: true - dependencies: - chalk: 4.1.2 - dargs: 7.0.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 5.1.1 - github-username: 6.0.0 - lodash: 4.17.21 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimist: 1.2.8 - pacote: 15.2.0 - read-pkg-up: 7.0.1 - run-async: 2.4.1 - semver: 7.5.2 - shelljs: 0.8.5 - sort-keys: 4.2.0 - text-table: 0.2.0 - yeoman-environment: 3.19.3 - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - supports-color - dev: true - - /yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: '>=6' } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } - dev: true - - /yosay@2.0.2: - resolution: - { - integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==, - } - engines: { node: '>=4' } - hasBin: true - dependencies: - ansi-regex: 2.1.1 - ansi-styles: 3.2.1 - chalk: 1.1.3 - cli-boxes: 1.0.0 - pad-component: 0.0.1 - string-width: 2.1.1 - strip-ansi: 3.0.1 - taketalk: 1.0.0 - wrap-ansi: 2.1.0 - dev: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 10.0.0 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.9.2): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 20.4.4 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff@29.6.1: + resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-docblock@29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.6.1: + resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /jest-environment-node@29.6.1: + resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.6.1: + resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 14.14.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + jest-worker: 29.6.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector@29.6.1: + resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-matcher-utils@29.6.1: + resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-message-util@29.6.1: + resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.6.1: + resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-util: 29.6.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.6.1 + dev: true + + /jest-regex-util@29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.6.1: + resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.6.1: + resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.6.1: + resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.6.1 + '@jest/environment': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.6.1 + jest-haste-map: 29.6.1 + jest-leak-detector: 29.6.1 + jest-message-util: 29.6.1 + jest-resolve: 29.6.1 + jest-runtime: 29.6.1 + jest-util: 29.6.1 + jest-watcher: 29.6.1 + jest-worker: 29.6.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.6.1: + resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/globals': 29.6.1 + '@jest/source-map': 29.6.0 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.6.1: + resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.2 + '@babel/generator': 7.22.9 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) + '@babel/types': 7.22.5 + '@jest/expect-utils': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + chalk: 4.1.2 + expect: 29.6.1 + graceful-fs: 4.2.11 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + natural-compare: 1.4.0 + pretty-format: 29.6.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.6.1: + resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.6.1: + resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.6.1 + dev: true + + /jest-watcher@29.6.1: + resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.6.1 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 14.14.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.6.1: + resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 14.14.7 + jest-util: 29.6.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.9.2) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jmespath@0.16.0: + resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} + engines: {node: '>= 0.6.0'} + dev: true + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /js2xmlparser@4.0.2: + resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + dependencies: + xmlcreate: 2.0.4 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /jsforce@2.0.0-beta.27: + resolution: {integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==} + engines: {node: '>=8.0'} + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /jsforce@2.0.0-beta.29: + resolution: {integrity: sha512-Fq7xjOYOikyozZZDQNTfzsAdhcO0rUXwtavsjM+cCYUFiCMVOJJavgco303zOsJk3v8sdAYnGgHyKckLIhnyAg==} + engines: {node: '>=8.0'} + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + dependencies: + bignumber.js: 9.1.1 + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stable-stringify@1.0.2: + resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} + dependencies: + jsonify: 0.0.1 + dev: true + + /json-stringify-nice@1.1.4: + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /just-diff-apply@5.5.0: + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + dev: true + + /just-diff@3.1.1: + resolution: {integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==} + dev: true + + /just-diff@5.2.0: + resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} + dev: true + + /just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /lerna@8.0.2: + resolution: {integrity: sha512-nnOIGI5V5Af9gfraNcMVoV1Fry/y7/h3nCQYk0/CMzBYDD+xbNL3DH8+c82AJkNR5ABslmpXjW4DLJ11/1b3CQ==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@lerna/create': 8.0.2 + '@npmcli/run-script': 7.0.2 + '@nx/devkit': 17.3.0(nx@17.3.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + envinfo: 7.8.1 + execa: 5.0.0 + fs-extra: 11.1.1 + get-port: 5.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + import-local: 3.1.0 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + libnpmaccess: 7.0.2 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 17.3.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-pipe: 3.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + pacote: 17.0.6 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + typescript: 5.0.2 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libnpmaccess@7.0.2: + resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish@7.3.0: + resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ci-info: 3.8.0 + normalize-package-data: 5.0.0 + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + semver: 7.5.2 + sigstore: 1.8.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + + /lodash.template@4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + + /lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + dependencies: + lodash._reinterpolate: 3.0.0 + + /lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /lolex@2.7.5: + resolution: {integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==} + dev: true + + /lolex@5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.1.0 + dev: false + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 17.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/agent': 2.2.0 + cacache: 18.0.2 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.2 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.3.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /markdown-table-ts@1.0.3: + resolution: {integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==} + dev: false + + /markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + dependencies: + repeat-string: 1.6.1 + dev: false + + /marked-terminal@5.1.1(marked@4.0.16): + resolution: {integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==} + engines: {node: '>=14.13.1 || >=16.0.0'} + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + ansi-escapes: 5.0.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 4.0.16 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + dev: false + + /marked@4.0.16: + resolution: {integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==} + engines: {node: '>= 12'} + hasBin: true + dev: false + + /mem-fs-editor@9.7.0(mem-fs@2.3.0): + resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} + engines: {node: '>=12.10.0'} + peerDependencies: + mem-fs: ^2.1.0 + peerDependenciesMeta: + mem-fs: + optional: true + dependencies: + binaryextensions: 4.18.0 + commondir: 1.0.1 + deep-extend: 0.6.0 + ejs: 3.1.9 + globby: 11.1.0 + isbinaryfile: 5.0.0 + mem-fs: 2.3.0 + minimatch: 7.4.6 + multimatch: 5.0.0 + normalize-path: 3.0.0 + textextensions: 5.16.0 + dev: true + + /mem-fs@2.3.0: + resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} + engines: {node: '>=12'} + dependencies: + '@types/node': 15.14.9 + '@types/vinyl': 2.0.7 + vinyl: 2.2.1 + vinyl-file: 3.0.0 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minimisted@2.0.1: + resolution: {integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==} + dependencies: + minimist: 1.2.8 + dev: false + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + minipass: 7.0.4 + dev: true + + /minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.3: + resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + /minipass@7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + engines: {node: '>=16 || 14 >=14.17'} + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp-infer-owner@2.0.0: + resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + infer-owner: 1.0.4 + mkdirp: 1.0.4 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mnemonist@0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + dependencies: + obliterator: 2.0.4 + dev: false + + /mock-stdin@1.0.0: + resolution: {integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==} + dev: true + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + + /multistream@3.1.0: + resolution: {integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /mylas@2.1.13: + resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} + engines: {node: '>=12.0.0'} + dev: true + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true + dev: false + optional: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /natural-orderby@2.0.3: + resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: false + + /neverthrow@4.2.1: + resolution: {integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==} + dev: false + + /neverthrow@4.4.2: + resolution: {integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==} + dev: false + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + /nise@1.5.3: + resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} + dependencies: + '@sinonjs/formatio': 3.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + lolex: 5.1.2 + path-to-regexp: 1.8.0 + dev: true + + /nise@5.1.4: + resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.1.0 + dev: false + + /nock@13.3.2: + resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} + engines: {node: '>= 10.13'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /node-abi@3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.2 + dev: false + + /node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + dependencies: + clone: 2.1.2 + dev: false + + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: false + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp@10.0.1: + resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.3.10 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.0 + nopt: 7.2.0 + proc-log: 3.0.0 + semver: 7.5.2 + tar: 6.1.15 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-gyp@9.4.0: + resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 11.1.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@4.0.0: + resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.2 + dev: true + + /npm-install-checks@6.1.1: + resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.2 + dev: true + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: true + + /npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@8.1.1: + resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 3.0.8 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-package-arg@8.1.5: + resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist@3.0.0: + resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 4.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@5.1.1: + resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.4 + dev: true + + /npm-pick-manifest@6.1.1: + resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + dependencies: + npm-install-checks: 4.0.0 + npm-normalize-package-bin: 1.0.1 + npm-package-arg: 8.1.5 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@8.0.1: + resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.2 + dev: true + + /npm-registry-fetch@12.0.2: + resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + make-fetch-happen: 10.2.1 + minipass: 3.3.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-registry-fetch@16.1.0: + resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + make-fetch-happen: 13.0.0 + minipass: 7.0.2 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.1 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /nx@17.3.0: + resolution: {integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==} + hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.6.7 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + dependencies: + '@nrwl/tao': 17.3.0 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.6.7 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.1.1 + ignore: 5.3.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 9.0.3 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + ora: 5.3.0 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.1 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 17.3.0 + '@nx/nx-darwin-x64': 17.3.0 + '@nx/nx-freebsd-x64': 17.3.0 + '@nx/nx-linux-arm-gnueabihf': 17.3.0 + '@nx/nx-linux-arm64-gnu': 17.3.0 + '@nx/nx-linux-arm64-musl': 17.3.0 + '@nx/nx-linux-x64-gnu': 17.3.0 + '@nx/nx-linux-x64-musl': 17.3.0 + '@nx/nx-win32-arm64-msvc': 17.3.0 + '@nx/nx-win32-x64-msvc': 17.3.0 + transitivePeerDependencies: + - debug + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@2.1.1: + resolution: {integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==} + engines: {node: '>= 6'} + dev: false + + /object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + + /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) + aws-sdk: 2.1421.0 + concurrently: 7.6.0 + debug: 4.3.4(supports-color@8.1.1) + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 1.5.0 + got: 11.8.6 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + semver: 7.5.2 + shelljs: 0.8.5 + tslib: 2.6.2 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0(yeoman-environment@3.19.3) + yosay: 2.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bluebird + - encoding + - mem-fs + - supports-color + - typescript + dev: true + + /on-exit-leak-free@2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map-series@2.1.0: + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + dev: true + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + dev: true + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-transform@1.3.0: + resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} + engines: {node: '>=12.10.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + p-queue: 6.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /p-waterfall@2.1.1: + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} + dependencies: + p-reduce: 2.1.0 + dev: true + + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /pacote@12.0.3: + resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + dependencies: + '@npmcli/git': 2.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/promise-spawn': 1.3.2 + '@npmcli/run-script': 2.0.0 + cacache: 15.3.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + infer-owner: 1.0.4 + minipass: 3.3.6 + mkdirp: 1.0.4 + npm-package-arg: 8.1.5 + npm-packlist: 3.0.0 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + promise-retry: 2.0.1 + read-package-json-fast: 2.0.3 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.3 + fs-minipass: 3.0.2 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.1 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.8.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@17.0.6: + resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 5.0.4 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 7.0.1 + '@npmcli/run-script': 7.0.2 + cacache: 18.0.2 + fs-minipass: 3.0.2 + minipass: 7.0.2 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.1.0 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 7.0.0 + read-package-json-fast: 3.0.2 + sigstore: 2.2.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pad-component@0.0.1: + resolution: {integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==} + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-conflict-json@2.0.2: + resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + json-parse-even-better-errors: 2.3.1 + just-diff: 5.2.0 + just-diff-apply: 5.5.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /password-prompt@1.1.2: + resolution: {integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==} + dependencies: + ansi-escapes: 3.2.0 + cross-spawn: 6.0.5 + + /password-prompt@1.1.3: + resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} + dependencies: + ansi-escapes: 4.3.2 + cross-spawn: 7.0.3 + dev: false + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.7.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino@8.17.2: + resolution: {integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.7.0 + thread-stream: 2.4.0 + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plimit-lit@1.5.0: + resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} + dependencies: + queue-lit: 1.5.0 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.45.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.0.5: + resolution: {integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-format@29.6.1: + resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /proc-log@1.0.0: + resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} + dev: true + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /promise-all-reject-late@1.0.1: + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + dev: true + + /promise-call-limit@1.0.2: + resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + dev: true + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard@1.0.0: + resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + read: 2.1.0 + dev: true + + /propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} + dev: true + + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: true + + /proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /pure-rand@6.0.2: + resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-lit@1.5.0: + resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-cmd-shim@3.0.1: + resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dev: true + + /read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /read-package-json-fast@2.0.3: + resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} + engines: {node: '>=10'} + dependencies: + json-parse-even-better-errors: 2.3.1 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read@2.1.0: + resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + mute-stream: 1.0.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readdir-scoped-modules@1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: false + + /replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /rimraf@5.0.1: + resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.3 + dev: false + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.1.0 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /samsam@1.3.0: + resolution: {integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==} + deprecated: This package has been deprecated in favour of @sinonjs/samsam + dev: true + + /sax@1.2.1: + resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} + dev: true + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /scoped-regex@2.1.0: + resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} + engines: {node: '>=8'} + dev: true + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.2: + resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /sequin@0.1.1: + resolution: {integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==} + engines: {node: '>=0.4.0'} + dev: false + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + /sigstore@1.8.0: + resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sigstore@2.2.0: + resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.2.1 + '@sigstore/tuf': 2.3.0 + '@sigstore/verify': 0.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-git@3.16.0: + resolution: {integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-git@3.19.1: + resolution: {integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sinon@11.1.2: + resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} + deprecated: 16.1.1 + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.1.3 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true + + /sinon@5.1.1: + resolution: {integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==} + dependencies: + '@sinonjs/formatio': 2.0.0 + diff: 3.5.0 + lodash.get: 4.4.2 + lolex: 2.7.5 + nise: 1.5.3 + supports-color: 5.5.0 + type-detect: 4.0.8 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + + /sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /spawn-command@0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /ssri@10.0.4: + resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 5.0.0 + dev: true + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stdout-stderr@0.1.13: + resolution: {integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==} + engines: {node: '>=8.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-buf@1.0.0: + resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} + engines: {node: '>=4'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom-stream@2.0.0: + resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} + engines: {node: '>=0.10.0'} + dependencies: + first-chunk-stream: 2.0.0 + strip-bom: 2.0.0 + dev: true + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + + /strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /taketalk@1.0.0: + resolution: {integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==} + dependencies: + get-stdin: 4.0.1 + minimist: 1.2.8 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /textextensions@5.16.0: + resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} + engines: {node: '>=0.8'} + dev: true + + /thread-stream@2.4.0: + resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} + dependencies: + real-require: 0.2.0 + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /treeverse@1.0.4: + resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.18.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.0.2 + yargs-parser: 21.1.1 + dev: true + + /ts-json-schema-generator@0.93.0: + resolution: {integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + '@types/json-schema': 7.0.12 + commander: 7.2.0 + fast-json-stable-stringify: 2.1.0 + glob: 7.2.3 + json-stable-stringify: 1.0.2 + typescript: 4.3.5 + dev: true + + /ts-loader@9.5.1(typescript@5.0.2)(webpack@5.88.2): + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.2 + source-map: 0.7.4 + typescript: 5.0.2 + webpack: 5.88.2 + dev: true + + /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@10.9.2(@types/node@10.0.0)(typescript@5.0.2): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 10.0.0 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@4.9.5): + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 4.9.5 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@5.0.2): + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 5.0.2 + yn: 3.1.1 + dev: true + + /ts-retry-promise@0.7.1: + resolution: {integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==} + engines: {node: '>=6'} + dev: false + + /ts-retry-promise@0.8.0: + resolution: {integrity: sha512-elI/GkojPANBikPaMWQnk4T/bOJ6tq/hqXyQRmhfC9PAD6MoHmXIXK7KilJrlpx47VAKCGcmBrTeK5dHk6YAYg==} + engines: {node: '>=6'} + dev: false + + /tsc-alias@1.8.3: + resolution: {integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==} + hasBin: true + dependencies: + chokidar: 3.5.3 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.5.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.1.0: + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@5.0.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /tuf-js@2.2.0: + resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/models': 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-fest@0.4.1: + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@4.3.5: + resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + optional: true + + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unix-dgram@2.0.6: + resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} + engines: {node: '>=0.10.48'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: false + optional: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.1.0 + dev: false + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.1.0 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /url@0.10.3: + resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: true + + /uuid@8.0.0: + resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} + hasBin: true + dev: true + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + dependencies: + builtins: 1.0.3 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + + /vinyl-file@3.0.0: + resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + strip-bom-buf: 1.0.0 + strip-bom-stream: 2.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /walk-up-path@1.0.0: + resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.0.9: + resolution: {integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==} + hasBin: true + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + + /winreg@1.2.4: + resolution: {integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.0.2 + dev: true + + /write-json-file@3.2.0: + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.11 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-pkg@4.0.0: + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /xml-formatter@3.3.2: + resolution: {integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==} + engines: {node: '>= 14'} + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-formatter@3.4.1: + resolution: {integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==} + engines: {node: '>= 14'} + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-parser-xo@4.1.1: + resolution: {integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==} + engines: {node: '>= 14'} + dev: false + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + + /xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + /xmlcreate@2.0.4: + resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yeoman-environment@3.19.3: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} + engines: {node: '>=12.10.0'} + hasBin: true + dependencies: + '@npmcli/arborist': 4.3.1 + are-we-there-yet: 2.0.0 + arrify: 2.0.1 + binaryextensions: 4.18.0 + chalk: 4.1.2 + cli-table: 0.3.11 + commander: 7.1.0 + dateformat: 4.6.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.1.0 + error: 10.4.0 + escape-string-regexp: 4.0.0 + execa: 5.1.1 + find-up: 5.0.0 + globby: 11.1.0 + grouped-queue: 2.0.0 + inquirer: 8.2.5 + is-scoped: 2.1.0 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log-symbols: 4.1.0 + mem-fs: 2.3.0 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimatch: 3.1.2 + npmlog: 5.0.1 + p-queue: 6.6.2 + p-transform: 1.3.0 + pacote: 12.0.3 + preferred-pm: 3.0.3 + pretty-bytes: 5.6.0 + readable-stream: 4.4.2 + semver: 7.5.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 + textextensions: 5.16.0 + untildify: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /yeoman-generator@5.9.0(yeoman-environment@3.19.3): + resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} + engines: {node: '>=12.10.0'} + peerDependencies: + yeoman-environment: ^3.2.0 + peerDependenciesMeta: + yeoman-environment: + optional: true + dependencies: + chalk: 4.1.2 + dargs: 7.0.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 5.1.1 + github-username: 6.0.0 + lodash: 4.17.21 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimist: 1.2.8 + pacote: 15.2.0 + read-pkg-up: 7.0.1 + run-async: 2.4.1 + semver: 7.5.2 + shelljs: 0.8.5 + sort-keys: 4.2.0 + text-table: 0.2.0 + yeoman-environment: 3.19.3 + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - supports-color + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yosay@2.0.2: + resolution: {integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + ansi-regex: 2.1.1 + ansi-styles: 3.2.1 + chalk: 1.1.3 + cli-boxes: 1.0.0 + pad-component: 0.0.1 + string-width: 2.1.1 + strip-ansi: 3.0.1 + taketalk: 1.0.0 + wrap-ansi: 2.1.0 + dev: true From 08095e469eb58abc7889c555cfe404ae9ac090db Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 30 Jan 2024 10:59:57 +1100 Subject: [PATCH 64/95] chore(publish): update versions and publish to npm - @flxblio/apexlink@2.0.0 - @flxblio/sfp@31.0.0 - @flxblio/sfprofiles@3.0.0 --- packages/apexlink/package.json | 2 +- packages/sfp-cli/package.json | 6 +- packages/sfprofiles/package.json | 2 +- pnpm-lock.yaml | 28181 +++++++++++++++++------------ 4 files changed, 16271 insertions(+), 11920 deletions(-) diff --git a/packages/apexlink/package.json b/packages/apexlink/package.json index 59a60f94e..748f126d0 100644 --- a/packages/apexlink/package.json +++ b/packages/apexlink/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/apexlink", - "version": "1.0.3", + "version": "2.0.0", "description": "Wrappers around @nawforce's apexlink java pom ", "author": "flxblio", "homepage": "https://github.com/flxbl-io/sfp", diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 41e888172..dd590252a 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "30.3.5", + "version": "31.0.0", "license": "MIT", "author": "flxblio", "release": "January 24", @@ -14,10 +14,10 @@ "access": "public" }, "dependencies": { - "@flxblio/apexlink": "^1.0.3", + "@flxblio/apexlink": "^2.0.0", "@flxblio/sfdx-process-wrapper": "^1.0.3", "@flxblio/sfp-logger": "^2.1.3", - "@flxblio/sfprofiles": "^2.0.9", + "@flxblio/sfprofiles": "^3.0.0", "@newrelic/telemetry-sdk": "^0.6.0", "@oclif/core": "2.11.8", "@oclif/plugin-commands": "^3.0.3", diff --git a/packages/sfprofiles/package.json b/packages/sfprofiles/package.json index 27d5303ba..fd267def1 100644 --- a/packages/sfprofiles/package.json +++ b/packages/sfprofiles/package.json @@ -1,6 +1,6 @@ { "name": "@flxblio/sfprofiles", - "version": "2.0.9", + "version": "3.0.0", "description": "Salesforce Profile management", "keywords": [ "sfdx-plugin", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0652c7c39..0d98176ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,11940 +1,16291 @@ lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - - .: - dependencies: - neverthrow: - specifier: ^4.2.1 - version: 4.2.1 - xml-formatter: - specifier: ^3.3.2 - version: 3.3.2 - devDependencies: - '@commitlint/cli': - specifier: ^15.0.0 - version: 15.0.0 - '@commitlint/config-conventional': - specifier: ^15.0.0 - version: 15.0.0 - '@types/async-retry': - specifier: ^1.4.2 - version: 1.4.2 - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/mocha': - specifier: ^5.2.7 - version: 5.2.7 - '@types/node': - specifier: ^10 - version: 10.0.0 - '@types/q': - specifier: ^1.5.2 - version: 1.5.2 - '@types/xml2js': - specifier: ^0.4.5 - version: 0.4.5 - lerna: - specifier: 8.0.2 - version: 8.0.2 - prettier: - specifier: ^2.0.5 - version: 2.0.5 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - semver: - specifier: 7.5.2 - version: 7.5.2 - ts-loader: - specifier: ~9.5.1 - version: 9.5.1(typescript@5.0.2)(webpack@5.88.2) - ts-node: - specifier: 10.9.2 - version: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/apexlink: - dependencies: - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.3 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - find-java-home: - specifier: 2.0.0 - version: 2.0.0 - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - jest: - specifier: 29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/forcemula: - devDependencies: - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) - - packages/sfdx-process-wrapper: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - devDependencies: - '@types/fs-extra': - specifier: ^9.0.11 - version: 9.0.11 - '@types/node': - specifier: ^10 - version: 10.0.0 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfp-cli: - dependencies: - '@flxblio/apexlink': - specifier: ^1.0.3 - version: link:../apexlink - '@flxblio/sfdx-process-wrapper': - specifier: ^1.0.3 - version: link:../sfdx-process-wrapper - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - '@flxblio/sfprofiles': - specifier: ^2.0.9 - version: link:../sfprofiles - '@newrelic/telemetry-sdk': - specifier: ^0.6.0 - version: 0.6.0 - '@oclif/core': - specifier: 2.11.8 - version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-commands': - specifier: ^3.0.3 - version: 3.0.3 - '@oclif/plugin-help': - specifier: 5.2.17 - version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@salesforce/apex-node': - specifier: 3.0.2 - version: 3.0.2 - '@salesforce/core': - specifier: 6.5.1 - version: 6.5.1 - '@salesforce/kit': - specifier: 3.0.15 - version: 3.0.15 - '@salesforce/packaging': - specifier: 3.2.5 - version: 3.2.5 - '@salesforce/source-deploy-retrieve': - specifier: 10.2.13 - version: 10.2.13 - '@salesforce/source-tracking': - specifier: 5.1.7 - version: 5.1.7 - adm-zip: - specifier: ^0.5.10 - version: 0.5.10 - ajv: - specifier: 8.11.0 - version: 8.11.0 - apex-parser: - specifier: 2.13.0 - version: 2.13.0 - async-retry: - specifier: ^1.3.1 - version: 1.3.3 - axios: - specifier: ^1.4.0 - version: 1.4.0 - bottleneck: - specifier: ^2.19.5 - version: 2.19.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - cli-table: - specifier: 0.3.11 - version: 0.3.11 - datadog-metrics: - specifier: ^0.9.3 - version: 0.9.3 - dotenv: - specifier: 16.3.1 - version: 16.3.1 - fast-xml-parser: - specifier: 4.2.7 - version: 4.2.7 - fs-extra: - specifier: ^11.1.1 - version: 11.1.1 - glob: - specifier: ^10.3.3 - version: 10.3.3 - handlebars: - specifier: ^4.7.7 - version: 4.7.7 - hot-shots: - specifier: ^8.5.0 - version: 8.5.0 - ignore: - specifier: ^5.1.6 - version: 5.2.4 - js-yaml: - specifier: ^4.0.0 - version: 4.1.0 - jsforce: - specifier: 2.0.0-beta.27 - version: 2.0.0-beta.27 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - markdown-table: - specifier: ^2.0.0 - version: 2.0.0 - markdown-table-ts: - specifier: ^1.0.3 - version: 1.0.3 - marked: - specifier: 4.0.16 - version: 4.0.16 - marked-terminal: - specifier: 5.1.1 - version: 5.1.1(marked@4.0.16) - neverthrow: - specifier: 4.4.2 - version: 4.4.2 - object-hash: - specifier: ^2.1.1 - version: 2.1.1 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - semver: - specifier: 7.5.2 - version: 7.5.2 - simple-git: - specifier: 3.19.1 - version: 3.19.1 - tar: - specifier: ^6.1.9 - version: 6.1.15 - tmp: - specifier: ^0.2.1 - version: 0.2.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 - '@oclif/plugin-command-snapshot': - specifier: ^3 - version: 3.0.0(@oclif/config@1.18.15) - '@oclif/test': - specifier: ^2 - version: 2.0.0 - '@salesforce/dev-config': - specifier: 3.0.1 - version: 3.0.1 - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.5 - version: 2.0.5 - '@types/adm-zip': - specifier: ^0.4.33 - version: 0.4.33 - '@types/fs-extra': - specifier: 11.0.4 - version: 11.0.4 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/marked': - specifier: 4.0.2 - version: 4.0.2 - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - oclif: - specifier: ^3.10.0 - version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: 10.7.0 - version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfplogger: - dependencies: - chalk: - specifier: ^4.1.2 - version: 4.1.2 - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - strip-ansi: - specifier: ^6.0.0 - version: 6.0.1 - devDependencies: - '@types/node': - specifier: ^14.14.7 - version: 14.14.7 - typescript: - specifier: ^5 - version: 5.0.2 - - packages/sfprofiles: - dependencies: - '@flxblio/sfp-logger': - specifier: ^2.1.3 - version: link:../sfplogger - '@salesforce/core': - specifier: 6.5.1 - version: 6.5.1 - '@salesforce/source-deploy-retrieve': - specifier: 10.2.13 - version: 10.2.13 - async-retry: - specifier: ^1.3.3 - version: 1.3.3 - better-sqlite3: - specifier: 8.4.0 - version: 8.4.0 - chalk: - specifier: ^4.1.0 - version: 4.1.0 - diff-match-patch: - specifier: ^1.0.5 - version: 1.0.5 - fs-extra: - specifier: ^11.1.0 - version: 11.1.0 - glob: - specifier: 10.3.3 - version: 10.3.3 - ignore: - specifier: ^5.1.8 - version: 5.2.4 - jsforce: - specifier: ^2.0.0-beta.29 - version: 2.0.0-beta.29 - node-cache: - specifier: ^5.1.2 - version: 5.1.2 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 - simple-git: - specifier: ^3.16.0 - version: 3.16.0 - tslib: - specifier: 2.1.0 - version: 2.1.0 - xml-formatter: - specifier: ^3.4.1 - version: 3.4.1 - xml2js: - specifier: ^0.6.0 - version: 0.6.0 - devDependencies: - '@babel/core': - specifier: 7.18.2 - version: 7.18.2 - '@babel/plugin-proposal-nullish-coalescing-operator': - specifier: ^7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@babel/plugin-proposal-optional-chaining': - specifier: 7.17.12 - version: 7.17.12(@babel/core@7.18.2) - '@salesforce/ts-sinon': - specifier: ^1.3.21 - version: 1.3.21 - '@salesforce/ts-types': - specifier: 2.0.7 - version: 2.0.7 - '@types/async-retry': - specifier: 1.4.5 - version: 1.4.5 - '@types/datadog-metrics': - specifier: ^0.6.1 - version: 0.6.1 - '@types/diff-match-patch': - specifier: ^1.0.32 - version: 1.0.32 - '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 - '@types/lodash': - specifier: ^4.14.191 - version: 4.14.191 - '@types/mocha': - specifier: 9.1.0 - version: 9.1.0 - '@types/node': - specifier: 20.4.4 - version: 20.4.4 - '@types/rimraf': - specifier: ^3.0.2 - version: 3.0.2 - '@typescript-eslint/eslint-plugin': - specifier: ^5.53.0 - version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/parser': - specifier: ^5.53.0 - version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) - eslint: - specifier: ^8.33.0 - version: 8.33.0 - jest: - specifier: ^29.5.3 - version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) - ts-node: - specifier: ^9.1.1 - version: 9.1.1(typescript@5.0.2) - tsc-alias: - specifier: ^1.8.3 - version: 1.8.3 - typescript: - specifier: ^5 - version: 5.0.2 + .: + dependencies: + neverthrow: + specifier: ^4.2.1 + version: 4.2.1 + xml-formatter: + specifier: ^3.3.2 + version: 3.3.2 + devDependencies: + '@commitlint/cli': + specifier: ^15.0.0 + version: 15.0.0 + '@commitlint/config-conventional': + specifier: ^15.0.0 + version: 15.0.0 + '@types/async-retry': + specifier: ^1.4.2 + version: 1.4.2 + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/mocha': + specifier: ^5.2.7 + version: 5.2.7 + '@types/node': + specifier: ^10 + version: 10.0.0 + '@types/q': + specifier: ^1.5.2 + version: 1.5.2 + '@types/xml2js': + specifier: ^0.4.5 + version: 0.4.5 + lerna: + specifier: 8.0.2 + version: 8.0.2 + prettier: + specifier: ^2.0.5 + version: 2.0.5 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + semver: + specifier: 7.5.2 + version: 7.5.2 + ts-loader: + specifier: ~9.5.1 + version: 9.5.1(typescript@5.0.2)(webpack@5.88.2) + ts-node: + specifier: 10.9.2 + version: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/apexlink: + dependencies: + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + find-java-home: + specifier: 2.0.0 + version: 2.0.0 + fs-extra: + specifier: 11.1.1 + version: 11.1.1 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + jest: + specifier: 29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/forcemula: + devDependencies: + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + + packages/sfdx-process-wrapper: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + devDependencies: + '@types/fs-extra': + specifier: ^9.0.11 + version: 9.0.11 + '@types/node': + specifier: ^10 + version: 10.0.0 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfp-cli: + dependencies: + '@flxblio/apexlink': + specifier: ^2.0.0 + version: link:../apexlink + '@flxblio/sfdx-process-wrapper': + specifier: ^1.0.3 + version: link:../sfdx-process-wrapper + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@flxblio/sfprofiles': + specifier: ^3.0.0 + version: link:../sfprofiles + '@newrelic/telemetry-sdk': + specifier: ^0.6.0 + version: 0.6.0 + '@oclif/core': + specifier: 2.11.8 + version: 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-commands': + specifier: ^3.0.3 + version: 3.0.3 + '@oclif/plugin-help': + specifier: 5.2.17 + version: 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@salesforce/apex-node': + specifier: 3.0.2 + version: 3.0.2 + '@salesforce/core': + specifier: 6.5.1 + version: 6.5.1 + '@salesforce/kit': + specifier: 3.0.15 + version: 3.0.15 + '@salesforce/packaging': + specifier: 3.2.5 + version: 3.2.5 + '@salesforce/source-deploy-retrieve': + specifier: 10.2.13 + version: 10.2.13 + '@salesforce/source-tracking': + specifier: 5.1.7 + version: 5.1.7 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + ajv: + specifier: 8.11.0 + version: 8.11.0 + apex-parser: + specifier: 2.13.0 + version: 2.13.0 + async-retry: + specifier: ^1.3.1 + version: 1.3.3 + axios: + specifier: ^1.4.0 + version: 1.4.0 + bottleneck: + specifier: ^2.19.5 + version: 2.19.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cli-table: + specifier: 0.3.11 + version: 0.3.11 + datadog-metrics: + specifier: ^0.9.3 + version: 0.9.3 + dotenv: + specifier: 16.3.1 + version: 16.3.1 + fast-xml-parser: + specifier: 4.2.7 + version: 4.2.7 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 + hot-shots: + specifier: ^8.5.0 + version: 8.5.0 + ignore: + specifier: ^5.1.6 + version: 5.2.4 + js-yaml: + specifier: ^4.0.0 + version: 4.1.0 + jsforce: + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + markdown-table: + specifier: ^2.0.0 + version: 2.0.0 + markdown-table-ts: + specifier: ^1.0.3 + version: 1.0.3 + marked: + specifier: 4.0.16 + version: 4.0.16 + marked-terminal: + specifier: 5.1.1 + version: 5.1.1(marked@4.0.16) + neverthrow: + specifier: 4.4.2 + version: 4.4.2 + object-hash: + specifier: ^2.1.1 + version: 2.1.1 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + semver: + specifier: 7.5.2 + version: 7.5.2 + simple-git: + specifier: 3.19.1 + version: 3.19.1 + tar: + specifier: ^6.1.9 + version: 6.1.15 + tmp: + specifier: ^0.2.1 + version: 0.2.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@jest/globals': + specifier: ^29.6.1 + version: 29.6.1 + '@oclif/plugin-command-snapshot': + specifier: ^3 + version: 3.0.0(@oclif/config@1.18.15) + '@oclif/test': + specifier: ^2 + version: 2.0.0 + '@salesforce/dev-config': + specifier: 3.0.1 + version: 3.0.1 + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.5 + version: 2.0.5 + '@types/adm-zip': + specifier: ^0.4.33 + version: 0.4.33 + '@types/fs-extra': + specifier: 11.0.4 + version: 11.0.4 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/marked': + specifier: 4.0.2 + version: 4.0.2 + jest: + specifier: ^29.6.1 + version: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + oclif: + specifier: ^3.10.0 + version: 3.10.0(@types/node@14.14.7)(typescript@5.0.2) + ts-jest: + specifier: 29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: 10.7.0 + version: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfplogger: + dependencies: + chalk: + specifier: ^4.1.2 + version: 4.1.2 + fs-extra: + specifier: ^9.1.0 + version: 9.1.0 + strip-ansi: + specifier: ^6.0.0 + version: 6.0.1 + devDependencies: + '@types/node': + specifier: ^14.14.7 + version: 14.14.7 + typescript: + specifier: ^5 + version: 5.0.2 + + packages/sfprofiles: + dependencies: + '@flxblio/sfp-logger': + specifier: ^2.1.3 + version: link:../sfplogger + '@salesforce/core': + specifier: 6.5.1 + version: 6.5.1 + '@salesforce/source-deploy-retrieve': + specifier: 10.2.13 + version: 10.2.13 + async-retry: + specifier: ^1.3.3 + version: 1.3.3 + better-sqlite3: + specifier: 8.4.0 + version: 8.4.0 + chalk: + specifier: ^4.1.0 + version: 4.1.0 + diff-match-patch: + specifier: ^1.0.5 + version: 1.0.5 + fs-extra: + specifier: ^11.1.0 + version: 11.1.0 + glob: + specifier: 10.3.3 + version: 10.3.3 + ignore: + specifier: ^5.1.8 + version: 5.2.4 + jsforce: + specifier: ^2.0.0-beta.29 + version: 2.0.0-beta.29 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + simple-git: + specifier: ^3.16.0 + version: 3.16.0 + tslib: + specifier: 2.1.0 + version: 2.1.0 + xml-formatter: + specifier: ^3.4.1 + version: 3.4.1 + xml2js: + specifier: ^0.6.0 + version: 0.6.0 + devDependencies: + '@babel/core': + specifier: 7.18.2 + version: 7.18.2 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@babel/plugin-proposal-optional-chaining': + specifier: 7.17.12 + version: 7.17.12(@babel/core@7.18.2) + '@salesforce/ts-sinon': + specifier: ^1.3.21 + version: 1.3.21 + '@salesforce/ts-types': + specifier: 2.0.7 + version: 2.0.7 + '@types/async-retry': + specifier: 1.4.5 + version: 1.4.5 + '@types/datadog-metrics': + specifier: ^0.6.1 + version: 0.6.1 + '@types/diff-match-patch': + specifier: ^1.0.32 + version: 1.0.32 + '@types/jest': + specifier: ^29.5.3 + version: 29.5.3 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mocha': + specifier: 9.1.0 + version: 9.1.0 + '@types/node': + specifier: 20.4.4 + version: 20.4.4 + '@types/rimraf': + specifier: ^3.0.2 + version: 3.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.53.0 + version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.53.0 + version: 5.53.0(eslint@8.33.0)(typescript@5.0.2) + eslint: + specifier: ^8.33.0 + version: 8.33.0 + jest: + specifier: ^29.5.3 + version: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2) + ts-node: + specifier: ^9.1.1 + version: 9.1.1(typescript@5.0.2) + tsc-alias: + specifier: ^1.8.3 + version: 1.8.3 + typescript: + specifier: ^5 + version: 5.0.2 packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.18.2: - resolution: {integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.18.2 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.22.6: - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): - resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): - resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime-corejs3@7.22.6: - resolution: {integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.31.1 - regenerator-runtime: 0.13.11 - dev: false - - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: false - optional: true - - /@commitlint/cli@15.0.0: - resolution: {integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==} - engines: {node: '>=v12'} - hasBin: true - dependencies: - '@commitlint/format': 15.0.0 - '@commitlint/lint': 15.0.0 - '@commitlint/load': 15.0.0 - '@commitlint/read': 15.0.0 - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - dev: true - - /@commitlint/config-conventional@15.0.0: - resolution: {integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==} - engines: {node: '>=v12'} - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/ensure@15.0.0: - resolution: {integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule@15.0.0: - resolution: {integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/format@15.0.0: - resolution: {integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@15.0.0: - resolution: {integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - semver: 7.3.5 - dev: true - - /@commitlint/lint@15.0.0: - resolution: {integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/is-ignored': 15.0.0 - '@commitlint/parse': 15.0.0 - '@commitlint/rules': 15.0.0 - '@commitlint/types': 15.0.0 - dev: true - - /@commitlint/load@15.0.0: - resolution: {integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/execute-rule': 15.0.0 - '@commitlint/resolve-extends': 15.0.0 - '@commitlint/types': 15.0.0 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) - chalk: 4.1.2 - cosmiconfig: 7.1.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.9.5 - dev: true - - /@commitlint/message@15.0.0: - resolution: {integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/parse@15.0.0: - resolution: {integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 15.0.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read@15.0.0: - resolution: {integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/top-level': 15.0.0 - '@commitlint/types': 15.0.0 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends@15.0.0: - resolution: {integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==} - engines: {node: '>=v12'} - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules@15.0.0: - resolution: {integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/ensure': 15.0.0 - '@commitlint/message': 15.0.0 - '@commitlint/to-lines': 15.0.0 - '@commitlint/types': 15.0.0 - execa: 5.1.1 - dev: true - - /@commitlint/to-lines@15.0.0: - resolution: {integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==} - engines: {node: '>=v12'} - dev: true - - /@commitlint/top-level@15.0.0: - resolution: {integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==} - engines: {node: '>=v12'} - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types@15.0.0: - resolution: {integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==} - engines: {node: '>=v12'} - dependencies: - chalk: 4.1.2 - dev: true - - /@cspotcode/source-map-consumer@0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} - dev: true - - /@cspotcode/source-map-support@0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} - dependencies: - '@cspotcode/source-map-consumer': 0.8.0 - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): - resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} - engines: {node: '>=10.0.0'} - peerDependencies: - cosmiconfig: '>=6' - dependencies: - cosmiconfig: 7.1.0 - lodash.get: 4.4.2 - make-error: 1.3.6 - ts-node: 9.1.1(typescript@4.9.5) - tslib: 2.1.0 - transitivePeerDependencies: - - typescript - dev: true - - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: true - - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@isaacs/string-locale-compare@1.1.0: - resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console@29.6.1: - resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/core@29.6.1(ts-node@10.7.0): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/core@29.6.1(ts-node@10.9.2): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.9.2) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/core@29.6.1(ts-node@9.1.1): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.6.1: - resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - dev: true - - /@jest/expect-utils@29.6.1: - resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.1: - resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.6.1 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.6.1: - resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 14.14.7 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /@jest/globals@29.6.1: - resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/types': 29.6.1 - jest-mock: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.6.1: - resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 14.14.7 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - jest-worker: 29.6.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.6.1: - resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.6.1: - resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/transform@29.6.1: - resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.18.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.1: - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 14.14.7 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: false - - /@lerna/create@8.0.2: - resolution: {integrity: sha512-AueSlfiYXqEmy9/EIc17mjlaHFuv734dfgVBegyoefIA7hdeoExtsXnACWf8Tw5af6gwyTL3KAp6QQyc1sTuZQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@npmcli/run-script': 7.0.2 - '@nx/devkit': 17.3.0(nx@17.3.0) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.1 - columnify: 1.6.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 8.2.0 - dedent: 0.7.0 - execa: 5.0.0 - fs-extra: 11.1.1 - get-stream: 6.0.0 - git-url-parse: 13.1.0 - glob-parent: 5.1.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - ini: 1.3.8 - init-package-json: 5.0.0 - inquirer: 8.2.5 - is-ci: 3.0.1 - is-stream: 2.0.0 - js-yaml: 4.1.0 - libnpmpublish: 7.3.0 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 4.0.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7 - npm-package-arg: 8.1.1 - npm-packlist: 5.1.1 - npm-registry-fetch: 14.0.5 - npmlog: 6.0.2 - nx: 17.3.0 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - pacote: 17.0.6 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - read-package-json: 6.0.4 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.5.2 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 9.0.1 - strong-log-transformer: 2.1.0 - tar: 6.1.11 - temp-dir: 1.0.0 - upath: 2.0.1 - uuid: 9.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - bluebird - - debug - - encoding - - supports-color - dev: true - - /@newrelic/telemetry-sdk@0.6.0: - resolution: {integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/agent@2.2.0: - resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - agent-base: 7.1.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 10.2.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@npmcli/arborist@4.3.1: - resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/map-workspaces': 2.0.4 - '@npmcli/metavuln-calculator': 2.0.0 - '@npmcli/move-file': 1.1.2 - '@npmcli/name-from-folder': 1.0.1 - '@npmcli/node-gyp': 1.0.3 - '@npmcli/package-json': 1.0.1 - '@npmcli/run-script': 2.0.0 - bin-links: 3.0.3 - cacache: 15.3.0 - common-ancestor-path: 1.0.1 - json-parse-even-better-errors: 2.3.1 - json-stringify-nice: 1.1.4 - mkdirp: 1.0.4 - mkdirp-infer-owner: 2.0.0 - npm-install-checks: 4.0.0 - npm-package-arg: 8.1.5 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - pacote: 12.0.3 - parse-conflict-json: 2.0.2 - proc-log: 1.0.0 - promise-all-reject-late: 1.0.1 - promise-call-limit: 1.0.2 - read-package-json-fast: 2.0.3 - readdir-scoped-modules: 1.1.0 - rimraf: 3.0.2 - semver: 7.5.2 - ssri: 8.0.1 - treeverse: 1.0.4 - walk-up-path: 1.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/fs@1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.2 - dev: true - - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.2 - dev: true - - /@npmcli/git@2.1.0: - resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} - dependencies: - '@npmcli/promise-spawn': 1.3.2 - lru-cache: 6.0.0 - mkdirp: 1.0.4 - npm-pick-manifest: 6.1.1 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/git@5.0.4: - resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 7.0.1 - lru-cache: 10.2.0 - npm-pick-manifest: 9.0.0 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.2 - which: 4.0.0 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@1.0.7: - resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/map-workspaces@2.0.4: - resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/name-from-folder': 1.0.1 - glob: 8.1.0 - minimatch: 5.1.6 - read-package-json-fast: 2.0.3 - dev: true - - /@npmcli/metavuln-calculator@2.0.0: - resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - cacache: 15.3.0 - json-parse-even-better-errors: 2.3.1 - pacote: 12.0.3 - semver: 7.5.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/move-file@1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true - - /@npmcli/name-from-folder@1.0.1: - resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} - dev: true - - /@npmcli/node-gyp@1.0.3: - resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/package-json@1.0.1: - resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} - dependencies: - json-parse-even-better-errors: 2.3.1 - dev: true - - /@npmcli/promise-spawn@1.3.2: - resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} - dependencies: - infer-owner: 1.0.4 - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/promise-spawn@7.0.1: - resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - which: 4.0.0 - dev: true - - /@npmcli/run-script@2.0.0: - resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} - dependencies: - '@npmcli/node-gyp': 1.0.3 - '@npmcli/promise-spawn': 1.3.2 - node-gyp: 8.4.1 - read-package-json-fast: 2.0.3 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@npmcli/run-script@7.0.2: - resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 7.0.1 - node-gyp: 10.0.1 - read-package-json-fast: 3.0.2 - which: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@nrwl/devkit@17.3.0(nx@17.3.0): - resolution: {integrity: sha512-3QUCvRisp0Iwwl7VEFQPQUU7wpqGEv9kJBNBtgmhe68ydusdNPk+d0npwkvH23BYPuswTI2MUJyLkdeiB58Ovw==} - dependencies: - '@nx/devkit': 17.3.0(nx@17.3.0) - transitivePeerDependencies: - - nx - dev: true - - /@nrwl/tao@17.3.0: - resolution: {integrity: sha512-Bhz+MvAk8CjQtclpEOagGiKzgoziwe+35SlHtvFqzZClAuB8BAx+3ZDNJZcEpDRNfodKqodMUy2OEf6pbzw/LA==} - hasBin: true - dependencies: - nx: 17.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - dev: true - - /@nx/devkit@17.3.0(nx@17.3.0): - resolution: {integrity: sha512-KPUkEwkGYrg5hDqqXc7sdv4PNXHyWtGwzkBZA3p/RjPieKcQSsTcUwTxQ+taOE4v877n0HuC7hcuLueLSbYGiQ==} - peerDependencies: - nx: '>= 16 <= 18' - dependencies: - '@nrwl/devkit': 17.3.0(nx@17.3.0) - ejs: 3.1.9 - enquirer: 2.3.6 - ignore: 5.3.0 - nx: 17.3.0 - semver: 7.5.3 - tmp: 0.2.1 - tslib: 2.6.2 - yargs-parser: 21.1.1 - dev: true - - /@nx/nx-darwin-arm64@17.3.0: - resolution: {integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-darwin-x64@17.3.0: - resolution: {integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-freebsd-x64@17.3.0: - resolution: {integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm-gnueabihf@17.3.0: - resolution: {integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm64-gnu@17.3.0: - resolution: {integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-arm64-musl@17.3.0: - resolution: {integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-x64-gnu@17.3.0: - resolution: {integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-linux-x64-musl@17.3.0: - resolution: {integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-win32-arm64-msvc@17.3.0: - resolution: {integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nx/nx-win32-x64-msvc@17.3.0: - resolution: {integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@oclif/color@1.0.9: - resolution: {integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==} - engines: {node: '>=12.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - ansi-styles: 4.3.0 - chalk: 4.1.2 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - tslib: 2.1.0 - dev: true - - /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): - resolution: {integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==} - engines: {node: '>=12.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@oclif/config': ^1 - dependencies: - '@oclif/config': 1.18.15 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.13(supports-color@8.1.1) - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.14(supports-color@8.1.1): - resolution: {integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/config@1.18.15: - resolution: {integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.15 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/core@0.5.41(@oclif/config@1.18.15): - resolution: {integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-ux: 5.6.7(@oclif/config@1.18.15) - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - lodash.template: 4.5.0 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tslib: 2.1.0 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==} - engines: {node: '>=14.0.0'} - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - fs-extra: 9.1.0 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.4 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/core@3.18.1: - resolution: {integrity: sha512-l0LsjzGcqjbUEdeSBX6bdZieVmEv82Q0W3StiyaDMEnPZ9KLH28HrLpcZg6d50mCYW9CUZNzmRo6qrCHWrgLKw==} - engines: {node: '>=18.0.0'} - dependencies: - '@types/cli-progress': 3.11.5 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - color: 4.2.3 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.3 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - dev: false - - /@oclif/core@3.3.2: - resolution: {integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==} - engines: {node: '>=18.0.0'} - dependencies: - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4(supports-color@8.1.1) - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - dev: false - - /@oclif/errors@1.3.6: - resolution: {integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /@oclif/help@1.0.13(supports-color@8.1.1): - resolution: {integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/config': 1.18.14(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@oclif/linewrap@1.0.0: - resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} - dev: true - - /@oclif/parser@3.8.15: - resolution: {integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - tslib: 2.6.2 - dev: true - - /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): - resolution: {integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 0.5.41(@oclif/config@1.18.15) - chalk: 4.1.2 - just-diff: 3.1.1 - semver: 7.5.2 - sinon: 11.1.2 - ts-json-schema-generator: 0.93.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - - supports-color - dev: true - - /@oclif/plugin-commands@3.0.3: - resolution: {integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==} - engines: {node: '>=18.0.0'} - dependencies: - '@oclif/core': 3.3.2 - lodash.pickby: 4.6.0 - lodash.sortby: 4.7.0 - lodash.template: 4.5.0 - lodash.uniqby: 4.7.0 - dev: false - - /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - - /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/color': 1.0.9 - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: true - - /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 9.1.0 - http-call: 5.3.0 - lodash: 4.17.21 - semver: 7.5.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - - /@oclif/screen@1.0.4: - resolution: {integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==} - engines: {node: '>=8.0.0'} - deprecated: Deprecated in favor of @oclif/core - dev: true - - /@oclif/test@2.0.0: - resolution: {integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==} - engines: {node: '>=8.0.0'} - dependencies: - fancy-test: 1.4.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@octokit/auth-token@2.5.0: - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} - dependencies: - '@octokit/types': 6.41.0 - dev: true - - /@octokit/auth-token@3.0.4: - resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} - engines: {node: '>= 14'} - dev: true - - /@octokit/core@3.6.0: - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} - dependencies: - '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/core@4.2.4: - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} - dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/endpoint@7.0.6: - resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/graphql@4.8.0: - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} - dependencies: - '@octokit/request': 5.6.3 - '@octokit/types': 6.41.0 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/graphql@5.0.6: - resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/request': 6.2.8 - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/openapi-types@12.11.0: - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} - dev: true - - /@octokit/openapi-types@18.0.0: - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} - dev: true - - /@octokit/plugin-enterprise-rest@6.0.1: - resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - dev: true - - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} - peerDependencies: - '@octokit/core': '>=2' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: true - - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=4' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - dev: true - - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - dev: true - - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true - - /@octokit/request-error@2.1.0: - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} - dependencies: - '@octokit/types': 6.41.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request-error@3.0.3: - resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@5.6.3: - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} - dependencies: - '@octokit/endpoint': 6.0.12 - '@octokit/request-error': 2.1.0 - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/request@6.2.8: - resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@18.12.0: - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} - dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@19.0.11: - resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/tsconfig@1.0.2: - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: true - - /@octokit/types@10.0.0: - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@octokit/types@6.41.0: - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} - dependencies: - '@octokit/openapi-types': 12.11.0 - dev: true - - /@octokit/types@9.3.2: - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true - - /@salesforce/apex-node@3.0.2: - resolution: {integrity: sha512-lHa7XnQCivuwTtO0RBTqw+nZ4Qm4ymodqpNJwefFLk6KBEva9sMV9Ksj2x6kBGGbLyO6ZiJiUMSAN6Gcny60zg==} - engines: {node: '>=18.18.2'} - dependencies: - '@salesforce/core': 6.5.1 - '@salesforce/kit': 3.0.15 - '@types/istanbul-reports': 3.0.4 - faye: 1.4.0 - glob: 10.3.10 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - jsforce: 2.0.0-beta.29 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/core@6.5.1: - resolution: {integrity: sha512-u/R82JGdbJCMY0EN3UY5hQUxn0gPN+ParNQIm9YPB9lDpBQv82nKeZJuH6j2LsaaF6ygY3bm79kftPxpdKbggQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@salesforce/kit': 3.0.15 - '@salesforce/schemas': 1.6.1 - '@salesforce/ts-types': 2.0.9 - '@types/semver': 7.5.6 - ajv: 8.12.0 - change-case: 4.1.2 - faye: 1.4.0 - form-data: 4.0.0 - js2xmlparser: 4.0.2 - jsforce: 2.0.0-beta.29 - jsonwebtoken: 9.0.2 - jszip: 3.10.1 - pino: 8.17.2 - pino-abstract-transport: 1.1.0 - pino-pretty: 10.3.1 - proper-lockfile: 4.1.2 - semver: 7.5.4 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/dev-config@3.0.1: - resolution: {integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==} - dev: true - - /@salesforce/kit@3.0.15: - resolution: {integrity: sha512-XkA8jsuLvVnyP460dAbU3pBFP2IkmmmsVxMQVifcKKbNWaIBbZBzAfj+vdaQfnvZyflLhsrFT3q2xkb0vHouPg==} - dependencies: - '@salesforce/ts-types': 2.0.9 - tslib: 2.6.2 - dev: false - - /@salesforce/packaging@3.2.5: - resolution: {integrity: sha512-vEydpa7gjr8vn35MezRPxoJE3b7f/fzIU9uBwgONf8THCJ7PMhj9PPfWOXfNp+/7qorqmYIVCJxMFWpJrMStlQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@oclif/core': 3.3.2 - '@salesforce/core': 6.5.1 - '@salesforce/kit': 3.0.15 - '@salesforce/schemas': 1.6.1 - '@salesforce/source-deploy-retrieve': 10.2.13 - '@salesforce/ts-types': 2.0.9 - fast-xml-parser: 4.3.3 - globby: 11.1.0 - graphology: 0.25.4(graphology-types@0.24.7) - graphology-traversal: 0.3.1(graphology-types@0.24.7) - graphology-types: 0.24.7 - jsforce: 2.0.0-beta.29 - jszip: 3.10.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/schemas@1.6.1: - resolution: {integrity: sha512-eVy947ZMxCJReKJdgfddUIsBIbPTa/i8RwQGwxq4/ss38H5sLOAeSTaun9V7HpJ1hkpDznWKfgzYvjsst9K6ig==} - dev: false - - /@salesforce/source-deploy-retrieve@10.2.13: - resolution: {integrity: sha512-KreSALl+mr+Yd7AoG+e6CjtD0/2FT4IS6Zvs4R0bbK/blixONycwl+zGaLia2b0X2pvitUOszMouW6aM0SAgvQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@salesforce/core': 6.5.1 - '@salesforce/kit': 3.0.15 - '@salesforce/ts-types': 2.0.9 - fast-levenshtein: 3.0.0 - fast-xml-parser: 4.3.3 - got: 11.8.6 - graceful-fs: 4.2.11 - ignore: 5.3.0 - jszip: 3.10.1 - mime: 2.6.0 - minimatch: 5.1.6 - proxy-agent: 6.3.1 - ts-retry-promise: 0.7.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/source-tracking@5.1.7: - resolution: {integrity: sha512-kkXWt4X+wxmYsLqG1OIWKgo3aFEg1f+1X6MBIHIrmjEmfMXIRiGX0dRyY+IjFl54w+CnOffNDQNsGSmnPImEYg==} - engines: {node: '>=18.0.0'} - dependencies: - '@oclif/core': 3.18.1 - '@salesforce/core': 6.5.1 - '@salesforce/kit': 3.0.15 - '@salesforce/source-deploy-retrieve': 10.2.13 - '@salesforce/ts-types': 2.0.9 - fast-xml-parser: 4.2.7 - graceful-fs: 4.2.11 - isomorphic-git: 1.23.0 - ts-retry-promise: 0.8.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@salesforce/ts-sinon@1.3.21: - resolution: {integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==} - dependencies: - '@salesforce/ts-types': 1.7.3 - sinon: 5.1.1 - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@1.7.3: - resolution: {integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==} - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.5: - resolution: {integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.7: - resolution: {integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - dev: true - - /@salesforce/ts-types@2.0.9: - resolution: {integrity: sha512-boUD9jw5vQpTCPCCmK/NFTWjSuuW+lsaxOynkyNXLW+zxOc4GDjhtKc4j0vWZJQvolpafbyS8ZLFHZJvs12gYA==} - engines: {node: '>=16.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - - /@sigstore/bundle@1.0.0: - resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - dev: true - - /@sigstore/bundle@2.1.1: - resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.1 - dev: true - - /@sigstore/core@0.2.0: - resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} - engines: {node: ^16.14.0 || >=18.0.0} - dev: true - - /@sigstore/protobuf-specs@0.2.0: - resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@sigstore/protobuf-specs@0.2.1: - resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@sigstore/sign@2.2.1: - resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 - make-fetch-happen: 13.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@sigstore/tuf@1.0.3: - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.0 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@sigstore/tuf@2.3.0: - resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.2.1 - tuf-js: 2.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@sigstore/verify@0.1.0: - resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@sinonjs/fake-timers@7.1.2: - resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/formatio@2.0.0: - resolution: {integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==} - dependencies: - samsam: 1.3.0 - dev: true - - /@sinonjs/formatio@3.2.2: - resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/samsam': 3.3.3 - dev: true - - /@sinonjs/samsam@3.3.3: - resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - array-from: 2.1.1 - lodash: 4.17.21 - dev: true - - /@sinonjs/samsam@6.1.3: - resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding@0.7.2: - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@tufjs/canonical-json@2.0.0: - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} - dev: true - - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.3 - dev: true - - /@tufjs/models@2.0.0: - resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.3 - dev: true - - /@types/adm-zip@0.4.33: - resolution: {integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/async-retry@1.4.2: - resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/async-retry@1.4.5: - resolution: {integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==} - dependencies: - '@types/retry': 0.12.2 - dev: true - - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - dev: true - - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 14.14.7 - '@types/responselike': 1.0.0 - - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true - - /@types/cli-progress@3.11.0: - resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} - dependencies: - '@types/node': 14.14.7 - - /@types/cli-progress@3.11.5: - resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==} - dependencies: - '@types/node': 14.14.7 - dev: false - - /@types/datadog-metrics@0.6.1: - resolution: {integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==} - dev: true - - /@types/diff-match-patch@1.0.32: - resolution: {integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==} - dev: true - - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.44.0 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.44.0: - resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true - - /@types/expect@1.20.4: - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - dev: true - - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 14.14.7 - dev: true - - /@types/fs-extra@9.0.11: - resolution: {integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==} - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 14.14.7 - dev: true - - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/http-cache-semantics@4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: false - - /@types/jest@29.5.3: - resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} - dependencies: - expect: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: true - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - dependencies: - '@types/node': 14.14.7 - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 14.14.7 - - /@types/lodash@4.14.191: - resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} - dev: true - - /@types/lodash@4.14.195: - resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} - dev: true - - /@types/marked@4.0.2: - resolution: {integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==} - dev: true - - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true - - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/mocha@5.2.7: - resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==} - dev: true - - /@types/mocha@9.1.0: - resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} - dev: true - - /@types/node@10.0.0: - resolution: {integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==} - dev: true - - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false - - /@types/node@14.14.7: - resolution: {integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==} - - /@types/node@15.14.9: - resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - dev: true - - /@types/node@20.4.4: - resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} - dev: true - - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true - - /@types/q@1.5.2: - resolution: {integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==} - dev: true - - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 14.14.7 - - /@types/retry@0.12.2: - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - dev: true - - /@types/rimraf@3.0.2: - resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} - dependencies: - '@types/glob': 8.1.0 - '@types/node': 14.14.7 - dev: true - - /@types/semver@7.5.2: - resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} - dev: true - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: false - - /@types/sinon@10.0.15: - resolution: {integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==} - dependencies: - '@types/sinonjs__fake-timers': 8.1.2 - dev: true - - /@types/sinonjs__fake-timers@8.1.2: - resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} - dev: true - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/vinyl@2.0.7: - resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} - dependencies: - '@types/expect': 1.20.4 - '@types/node': 14.14.7 - dev: true - - /@types/xml2js@0.4.5: - resolution: {integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==} - dependencies: - '@types/node': 10.0.0 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.53.0: - resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - dev: true - - /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.33.0 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.53.0: - resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): - resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/visitor-keys': 5.53.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): - resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.53.0 - '@typescript-eslint/types': 5.53.0 - '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) - eslint: 8.33.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.53.0: - resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.53.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true - - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - dev: true - - /@zkochan/js-yaml@0.0.6: - resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true - - /adm-zip@0.5.10: - resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} - engines: {node: '>=6.0'} - dev: false - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - depd: 2.0.0 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: false - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - /ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - /antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /apex-parser@2.13.0: - resolution: {integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==} - engines: {node: '>=8.0.0'} - dependencies: - antlr4ts: 0.5.0-alpha.4 - node-dir: 0.1.17 - dev: false - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: true - - /array-from@2.1.1: - resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} - dev: true - - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.1.0 - dev: false - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - /async-lock@1.4.0: - resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} - dev: false - - /async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - dependencies: - retry: 0.13.1 - dev: false - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /aws-sdk@2.1421.0: - resolution: {integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==} - engines: {node: '>= 10.0.0'} - dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.5.0 - dev: true - - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - - /babel-jest@29.6.1(@babel/core@7.18.2): - resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.18.2 - '@jest/transform': 29.6.1 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.18.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.18.2): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.2 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64url@3.0.1: - resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} - engines: {node: '>=6.0.0'} - dev: false - - /basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} - engines: {node: '>=10.0.0'} - dev: false - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: true - - /better-sqlite3@8.4.0: - resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: false - - /bignumber.js@9.1.1: - resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} - dev: false - - /bin-links@3.0.3: - resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - cmd-shim: 5.0.0 - mkdirp-infer-owner: 2.0.0 - npm-normalize-package-bin: 2.0.0 - read-cmd-shim: 3.0.1 - rimraf: 3.0.2 - write-file-atomic: 4.0.2 - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /binaryextensions@4.18.0: - resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} - engines: {node: '>=0.8'} - dev: true - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.469 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true - - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.5.2 - dev: true - - /byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} - dev: true - - /cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.1.15 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /cacache@18.0.2: - resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 - lru-cache: 10.2.0 - minipass: 7.0.4 - minipass-collect: 2.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.3 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.1.0 - dev: false - - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001517: - resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} - dev: true - - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /cardinal@2.1.1: - resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} - hasBin: true - dependencies: - ansicolors: 0.3.2 - redeyed: 2.1.1 - - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.0: - resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true - - /clean-git-ref@2.0.1: - resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} - dev: false - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /clean-stack@3.0.1: - resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 4.0.0 - - /cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - - /cli-progress@3.12.0: - resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} - engines: {node: '>=4'} - dependencies: - string-width: 4.2.3 - - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true - - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: true - - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: false - - /cli-table@0.3.11: - resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} - engines: {node: '>= 0.2.0'} - dependencies: - colors: 1.0.3 - - /cli-ux@5.6.7(@oclif/config@1.18.15): - resolution: {integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - '@oclif/screen': 1.0.4 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - extract-stack: 2.0.0 - fs-extra: 8.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - lodash: 4.17.21 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - semver: 7.5.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - tslib: 2.1.0 - transitivePeerDependencies: - - '@oclif/config' - dev: true - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} - dev: true - - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - - /clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: true - - /cmd-shim@5.0.0: - resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - mkdirp-infer-owner: 2.0.0 - dev: true - - /cmd-shim@6.0.1: - resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true - - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false - - /colors@1.0.3: - resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} - engines: {node: '>=0.1.90'} - - /columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - - /commander@7.1.0: - resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} - engines: {node: '>= 10'} - dev: true - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - dev: true - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - requiresBuild: true - - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: true - - /concurrently@7.6.0: - resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} - engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case: 2.0.2 - dev: false - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-changelog-core@5.0.1: - resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} - engines: {node: '>=14'} - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 - git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - dev: true - - /conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} - dev: true - - /conventional-changelog-writer@6.0.1: - resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} - engines: {node: '>=14'} - hasBin: true - dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 - handlebars: 4.7.7 - json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.5.2 - split: 1.0.1 - dev: true - - /conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /core-js-pure@3.31.1: - resolution: {integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==} - requiresBuild: true - dev: false - - /core-js@3.31.1: - resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} - requiresBuild: true - dev: false - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /csprng@0.1.2: - resolution: {integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==} - engines: {node: '>=0.6.0'} - dependencies: - sequin: 0.1.1 - dev: false - - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: false - - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: false - - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true - - /data-uri-to-buffer@5.0.1: - resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} - engines: {node: '>= 14'} - dev: false - - /datadog-metrics@0.9.3: - resolution: {integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==} - dependencies: - debug: 3.1.0 - dogapi: 2.8.4 - transitivePeerDependencies: - - supports-color - dev: false - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.22.6 - dev: true - - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true - - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: true - - /detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} - dev: true - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: true - - /diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dev: false - - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff3@0.0.3: - resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} - dev: false - - /diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dogapi@2.8.4: - resolution: {integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==} - hasBin: true - dependencies: - extend: 3.0.2 - json-bigint: 1.0.0 - lodash: 4.17.21 - minimist: 1.2.8 - rc: 1.2.8 - dev: false - - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - jake: 10.8.7 - - /electron-to-chromium@1.4.469: - resolution: {integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==} - dev: true - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true - optional: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - dev: true - - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error@10.4.0: - resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} - dev: true - - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.1: - resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.33.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.33.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.33.0: - resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-utils: 3.0.0(eslint@8.33.0) - eslint-visitor-keys: 3.4.1 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events@1.1.1: - resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} - engines: {node: '>=0.4.x'} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /execa@5.0.0: - resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false - - /expect@29.6.1: - resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.6.1 - '@types/node': 14.14.7 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - dev: true - - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /extract-stack@2.0.0: - resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} - engines: {node: '>=8'} - dev: true - - /fancy-test@1.4.10: - resolution: {integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/chai': 4.3.5 - '@types/lodash': 4.14.195 - '@types/node': 14.14.7 - '@types/sinon': 10.0.15 - lodash: 4.17.21 - mock-stdin: 1.0.0 - nock: 13.3.2 - stdout-stderr: 0.1.13 - transitivePeerDependencies: - - supports-color - dev: true - - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-levenshtein@3.0.0: - resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - dependencies: - fastest-levenshtein: 1.0.16 - - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false - - /fast-xml-parser@4.2.7: - resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fast-xml-parser@4.3.3: - resolution: {integrity: sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: false - - /faye@1.4.0: - resolution: {integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==} - engines: {node: '>=0.8.0'} - dependencies: - asap: 2.0.6 - csprng: 0.1.2 - faye-websocket: 0.11.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - dev: false - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false - - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-java-home@2.0.0: - resolution: {integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==} - dependencies: - which: 1.0.9 - winreg: 1.2.4 - dev: false - - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - - /find-yarn-workspace-root@2.0.0: - resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} - dependencies: - micromatch: 4.0.5 - dev: true - - /first-chunk-stream@2.0.0: - resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} - engines: {node: '>=0.10.0'} - dependencies: - readable-stream: 2.3.8 - dev: true - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.0.2 - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - - /fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true - - /get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - - /get-stream@6.0.0: - resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} - engines: {node: '>=10'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-uri@6.0.1: - resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} - engines: {node: '>= 14'} - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} - hasBin: true - dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 - dev: true - - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 - dev: true - - /git-semver-tags@5.0.1: - resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - meow: 8.1.2 - semver: 7.5.2 - dev: true - - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: true - - /git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} - dependencies: - git-up: 7.0.0 - dev: true - - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - dependencies: - ini: 1.3.8 - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false - - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true - - /github-username@6.0.0: - resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} - engines: {node: '>=10'} - dependencies: - '@octokit/rest': 18.12.0 - transitivePeerDependencies: - - encoding - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.2 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: true - - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /graphology-indices@0.17.0(graphology-types@0.24.7): - resolution: {integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==} - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - mnemonist: 0.39.5 - dev: false - - /graphology-traversal@0.3.1(graphology-types@0.24.7): - resolution: {integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==} - peerDependencies: - graphology-types: '>=0.20.0' - dependencies: - graphology-indices: 0.17.0(graphology-types@0.24.7) - graphology-types: 0.24.7 - graphology-utils: 2.5.2(graphology-types@0.24.7) - dev: false - - /graphology-types@0.24.7: - resolution: {integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==} - dev: false - - /graphology-utils@2.5.2(graphology-types@0.24.7): - resolution: {integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==} - peerDependencies: - graphology-types: '>=0.23.0' - dependencies: - graphology-types: 0.24.7 - dev: false - - /graphology@0.25.4(graphology-types@0.24.7): - resolution: {integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==} - peerDependencies: - graphology-types: '>=0.24.0' - dependencies: - events: 3.3.0 - graphology-types: 0.24.7 - obliterator: 2.0.4 - dev: false - - /grouped-queue@2.0.0: - resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} - engines: {node: '>=8.0.0'} - dev: true - - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - dependencies: - capital-case: 1.0.4 - tslib: 2.1.0 - dev: false - - /help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: false - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /hosted-git-info@3.0.8: - resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - lru-cache: 7.18.3 - dev: true - - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - lru-cache: 10.2.0 - dev: true - - /hot-shots@8.5.0: - resolution: {integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==} - engines: {node: '>=6.0.0'} - optionalDependencies: - unix-dgram: 2.0.6 - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - /http-call@5.3.0: - resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} - engines: {node: '>=8.0.0'} - dependencies: - content-type: 1.0.5 - debug: 4.3.4(supports-color@8.1.1) - is-retry-allowed: 1.2.0 - is-stream: 2.0.1 - parse-json: 4.0.0 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: false - - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: true - - /hyperlinker@1.0.0: - resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} - engines: {node: '>=4'} - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dependencies: - safer-buffer: 2.1.2 - dev: true - optional: true - - /ieee754@1.1.13: - resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore-walk@4.0.1: - resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} - engines: {node: '>=10'} - dependencies: - minimatch: 3.1.2 - dev: true - - /ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minimatch: 5.1.6 - dev: true - - /ignore-walk@6.0.3: - resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minimatch: 9.0.3 - dev: true - - /ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minimatch: 9.0.3 - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - /init-package-json@5.0.0: - resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-package-arg: 10.1.0 - promzard: 1.0.0 - read: 2.1.0 - read-package-json: 6.0.4 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - dev: true - - /inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - dev: false - - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: false - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.8.0 - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - - /is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-scoped@2.1.0: - resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} - engines: {node: '>=8'} - dependencies: - scoped-regex: 2.1.0 - dev: true - - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - dependencies: - protocols: 2.0.1 - dev: true - - /is-stream@2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} - engines: {node: '>=8'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true - - /isbinaryfile@5.0.0: - resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} - engines: {node: '>= 14.0.0'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isomorphic-git@1.23.0: - resolution: {integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==} - engines: {node: '>=12'} - hasBin: true - dependencies: - async-lock: 1.4.0 - clean-git-ref: 2.0.1 - crc-32: 1.2.2 - diff3: 0.0.3 - ignore: 5.2.4 - minimisted: 2.0.1 - pako: 1.0.11 - pify: 4.0.1 - readable-stream: 3.6.2 - sha.js: 2.4.11 - simple-get: 4.0.1 - dev: false - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.18.2 - '@babel/parser': 7.22.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - /jackspeak@2.2.2: - resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.4 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.6.1: - resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.6.1 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - p-limit: 3.1.0 - pretty-format: 29.6.1 - pure-rand: 6.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.9.2) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 10.0.0 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.9.2): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /@ampproject/remapping@2.2.1: + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame@7.22.5: + resolution: + { + integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/highlight': 7.22.5 + dev: true + + /@babel/compat-data@7.22.9: + resolution: + { + integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/core@7.18.2: + resolution: + { + integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.18.2) + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.18.2) + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.9: + resolution: + { + integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.18.2): + resolution: + { + integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.18.2 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: + { + integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: + { + integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: + { + integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.18.2): + resolution: + { + integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: + { + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: + { + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: + { + integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: + { + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: + { + integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: + { + integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: + { + integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helpers@7.22.6: + resolution: + { + integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.5: + resolution: + { + integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.7: + resolution: + { + integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==, + } + engines: { node: '>=6.0.0' } + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.2): + resolution: + { + integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.2): + resolution: + { + integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==, + } + engines: { node: '>=6.9.0' } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2): + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2): + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2): + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.18.2): + resolution: + { + integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime-corejs3@7.22.6: + resolution: + { + integrity: sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==, + } + engines: { node: '>=6.9.0' } + dependencies: + core-js-pure: 3.31.1 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime@7.22.6: + resolution: + { + integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==, + } + engines: { node: '>=6.9.0' } + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.22.5: + resolution: + { + integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@babel/traverse@7.22.8: + resolution: + { + integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.5: + resolution: + { + integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, + } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } + dev: true + + /@colors/colors@1.5.0: + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: '>=0.1.90' } + requiresBuild: true + dev: false optional: true - dependencies: - '@babel/core': 7.18.2 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 20.4.4 - babel-jest: 29.6.1(@babel/core@7.18.2) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 9.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.6.1: - resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.6.1: - resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /jest-environment-node@29.6.1: - resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.6.1: - resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 14.14.7 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - jest-worker: 29.6.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.1: - resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-matcher-utils@29.6.1: - resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.6.1: - resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.6.1: - resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - jest-util: 29.6.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.6.1 - dev: true - - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.6.1: - resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.6.1: - resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.6.1: - resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/environment': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.1 - jest-haste-map: 29.6.1 - jest-leak-detector: 29.6.1 - jest-message-util: 29.6.1 - jest-resolve: 29.6.1 - jest-runtime: 29.6.1 - jest-util: 29.6.1 - jest-watcher: 29.6.1 - jest-worker: 29.6.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.6.1: - resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/globals': 29.6.1 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.6.1: - resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.18.2 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) - chalk: 4.1.2 - expect: 29.6.1 - graceful-fs: 4.2.11 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - natural-compare: 1.4.0 - pretty-format: 29.6.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.6.1: - resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.6.1: - resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.1 - dev: true - - /jest-watcher@29.6.1: - resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 14.14.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.6.1 - string-length: 4.0.2 - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 14.14.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest-worker@29.6.1: - resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 14.14.7 - jest-util: 29.6.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.9.2) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.7.0) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@9.1.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false - - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /js2xmlparser@4.0.2: - resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} - dependencies: - xmlcreate: 2.0.4 - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /jsforce@2.0.0-beta.27: - resolution: {integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==} - engines: {node: '>=8.0'} - hasBin: true - dependencies: - '@babel/runtime': 7.22.6 - '@babel/runtime-corejs3': 7.22.6 - '@types/node': 12.20.55 - abort-controller: 3.0.0 - base64url: 3.0.1 - commander: 4.1.1 - core-js: 3.31.1 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - faye: 1.4.0 - form-data: 4.0.0 - fs-extra: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 7.3.3 - multistream: 3.1.0 - node-fetch: 2.6.12 - open: 7.4.2 - regenerator-runtime: 0.13.11 - strip-ansi: 6.0.1 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /jsforce@2.0.0-beta.29: - resolution: {integrity: sha512-Fq7xjOYOikyozZZDQNTfzsAdhcO0rUXwtavsjM+cCYUFiCMVOJJavgco303zOsJk3v8sdAYnGgHyKckLIhnyAg==} - engines: {node: '>=8.0'} - hasBin: true - dependencies: - '@babel/runtime': 7.22.6 - '@babel/runtime-corejs3': 7.22.6 - '@types/node': 12.20.55 - abort-controller: 3.0.0 - base64url: 3.0.1 - commander: 4.1.1 - core-js: 3.31.1 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - faye: 1.4.0 - form-data: 4.0.0 - fs-extra: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 7.3.3 - multistream: 3.1.0 - node-fetch: 2.6.12 - open: 7.4.2 - regenerator-runtime: 0.13.11 - strip-ansi: 6.0.1 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - dependencies: - bignumber.js: 9.1.1 - dev: false - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json-stable-stringify@1.0.2: - resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} - dependencies: - jsonify: 0.0.1 - dev: true - - /json-stringify-nice@1.1.4: - resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - dev: true - - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.5.4 - dev: false - - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /just-diff-apply@5.5.0: - resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} - dev: true - - /just-diff@3.1.1: - resolution: {integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==} - dev: true - - /just-diff@5.2.0: - resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} - dev: true - - /just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - dev: true - - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: false - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: false - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /lerna@8.0.2: - resolution: {integrity: sha512-nnOIGI5V5Af9gfraNcMVoV1Fry/y7/h3nCQYk0/CMzBYDD+xbNL3DH8+c82AJkNR5ABslmpXjW4DLJ11/1b3CQ==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - '@lerna/create': 8.0.2 - '@npmcli/run-script': 7.0.2 - '@nx/devkit': 17.3.0(nx@17.3.0) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 - byte-size: 8.1.1 - chalk: 4.1.0 - clone-deep: 4.0.1 - cmd-shim: 6.0.1 - columnify: 1.6.0 - conventional-changelog-angular: 7.0.0 - conventional-changelog-core: 5.0.1 - conventional-recommended-bump: 7.0.1 - cosmiconfig: 8.2.0 - dedent: 0.7.0 - envinfo: 7.8.1 - execa: 5.0.0 - fs-extra: 11.1.1 - get-port: 5.1.1 - get-stream: 6.0.0 - git-url-parse: 13.1.0 - glob-parent: 5.1.2 - globby: 11.1.0 - graceful-fs: 4.2.11 - has-unicode: 2.0.1 - import-local: 3.1.0 - ini: 1.3.8 - init-package-json: 5.0.0 - inquirer: 8.2.5 - is-ci: 3.0.1 - is-stream: 2.0.0 - jest-diff: 29.6.1 - js-yaml: 4.1.0 - libnpmaccess: 7.0.2 - libnpmpublish: 7.3.0 - load-json-file: 6.2.0 - lodash: 4.17.21 - make-dir: 4.0.0 - minimatch: 3.0.5 - multimatch: 5.0.0 - node-fetch: 2.6.7 - npm-package-arg: 8.1.1 - npm-packlist: 5.1.1 - npm-registry-fetch: 14.0.5 - npmlog: 6.0.2 - nx: 17.3.0 - p-map: 4.0.0 - p-map-series: 2.1.0 - p-pipe: 3.1.0 - p-queue: 6.6.2 - p-reduce: 2.1.0 - p-waterfall: 2.1.1 - pacote: 17.0.6 - pify: 5.0.0 - read-cmd-shim: 4.0.0 - read-package-json: 6.0.4 - resolve-from: 5.0.0 - rimraf: 4.4.1 - semver: 7.5.2 - signal-exit: 3.0.7 - slash: 3.0.0 - ssri: 9.0.1 - strong-log-transformer: 2.1.0 - tar: 6.1.11 - temp-dir: 1.0.0 - typescript: 5.0.2 - upath: 2.0.1 - uuid: 9.0.0 - validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.0 - write-file-atomic: 5.0.1 - write-pkg: 4.0.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - bluebird - - debug - - encoding - - supports-color - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /libnpmaccess@7.0.2: - resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - transitivePeerDependencies: - - supports-color - dev: true - - /libnpmpublish@7.3.0: - resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ci-info: 3.8.0 - normalize-package-data: 5.0.0 - npm-package-arg: 10.1.0 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - semver: 7.5.2 - sigstore: 1.8.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - - /load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - dev: true - - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false - - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false - - /lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} - dev: false - - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false - - /lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - dependencies: - lodash._reinterpolate: 3.0.0 - - /lodash.uniqby@4.7.0: - resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /lolex@2.7.5: - resolution: {integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==} - dev: true - - /lolex@5.1.2: - resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.1.0 - dev: false - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - /lru-cache@10.0.0: - resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} - engines: {node: 14 || >=16.14} - - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - agentkeepalive: 4.3.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /make-fetch-happen@13.0.0: - resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@npmcli/agent': 2.2.0 - cacache: 18.0.2 - http-cache-semantics: 4.1.1 - is-lambda: 1.0.1 - minipass: 7.0.2 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} - dependencies: - agentkeepalive: 4.3.0 - cacache: 15.3.0 - http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - - /markdown-table-ts@1.0.3: - resolution: {integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==} - dev: false - - /markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - dependencies: - repeat-string: 1.6.1 - dev: false - - /marked-terminal@5.1.1(marked@4.0.16): - resolution: {integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==} - engines: {node: '>=14.13.1 || >=16.0.0'} - peerDependencies: - marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - ansi-escapes: 5.0.0 - cardinal: 2.1.1 - chalk: 5.3.0 - cli-table3: 0.6.3 - marked: 4.0.16 - node-emoji: 1.11.0 - supports-hyperlinks: 2.3.0 - dev: false - - /marked@4.0.16: - resolution: {integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==} - engines: {node: '>= 12'} - hasBin: true - dev: false - - /mem-fs-editor@9.7.0(mem-fs@2.3.0): - resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} - engines: {node: '>=12.10.0'} - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true - dependencies: - binaryextensions: 4.18.0 - commondir: 1.0.1 - deep-extend: 0.6.0 - ejs: 3.1.9 - globby: 11.1.0 - isbinaryfile: 5.0.0 - mem-fs: 2.3.0 - minimatch: 7.4.6 - multimatch: 5.0.0 - normalize-path: 3.0.0 - textextensions: 5.16.0 - dev: true - - /mem-fs@2.3.0: - resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} - engines: {node: '>=12'} - dependencies: - '@types/node': 15.14.9 - '@types/vinyl': 2.0.7 - vinyl: 2.2.1 - vinyl-file: 3.0.0 - dev: true - - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.0.5: - resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /minimisted@2.0.1: - resolution: {integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==} - dependencies: - minimist: 1.2.8 - dev: false - - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - minipass: 7.0.4 - dev: true - - /minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - dev: true - - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - /minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} - engines: {node: '>=16 || 14 >=14.17'} - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /mkdirp-infer-owner@2.0.0: - resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - infer-owner: 1.0.4 - mkdirp: 1.0.4 - dev: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - /mnemonist@0.39.5: - resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} - dependencies: - obliterator: 2.0.4 - dev: false - - /mock-stdin@1.0.0: - resolution: {integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==} - dev: true - - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /multistream@3.1.0: - resolution: {integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /mylas@2.1.13: - resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} - engines: {node: '>=12.0.0'} - dev: true - - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} - requiresBuild: true - dev: false - optional: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /natural-orderby@2.0.3: - resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: false - - /neverthrow@4.2.1: - resolution: {integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==} - dev: false - - /neverthrow@4.4.2: - resolution: {integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==} - dev: false - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - /nise@1.5.3: - resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} - dependencies: - '@sinonjs/formatio': 3.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - lolex: 5.1.2 - path-to-regexp: 1.8.0 - dev: true - - /nise@5.1.4: - resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} - dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - dev: true - - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.1.0 - dev: false - - /nock@13.3.2: - resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} - engines: {node: '>= 10.13'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.2 - dev: false - - /node-cache@5.1.2: - resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} - engines: {node: '>= 8.0.0'} - dependencies: - clone: 2.1.2 - dev: false - - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - dependencies: - minimatch: 3.1.2 - dev: false - - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - dependencies: - lodash: 4.17.21 - dev: false - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-gyp@10.0.1: - resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 10.3.10 - graceful-fs: 4.2.11 - make-fetch-happen: 13.0.0 - nopt: 7.2.0 - proc-log: 3.0.0 - semver: 7.5.2 - tar: 6.1.15 - which: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /node-gyp@8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /node-gyp@9.4.0: - resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 11.1.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.2 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: true - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - abbrev: 2.0.0 - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.12.1 - semver: 7.5.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - /npm-bundled@1.1.2: - resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} - dependencies: - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-normalize-package-bin: 3.0.1 - dev: true - - /npm-install-checks@4.0.0: - resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.2 - dev: true - - /npm-install-checks@6.1.1: - resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.2 - dev: true - - /npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} - dev: true - - /npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.2 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-package-arg@11.0.1: - resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - hosted-git-info: 7.0.1 - proc-log: 3.0.0 - semver: 7.5.2 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-package-arg@8.1.1: - resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 3.0.8 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-package-arg@8.1.5: - resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - semver: 7.5.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-packlist@3.0.0: - resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - glob: 7.2.3 - ignore-walk: 4.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@5.1.1: - resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - glob: 8.1.0 - ignore-walk: 5.0.1 - npm-bundled: 1.1.2 - npm-normalize-package-bin: 1.0.1 - dev: true - - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ignore-walk: 6.0.3 - dev: true - - /npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ignore-walk: 6.0.4 - dev: true - - /npm-pick-manifest@6.1.1: - resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} - dependencies: - npm-install-checks: 4.0.0 - npm-normalize-package-bin: 1.0.1 - npm-package-arg: 8.1.5 - semver: 7.5.2 - dev: true - - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.5.2 - dev: true - - /npm-pick-manifest@9.0.0: - resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.1 - semver: 7.5.2 - dev: true - - /npm-registry-fetch@12.0.2: - resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - make-fetch-happen: 10.2.1 - minipass: 3.3.6 - minipass-fetch: 1.4.1 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 8.1.5 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-registry-fetch@16.1.0: - resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - make-fetch-happen: 13.0.0 - minipass: 7.0.2 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 11.0.1 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true - - /nx@17.3.0: - resolution: {integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==} - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.6.7 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': + + /@commitlint/cli@15.0.0: + resolution: + { + integrity: sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==, + } + engines: { node: '>=v12' } + hasBin: true + dependencies: + '@commitlint/format': 15.0.0 + '@commitlint/lint': 15.0.0 + '@commitlint/load': 15.0.0 + '@commitlint/read': 15.0.0 + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + dev: true + + /@commitlint/config-conventional@15.0.0: + resolution: + { + integrity: sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==, + } + engines: { node: '>=v12' } + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/ensure@15.0.0: + resolution: + { + integrity: sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule@15.0.0: + resolution: + { + integrity: sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/format@15.0.0: + resolution: + { + integrity: sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@15.0.0: + resolution: + { + integrity: sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + semver: 7.3.5 + dev: true + + /@commitlint/lint@15.0.0: + resolution: + { + integrity: sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/is-ignored': 15.0.0 + '@commitlint/parse': 15.0.0 + '@commitlint/rules': 15.0.0 + '@commitlint/types': 15.0.0 + dev: true + + /@commitlint/load@15.0.0: + resolution: + { + integrity: sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/execute-rule': 15.0.0 + '@commitlint/resolve-extends': 15.0.0 + '@commitlint/types': 15.0.0 + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5) + chalk: 4.1.2 + cosmiconfig: 7.1.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.9.5 + dev: true + + /@commitlint/message@15.0.0: + resolution: + { + integrity: sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/parse@15.0.0: + resolution: + { + integrity: sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/types': 15.0.0 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@15.0.0: + resolution: + { + integrity: sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/top-level': 15.0.0 + '@commitlint/types': 15.0.0 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends@15.0.0: + resolution: + { + integrity: sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==, + } + engines: { node: '>=v12' } + dependencies: + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@15.0.0: + resolution: + { + integrity: sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==, + } + engines: { node: '>=v12' } + dependencies: + '@commitlint/ensure': 15.0.0 + '@commitlint/message': 15.0.0 + '@commitlint/to-lines': 15.0.0 + '@commitlint/types': 15.0.0 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@15.0.0: + resolution: + { + integrity: sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==, + } + engines: { node: '>=v12' } + dev: true + + /@commitlint/top-level@15.0.0: + resolution: + { + integrity: sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==, + } + engines: { node: '>=v12' } + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@15.0.0: + resolution: + { + integrity: sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==, + } + engines: { node: '>=v12' } + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: + { + integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==, + } + engines: { node: '>= 12' } + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: + { + integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==, + } + engines: { node: '>=12' } + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.1.0)(typescript@4.9.5): + resolution: + { + integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==, + } + engines: { node: '>=10.0.0' } + peerDependencies: + cosmiconfig: '>=6' + dependencies: + cosmiconfig: 7.1.0 + lodash.get: 4.4.2 + make-error: 1.3.6 + ts-node: 9.1.1(typescript@4.9.5) + tslib: 2.1.0 + transitivePeerDependencies: + - typescript + dev: true + + /@eslint/eslintrc@1.4.1: + resolution: + { + integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify@1.1.3: + resolution: + { + integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, + } + dev: true + + /@humanwhocodes/config-array@0.11.10: + resolution: + { + integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + } + engines: { node: '>=10.10.0' } + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: + { + integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, + } + engines: { node: '>=6.9.0' } + dev: true + + /@isaacs/cliui@8.0.2: + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/string-locale-compare@1.1.0: + resolution: + { + integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, + } + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + } + engines: { node: '>=8' } + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } + dev: true + + /@jest/console@29.6.1: + resolution: + { + integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/core@29.6.1(ts-node@10.7.0): + resolution: + { + integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@10.9.2): + resolution: + { + integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.9.2) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core@29.6.1(ts-node@9.1.1): + resolution: + { + integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@9.1.1) + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment@29.6.1: + resolution: + { + integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + dev: true + + /@jest/expect-utils@29.6.1: + resolution: + { + integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect@29.6.1: + resolution: + { + integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + expect: 29.6.1 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.6.1: + resolution: + { + integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.14.7 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /@jest/globals@29.6.1: + resolution: + { + integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/types': 29.6.1 + jest-mock: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.6.1: + resolution: + { + integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 14.14.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + jest-worker: 29.6.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.0: + resolution: + { + integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.0: + resolution: + { + integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.6.1: + resolution: + { + integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.6.1 + '@jest/types': 29.6.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.6.1: + resolution: + { + integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.6.1 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + slash: 3.0.0 + dev: true + + /@jest/transform@29.6.1: + resolution: + { + integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.18.2 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.1: + resolution: + { + integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 14.14.7 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: + { + integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, + } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: '>=6.0.0' } + + /@jridgewell/set-array@1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: + { + integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, + } + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: + { + integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, + } + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + /@jridgewell/trace-mapping@0.3.18: + resolution: + { + integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, + } + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@kwsites/file-exists@1.1.1: + resolution: + { + integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==, + } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@kwsites/promise-deferred@1.1.1: + resolution: + { + integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==, + } + dev: false + + /@lerna/create@8.0.2: + resolution: + { + integrity: sha512-AueSlfiYXqEmy9/EIc17mjlaHFuv734dfgVBegyoefIA7hdeoExtsXnACWf8Tw5af6gwyTL3KAp6QQyc1sTuZQ==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@npmcli/run-script': 7.0.2 + '@nx/devkit': 17.3.0(nx@17.3.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + execa: 5.0.0 + fs-extra: 11.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + js-yaml: 4.1.0 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 17.3.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + pacote: 17.0.6 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /@newrelic/telemetry-sdk@0.6.0: + resolution: + { + integrity: sha512-T5B7bHyAYW58S8Yr4BDkzlUsFZzqI0ChuJHhmN4sPWeAxJNZNleIYN0cB3qKQSlQk5dL2oupiXy8FrAmm7ljzQ==, + } + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/agent@2.2.0: + resolution: + { + integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.2.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/arborist@4.3.1: + resolution: + { + integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + hasBin: true + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/map-workspaces': 2.0.4 + '@npmcli/metavuln-calculator': 2.0.0 + '@npmcli/move-file': 1.1.2 + '@npmcli/name-from-folder': 1.0.1 + '@npmcli/node-gyp': 1.0.3 + '@npmcli/package-json': 1.0.1 + '@npmcli/run-script': 2.0.0 + bin-links: 3.0.3 + cacache: 15.3.0 + common-ancestor-path: 1.0.1 + json-parse-even-better-errors: 2.3.1 + json-stringify-nice: 1.1.4 + mkdirp: 1.0.4 + mkdirp-infer-owner: 2.0.0 + npm-install-checks: 4.0.0 + npm-package-arg: 8.1.5 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + pacote: 12.0.3 + parse-conflict-json: 2.0.2 + proc-log: 1.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 1.0.2 + read-package-json-fast: 2.0.3 + readdir-scoped-modules: 1.1.0 + rimraf: 3.0.2 + semver: 7.5.2 + ssri: 8.0.1 + treeverse: 1.0.4 + walk-up-path: 1.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/fs@1.1.1: + resolution: + { + integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, + } + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@2.1.2: + resolution: + { + integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.2 + dev: true + + /@npmcli/fs@3.1.0: + resolution: + { + integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + semver: 7.5.2 + dev: true + + /@npmcli/git@2.1.0: + resolution: + { + integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==, + } + dependencies: + '@npmcli/promise-spawn': 1.3.2 + lru-cache: 6.0.0 + mkdirp: 1.0.4 + npm-pick-manifest: 6.1.1 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@4.1.0: + resolution: + { + integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.1 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/git@5.0.4: + resolution: + { + integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@npmcli/promise-spawn': 7.0.1 + lru-cache: 10.2.0 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.2 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@1.0.7: + resolution: + { + integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==, + } + engines: { node: '>= 10' } + hasBin: true + dependencies: + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: + { + integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/map-workspaces@2.0.4: + resolution: + { + integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@npmcli/name-from-folder': 1.0.1 + glob: 8.1.0 + minimatch: 5.1.6 + read-package-json-fast: 2.0.3 + dev: true + + /@npmcli/metavuln-calculator@2.0.0: + resolution: + { + integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + dependencies: + cacache: 15.3.0 + json-parse-even-better-errors: 2.3.1 + pacote: 12.0.3 + semver: 7.5.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/move-file@1.1.2: + resolution: + { + integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==, + } + engines: { node: '>=10' } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: + { + integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/name-from-folder@1.0.1: + resolution: + { + integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==, + } + dev: true + + /@npmcli/node-gyp@1.0.3: + resolution: + { + integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==, + } + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: + { + integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@npmcli/package-json@1.0.1: + resolution: + { + integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==, + } + dependencies: + json-parse-even-better-errors: 2.3.1 + dev: true + + /@npmcli/promise-spawn@1.3.2: + resolution: + { + integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==, + } + dependencies: + infer-owner: 1.0.4 + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: + { + integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/promise-spawn@7.0.1: + resolution: + { + integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + which: 4.0.0 + dev: true + + /@npmcli/run-script@2.0.0: + resolution: + { + integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==, + } + dependencies: + '@npmcli/node-gyp': 1.0.3 + '@npmcli/promise-spawn': 1.3.2 + node-gyp: 8.4.1 + read-package-json-fast: 2.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@npmcli/run-script@6.0.2: + resolution: + { + integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/run-script@7.0.2: + resolution: + { + integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 7.0.1 + node-gyp: 10.0.1 + read-package-json-fast: 3.0.2 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nrwl/devkit@17.3.0(nx@17.3.0): + resolution: + { + integrity: sha512-3QUCvRisp0Iwwl7VEFQPQUU7wpqGEv9kJBNBtgmhe68ydusdNPk+d0npwkvH23BYPuswTI2MUJyLkdeiB58Ovw==, + } + dependencies: + '@nx/devkit': 17.3.0(nx@17.3.0) + transitivePeerDependencies: + - nx + dev: true + + /@nrwl/tao@17.3.0: + resolution: + { + integrity: sha512-Bhz+MvAk8CjQtclpEOagGiKzgoziwe+35SlHtvFqzZClAuB8BAx+3ZDNJZcEpDRNfodKqodMUy2OEf6pbzw/LA==, + } + hasBin: true + dependencies: + nx: 17.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + + /@nx/devkit@17.3.0(nx@17.3.0): + resolution: + { + integrity: sha512-KPUkEwkGYrg5hDqqXc7sdv4PNXHyWtGwzkBZA3p/RjPieKcQSsTcUwTxQ+taOE4v877n0HuC7hcuLueLSbYGiQ==, + } + peerDependencies: + nx: '>= 16 <= 18' + dependencies: + '@nrwl/devkit': 17.3.0(nx@17.3.0) + ejs: 3.1.9 + enquirer: 2.3.6 + ignore: 5.3.0 + nx: 17.3.0 + semver: 7.5.3 + tmp: 0.2.1 + tslib: 2.6.2 + yargs-parser: 21.1.1 + dev: true + + /@nx/nx-darwin-arm64@17.3.0: + resolution: + { + integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@nrwl/tao': 17.3.0 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 - axios: 1.6.7 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.3.1 - dotenv-expand: 10.0.0 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - fs-extra: 11.1.1 - ignore: 5.3.0 - jest-diff: 29.6.1 - js-yaml: 4.1.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - semver: 7.5.3 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 17.3.0 - '@nx/nx-darwin-x64': 17.3.0 - '@nx/nx-freebsd-x64': 17.3.0 - '@nx/nx-linux-arm-gnueabihf': 17.3.0 - '@nx/nx-linux-arm64-gnu': 17.3.0 - '@nx/nx-linux-arm64-musl': 17.3.0 - '@nx/nx-linux-x64-gnu': 17.3.0 - '@nx/nx-linux-x64-musl': 17.3.0 - '@nx/nx-win32-arm64-msvc': 17.3.0 - '@nx/nx-win32-x64-msvc': 17.3.0 - transitivePeerDependencies: - - debug - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-hash@2.1.1: - resolution: {integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==} - engines: {node: '>= 6'} - dev: false - - /object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false - - /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) - '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) - aws-sdk: 2.1421.0 - concurrently: 7.6.0 - debug: 4.3.4(supports-color@8.1.1) - find-yarn-workspace-root: 2.0.0 - fs-extra: 8.1.0 - github-slugger: 1.5.0 - got: 11.8.6 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - semver: 7.5.2 - shelljs: 0.8.5 - tslib: 2.6.2 - yeoman-environment: 3.19.3 - yeoman-generator: 5.9.0(yeoman-environment@3.19.3) - yosay: 2.0.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bluebird - - encoding - - mem-fs - - supports-color - - typescript - dev: true - - /on-exit-leak-free@2.1.0: - resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - dependencies: - p-limit: 1.3.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map-series@2.1.0: - resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} - engines: {node: '>=8'} - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-pipe@3.1.0: - resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} - engines: {node: '>=8'} - dev: true - - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: true - - /p-reduce@2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} - dev: true - - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - dependencies: - p-finally: 1.0.0 - dev: true - - /p-transform@1.3.0: - resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} - engines: {node: '>=12.10.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - p-queue: 6.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /p-waterfall@2.1.1: - resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} - engines: {node: '>=8'} - dependencies: - p-reduce: 2.1.0 - dev: true - - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} - engines: {node: '>= 14'} - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - dev: false - - /pacote@12.0.3: - resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true - dependencies: - '@npmcli/git': 2.1.0 - '@npmcli/installed-package-contents': 1.0.7 - '@npmcli/promise-spawn': 1.3.2 - '@npmcli/run-script': 2.0.0 - cacache: 15.3.0 - chownr: 2.0.0 - fs-minipass: 2.1.0 - infer-owner: 1.0.4 - minipass: 3.3.6 - mkdirp: 1.0.4 - npm-package-arg: 8.1.5 - npm-packlist: 3.0.0 - npm-pick-manifest: 6.1.1 - npm-registry-fetch: 12.0.2 - promise-retry: 2.0.1 - read-package-json-fast: 2.0.3 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.8.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pacote@17.0.6: - resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - dependencies: - '@npmcli/git': 5.0.4 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 7.0.1 - '@npmcli/run-script': 7.0.2 - cacache: 18.0.2 - fs-minipass: 3.0.2 - minipass: 7.0.2 - npm-package-arg: 11.0.1 - npm-packlist: 8.0.2 - npm-pick-manifest: 9.0.0 - npm-registry-fetch: 16.1.0 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 7.0.0 - read-package-json-fast: 3.0.2 - sigstore: 2.2.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pad-component@0.0.1: - resolution: {integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==} - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-conflict-json@2.0.2: - resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - json-parse-even-better-errors: 2.3.1 - just-diff: 5.2.0 - just-diff-apply: 5.5.0 - dev: true - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - dependencies: - protocols: 2.0.1 - dev: true - - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - dependencies: - parse-path: 7.0.0 - dev: true - - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /password-prompt@1.1.2: - resolution: {integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==} - dependencies: - ansi-escapes: 3.2.0 - cross-spawn: 6.0.5 - - /password-prompt@1.1.3: - resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} - dependencies: - ansi-escapes: 4.3.2 - cross-spawn: 7.0.3 - dev: false - - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 - - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 - dev: true - - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: true - - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - dev: false - - /pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.4.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.7.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false - - /pino@8.17.2: - resolution: {integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.7.0 - thread-stream: 2.4.0 - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /plimit-lit@1.5.0: - resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} - dependencies: - queue-lit: 1.5.0 - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.45.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier@2.0.5: - resolution: {integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - - /pretty-format@29.6.1: - resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /proc-log@1.0.0: - resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} - dev: true - - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - /promise-all-reject-late@1.0.1: - resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} - dev: true - - /promise-call-limit@1.0.2: - resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} - dev: true - - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: + + /@nx/nx-darwin-x64@17.3.0: + resolution: + { + integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - dev: true - - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - read: 2.1.0 - dev: true - - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: true - - /proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - dev: false - - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: true - - /proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} - dev: true - - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true - - /querystring@0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-lit@1.5.0: - resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false - - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /read-cmd-shim@3.0.1: - resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true - - /read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /read-package-json-fast@2.0.3: - resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} - engines: {node: '>=10'} - dependencies: - json-parse-even-better-errors: 2.3.1 - npm-normalize-package-bin: 1.0.1 - dev: true - - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - glob: 10.3.3 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@7.0.0: - resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - glob: 10.3.3 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 6.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read@2.1.0: - resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - mute-stream: 1.0.0 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - /readdir-scoped-modules@1.1.0: - resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - debuglog: 1.0.1 - dezalgo: 1.0.4 - graceful-fs: 4.2.11 - once: 1.4.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false - - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.2 - dev: true - - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /redeyed@2.1.1: - resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} - dependencies: - esprima: 4.0.1 - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: true - - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false - - /replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 9.3.5 - dev: true - - /rimraf@5.0.1: - resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 10.3.3 - dev: false - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: false - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.1.0 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /samsam@1.3.0: - resolution: {integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==} - deprecated: This package has been deprecated in favour of @sinonjs/samsam - dev: true - - /sax@1.2.1: - resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - dev: true - - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /scoped-regex@2.1.0: - resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} - engines: {node: '>=8'} - dev: true - - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: false - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.2: - resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.1.0 - upper-case-first: 2.0.2 - dev: false - - /sequin@0.1.1: - resolution: {integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==} - engines: {node: '>=0.4.0'} - dev: false - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} - engines: {node: '>=14'} - - /sigstore@1.8.0: - resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@sigstore/bundle': 1.0.0 - '@sigstore/protobuf-specs': 0.2.0 - '@sigstore/tuf': 1.0.3 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /sigstore@2.2.0: - resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 - '@sigstore/sign': 2.2.1 - '@sigstore/tuf': 2.3.0 - '@sigstore/verify': 0.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - - /simple-git@3.16.0: - resolution: {integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==} - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /simple-git@3.19.1: - resolution: {integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==} - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: false - - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - - /sinon@11.1.2: - resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} - deprecated: 16.1.1 - dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/samsam': 6.1.3 - diff: 5.1.0 - nise: 5.1.4 - supports-color: 7.2.0 - dev: true - - /sinon@5.1.1: - resolution: {integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==} - dependencies: - '@sinonjs/formatio': 2.0.0 - diff: 3.5.0 - lodash.get: 4.4.2 - lolex: 2.7.5 - nise: 1.5.3 - supports-color: 5.5.0 - type-detect: 4.0.8 - dev: true - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.1.0 - dev: false - - /socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sonic-boom@3.7.0: - resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} - dependencies: - atomic-sleep: 1.0.0 - dev: false - - /sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /sort-keys@4.2.0: - resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} - engines: {node: '>=8'} - dependencies: - is-plain-obj: 2.1.0 - dev: true - - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /spawn-command@0.0.2-1: - resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true - - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.2 - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: false - - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - /ssri@10.0.4: - resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stdout-stderr@0.1.13: - resolution: {integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==} - engines: {node: '>=8.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - - /strip-bom-buf@1.0.0: - resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} - engines: {node: '>=4'} - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom-stream@2.0.0: - resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} - engines: {node: '>=0.10.0'} - dependencies: - first-chunk-stream: 2.0.0 - strip-bom: 2.0.0 - dev: true - - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - - /strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - dev: true - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /taketalk@1.0.0: - resolution: {integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==} - dependencies: - get-stdin: 4.0.1 - minimist: 1.2.8 - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - /temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': + + /@nx/nx-freebsd-x64@17.3.0: + resolution: + { + integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - esbuild: + + /@nx/nx-linux-arm-gnueabihf@17.3.0: + resolution: + { + integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==, + } + engines: { node: '>= 10' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true - uglify-js: + + /@nx/nx-linux-arm64-gnu@17.3.0: + resolution: + { + integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2 - dev: true - - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /textextensions@5.16.0: - resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} - engines: {node: '>=0.8'} - dev: true - - /thread-stream@2.4.0: - resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} - dependencies: - real-require: 0.2.0 - dev: false - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.2 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /treeverse@1.0.4: - resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': + + /@nx/nx-linux-arm64-musl@17.3.0: + resolution: + { + integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@jest/types': + + /@nx/nx-linux-x64-gnu@17.3.0: + resolution: + { + integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - babel-jest: + + /@nx/nx-linux-x64-musl@17.3.0: + resolution: + { + integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - esbuild: + + /@nx/nx-win32-arm64-msvc@17.3.0: + resolution: + { + integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==, + } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@babel/core': 7.18.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) - jest-util: 29.6.1 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.0.2 - yargs-parser: 21.1.1 - dev: true - - /ts-json-schema-generator@0.93.0: - resolution: {integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - '@types/json-schema': 7.0.12 - commander: 7.2.0 - fast-json-stable-stringify: 2.1.0 - glob: 7.2.3 - json-stable-stringify: 1.0.2 - typescript: 4.3.5 - dev: true - - /ts-loader@9.5.1(typescript@5.0.2)(webpack@5.88.2): - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.2 - source-map: 0.7.4 - typescript: 5.0.2 - webpack: 5.88.2 - dev: true - - /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': + + /@nx/nx-win32-x64-msvc@17.3.0: + resolution: + { + integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==, + } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - '@swc/wasm': + + /@oclif/color@1.0.9: + resolution: + { + integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==, + } + engines: { node: '>=12.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + ansi-styles: 4.3.0 + chalk: 4.1.2 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + tslib: 2.1.0 + dev: true + + /@oclif/command@1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1): + resolution: + { + integrity: sha512-x1evrqQ2bAEuoqkveOCYgIqkj43SntoM02C45gfYNrdvrX8nsne+uzzXzwKcJ0p94qnQRX7PmyxOaRDF7f77xw==, + } + engines: { node: '>=12.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@oclif/config': ^1 + dependencies: + '@oclif/config': 1.18.15 + '@oclif/errors': 1.3.6 + '@oclif/help': 1.0.13(supports-color@8.1.1) + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.14(supports-color@8.1.1): + resolution: + { + integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/config@1.18.15: + resolution: + { + integrity: sha512-eBTiFXGfXSzghc4Yjp3EutYU+6MrHX1kzk4j5i4CsR5AEor43ynXFrzpO6v7IwbR1KyUo+9SYE2D69Y+sHIMpg==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/parser': 3.8.15 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-wsl: 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/core@0.5.41(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-zEYbpxSQr80t7MkLMHOmZr8QCrCIbVrI7fLSZWlsvD2AEM0vvzuhWymjo9/kHy2/kNfxwu7NTI4i2a0zoHu11w==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-ux: 5.6.7(@oclif/config@1.18.15) + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lodash.template: 4.5.0 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.1.0 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/core@2.11.8(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-GILmztcHBzze45GvxRpUvqQI5nM26kSE/Q21Y+6DtMR+C8etM/hFW26D3uqIAbGlGtg5QEZZ6pjA/Fqgz+gl3A==, + } + engines: { node: '>=14.0.0' } + dependencies: + '@types/cli-progress': 3.11.0 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + fs-extra: 9.1.0 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.4 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + ts-node: 10.9.1(@types/node@14.14.7)(typescript@5.0.2) + tslib: 2.6.2 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/core@3.18.1: + resolution: + { + integrity: sha512-l0LsjzGcqjbUEdeSBX6bdZieVmEv82Q0W3StiyaDMEnPZ9KLH28HrLpcZg6d50mCYW9CUZNzmRo6qrCHWrgLKw==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@types/cli-progress': 3.11.5 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + color: 4.2.3 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.3 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/core@3.3.2: + resolution: + { + integrity: sha512-8bZa42d86t5BayJUENKqZN6c5CnX0n3j+JyCWmqI5PP7VsRWZl4YSXFoLFw+mZXKtvwAMrgzMxSGltm5iIXT7w==, + } + engines: { node: '>=18.0.0' } + dependencies: + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + debug: 4.3.4(supports-color@8.1.1) + ejs: 3.1.9 + get-package-type: 0.1.0 + globby: 11.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + dev: false + + /@oclif/errors@1.3.6: + resolution: + { + integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + clean-stack: 3.0.1 + fs-extra: 8.1.0 + indent-string: 4.0.0 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /@oclif/help@1.0.13(supports-color@8.1.1): + resolution: + { + integrity: sha512-/DWgI7umEG3mmTKweKlCJ2a4iS3QIdVYXUltmpFvgfZ6YHPy1DrLRN/l8j9yqawPlPMPn8DfCbINJ9atZ+4Kcw==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/config': 1.18.14(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + chalk: 4.1.2 + indent-string: 4.0.0 + lodash: 4.17.21 + string-width: 4.2.3 + strip-ansi: 6.0.1 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@oclif/linewrap@1.0.0: + resolution: + { + integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==, + } + dev: true + + /@oclif/parser@3.8.15: + resolution: + { + integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + chalk: 4.1.2 + tslib: 2.6.2 + dev: true + + /@oclif/plugin-command-snapshot@3.0.0(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-YzOx45mBdIbQ5AciPz/5GaM3m3ppYQdxyTBoHPDgzXReDiMgQJKdOkhLR9epB1kNySfVCiwpm1tu9zAXMvXgwg==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 0.5.41(@oclif/config@1.18.15) + chalk: 4.1.2 + just-diff: 3.1.1 + semver: 7.5.2 + sinon: 11.1.2 + ts-json-schema-generator: 0.93.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + - supports-color + dev: true + + /@oclif/plugin-commands@3.0.3: + resolution: + { + integrity: sha512-xIs+6Ka7qm7XZOkezpTmAU0h90GZOlctLCnbK80Kh/Qr3wQJJR/w9jEQ0PLaMzc9u1zQRqBLIhl24DuFFESw+g==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@oclif/core': 3.3.2 + lodash.pickby: 4.6.0 + lodash.sortby: 4.7.0 + lodash.template: 4.5.0 + lodash.uniqby: 4.7.0 + dev: false + + /@oclif/plugin-help@5.2.17(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-8dhvATZZnkD8uq3etsvbVjjpdxiTqXTPjkMlU8ToQz09DL5BBzYApm65iTHFE0Vn9DPbKcNxX1d8YiF3ilgMOQ==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + /@oclif/plugin-not-found@2.3.34(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-uXUpw6o2e0aqnNn+XkGL7LbL+Th2rBD1JGtFbb6anmvUvz2skiGz0o23BYmrQW8tvU92ajPOykfClKD75ptZcw==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/color': 1.0.9 + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@oclif/plugin-warn-if-update-available@2.0.45(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-MEncCUHW1vCOQdvt1z46jAblwvuGcs3Q1Gjl8IghazGJ0GRHzGOMILABpqVWR5uH/YJ3gfs05Tt7M4LdZ40N3g==, + } + engines: { node: '>=12.0.0' } + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 9.1.0 + http-call: 5.3.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + dev: true + + /@oclif/screen@1.0.4: + resolution: + { + integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==, + } + engines: { node: '>=8.0.0' } + deprecated: Deprecated in favor of @oclif/core + dev: true + + /@oclif/test@2.0.0: + resolution: + { + integrity: sha512-DNMhGCKX1b3k/rCNmmTxftXNw0luiCDDfkvh/bEWsZN8PoyhN9Na/zJvzaB1eWbKXSg5qzkTpWpOc2AjYA6rMQ==, + } + engines: { node: '>=8.0.0' } + dependencies: + fancy-test: 1.4.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@octokit/auth-token@2.5.0: + resolution: + { + integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, + } + dependencies: + '@octokit/types': 6.41.0 + dev: true + + /@octokit/auth-token@3.0.4: + resolution: + { + integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==, + } + engines: { node: '>= 14' } + dev: true + + /@octokit/core@3.6.0: + resolution: + { + integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, + } + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/core@4.2.4: + resolution: + { + integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@6.0.12: + resolution: + { + integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, + } + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/endpoint@7.0.6: + resolution: + { + integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql@4.8.0: + resolution: + { + integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, + } + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/graphql@5.0.6: + resolution: + { + integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@12.11.0: + resolution: + { + integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, + } + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: + { + integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==, + } + dev: true + + /@octokit/plugin-enterprise-rest@6.0.1: + resolution: + { + integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, + } + dev: true + + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, + } + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==, + } + engines: { node: '>= 14' } + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: + { + integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, + } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: + { + integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==, + } + engines: { node: '>= 14' } + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@2.1.0: + resolution: + { + integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, + } + dependencies: + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: + { + integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@5.6.3: + resolution: + { + integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, + } + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/request@6.2.8: + resolution: + { + integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@18.12.0: + resolution: + { + integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==, + } + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.11: + resolution: + { + integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==, + } + engines: { node: '>= 14' } + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: + { + integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==, + } + dev: true + + /@octokit/types@10.0.0: + resolution: + { + integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==, + } + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@octokit/types@6.41.0: + resolution: + { + integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, + } + dependencies: + '@octokit/openapi-types': 12.11.0 + dev: true + + /@octokit/types@9.3.2: + resolution: + { + integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==, + } + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } + requiresBuild: true optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': + + /@salesforce/apex-node@3.0.2: + resolution: + { + integrity: sha512-lHa7XnQCivuwTtO0RBTqw+nZ4Qm4ymodqpNJwefFLk6KBEva9sMV9Ksj2x6kBGGbLyO6ZiJiUMSAN6Gcny60zg==, + } + engines: { node: '>=18.18.2' } + dependencies: + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@types/istanbul-reports': 3.0.4 + faye: 1.4.0 + glob: 10.3.10 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + jsforce: 2.0.0-beta.29 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/core@6.5.1: + resolution: + { + integrity: sha512-u/R82JGdbJCMY0EN3UY5hQUxn0gPN+ParNQIm9YPB9lDpBQv82nKeZJuH6j2LsaaF6ygY3bm79kftPxpdKbggQ==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@salesforce/kit': 3.0.15 + '@salesforce/schemas': 1.6.1 + '@salesforce/ts-types': 2.0.9 + '@types/semver': 7.5.6 + ajv: 8.12.0 + change-case: 4.1.2 + faye: 1.4.0 + form-data: 4.0.0 + js2xmlparser: 4.0.2 + jsforce: 2.0.0-beta.29 + jsonwebtoken: 9.0.2 + jszip: 3.10.1 + pino: 8.17.2 + pino-abstract-transport: 1.1.0 + pino-pretty: 10.3.1 + proper-lockfile: 4.1.2 + semver: 7.5.4 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/dev-config@3.0.1: + resolution: + { + integrity: sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ==, + } + dev: true + + /@salesforce/kit@3.0.15: + resolution: + { + integrity: sha512-XkA8jsuLvVnyP460dAbU3pBFP2IkmmmsVxMQVifcKKbNWaIBbZBzAfj+vdaQfnvZyflLhsrFT3q2xkb0vHouPg==, + } + dependencies: + '@salesforce/ts-types': 2.0.9 + tslib: 2.6.2 + dev: false + + /@salesforce/packaging@3.2.5: + resolution: + { + integrity: sha512-vEydpa7gjr8vn35MezRPxoJE3b7f/fzIU9uBwgONf8THCJ7PMhj9PPfWOXfNp+/7qorqmYIVCJxMFWpJrMStlQ==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@oclif/core': 3.3.2 + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/schemas': 1.6.1 + '@salesforce/source-deploy-retrieve': 10.2.13 + '@salesforce/ts-types': 2.0.9 + fast-xml-parser: 4.3.3 + globby: 11.1.0 + graphology: 0.25.4(graphology-types@0.24.7) + graphology-traversal: 0.3.1(graphology-types@0.24.7) + graphology-types: 0.24.7 + jsforce: 2.0.0-beta.29 + jszip: 3.10.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/schemas@1.6.1: + resolution: + { + integrity: sha512-eVy947ZMxCJReKJdgfddUIsBIbPTa/i8RwQGwxq4/ss38H5sLOAeSTaun9V7HpJ1hkpDznWKfgzYvjsst9K6ig==, + } + dev: false + + /@salesforce/source-deploy-retrieve@10.2.13: + resolution: + { + integrity: sha512-KreSALl+mr+Yd7AoG+e6CjtD0/2FT4IS6Zvs4R0bbK/blixONycwl+zGaLia2b0X2pvitUOszMouW6aM0SAgvQ==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/ts-types': 2.0.9 + fast-levenshtein: 3.0.0 + fast-xml-parser: 4.3.3 + got: 11.8.6 + graceful-fs: 4.2.11 + ignore: 5.3.0 + jszip: 3.10.1 + mime: 2.6.0 + minimatch: 5.1.6 + proxy-agent: 6.3.1 + ts-retry-promise: 0.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/source-tracking@5.1.7: + resolution: + { + integrity: sha512-kkXWt4X+wxmYsLqG1OIWKgo3aFEg1f+1X6MBIHIrmjEmfMXIRiGX0dRyY+IjFl54w+CnOffNDQNsGSmnPImEYg==, + } + engines: { node: '>=18.0.0' } + dependencies: + '@oclif/core': 3.18.1 + '@salesforce/core': 6.5.1 + '@salesforce/kit': 3.0.15 + '@salesforce/source-deploy-retrieve': 10.2.13 + '@salesforce/ts-types': 2.0.9 + fast-xml-parser: 4.2.7 + graceful-fs: 4.2.11 + isomorphic-git: 1.23.0 + ts-retry-promise: 0.8.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@salesforce/ts-sinon@1.3.21: + resolution: + { + integrity: sha512-sb0Ii3utcuNSh5fjsAyyXhnANKD0D0LHiLME1gAz/2bLhPLA5+l6PtAYZbLZxl2V3zXux8He53aiz8Kc6ApKEg==, + } + dependencies: + '@salesforce/ts-types': 1.7.3 + sinon: 5.1.1 + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@1.7.3: + resolution: + { + integrity: sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw==, + } + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.5: + resolution: + { + integrity: sha512-X91De9ZK/X86lYcFAzoAt/pPeY6Lf+G7LyAJRx3FuYpdc+nocvniUnnJGXwSmyKMMxW2NifvQgST7FTZLZ5REA==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.7: + resolution: + { + integrity: sha512-8csXgstPuy6QXL3JavkIi/f8DOWHBNCvWeszrFu5sbVlcKO3YqOOCE+rDFGPkrZsYv5OywV6H8kEi877bWOz6Q==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + dev: true + + /@salesforce/ts-types@2.0.9: + resolution: + { + integrity: sha512-boUD9jw5vQpTCPCCmK/NFTWjSuuW+lsaxOynkyNXLW+zxOc4GDjhtKc4j0vWZJQvolpafbyS8ZLFHZJvs12gYA==, + } + engines: { node: '>=16.0.0' } + dependencies: + tslib: 2.6.2 + dev: false + + /@sigstore/bundle@1.0.0: + resolution: + { + integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + dev: true + + /@sigstore/bundle@2.1.1: + resolution: + { + integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/core@0.2.0: + resolution: + { + integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dev: true + + /@sigstore/protobuf-specs@0.2.0: + resolution: + { + integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: + { + integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@sigstore/sign@2.2.1: + resolution: + { + integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@1.0.3: + resolution: + { + integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@2.3.0: + resolution: + { + integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/verify@0.1.0: + resolution: + { + integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + dev: true + + /@sindresorhus/is@4.6.0: + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: '>=10' } + + /@sinonjs/commons@1.8.6: + resolution: + { + integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@2.0.0: + resolution: + { + integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: + { + integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: + { + integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, + } + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/fake-timers@7.1.2: + resolution: + { + integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/formatio@2.0.0: + resolution: + { + integrity: sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==, + } + dependencies: + samsam: 1.3.0 + dev: true + + /@sinonjs/formatio@3.2.2: + resolution: + { + integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam': 3.3.3 + dev: true + + /@sinonjs/samsam@3.3.3: + resolution: + { + integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + array-from: 2.1.1 + lodash: 4.17.21 + dev: true + + /@sinonjs/samsam@6.1.3: + resolution: + { + integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: + { + integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, + } + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: + { + integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, + } + engines: { node: '>=10' } + dependencies: + defer-to-connect: 2.0.1 + + /@tootallnate/once@1.1.2: + resolution: + { + integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, + } + engines: { node: '>= 6' } + dev: true + + /@tootallnate/once@2.0.0: + resolution: + { + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + } + engines: { node: '>= 10' } + dev: true + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: + { + integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, + } + dev: false + + /@tsconfig/node10@1.0.9: + resolution: + { + integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, + } + + /@tsconfig/node12@1.0.11: + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } + + /@tsconfig/node14@1.0.3: + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } + + /@tsconfig/node16@1.0.4: + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } + + /@tufjs/canonical-json@1.0.0: + resolution: + { + integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /@tufjs/canonical-json@2.0.0: + resolution: + { + integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dev: true + + /@tufjs/models@1.0.4: + resolution: + { + integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.3 + dev: true + + /@tufjs/models@2.0.0: + resolution: + { + integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 + dev: true + + /@types/adm-zip@0.4.33: + resolution: + { + integrity: sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/async-retry@1.4.2: + resolution: + { + integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==, + } + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/async-retry@1.4.5: + resolution: + { + integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==, + } + dependencies: + '@types/retry': 0.12.2 + dev: true + + /@types/babel__core@7.20.1: + resolution: + { + integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==, + } + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: + { + integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, + } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/babel__template@7.4.1: + resolution: + { + integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, + } + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: + { + integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==, + } + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: + { + integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, + } + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 14.14.7 + '@types/responselike': 1.0.0 + + /@types/chai@4.3.5: + resolution: + { + integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==, + } + dev: true + + /@types/cli-progress@3.11.0: + resolution: + { + integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/cli-progress@3.11.5: + resolution: + { + integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==, + } + dependencies: + '@types/node': 14.14.7 + dev: false + + /@types/datadog-metrics@0.6.1: + resolution: + { + integrity: sha512-p6zVpfmNcXwtcXjgpz7do/fKyfndGhU5sGJVtb5Gn5PvLDiQUAgD0mI/itf/99sBi9DRxeyhFQ9dQF6OxxQNbA==, + } + dev: true + + /@types/diff-match-patch@1.0.32: + resolution: + { + integrity: sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==, + } + dev: true + + /@types/eslint-scope@3.7.4: + resolution: + { + integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==, + } + dependencies: + '@types/eslint': 8.44.0 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.0: + resolution: + { + integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==, + } + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.1: + resolution: + { + integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, + } + dev: true + + /@types/expect@1.20.4: + resolution: + { + integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==, + } + dev: true + + /@types/fs-extra@11.0.4: + resolution: + { + integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==, + } + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 14.14.7 + dev: true + + /@types/fs-extra@9.0.11: + resolution: + { + integrity: sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==, + } + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/glob@8.1.0: + resolution: + { + integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==, + } + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 14.14.7 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: + { + integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/http-cache-semantics@4.0.1: + resolution: + { + integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, + } + + /@types/istanbul-lib-coverage@2.0.4: + resolution: + { + integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, + } + + /@types/istanbul-lib-report@3.0.0: + resolution: + { + integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, + } + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + + /@types/istanbul-reports@3.0.1: + resolution: + { + integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, + } + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: false + + /@types/jest@29.5.3: + resolution: + { + integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==, + } + dependencies: + expect: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /@types/js-yaml@4.0.5: + resolution: + { + integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==, + } + dev: true + + /@types/json-schema@7.0.12: + resolution: + { + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + } + dev: true + + /@types/jsonfile@6.1.4: + resolution: + { + integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==, + } + dependencies: + '@types/node': 14.14.7 + dev: true + + /@types/keyv@3.1.4: + resolution: + { + integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/lodash@4.14.191: + resolution: + { + integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==, + } + dev: true + + /@types/lodash@4.14.195: + resolution: + { + integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==, + } + dev: true + + /@types/marked@4.0.2: + resolution: + { + integrity: sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==, + } + dev: true + + /@types/minimatch@3.0.5: + resolution: + { + integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, + } + dev: true + + /@types/minimatch@5.1.2: + resolution: + { + integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, + } + dev: true + + /@types/minimist@1.2.2: + resolution: + { + integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, + } + dev: true + + /@types/mocha@5.2.7: + resolution: + { + integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==, + } + dev: true + + /@types/mocha@9.1.0: + resolution: + { + integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==, + } + dev: true + + /@types/node@10.0.0: + resolution: + { + integrity: sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==, + } + dev: true + + /@types/node@12.20.55: + resolution: + { + integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, + } + dev: false + + /@types/node@14.14.7: + resolution: + { + integrity: sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==, + } + + /@types/node@15.14.9: + resolution: + { + integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==, + } + dev: true + + /@types/node@20.4.4: + resolution: + { + integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==, + } + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: + { + integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, + } + dev: true + + /@types/parse-json@4.0.0: + resolution: + { + integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, + } + dev: true + + /@types/prettier@2.7.3: + resolution: + { + integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, + } + dev: true + + /@types/q@1.5.2: + resolution: + { + integrity: sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==, + } + dev: true + + /@types/responselike@1.0.0: + resolution: + { + integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, + } + dependencies: + '@types/node': 14.14.7 + + /@types/retry@0.12.2: + resolution: + { + integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, + } + dev: true + + /@types/rimraf@3.0.2: + resolution: + { + integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==, + } + dependencies: + '@types/glob': 8.1.0 + '@types/node': 14.14.7 + dev: true + + /@types/semver@7.5.2: + resolution: + { + integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, + } + dev: true + + /@types/semver@7.5.6: + resolution: + { + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + } + dev: false + + /@types/sinon@10.0.15: + resolution: + { + integrity: sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==, + } + dependencies: + '@types/sinonjs__fake-timers': 8.1.2 + dev: true + + /@types/sinonjs__fake-timers@8.1.2: + resolution: + { + integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==, + } + dev: true + + /@types/stack-utils@2.0.1: + resolution: + { + integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, + } + dev: true + + /@types/vinyl@2.0.7: + resolution: + { + integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==, + } + dependencies: + '@types/expect': 1.20.4 + '@types/node': 14.14.7 + dev: true + + /@types/xml2js@0.4.5: + resolution: + { + integrity: sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==, + } + dependencies: + '@types/node': 10.0.0 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: + { + integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, + } + dev: true + + /@types/yargs@17.0.24: + resolution: + { + integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==, + } + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.53.0: + resolution: + { + integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.53.0(eslint@8.33.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.33.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.53.0: + resolution: + { + integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@typescript-eslint/typescript-estree@5.53.0(typescript@5.0.2): + resolution: + { + integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.53.0(eslint@8.33.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.2 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@5.0.2) + eslint: 8.33.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.33.0) + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.53.0: + resolution: + { + integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: + { + integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==, + } + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: + { + integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + } + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: + { + integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + } + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: + { + integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==, + } + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: + { + integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + } + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: + { + integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + } + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: + { + integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: + { + integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + } + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: + { + integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + } + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: + { + integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + } + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: + { + integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: + { + integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: + { + integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: + { + integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: + { + integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==, + } + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } + dev: true + + /@xtuc/long@4.2.2: + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: + { + integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, + } + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: + { + integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==, + } + engines: { node: '>=14.15.0' } + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: + { + integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /JSONStream@1.3.5: + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abbrev@1.1.1: + resolution: + { + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, + } + dev: true + + /abbrev@2.0.0: + resolution: + { + integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: '>=6.5' } + dependencies: + event-target-shim: 5.0.1 + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: + { + integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, + } + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: '>=0.4.0' } + + /acorn@8.10.0: + resolution: + { + integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, + } + engines: { node: '>=0.4.0' } + hasBin: true + + /add-stream@1.0.0: + resolution: + { + integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, + } + dev: true + + /adm-zip@0.5.10: + resolution: + { + integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==, + } + engines: { node: '>=6.0' } + dev: false + + /agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: '>= 6.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agent-base@7.1.0: + resolution: + { + integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, + } + engines: { node: '>= 14' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /agentkeepalive@4.3.0: + resolution: + { + integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==, + } + engines: { node: '>= 8.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: '>=8' } + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.11.0: + resolution: + { + integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-colors@4.1.3: + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } + dev: true + + /ansi-escapes@3.2.0: + resolution: + { + integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, + } + engines: { node: '>=4' } + + /ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } + dependencies: + type-fest: 0.21.3 + + /ansi-escapes@5.0.0: + resolution: + { + integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, + } + engines: { node: '>=12' } + dependencies: + type-fest: 1.4.0 + dev: false + + /ansi-regex@2.1.1: + resolution: + { + integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ansi-regex@3.0.1: + resolution: + { + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, + } + engines: { node: '>=4' } + dev: true + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } + + /ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: '>=12' } + + /ansi-styles@2.2.1: + resolution: + { + integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } + dev: true + + /ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } + + /ansicolors@0.3.2: + resolution: + { + integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, + } + + /antlr4ts@0.5.0-alpha.4: + resolution: + { + integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==, + } + dev: false + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /apex-parser@2.13.0: + resolution: + { + integrity: sha512-+k5F0p+7P5wJtJ9FSPqliUX/ao4+kX1SWnYvrU6xvU2A4OrXp6oQ7L8I6I7uhLrL0OhPuUeJXKcX6KaExOEf6w==, + } + engines: { node: '>=8.0.0' } + dependencies: + antlr4ts: 0.5.0-alpha.4 + node-dir: 0.1.17 + dev: false + + /aproba@2.0.0: + resolution: + { + integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, + } + dev: true + + /are-we-there-yet@2.0.0: + resolution: + { + integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, + } + engines: { node: '>=10' } + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /are-we-there-yet@3.0.1: + resolution: + { + integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } + + /argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-differ@3.0.0: + resolution: + { + integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, + } + engines: { node: '>=8' } + dev: true + + /array-from@2.1.1: + resolution: + { + integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, + } + dev: true + + /array-ify@1.0.0: + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } + dev: true + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: '>=8' } + + /arrify@1.0.1: + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /arrify@2.0.1: + resolution: + { + integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, + } + engines: { node: '>=8' } + dev: true + + /asap@2.0.6: + resolution: + { + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, + } + + /ast-types@0.13.4: + resolution: + { + integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, + } + engines: { node: '>=4' } + dependencies: + tslib: 2.1.0 + dev: false + + /astral-regex@2.0.0: + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: '>=8' } + + /async-lock@1.4.0: + resolution: + { + integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==, + } + dev: false + + /async-retry@1.3.3: + resolution: + { + integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, + } + dependencies: + retry: 0.13.1 + dev: false + + /async@3.2.4: + resolution: + { + integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, + } + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + /at-least-node@1.0.0: + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: '>= 4.0.0' } + + /atomic-sleep@1.0.0: + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: '>=8.0.0' } + dev: false + + /available-typed-arrays@1.0.5: + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + } + engines: { node: '>= 0.4' } + dev: true + + /aws-sdk@2.1421.0: + resolution: + { + integrity: sha512-t262eTnaP6mQrntuNV3f2mxNn12EFcAGdy9ipY805+YUtyJ0oUKqrJZB5Zjkd4xhEKIF9AcDAB0u1ApTX+8Ogg==, + } + engines: { node: '>= 10.0.0' } + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: 0.12.5 + uuid: 8.0.0 + xml2js: 0.5.0 + dev: true + + /axios@1.4.0: + resolution: + { + integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, + } + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.6.7: + resolution: + { + integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, + } + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /babel-jest@29.6.1(@babel/core@7.18.2): + resolution: + { + integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.18.2 + '@jest/transform': 29.6.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0(@babel/core@7.18.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + } + engines: { node: '>=8' } + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.5.0: + resolution: + { + integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2): + resolution: + { + integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, + } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.18.2): + resolution: + { + integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.2 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + dev: true + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + /base64url@3.0.1: + resolution: + { + integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, + } + engines: { node: '>=6.0.0' } + dev: false + + /basic-ftp@5.0.3: + resolution: + { + integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, + } + engines: { node: '>=10.0.0' } + dev: false + + /before-after-hook@2.2.3: + resolution: + { + integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, + } + dev: true + + /better-sqlite3@8.4.0: + resolution: + { + integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, + } + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + + /bignumber.js@9.1.1: + resolution: + { + integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==, + } + dev: false + + /bin-links@3.0.3: + resolution: + { + integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + cmd-shim: 5.0.0 + mkdirp-infer-owner: 2.0.0 + npm-normalize-package-bin: 2.0.0 + read-cmd-shim: 3.0.1 + rimraf: 3.0.2 + write-file-atomic: 4.0.2 + dev: true + + /binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: '>=8' } + dev: true + + /binaryextensions@4.18.0: + resolution: + { + integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==, + } + engines: { node: '>=0.8' } + dev: true + + /bindings@1.5.0: + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bottleneck@2.19.5: + resolution: + { + integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, + } + dev: false + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: '>=8' } + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.9: + resolution: + { + integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.469 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + + /bs-logger@0.2.6: + resolution: + { + integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, + } + engines: { node: '>= 6' } + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + } + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: + { + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, + } + dev: false + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@4.9.2: + resolution: + { + integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /builtins@1.0.3: + resolution: + { + integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, + } + dev: true + + /builtins@5.0.1: + resolution: + { + integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, + } + dependencies: + semver: 7.5.2 + dev: true + + /byte-size@8.1.1: + resolution: + { + integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, + } + engines: { node: '>=12.17' } + dev: true + + /cacache@15.3.0: + resolution: + { + integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==, + } + engines: { node: '>= 10' } + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@16.1.3: + resolution: + { + integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.15 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.3: + resolution: + { + integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacache@18.0.2: + resolution: + { + integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.2 + glob: 10.3.3 + lru-cache: 10.2.0 + minipass: 7.0.4 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.4 + tar: 6.1.15 + unique-filename: 3.0.0 + dev: true + + /cacheable-lookup@5.0.4: + resolution: + { + integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, + } + engines: { node: '>=10.6.0' } + + /cacheable-request@7.0.4: + resolution: + { + integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, + } + engines: { node: '>=8' } + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.3 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-bind@1.0.2: + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } + dev: true + + /camel-case@4.1.2: + resolution: + { + integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + } + dependencies: + pascal-case: 3.1.2 + tslib: 2.1.0 + dev: false + + /camelcase-keys@6.2.2: + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: '>=8' } + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } + dev: true + + /camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } + dev: true + + /caniuse-lite@1.0.30001517: + resolution: + { + integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==, + } + dev: true + + /capital-case@1.0.4: + resolution: + { + integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /cardinal@2.1.1: + resolution: + { + integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, + } + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + /chalk@1.1.3: + resolution: + { + integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.0: + resolution: + { + integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: false + + /change-case@4.1.2: + resolution: + { + integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==, + } + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /char-regex@1.0.2: + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: '>=10' } + dev: true + + /chardet@0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: '>= 8.10.0' } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /chownr@2.0.0: + resolution: + { + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + } + engines: { node: '>=10' } + + /chrome-trace-event@1.0.3: + resolution: + { + integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, + } + engines: { node: '>=6.0' } + dev: true + + /ci-info@3.8.0: + resolution: + { + integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, + } + engines: { node: '>=8' } + dev: true + + /cjs-module-lexer@1.2.3: + resolution: + { + integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==, + } + dev: true + + /clean-git-ref@2.0.1: + resolution: + { + integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==, + } + dev: false + + /clean-stack@2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: '>=6' } + dev: true + + /clean-stack@3.0.1: + resolution: + { + integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==, + } + engines: { node: '>=10' } + dependencies: + escape-string-regexp: 4.0.0 + + /cli-boxes@1.0.0: + resolution: + { + integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: '>=8' } + dependencies: + restore-cursor: 3.1.0 + + /cli-progress@3.12.0: + resolution: + { + integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==, + } + engines: { node: '>=4' } + dependencies: + string-width: 4.2.3 + + /cli-spinners@2.6.1: + resolution: + { + integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, + } + engines: { node: '>=6' } + dev: true + + /cli-spinners@2.9.0: + resolution: + { + integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==, + } + engines: { node: '>=6' } + dev: true + + /cli-table3@0.6.3: + resolution: + { + integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, + } + engines: { node: 10.* || >= 12.* } + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: false + + /cli-table@0.3.11: + resolution: + { + integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==, + } + engines: { node: '>= 0.2.0' } + dependencies: + colors: 1.0.3 + + /cli-ux@5.6.7(@oclif/config@1.18.15): + resolution: + { + integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==, + } + engines: { node: '>=8.0.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@oclif/command': 1.8.27(@oclif/config@1.18.15)(supports-color@8.1.1) + '@oclif/errors': 1.3.6 + '@oclif/linewrap': 1.0.0 + '@oclif/screen': 1.0.4 + ansi-escapes: 4.3.2 + ansi-styles: 4.3.0 + cardinal: 2.1.1 + chalk: 4.1.2 + clean-stack: 3.0.1 + cli-progress: 3.12.0 + extract-stack: 2.0.0 + fs-extra: 8.1.0 + hyperlinker: 1.0.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + natural-orderby: 2.0.3 + object-treeify: 1.1.33 + password-prompt: 1.1.2 + semver: 7.5.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + supports-hyperlinks: 2.3.0 + tslib: 2.1.0 + transitivePeerDependencies: + - '@oclif/config' + dev: true + + /cli-width@3.0.0: + resolution: + { + integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, + } + engines: { node: '>= 10' } + + /cliui@7.0.4: + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: + { + integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, + } + engines: { node: '>= 0.10' } + dev: true + + /clone-deep@4.0.1: + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: '>=6' } + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-response@1.0.3: + resolution: + { + integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, + } + dependencies: + mimic-response: 1.0.1 + + /clone-stats@1.0.0: + resolution: + { + integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, + } + dev: true + + /clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: '>=0.8' } + dev: true + + /clone@2.1.2: + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: '>=0.8' } + + /cloneable-readable@1.1.3: + resolution: + { + integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, + } + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /cmd-shim@5.0.0: + resolution: + { + integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + mkdirp-infer-owner: 2.0.0 + dev: true + + /cmd-shim@6.0.1: + resolution: + { + integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /co@4.6.0: + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } + dev: true + + /code-point-at@1.1.0: + resolution: + { + integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /collect-v8-coverage@1.0.2: + resolution: + { + integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, + } + dev: true + + /color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + dev: true + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support@1.1.3: + resolution: + { + integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, + } + hasBin: true + dev: true + + /color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: '>=12.5.0' } + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + dev: false + + /colors@1.0.3: + resolution: + { + integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==, + } + engines: { node: '>=0.1.90' } + + /columnify@1.6.0: + resolution: + { + integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, + } + engines: { node: '>=8.0.0' } + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + dev: true + + /commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } + dev: false + + /commander@7.1.0: + resolution: + { + integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==, + } + engines: { node: '>= 10' } + dev: true + + /commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: '>= 10' } + dev: true + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /common-ancestor-path@1.0.1: + resolution: + { + integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, + } + dev: true + + /commondir@1.0.1: + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } + dev: true + + /compare-func@2.0.0: + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + requiresBuild: true + + /concat-stream@2.0.0: + resolution: + { + integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, + } + engines: { '0': node >= 6.0 } + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: + { + integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==, + } + engines: { node: ^12.20.0 || ^14.13.0 || >=16.0.0 } + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /console-control-strings@1.1.0: + resolution: + { + integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, + } + dev: true + + /constant-case@3.0.4: + resolution: + { + integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case: 2.0.2 + dev: false + + /content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: + { + integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, + } + engines: { node: '>=10' } + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: + { + integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, + } + engines: { node: '>=16' } + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: + { + integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, + } + engines: { node: '>=10' } + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@5.0.1: + resolution: + { + integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, + } + engines: { node: '>=14' } + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: true + + /conventional-changelog-preset-loader@3.0.0: + resolution: + { + integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, + } + engines: { node: '>=14' } + dev: true + + /conventional-changelog-writer@6.0.1: + resolution: + { + integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.2 + split: 1.0.1 + dev: true + + /conventional-commits-filter@3.0.0: + resolution: + { + integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, + } + engines: { node: '>=14' } + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: + { + integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: + { + integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: + { + integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: true + + /convert-source-map@1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + dev: true + + /convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + dev: true + + /core-js-pure@3.31.1: + resolution: + { + integrity: sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==, + } + requiresBuild: true + dev: false + + /core-js@3.31.1: + resolution: + { + integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==, + } + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + /cosmiconfig@7.1.0: + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.2.0: + resolution: + { + integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==, + } + engines: { node: '>=14' } + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /crc-32@1.2.2: + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: '>=0.8' } + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } + + /cross-spawn@6.0.5: + resolution: + { + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, + } + engines: { node: '>=4.8' } + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: '>= 8' } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /csprng@0.1.2: + resolution: + { + integrity: sha512-D3WAbvvgUVIqSxUfdvLeGjuotsB32bvfVPd+AaaTWMtyUeC9zgCnw5xs94no89yFLVsafvY9dMZEhTwsY/ZecA==, + } + engines: { node: '>=0.6.0' } + dependencies: + sequin: 0.1.1 + dev: false + + /csv-parse@4.16.3: + resolution: + { + integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, + } + dev: false + + /csv-stringify@5.6.5: + resolution: + { + integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, + } + dev: false + + /dargs@7.0.0: + resolution: + { + integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + } + engines: { node: '>=8' } + dev: true + + /data-uri-to-buffer@5.0.1: + resolution: + { + integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==, + } + engines: { node: '>= 14' } + dev: false + + /datadog-metrics@0.9.3: + resolution: + { + integrity: sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg==, + } + dependencies: + debug: 3.1.0 + dogapi: 2.8.4 + transitivePeerDependencies: + - supports-color + dev: false + + /date-fns@2.30.0: + resolution: + { + integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, + } + engines: { node: '>=0.11' } + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /dateformat@3.0.3: + resolution: + { + integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, + } + dev: true + + /dateformat@4.6.3: + resolution: + { + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, + } + + /debug@3.1.0: + resolution: + { + integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, + } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /debuglog@1.0.1: + resolution: + { + integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==, + } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /decamelize-keys@1.1.1: + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: '>=0.10.0' } + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: '>=10' } + dependencies: + mimic-response: 3.1.0 + + /dedent@0.7.0: + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: '>=4.0.0' } + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + dev: true + + /deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: '>=0.10.0' } + dev: true + + /defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: '>=10' } + + /define-lazy-prop@2.0.0: + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } + dev: true + + /degenerator@5.0.1: + resolution: + { + integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, + } + engines: { node: '>= 14' } + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } + + /delegates@1.0.0: + resolution: + { + integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, + } + dev: true + + /depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } + dev: true + + /deprecation@2.3.1: + resolution: + { + integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, + } + dev: true + + /detect-indent@5.0.0: + resolution: + { + integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, + } + engines: { node: '>=4' } + dev: true + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: '>=8' } + dev: false + + /detect-newline@3.1.0: + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: '>=8' } + dev: true + + /dezalgo@1.0.4: + resolution: + { + integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==, + } + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-match-patch@1.0.5: + resolution: + { + integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, + } + dev: false + + /diff-sequences@29.4.3: + resolution: + { + integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /diff3@0.0.3: + resolution: + { + integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==, + } + dev: false + + /diff@3.5.0: + resolution: + { + integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, + } + engines: { node: '>=0.3.1' } + dev: true + + /diff@4.0.2: + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } + + /diff@5.1.0: + resolution: + { + integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, + } + engines: { node: '>=0.3.1' } + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: '>=8' } + dependencies: + path-type: 4.0.0 + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: '>=6.0.0' } + dependencies: + esutils: 2.0.3 + dev: true + + /dogapi@2.8.4: + resolution: + { + integrity: sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg==, + } + hasBin: true + dependencies: + extend: 3.0.2 + json-bigint: 1.0.0 + lodash: 4.17.21 + minimist: 1.2.8 + rc: 1.2.8 + dev: false + + /dot-case@3.0.4: + resolution: + { + integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /dot-prop@5.3.0: + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: '>=8' } + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@10.0.0: + resolution: + { + integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==, + } + engines: { node: '>=12' } + dev: true + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: '>=12' } + + /duplexer@0.1.2: + resolution: + { + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, + } + dev: true + + /eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + /ecdsa-sig-formatter@1.0.11: + resolution: + { + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ejs@3.1.9: + resolution: + { + integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, + } + engines: { node: '>=0.10.0' } + hasBin: true + dependencies: + jake: 10.8.7 + + /electron-to-chromium@1.4.469: + resolution: + { + integrity: sha512-HRN9XQjElxJBrdDky5iiUUr3eDwXGTg6Cp4IV8MuNc8VqMkYSneSnIe6poFKx9PsNzkudCgaWCBVxwDqirwQWQ==, + } + dev: true + + /emittery@0.13.1: + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + } + engines: { node: '>=12' } + dev: true + + /emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + /emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + /encoding@0.1.13: + resolution: + { + integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, + } + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true optional: true - '@swc/wasm': + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + + /enhanced-resolve@5.15.0: + resolution: + { + integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, + } + engines: { node: '>=10.13.0' } + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: + { + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, + } + engines: { node: '>=8.6' } + dependencies: + ansi-colors: 4.1.3 + dev: true + + /env-paths@2.2.1: + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: '>=6' } + dev: true + + /envinfo@7.8.1: + resolution: + { + integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==, + } + engines: { node: '>=4' } + hasBin: true + dev: true + + /err-code@2.0.3: + resolution: + { + integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, + } + dev: true + + /error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error@10.4.0: + resolution: + { + integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==, + } + dev: true + + /es-module-lexer@1.3.0: + resolution: + { + integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==, + } + dev: true + + /escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: '>=6' } + dev: true + + /escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } + + /escape-string-regexp@2.0.0: + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + } + engines: { node: '>=8' } + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } + + /escodegen@2.1.0: + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + } + engines: { node: '>=6.0' } + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-scope@5.1.1: + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: '>=8.0.0' } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.1: + resolution: + { + integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.33.0): + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: '>=10' } + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: + { + integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /eslint@8.33.0: + resolution: + { + integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.1 + eslint-utils: 3.0.0(eslint@8.33.0) + eslint-visitor-keys: 3.4.1 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.2 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: true + + /esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } + hasBin: true + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: '>=0.10' } + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: '>=4.0' } + dev: true + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } + + /esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } + + /event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: '>=6' } + + /eventemitter3@4.0.7: + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } + dev: true + + /events@1.1.1: + resolution: + { + integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==, + } + engines: { node: '>=0.4.x' } + dev: true + + /events@3.3.0: + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: '>=0.8.x' } + + /execa@5.0.0: + resolution: + { + integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, + } + engines: { node: '>=10' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + } + engines: { node: '>= 0.8.0' } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: '>=6' } + dev: false + + /expect@29.6.1: + resolution: + { + integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/expect-utils': 29.6.1 + '@types/node': 14.14.7 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + dev: true + + /exponential-backoff@3.1.1: + resolution: + { + integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==, + } + dev: true + + /extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + dev: false + + /external-editor@3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: '>=4' } + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + /extract-stack@2.0.0: + resolution: + { + integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==, + } + engines: { node: '>=8' } + dev: true + + /fancy-test@1.4.10: + resolution: + { + integrity: sha512-AaUX6wKS7D5OP2YK2q5G7c8PGx2lgoyLUD7Bbg8z323sb9aebBqzb9UN6phzI73UgO/ViihmNfOxF3kdfZLhew==, + } + engines: { node: '>=8.0.0' } + dependencies: + '@types/chai': 4.3.5 + '@types/lodash': 4.14.195 + '@types/node': 14.14.7 + '@types/sinon': 10.0.15 + lodash: 4.17.21 + mock-stdin: 1.0.0 + nock: 13.3.2 + stdout-stderr: 0.1.13 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-copy@3.0.1: + resolution: + { + integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==, + } + dev: false + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.3.1: + resolution: + { + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + } + engines: { node: '>=8.6.0' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + dev: true + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + dev: true + + /fast-levenshtein@3.0.0: + resolution: + { + integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==, + } + dependencies: + fastest-levenshtein: 1.0.16 + + /fast-redact@3.3.0: + resolution: + { + integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==, + } + engines: { node: '>=6' } + dev: false + + /fast-safe-stringify@2.1.1: + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } + dev: false + + /fast-xml-parser@4.2.7: + resolution: + { + integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==, + } + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fast-xml-parser@4.3.3: + resolution: + { + integrity: sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==, + } + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + + /fastest-levenshtein@1.0.16: + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: '>= 4.9.1' } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: '>=0.8.0' } + dependencies: + websocket-driver: 0.7.4 + dev: false + + /faye@1.4.0: + resolution: + { + integrity: sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==, + } + engines: { node: '>=0.8.0' } + dependencies: + asap: 2.0.6 + csprng: 0.1.2 + faye-websocket: 0.11.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + dev: false + + /fb-watchman@2.0.2: + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + } + dependencies: + bser: 2.1.1 + dev: true + + /figures@3.2.0: + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: '>=8' } + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + dev: false + + /filelist@1.0.4: + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + } + dependencies: + minimatch: 5.1.6 + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: '>=8' } + dependencies: + to-regex-range: 5.0.1 + + /find-java-home@2.0.0: + resolution: + { + integrity: sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==, + } + dependencies: + which: 1.0.9 + winreg: 1.2.4 + dev: false + + /find-up@2.1.0: + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: '>=4' } + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /find-yarn-workspace-root@2.0.0: + resolution: + { + integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, + } + dependencies: + micromatch: 4.0.5 + dev: true + + /first-chunk-stream@2.0.0: + resolution: + { + integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==, + } + engines: { node: '>=0.10.0' } + dependencies: + readable-stream: 2.3.8 + dev: true + + /flat-cache@3.0.4: + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } + hasBin: true + dev: true + + /flatted@3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + dev: true + + /follow-redirects@1.15.2: + resolution: + { + integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, + } + engines: { node: '>=4.0' } + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /follow-redirects@1.15.5: + resolution: + { + integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, + } + engines: { node: '>=4.0' } + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + } + engines: { node: '>=14' } + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: '>= 6' } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + + /fs-extra@10.1.0: + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.0: + resolution: + { + integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, + } + engines: { node: '>=14.14' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra@11.1.1: + resolution: + { + integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, + } + engines: { node: '>=14.14' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@8.1.0: + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: '>=6 <7 || >=8' } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@9.1.0: + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: '>=10' } + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: + { + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + + /fs-minipass@3.0.2: + resolution: + { + integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.2: + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 14.14.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /ts-node@10.9.2(@types/node@10.0.0)(typescript@5.0.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': + + /function-bind@1.1.1: + resolution: + { + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + } + dev: true + + /gauge@3.0.2: + resolution: + { + integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, + } + engines: { node: '>=10' } + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gauge@4.0.4: + resolution: + { + integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } + dev: true + + /get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + dev: true + + /get-intrinsic@1.2.1: + resolution: + { + integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, + } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-package-type@0.1.0: + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + } + engines: { node: '>=8.0.0' } + + /get-pkg-repo@4.2.1: + resolution: + { + integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, + } + engines: { node: '>=6.9.0' } + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port@5.1.1: + resolution: + { + integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, + } + engines: { node: '>=8' } + dev: true + + /get-stdin@4.0.1: + resolution: + { + integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /get-stream@5.2.0: + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: '>=8' } + dependencies: + pump: 3.0.0 + + /get-stream@6.0.0: + resolution: + { + integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, + } + engines: { node: '>=10' } + dev: true + + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } + dev: true + + /get-uri@6.0.1: + resolution: + { + integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==, + } + engines: { node: '>= 14' } + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /git-raw-commits@2.0.11: + resolution: + { + integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-raw-commits@3.0.0: + resolution: + { + integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: + { + integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, + } + engines: { node: '>=4' } + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@5.0.1: + resolution: + { + integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.5.2 + dev: true + + /git-up@7.0.0: + resolution: + { + integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, + } + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: + { + integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==, + } + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: + { + integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, + } + dependencies: + ini: 1.3.8 + dev: true + + /github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + dev: false + + /github-slugger@1.5.0: + resolution: + { + integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, + } + dev: true + + /github-username@6.0.0: + resolution: + { + integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==, + } + engines: { node: '>=10' } + dependencies: + '@octokit/rest': 18.12.0 + transitivePeerDependencies: + - encoding + dev: true + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@10.3.10: + resolution: + { + integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, + } + engines: { node: '>=16 || 14 >=14.17' } + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@10.3.3: + resolution: + { + integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==, + } + engines: { node: '>=16 || 14 >=14.17' } + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: '>=12' } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /glob@9.3.5: + resolution: + { + integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + + /global-dirs@0.1.1: + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: '>=4' } + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: '>=4' } + dev: true + + /globals@13.20.0: + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: '>=8' } + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: '>=10' } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + + /gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /got@11.8.6: + resolution: + { + integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, + } + engines: { node: '>=10.19.0' } + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + /grapheme-splitter@1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } + dev: true + + /graphology-indices@0.17.0(graphology-types@0.24.7): + resolution: + { + integrity: sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==, + } + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + mnemonist: 0.39.5 + dev: false + + /graphology-traversal@0.3.1(graphology-types@0.24.7): + resolution: + { + integrity: sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==, + } + peerDependencies: + graphology-types: '>=0.20.0' + dependencies: + graphology-indices: 0.17.0(graphology-types@0.24.7) + graphology-types: 0.24.7 + graphology-utils: 2.5.2(graphology-types@0.24.7) + dev: false + + /graphology-types@0.24.7: + resolution: + { + integrity: sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==, + } + dev: false + + /graphology-utils@2.5.2(graphology-types@0.24.7): + resolution: + { + integrity: sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==, + } + peerDependencies: + graphology-types: '>=0.23.0' + dependencies: + graphology-types: 0.24.7 + dev: false + + /graphology@0.25.4(graphology-types@0.24.7): + resolution: + { + integrity: sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==, + } + peerDependencies: + graphology-types: '>=0.24.0' + dependencies: + events: 3.3.0 + graphology-types: 0.24.7 + obliterator: 2.0.4 + dev: false + + /grouped-queue@2.0.0: + resolution: + { + integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==, + } + engines: { node: '>=8.0.0' } + dev: true + + /handlebars@4.7.7: + resolution: + { + integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, + } + engines: { node: '>=0.4.7' } + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + /hard-rejection@2.1.0: + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: '>=6' } + dev: true + + /has-ansi@2.0.0: + resolution: + { + integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } + + /has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: '>= 0.4' } + dev: true + + /has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: '>= 0.4' } + dev: true + + /has-tostringtag@1.0.0: + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + } + engines: { node: '>= 0.4' } + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: + { + integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, + } + dev: true + + /has@1.0.3: + resolution: + { + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + } + engines: { node: '>= 0.4.0' } + dependencies: + function-bind: 1.1.1 + dev: true + + /header-case@2.0.4: + resolution: + { + integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==, + } + dependencies: + capital-case: 1.0.4 + tslib: 2.1.0 + dev: false + + /help-me@5.0.0: + resolution: + { + integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, + } + dev: false + + /hosted-git-info@2.8.9: + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + dev: true + + /hosted-git-info@3.0.8: + resolution: + { + integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, + } + engines: { node: '>=10' } + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@4.1.0: + resolution: + { + integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, + } + engines: { node: '>=10' } + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: + { + integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + lru-cache: 7.18.3 + dev: true + + /hosted-git-info@7.0.1: + resolution: + { + integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + lru-cache: 10.2.0 + dev: true + + /hot-shots@8.5.0: + resolution: + { + integrity: sha512-GNXtNSxa9qibcPhi3gndyN5g14iBJS+/DDlu7hjSPfXYJy9/fcO13DgSyfPUVWrD/aIyPY36z7MksHvDe05zYg==, + } + engines: { node: '>=6.0.0' } + optionalDependencies: + unix-dgram: 2.0.6 + dev: false + + /html-escaper@2.0.2: + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } + + /http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + /http-call@5.3.0: + resolution: + { + integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==, + } + engines: { node: '>=8.0.0' } + dependencies: + content-type: 1.0.5 + debug: 4.3.4(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /http-parser-js@0.5.8: + resolution: + { + integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, + } + dev: false + + /http-proxy-agent@4.0.1: + resolution: + { + integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, + } + engines: { node: '>= 6' } + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@5.0.0: + resolution: + { + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + } + engines: { node: '>= 6' } + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /http2-wrapper@1.0.3: + resolution: + { + integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, + } + engines: { node: '>=10.19.0' } + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: '>= 6' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@7.0.2: + resolution: + { + integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } + dev: true + + /humanize-ms@1.2.1: + resolution: + { + integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, + } + dependencies: + ms: 2.1.3 + dev: true + + /hyperlinker@1.0.0: + resolution: + { + integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==, + } + engines: { node: '>=4' } + + /iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true optional: true - '@swc/wasm': + + /ieee754@1.1.13: + resolution: + { + integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==, + } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + /ignore-walk@4.0.1: + resolution: + { + integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==, + } + engines: { node: '>=10' } + dependencies: + minimatch: 3.1.2 + dev: true + + /ignore-walk@5.0.1: + resolution: + { + integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minimatch: 5.1.6 + dev: true + + /ignore-walk@6.0.3: + resolution: + { + integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore-walk@6.0.4: + resolution: + { + integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: '>= 4' } + + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: '>= 4' } + + /immediate@3.0.6: + resolution: + { + integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, + } + dev: false + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: '>=6' } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: + { + integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, + } + engines: { node: '>=8' } + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } + dev: true + + /indent-string@4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } + + /infer-owner@1.0.4: + resolution: + { + integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, + } + dev: true + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + /init-package-json@5.0.0: + resolution: + { + integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-package-arg: 10.1.0 + promzard: 1.0.0 + read: 2.1.0 + read-package-json: 6.0.4 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + dev: true + + /inquirer@7.3.3: + resolution: + { + integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, + } + engines: { node: '>=8.0.0' } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: false + + /inquirer@8.2.5: + resolution: + { + integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, + } + engines: { node: '>=12.0.0' } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /interpret@1.4.0: + resolution: + { + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + } + engines: { node: '>= 0.10' } + dev: true + + /ip@1.1.8: + resolution: + { + integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, + } + dev: false + + /ip@2.0.0: + resolution: + { + integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, + } + + /is-arguments@1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + dev: true + + /is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: '>=8' } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } + dev: true + + /is-ci@3.0.1: + resolution: + { + integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, + } + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.12.1: + resolution: + { + integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==, + } + dependencies: + has: 1.0.3 + dev: true + + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } + hasBin: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } + + /is-fullwidth-code-point@1.0.0: + resolution: + { + integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, + } + engines: { node: '>=0.10.0' } + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: + { + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, + } + engines: { node: '>=4' } + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } + + /is-generator-fn@2.1.0: + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + } + engines: { node: '>=6' } + dev: true + + /is-generator-function@1.0.10: + resolution: + { + integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, + } + engines: { node: '>= 0.4' } + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: '>=8' } + dev: true + + /is-lambda@1.0.1: + resolution: + { + integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, + } + dev: true + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } + + /is-obj@2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: '>=8' } + dev: true + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: '>=8' } + dev: true + + /is-plain-obj@1.1.0: + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-plain-obj@2.1.0: + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + } + engines: { node: '>=8' } + dev: true + + /is-plain-object@2.0.4: + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: '>=0.10.0' } + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-retry-allowed@1.2.0: + resolution: + { + integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /is-scoped@2.1.0: + resolution: + { + integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==, + } + engines: { node: '>=8' } + dependencies: + scoped-regex: 2.1.0 + dev: true + + /is-ssh@1.4.0: + resolution: + { + integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==, + } + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@2.0.0: + resolution: + { + integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, + } + engines: { node: '>=8' } + dev: true + + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } + dev: true + + /is-text-path@1.0.1: + resolution: + { + integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, + } + engines: { node: '>=0.10.0' } + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.12: + resolution: + { + integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, + } + engines: { node: '>= 0.4' } + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: '>=10' } + dev: true + + /is-utf8@0.2.1: + resolution: + { + integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, + } + dev: true + + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } + dependencies: + is-docker: 2.2.1 + + /isarray@0.0.1: + resolution: + { + integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, + } + dev: true + + /isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + /isbinaryfile@4.0.10: + resolution: + { + integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, + } + engines: { node: '>= 8.0.0' } + dev: true + + /isbinaryfile@5.0.0: + resolution: + { + integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==, + } + engines: { node: '>= 14.0.0' } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /isexe@3.1.1: + resolution: + { + integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, + } + engines: { node: '>=16' } + dev: true + + /isobject@3.0.1: + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /isomorphic-git@1.23.0: + resolution: + { + integrity: sha512-7mQlnZivFwrU6B3CswvmoNtVN8jqF9BcLf80uk7yh4fNA8PhFjAfQigi2Hu/Io0cmIvpOc7vn0/Rq3KtL5Ph8g==, + } + engines: { node: '>=12' } + hasBin: true + dependencies: + async-lock: 1.4.0 + clean-git-ref: 2.0.1 + crc-32: 1.2.2 + diff3: 0.0.3 + ignore: 5.2.4 + minimisted: 2.0.1 + pako: 1.0.11 + pify: 4.0.1 + readable-stream: 3.6.2 + sha.js: 2.4.11 + simple-get: 4.0.1 + dev: false + + /istanbul-lib-coverage@3.2.0: + resolution: + { + integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, + } + engines: { node: '>=8' } + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: '>=8' } + + /istanbul-lib-instrument@5.2.1: + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + } + engines: { node: '>=8' } + dependencies: + '@babel/core': 7.18.2 + '@babel/parser': 7.22.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps@4.0.1: + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + } + engines: { node: '>=10' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: + { + integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==, + } + engines: { node: '>=8' } + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /jackspeak@2.2.2: + resolution: + { + integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==, + } + engines: { node: '>=14' } + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jackspeak@2.3.6: + resolution: + { + integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, + } + engines: { node: '>=14' } + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.8.7: + resolution: + { + integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + /jest-changed-files@29.5.0: + resolution: + { + integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.6.1: + resolution: + { + integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.6.1 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + p-limit: 3.1.0 + pretty-format: 29.6.1 + pure-rand: 6.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.9.2) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 10.0.0 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.7.0(@types/node@14.14.7)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@10.9.2): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@10.0.0)(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@14.14.7)(ts-node@9.1.1): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.2 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 20.4.4 + babel-jest: 29.6.1(@babel/core@7.18.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff@29.6.1: + resolution: + { + integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-docblock@29.4.3: + resolution: + { + integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.6.1: + resolution: + { + integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.6.1 + pretty-format: 29.6.1 + dev: true + + /jest-environment-node@29.6.1: + resolution: + { + integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-mock: 29.6.1 + jest-util: 29.6.1 + dev: true + + /jest-get-type@29.4.3: + resolution: + { + integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-haste-map@29.6.1: + resolution: + { + integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 14.14.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.6.1 + jest-worker: 29.6.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector@29.6.1: + resolution: + { + integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-matcher-utils@29.6.1: + resolution: + { + integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-message-util@29.6.1: + resolution: + { + integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.6.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.6.1: + resolution: + { + integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + jest-util: 29.6.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + } + engines: { node: '>=6' } + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.6.1 + dev: true + + /jest-regex-util@29.4.3: + resolution: + { + integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-resolve-dependencies@29.6.1: + resolution: + { + integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.6.1: + resolution: + { + integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) + jest-util: 29.6.1 + jest-validate: 29.6.1 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.6.1: + resolution: + { + integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.6.1 + '@jest/environment': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.6.1 + jest-haste-map: 29.6.1 + jest-leak-detector: 29.6.1 + jest-message-util: 29.6.1 + jest-resolve: 29.6.1 + jest-runtime: 29.6.1 + jest-util: 29.6.1 + jest-watcher: 29.6.1 + jest-worker: 29.6.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.6.1: + resolution: + { + integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/globals': 29.6.1 + '@jest/source-map': 29.6.0 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.6.1: + resolution: + { + integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.18.2 + '@babel/generator': 7.22.9 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.18.2) + '@babel/types': 7.22.5 + '@jest/expect-utils': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2) + chalk: 4.1.2 + expect: 29.6.1 + graceful-fs: 4.2.11 + jest-diff: 29.6.1 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + natural-compare: 1.4.0 + pretty-format: 29.6.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.6.1: + resolution: + { + integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.6.1: + resolution: + { + integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.6.1 + dev: true + + /jest-watcher@29.6.1: + resolution: + { + integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.6.1 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: '>= 10.13.0' } + dependencies: + '@types/node': 14.14.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.6.1: + resolution: + { + integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@types/node': 14.14.7 + jest-util: 29.6.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.6.1(@types/node@10.0.0)(ts-node@10.9.2): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.9.2) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@10.0.0)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@14.14.7)(ts-node@10.7.0): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@10.7.0) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest@29.6.1(@types/node@20.4.4)(ts-node@9.1.1): + resolution: + { + integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.1(ts-node@9.1.1) + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.1(@types/node@20.4.4)(ts-node@9.1.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jmespath@0.16.0: + resolution: + { + integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==, + } + engines: { node: '>= 0.6.0' } + dev: true + + /joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } + dev: false + + /js-sdsl@4.4.2: + resolution: + { + integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==, + } + dev: true + + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: true + + /js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /js2xmlparser@4.0.2: + resolution: + { + integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, + } + dependencies: + xmlcreate: 2.0.4 + dev: false + + /jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: '>=4' } + hasBin: true + dev: true + + /jsforce@2.0.0-beta.27: + resolution: + { + integrity: sha512-d9dDWWeHwayRKPo8FJBAIUyk8sNXGSHwdUjR6al3yK0YKci27Jc1XfNaQTxEAuymHQJVaCb1gxTKqmA4uznFdQ==, + } + engines: { node: '>=8.0' } + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /jsforce@2.0.0-beta.29: + resolution: + { + integrity: sha512-Fq7xjOYOikyozZZDQNTfzsAdhcO0rUXwtavsjM+cCYUFiCMVOJJavgco303zOsJk3v8sdAYnGgHyKckLIhnyAg==, + } + engines: { node: '>=8.0' } + hasBin: true + dependencies: + '@babel/runtime': 7.22.6 + '@babel/runtime-corejs3': 7.22.6 + '@types/node': 12.20.55 + abort-controller: 3.0.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.31.1 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + faye: 1.4.0 + form-data: 4.0.0 + fs-extra: 8.1.0 + https-proxy-agent: 5.0.1 + inquirer: 7.3.3 + multistream: 3.1.0 + node-fetch: 2.6.12 + open: 7.4.2 + regenerator-runtime: 0.13.11 + strip-ansi: 6.0.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /json-bigint@1.0.0: + resolution: + { + integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, + } + dependencies: + bignumber.js: 9.1.1 + dev: false + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /json-parse-better-errors@1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + dev: true + + /json-parse-even-better-errors@3.0.0: + resolution: + { + integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + dev: true + + /json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + dev: true + + /json-stable-stringify@1.0.2: + resolution: + { + integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==, + } + dependencies: + jsonify: 0.0.1 + dev: true + + /json-stringify-nice@1.1.4: + resolution: + { + integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, + } + dev: true + + /json-stringify-safe@5.0.1: + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } + dev: true + + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: + { + integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==, + } + dev: true + + /jsonparse@1.3.1: + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { '0': node >= 0.2.0 } + dev: true + + /jsonwebtoken@9.0.2: + resolution: + { + integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, + } + engines: { node: '>=12', npm: '>=6' } + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /jszip@3.10.1: + resolution: + { + integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, + } + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /just-diff-apply@5.5.0: + resolution: + { + integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, + } + dev: true + + /just-diff@3.1.1: + resolution: + { + integrity: sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==, + } + dev: true + + /just-diff@5.2.0: + resolution: + { + integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==, + } + dev: true + + /just-extend@4.2.1: + resolution: + { + integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, + } + dev: true + + /jwa@1.4.1: + resolution: + { + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, + } + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: + { + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, + } + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keyv@4.5.3: + resolution: + { + integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + } + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } + dev: true + + /lerna@8.0.2: + resolution: + { + integrity: sha512-nnOIGI5V5Af9gfraNcMVoV1Fry/y7/h3nCQYk0/CMzBYDD+xbNL3DH8+c82AJkNR5ABslmpXjW4DLJ11/1b3CQ==, + } + engines: { node: '>=18.0.0' } + hasBin: true + dependencies: + '@lerna/create': 8.0.2 + '@npmcli/run-script': 7.0.2 + '@nx/devkit': 17.3.0(nx@17.3.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.2.0 + dedent: 0.7.0 + envinfo: 7.8.1 + execa: 5.0.0 + fs-extra: 11.1.1 + get-port: 5.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + import-local: 3.1.0 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.5 + is-ci: 3.0.1 + is-stream: 2.0.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + libnpmaccess: 7.0.2 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 17.3.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-pipe: 3.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + pacote: 17.0.6 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.5.2 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + typescript: 5.0.2 + upath: 2.0.1 + uuid: 9.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: '>=6' } + dev: true + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libnpmaccess@7.0.2: + resolution: + { + integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish@7.3.0: + resolution: + { + integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + ci-info: 3.8.0 + normalize-package-data: 5.0.0 + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + semver: 7.5.2 + sigstore: 1.8.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /lie@3.3.0: + resolution: + { + integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, + } + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + dev: true + + /lines-and-columns@2.0.3: + resolution: + { + integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /load-json-file@4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@6.2.0: + resolution: + { + integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, + } + engines: { node: '>=8' } + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /load-yaml-file@0.2.0: + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: '>=6' } + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: '>=6.11.5' } + dev: true + + /locate-path@2.0.0: + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: '>=4' } + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash._reinterpolate@3.0.0: + resolution: + { + integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==, + } + + /lodash.get@4.4.2: + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } + dev: true + + /lodash.includes@4.3.0: + resolution: + { + integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, + } + dev: false + + /lodash.isboolean@3.0.3: + resolution: + { + integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, + } + dev: false + + /lodash.isinteger@4.0.4: + resolution: + { + integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, + } + dev: false + + /lodash.ismatch@4.4.0: + resolution: + { + integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, + } + dev: true + + /lodash.isnumber@3.0.3: + resolution: + { + integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, + } + dev: false + + /lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + dev: false + + /lodash.isstring@4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + dev: false + + /lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + dev: true + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + dev: true + + /lodash.once@4.1.1: + resolution: + { + integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, + } + dev: false + + /lodash.pickby@4.6.0: + resolution: + { + integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, + } + dev: false + + /lodash.sortby@4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + dev: false + + /lodash.template@4.5.0: + resolution: + { + integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==, + } + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + + /lodash.templatesettings@4.2.0: + resolution: + { + integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==, + } + dependencies: + lodash._reinterpolate: 3.0.0 + + /lodash.uniqby@4.7.0: + resolution: + { + integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, + } + dev: false + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + /log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /lolex@2.7.5: + resolution: + { + integrity: sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==, + } + dev: true + + /lolex@5.1.2: + resolution: + { + integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==, + } + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /lower-case@2.0.2: + resolution: + { + integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /lowercase-keys@2.0.0: + resolution: + { + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, + } + engines: { node: '>=8' } + + /lru-cache@10.0.0: + resolution: + { + integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==, + } + engines: { node: 14 || >=16.14 } + + /lru-cache@10.2.0: + resolution: + { + integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==, + } + engines: { node: 14 || >=16.14 } + dev: true + + /lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: '>=10' } + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: '>=12' } + + /make-dir@2.1.0: + resolution: + { + integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, + } + engines: { node: '>=6' } + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@4.0.0: + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.4 + + /make-error@1.3.6: + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } + + /make-fetch-happen@10.2.1: + resolution: + { + integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + agentkeepalive: 4.3.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: + { + integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + agentkeepalive: 4.3.0 + cacache: 17.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@13.0.0: + resolution: + { + integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@npmcli/agent': 2.2.0 + cacache: 18.0.2 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.2 + minipass-fetch: 3.0.3 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + ssri: 10.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen@9.1.0: + resolution: + { + integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==, + } + engines: { node: '>= 10' } + dependencies: + agentkeepalive: 4.3.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } + dependencies: + tmpl: 1.0.5 + dev: true + + /map-obj@1.0.1: + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /map-obj@4.3.0: + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: '>=8' } + dev: true + + /markdown-table-ts@1.0.3: + resolution: + { + integrity: sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==, + } + dev: false + + /markdown-table@2.0.0: + resolution: + { + integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==, + } + dependencies: + repeat-string: 1.6.1 + dev: false + + /marked-terminal@5.1.1(marked@4.0.16): + resolution: + { + integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, + } + engines: { node: '>=14.13.1 || >=16.0.0' } + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + ansi-escapes: 5.0.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 4.0.16 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + dev: false + + /marked@4.0.16: + resolution: + { + integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==, + } + engines: { node: '>= 12' } + hasBin: true + dev: false + + /mem-fs-editor@9.7.0(mem-fs@2.3.0): + resolution: + { + integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==, + } + engines: { node: '>=12.10.0' } + peerDependencies: + mem-fs: ^2.1.0 + peerDependenciesMeta: + mem-fs: + optional: true + dependencies: + binaryextensions: 4.18.0 + commondir: 1.0.1 + deep-extend: 0.6.0 + ejs: 3.1.9 + globby: 11.1.0 + isbinaryfile: 5.0.0 + mem-fs: 2.3.0 + minimatch: 7.4.6 + multimatch: 5.0.0 + normalize-path: 3.0.0 + textextensions: 5.16.0 + dev: true + + /mem-fs@2.3.0: + resolution: + { + integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==, + } + engines: { node: '>=12' } + dependencies: + '@types/node': 15.14.9 + '@types/vinyl': 2.0.7 + vinyl: 2.2.1 + vinyl-file: 3.0.0 + dev: true + + /meow@8.1.2: + resolution: + { + integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, + } + engines: { node: '>=10' } + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: '>=8.6' } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } + dependencies: + mime-db: 1.52.0 + + /mime@2.6.0: + resolution: + { + integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, + } + engines: { node: '>=4.0.0' } + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } + + /mimic-response@1.0.1: + resolution: + { + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, + } + engines: { node: '>=4' } + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: '>=10' } + + /min-indent@1.0.1: + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } + dev: true + + /minimatch@3.0.5: + resolution: + { + integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, + } + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: '>=10' } + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: '>=10' } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: + { + integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: '>= 6' } + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + /minimisted@2.0.1: + resolution: + { + integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==, + } + dependencies: + minimist: 1.2.8 + dev: false + + /minipass-collect@1.0.2: + resolution: + { + integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-collect@2.0.1: + resolution: + { + integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + minipass: 7.0.4 + dev: true + + /minipass-fetch@1.4.1: + resolution: + { + integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@2.1.2: + resolution: + { + integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.3: + resolution: + { + integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: + { + integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: + { + integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==, + } + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: + { + integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: + { + integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, + } + engines: { node: '>=8' } + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: + { + integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + } + engines: { node: '>=8' } + dependencies: + yallist: 4.0.0 + + /minipass@4.2.8: + resolution: + { + integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, + } + engines: { node: '>=8' } + dev: true + + /minipass@5.0.0: + resolution: + { + integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + } + engines: { node: '>=8' } + + /minipass@7.0.2: + resolution: + { + integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==, + } + engines: { node: '>=16 || 14 >=14.17' } + + /minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + } + engines: { node: '>=16 || 14 >=14.17' } + dev: true + + /minizlib@2.1.2: + resolution: + { + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /mkdirp-infer-owner@2.0.0: + resolution: + { + integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==, + } + engines: { node: '>=10' } + dependencies: + chownr: 2.0.0 + infer-owner: 1.0.4 + mkdirp: 1.0.4 + dev: true + + /mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: '>=10' } + hasBin: true + + /mnemonist@0.39.5: + resolution: + { + integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==, + } + dependencies: + obliterator: 2.0.4 + dev: false + + /mock-stdin@1.0.0: + resolution: + { + integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==, + } + dev: true + + /modify-values@1.0.1: + resolution: + { + integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, + } + engines: { node: '>=0.10.0' } + dev: true + + /ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + /multimatch@5.0.0: + resolution: + { + integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, + } + engines: { node: '>=10' } + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + + /multistream@3.1.0: + resolution: + { + integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==, + } + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /mute-stream@0.0.8: + resolution: + { + integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, + } + + /mute-stream@1.0.0: + resolution: + { + integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /mylas@2.1.13: + resolution: + { + integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==, + } + engines: { node: '>=12.0.0' } + dev: true + + /nan@2.17.0: + resolution: + { + integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, + } + requiresBuild: true + dev: false optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 10.0.0 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@9.1.1(typescript@4.9.5): - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} - engines: {node: '>=10.0.0'} - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.9.5 - yn: 3.1.1 - dev: true - - /ts-node@9.1.1(typescript@5.0.2): - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} - engines: {node: '>=10.0.0'} - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 5.0.2 - yn: 3.1.1 - dev: true - - /ts-retry-promise@0.7.1: - resolution: {integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==} - engines: {node: '>=6'} - dev: false - - /ts-retry-promise@0.8.0: - resolution: {integrity: sha512-elI/GkojPANBikPaMWQnk4T/bOJ6tq/hqXyQRmhfC9PAD6MoHmXIXK7KilJrlpx47VAKCGcmBrTeK5dHk6YAYg==} - engines: {node: '>=6'} - dev: false - - /tsc-alias@1.8.3: - resolution: {integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==} - hasBin: true - dependencies: - chokidar: 3.5.3 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.5.0 - dev: true - - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - /tslib@2.1.0: - resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsutils@3.21.0(typescript@5.0.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.2 - dev: true - - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4(supports-color@8.1.1) - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /tuf-js@2.2.0: - resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - '@tufjs/models': 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - make-fetch-happen: 13.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - /type-fest@0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: false - - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true - - /typescript@4.3.5: - resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - optional: true - - /unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - dependencies: - unique-slug: 2.0.2 - dev: true - - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - unique-slug: 3.0.0 - dev: true - - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - unique-slug: 4.0.0 - dev: true - - /unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - - /unix-dgram@2.0.6: - resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} - engines: {node: '>=0.10.48'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: false - optional: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.1.0 - dev: false - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.1.0 - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url@0.10.3: - resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - - /uuid@8.0.0: - resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} - hasBin: true - dev: true - - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - dependencies: - builtins: 1.0.3 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - builtins: 5.0.1 - dev: true - - /vinyl-file@3.0.0: - resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - strip-bom-buf: 1.0.0 - strip-bom-stream: 2.0.0 - vinyl: 2.2.1 - dev: true - - /vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} - dependencies: - clone: 2.1.2 - clone-buffer: 1.0.0 - clone-stats: 1.0.0 - cloneable-readable: 1.1.3 - remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 - dev: true - - /walk-up-path@1.0.0: - resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} - dev: true - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: + + /napi-build-utils@1.0.2: + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } + dev: false + + /natural-compare-lite@1.4.0: + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } + dev: true + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + dev: true + + /natural-orderby@2.0.3: + resolution: + { + integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==, + } + + /negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } + dev: true + + /neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + + /netmask@2.0.2: + resolution: + { + integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, + } + engines: { node: '>= 0.4.0' } + dev: false + + /neverthrow@4.2.1: + resolution: + { + integrity: sha512-faWQGNqVQrXOuG8K7E0PRzsfBHzfVqeDX9nwawKDseuH/qEGIH02Nrq03OJOs5eTFML03xeol3otzagPoHyEPA==, + } + dev: false + + /neverthrow@4.4.2: + resolution: + { + integrity: sha512-QVY0ylzBF71pUdLshRrqtweMgqKnE3R37/T82Z5bhO/z8P9z96PC/5pEl2FmiZSy0p+3lsjKerh6jmTWM5fv2g==, + } + dev: false + + /nice-try@1.0.5: + resolution: + { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } + + /nise@1.5.3: + resolution: + { + integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==, + } + dependencies: + '@sinonjs/formatio': 3.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + lolex: 5.1.2 + path-to-regexp: 1.8.0 + dev: true + + /nise@5.1.4: + resolution: + { + integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==, + } + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: + { + integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, + } + dependencies: + lower-case: 2.0.2 + tslib: 2.1.0 + dev: false + + /nock@13.3.2: + resolution: + { + integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==, + } + engines: { node: '>= 10.13' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /node-abi@3.45.0: + resolution: + { + integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.2 + dev: false + + /node-cache@5.1.2: + resolution: + { + integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==, + } + engines: { node: '>= 8.0.0' } + dependencies: + clone: 2.1.2 + dev: false + + /node-dir@0.1.17: + resolution: + { + integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==, + } + engines: { node: '>= 0.10.5' } + dependencies: + minimatch: 3.1.2 + dev: false + + /node-emoji@1.11.0: + resolution: + { + integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, + } + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.12: + resolution: + { + integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@2.6.7: + resolution: + { + integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp@10.0.1: + resolution: + { + integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.3.10 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.0 + nopt: 7.2.0 + proc-log: 3.0.0 + semver: 7.5.2 + tar: 6.1.15 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /node-gyp@8.4.1: + resolution: + { + integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==, + } + engines: { node: '>= 10.12.0' } + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-gyp@9.4.0: + resolution: + { + integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==, + } + engines: { node: ^12.13 || ^14.13 || >=16 } + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 11.1.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.2 + tar: 6.1.15 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } + dev: true + + /node-machine-id@1.1.12: + resolution: + { + integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==, + } + dev: true + + /node-releases@2.0.13: + resolution: + { + integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, + } + dev: true + + /nopt@5.0.0: + resolution: + { + integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, + } + engines: { node: '>=6' } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: + { + integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@7.2.0: + resolution: + { + integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + + /normalize-package-data@2.5.0: + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: + { + integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: + { + integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@6.0.0: + resolution: + { + integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.12.1 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } + dev: true + + /normalize-url@6.1.0: + resolution: + { + integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, + } + engines: { node: '>=10' } + + /npm-bundled@1.1.2: + resolution: + { + integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==, + } + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-bundled@3.0.0: + resolution: + { + integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@4.0.0: + resolution: + { + integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==, + } + engines: { node: '>=10' } + dependencies: + semver: 7.5.2 + dev: true + + /npm-install-checks@6.1.1: + resolution: + { + integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + semver: 7.5.2 + dev: true + + /npm-normalize-package-bin@1.0.1: + resolution: + { + integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==, + } + dev: true + + /npm-normalize-package-bin@2.0.0: + resolution: + { + integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: + { + integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /npm-package-arg@10.1.0: + resolution: + { + integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@11.0.1: + resolution: + { + integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.2 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@8.1.1: + resolution: + { + integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 3.0.8 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-package-arg@8.1.5: + resolution: + { + integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==, + } + engines: { node: '>=10' } + dependencies: + hosted-git-info: 4.1.0 + semver: 7.5.2 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist@3.0.0: + resolution: + { + integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 4.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@5.1.1: + resolution: + { + integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@7.0.4: + resolution: + { + integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-packlist@8.0.2: + resolution: + { + integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + ignore-walk: 6.0.4 + dev: true + + /npm-pick-manifest@6.1.1: + resolution: + { + integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==, + } + dependencies: + npm-install-checks: 4.0.0 + npm-normalize-package-bin: 1.0.1 + npm-package-arg: 8.1.5 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@8.0.1: + resolution: + { + integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.5.2 + dev: true + + /npm-pick-manifest@9.0.0: + resolution: + { + integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + npm-install-checks: 6.1.1 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.2 + dev: true + + /npm-registry-fetch@12.0.2: + resolution: + { + integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + dependencies: + make-fetch-happen: 10.2.1 + minipass: 3.3.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /npm-registry-fetch@14.0.5: + resolution: + { + integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-registry-fetch@16.1.0: + resolution: + { + integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + make-fetch-happen: 13.0.0 + minipass: 7.0.2 + minipass-fetch: 3.0.3 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.1 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } + dependencies: + path-key: 3.1.1 + dev: true + + /npmlog@5.0.1: + resolution: + { + integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, + } + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /npmlog@6.0.2: + resolution: + { + integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /number-is-nan@1.0.1: + resolution: + { + integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, + } + engines: { node: '>=0.10.0' } + dev: true + + /nx@17.3.0: + resolution: + { + integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==, + } + hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.6.7 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + dependencies: + '@nrwl/tao': 17.3.0 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.6.7 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.1.1 + ignore: 5.3.0 + jest-diff: 29.6.1 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 9.0.3 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + ora: 5.3.0 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.1 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 17.3.0 + '@nx/nx-darwin-x64': 17.3.0 + '@nx/nx-freebsd-x64': 17.3.0 + '@nx/nx-linux-arm-gnueabihf': 17.3.0 + '@nx/nx-linux-arm64-gnu': 17.3.0 + '@nx/nx-linux-arm64-musl': 17.3.0 + '@nx/nx-linux-x64-gnu': 17.3.0 + '@nx/nx-linux-x64-musl': 17.3.0 + '@nx/nx-win32-arm64-msvc': 17.3.0 + '@nx/nx-win32-x64-msvc': 17.3.0 + transitivePeerDependencies: + - debug + dev: true + + /object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } + dev: true + + /object-hash@2.1.1: + resolution: + { + integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==, + } + engines: { node: '>= 6' } + dev: false + + /object-treeify@1.1.33: + resolution: + { + integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==, + } + engines: { node: '>= 10' } + + /obliterator@2.0.4: + resolution: + { + integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, + } + dev: false + + /oclif@3.10.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-Kf/nL7GrfezePsZGQytbPJG1EGNFRAG+lC6NhYqPOgeBIGppLuQDg6vO9wz0QRoijSJv/Yf4wCe2URMoCFtBNw==, + } + engines: { node: '>=12.0.0' } + hasBin: true + dependencies: + '@oclif/core': 2.11.8(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-help': 5.2.17(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-not-found': 2.3.34(@types/node@14.14.7)(typescript@5.0.2) + '@oclif/plugin-warn-if-update-available': 2.0.45(@types/node@14.14.7)(typescript@5.0.2) + aws-sdk: 2.1421.0 + concurrently: 7.6.0 + debug: 4.3.4(supports-color@8.1.1) + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 1.5.0 + got: 11.8.6 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + semver: 7.5.2 + shelljs: 0.8.5 + tslib: 2.6.2 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0(yeoman-environment@3.19.3) + yosay: 2.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bluebird + - encoding + - mem-fs + - supports-color + - typescript + dev: true + + /on-exit-leak-free@2.1.0: + resolution: + { + integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==, + } + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } + dependencies: + mimic-fn: 2.1.0 + + /open@7.4.2: + resolution: + { + integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, + } + engines: { node: '>=8' } + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /open@8.4.2: + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: '>= 0.8.0' } + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.3.0: + resolution: + { + integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==, + } + engines: { node: '>=10' } + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: '>=10' } + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: '>=0.10.0' } + + /p-cancelable@2.1.1: + resolution: + { + integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, + } + engines: { node: '>=8' } + + /p-finally@1.0.0: + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: '>=4' } + dev: true + + /p-limit@1.3.0: + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: '>=4' } + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: '>=4' } + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map-series@2.1.0: + resolution: + { + integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, + } + engines: { node: '>=8' } + dev: true + + /p-map@4.0.0: + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: '>=10' } + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: + { + integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, + } + engines: { node: '>=8' } + dev: true + + /p-queue@6.6.2: + resolution: + { + integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, + } + engines: { node: '>=8' } + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce@2.1.0: + resolution: + { + integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, + } + engines: { node: '>=8' } + dev: true + + /p-timeout@3.2.0: + resolution: + { + integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, + } + engines: { node: '>=8' } + dependencies: + p-finally: 1.0.0 + dev: true + + /p-transform@1.3.0: + resolution: + { + integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==, + } + engines: { node: '>=12.10.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + p-queue: 6.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /p-try@1.0.0: + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: '>=4' } + dev: true + + /p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } + dev: true + + /p-waterfall@2.1.1: + resolution: + { + integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, + } + engines: { node: '>=8' } + dependencies: + p-reduce: 2.1.0 + dev: true + + /pac-proxy-agent@7.0.1: + resolution: + { + integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, + } + engines: { node: '>= 14' } + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver@7.0.0: + resolution: + { + integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, + } + engines: { node: '>= 14' } + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /pacote@12.0.3: + resolution: + { + integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16 } + hasBin: true + dependencies: + '@npmcli/git': 2.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/promise-spawn': 1.3.2 + '@npmcli/run-script': 2.0.0 + cacache: 15.3.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + infer-owner: 1.0.4 + minipass: 3.3.6 + mkdirp: 1.0.4 + npm-package-arg: 8.1.5 + npm-packlist: 3.0.0 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 12.0.2 + promise-retry: 2.0.1 + read-package-json-fast: 2.0.3 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@15.2.0: + resolution: + { + integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.3 + fs-minipass: 3.0.2 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.1 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.8.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pacote@17.0.6: + resolution: + { + integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + hasBin: true + dependencies: + '@npmcli/git': 5.0.4 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 7.0.1 + '@npmcli/run-script': 7.0.2 + cacache: 18.0.2 + fs-minipass: 3.0.2 + minipass: 7.0.2 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.1.0 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 7.0.0 + read-package-json-fast: 3.0.2 + sigstore: 2.2.0 + ssri: 10.0.4 + tar: 6.1.15 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pad-component@0.0.1: + resolution: + { + integrity: sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==, + } + dev: true + + /pako@1.0.11: + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } + dev: false + + /param-case@3.0.4: + resolution: + { + integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } + dependencies: + callsites: 3.1.0 + dev: true + + /parse-conflict-json@2.0.2: + resolution: + { + integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + json-parse-even-better-errors: 2.3.1 + just-diff: 5.2.0 + just-diff-apply: 5.5.0 + dev: true + + /parse-json@4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-path@7.0.0: + resolution: + { + integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, + } + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url@8.1.0: + resolution: + { + integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, + } + dependencies: + parse-path: 7.0.0 + dev: true + + /pascal-case@3.1.2: + resolution: + { + integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /password-prompt@1.1.2: + resolution: + { + integrity: sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==, + } + dependencies: + ansi-escapes: 3.2.0 + cross-spawn: 6.0.5 + + /password-prompt@1.1.3: + resolution: + { + integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==, + } + dependencies: + ansi-escapes: 4.3.2 + cross-spawn: 7.0.3 + dev: false + + /path-case@3.0.4: + resolution: + { + integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /path-exists@3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: '>=4' } + dev: true + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } + dev: true + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } + + /path-key@2.0.1: + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: '>=4' } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: true + + /path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + + /path-to-regexp@1.8.0: + resolution: + { + integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, + } + dependencies: + isarray: 0.0.1 + dev: true + + /path-type@3.0.0: + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: true + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } + + /pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } + dev: true + + /pify@3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } + dev: true + + /pify@4.0.1: + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: '>=6' } + + /pify@5.0.0: + resolution: + { + integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, + } + engines: { node: '>=10' } + dev: true + + /pino-abstract-transport@1.1.0: + resolution: + { + integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==, + } + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.3.1: + resolution: + { + integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==, + } + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.7.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: + { + integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==, + } + dev: false + + /pino@8.17.2: + resolution: + { + integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==, + } + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.7.0 + thread-stream: 2.4.0 + dev: false + + /pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: '>= 6' } + dev: true + + /pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + dev: true + + /plimit-lit@1.5.0: + resolution: + { + integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==, + } + dependencies: + queue-lit: 1.5.0 + dev: true + + /prebuild-install@7.1.1: + resolution: + { + integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.45.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.0.3: + resolution: + { + integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, + } + engines: { node: '>=10' } + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } + dev: true + + /prettier@2.0.5: + resolution: + { + integrity: sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==, + } + engines: { node: '>=10.13.0' } + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: '>=6' } + dev: true + + /pretty-format@29.6.1: + resolution: + { + integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /proc-log@1.0.0: + resolution: + { + integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==, + } + dev: true + + /proc-log@3.0.0: + resolution: + { + integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + /process-warning@3.0.0: + resolution: + { + integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==, + } + dev: false + + /process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } + + /promise-all-reject-late@1.0.1: + resolution: + { + integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, + } + dev: true + + /promise-call-limit@1.0.2: + resolution: + { + integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==, + } + dev: true + + /promise-inflight@1.0.1: + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: + { + integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, + } + engines: { node: '>=10' } + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard@1.0.0: + resolution: + { + integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + read: 2.1.0 + dev: true + + /propagate@2.0.1: + resolution: + { + integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==, + } + engines: { node: '>= 8' } + dev: true + + /proper-lockfile@4.1.2: + resolution: + { + integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, + } + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocols@2.0.1: + resolution: + { + integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, + } + dev: true + + /proxy-agent@6.3.1: + resolution: + { + integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + + /psl@1.9.0: + resolution: + { + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, + } + dev: false + + /pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@1.3.2: + resolution: + { + integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, + } + dev: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: '>=6' } + + /pure-rand@6.0.2: + resolution: + { + integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==, + } + dev: true + + /q@1.5.1: + resolution: + { + integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, + } + engines: { node: '>=0.6.0', teleport: '>=0.2.0' } + dev: true + + /querystring@0.2.0: + resolution: + { + integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, + } + engines: { node: '>=0.4.x' } + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystringify@2.2.0: + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + } + dev: false + + /queue-lit@1.5.0: + resolution: + { + integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==, + } + dev: true + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /quick-format-unescaped@4.0.4: + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } + dev: false + + /quick-lru@4.0.1: + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: '>=8' } + dev: true + + /quick-lru@5.1.1: + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: '>=10' } + + /randombytes@2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-is@18.2.0: + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + } + dev: true + + /read-cmd-shim@3.0.1: + resolution: + { + integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dev: true + + /read-cmd-shim@4.0.0: + resolution: + { + integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + /read-package-json-fast@2.0.3: + resolution: + { + integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==, + } + engines: { node: '>=10' } + dependencies: + json-parse-even-better-errors: 2.3.1 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json-fast@3.0.2: + resolution: + { + integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: + { + integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@7.0.0: + resolution: + { + integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + glob: 10.3.3 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: + { + integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, + } + engines: { node: '>=4' } + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: '>=8' } + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read@2.1.0: + resolution: + { + integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + mute-stream: 1.0.0 + dev: true + + /readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: + { + integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readdir-scoped-modules@1.1.0: + resolution: + { + integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==, + } + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: true + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: '>=8.10.0' } + dependencies: + picomatch: 2.3.1 + dev: true + + /real-require@0.2.0: + resolution: + { + integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, + } + engines: { node: '>= 12.13.0' } + dev: false + + /rechoir@0.6.2: + resolution: + { + integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, + } + engines: { node: '>= 0.10' } + dependencies: + resolve: 1.22.2 + dev: true + + /redent@3.0.0: + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed@2.1.1: + resolution: + { + integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, + } + dependencies: + esprima: 4.0.1 + + /regenerator-runtime@0.13.11: + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } + + /regexpp@3.2.0: + resolution: + { + integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, + } + engines: { node: '>=8' } + dev: true + + /remove-trailing-separator@1.1.0: + resolution: + { + integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, + } + dev: true + + /repeat-string@1.6.1: + resolution: + { + integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, + } + engines: { node: '>=0.10' } + dev: false + + /replace-ext@1.0.1: + resolution: + { + integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, + } + engines: { node: '>= 0.10' } + dev: true + + /require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } + dev: true + + /require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } + dev: false + + /requires-port@1.0.0: + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } + dev: false + + /resolve-alpn@1.2.1: + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } + + /resolve-cwd@3.0.0: + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: '>=8' } + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } + dev: true + + /resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } + dev: true + + /resolve-global@1.0.0: + resolution: + { + integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, + } + engines: { node: '>=8' } + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve.exports@2.0.2: + resolution: + { + integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, + } + engines: { node: '>=10' } + dev: true + + /resolve@1.22.2: + resolution: + { + integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==, + } + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: + { + integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, + } + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /retry@0.12.0: + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: '>= 4' } + + /retry@0.13.1: + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: '>= 4' } + dev: false + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: + { + integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /rimraf@5.0.1: + resolution: + { + integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==, + } + engines: { node: '>=14' } + hasBin: true + dependencies: + glob: 10.3.3 + dev: false + + /run-async@2.4.1: + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: '>=0.12.0' } + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: + { + integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, + } + engines: { npm: '>=2.0.0' } + dependencies: + tslib: 1.14.1 + dev: false + + /rxjs@7.8.1: + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } + dependencies: + tslib: 2.1.0 + dev: true + + /safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + /safe-stable-stringify@2.4.3: + resolution: + { + integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, + } + engines: { node: '>=10' } + dev: false + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + /samsam@1.3.0: + resolution: + { + integrity: sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==, + } + deprecated: This package has been deprecated in favour of @sinonjs/samsam + dev: true + + /sax@1.2.1: + resolution: + { + integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==, + } + dev: true + + /sax@1.2.4: + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } + + /schema-utils@3.3.0: + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: '>= 10.13.0' } + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /scoped-regex@2.1.0: + resolution: + { + integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==, + } + engines: { node: '>=8' } + dev: true + + /secure-json-parse@2.7.0: + resolution: + { + integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, + } + dev: false + + /semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + + /semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + dev: true + + /semver@7.3.5: + resolution: + { + integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.2: + resolution: + { + integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.5.3: + resolution: + { + integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /sentence-case@3.0.4: + resolution: + { + integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==, + } + dependencies: + no-case: 3.0.4 + tslib: 2.1.0 + upper-case-first: 2.0.2 + dev: false + + /sequin@0.1.1: + resolution: + { + integrity: sha512-hJWMZRwP75ocoBM+1/YaCsvS0j5MTPeBHJkS2/wruehl9xwtX30HlDF1Gt6UZ8HHHY8SJa2/IL+jo+JJCd59rA==, + } + engines: { node: '>=0.4.0' } + dev: false + + /serialize-javascript@6.0.1: + resolution: + { + integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==, + } + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + dev: true + + /setimmediate@1.0.5: + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } + dev: false + + /sha.js@2.4.11: + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallow-clone@3.0.1: + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: '>=8' } + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: '>=0.10.0' } + dependencies: + shebang-regex: 1.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: '>=0.10.0' } + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + + /shell-quote@1.8.1: + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } + dev: true + + /shelljs@0.8.5: + resolution: + { + integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + /signal-exit@4.0.2: + resolution: + { + integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==, + } + engines: { node: '>=14' } + + /sigstore@1.8.0: + resolution: + { + integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sigstore@2.2.0: + resolution: + { + integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.2.1 + '@sigstore/tuf': 2.3.0 + '@sigstore/verify': 0.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-git@3.16.0: + resolution: + { + integrity: sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==, + } + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-git@3.19.1: + resolution: + { + integrity: sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==, + } + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sinon@11.1.2: + resolution: + { + integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==, + } + deprecated: 16.1.1 + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.1.3 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true + + /sinon@5.1.1: + resolution: + { + integrity: sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==, + } + dependencies: + '@sinonjs/formatio': 2.0.0 + diff: 3.5.0 + lodash.get: 4.4.2 + lolex: 2.7.5 + nise: 1.5.3 + supports-color: 5.5.0 + type-detect: 4.0.8 + dev: true + + /sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + dev: true + + /slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } + + /slice-ansi@4.0.0: + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /smart-buffer@4.2.0: + resolution: + { + integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, + } + engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } + + /snake-case@3.0.4: + resolution: + { + integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==, + } + dependencies: + dot-case: 3.0.4 + tslib: 2.1.0 + dev: false + + /socks-proxy-agent@6.2.1: + resolution: + { + integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==, + } + engines: { node: '>= 10' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==, + } + engines: { node: '>= 10' } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@8.0.2: + resolution: + { + integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, + } + engines: { node: '>= 14' } + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + + /socks@2.7.1: + resolution: + { + integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, + } + engines: { node: '>= 10.13.0', npm: '>= 3.0.0' } + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + + /sonic-boom@3.7.0: + resolution: + { + integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==, + } + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sort-keys@2.0.0: + resolution: + { + integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, + } + engines: { node: '>=4' } + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys@4.2.0: + resolution: + { + integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==, + } + engines: { node: '>=8' } + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /source-map-support@0.5.13: + resolution: + { + integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } + + /source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: '>= 8' } + dev: true + + /spawn-command@0.0.2-1: + resolution: + { + integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==, + } + dev: true + + /spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + } + dev: true + + /spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: + { + integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, + } + dev: true + + /split2@3.2.2: + resolution: + { + integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, + } + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: '>= 10.x' } + dev: false + + /split@1.0.1: + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + + /ssri@10.0.4: + resolution: + { + integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + minipass: 5.0.0 + dev: true + + /ssri@8.0.1: + resolution: + { + integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, + } + engines: { node: '>= 8' } + dependencies: + minipass: 3.3.6 + dev: true + + /ssri@9.0.1: + resolution: + { + integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + minipass: 3.3.6 + dev: true + + /stack-utils@2.0.6: + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + } + engines: { node: '>=10' } + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stdout-stderr@0.1.13: + resolution: + { + integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==, + } + engines: { node: '>=8.0.0' } + dependencies: + debug: 4.3.4(supports-color@8.1.1) + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /string-length@4.0.2: + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + } + engines: { node: '>=10' } + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: + { + integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, + } + engines: { node: '>=0.10.0' } + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: + { + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, + } + engines: { node: '>=4' } + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@3.0.1: + resolution: + { + integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, + } + engines: { node: '>=0.10.0' } + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: + { + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, + } + engines: { node: '>=4' } + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-buf@1.0.0: + resolution: + { + integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==, + } + engines: { node: '>=4' } + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom-stream@2.0.0: + resolution: + { + integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==, + } + engines: { node: '>=0.10.0' } + dependencies: + first-chunk-stream: 2.0.0 + strip-bom: 2.0.0 + dev: true + + /strip-bom@2.0.0: + resolution: + { + integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, + } + engines: { node: '>=0.10.0' } + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } + dev: true + + /strip-bom@4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: '>=8' } + dev: true + + /strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } + dev: true + + /strip-indent@3.0.0: + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: '>=0.10.0' } + dev: false + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } + + /strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + dev: false + + /strong-log-transformer@2.1.0: + resolution: + { + integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + + /supports-color@2.0.0: + resolution: + { + integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, + } + engines: { node: '>=0.8.0' } + dev: true + + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: + { + integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, + } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } + dev: true + + /taketalk@1.0.0: + resolution: + { + integrity: sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==, + } + dependencies: + get-stdin: 4.0.1 + minimist: 1.2.8 + dev: true + + /tapable@2.2.1: + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: '>=6' } + dev: true + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: '>=6' } + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /tar@6.1.11: + resolution: + { + integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==, + } + engines: { node: '>= 10' } + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@6.1.15: + resolution: + { + integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==, + } + engines: { node: '>=10' } + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /temp-dir@1.0.0: + resolution: + { + integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, + } + engines: { node: '>=4' } + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: + { + integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==, + } + engines: { node: '>= 10.13.0' } + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: + { + integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==, + } + engines: { node: '>=10' } + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: '>=8' } + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: + { + integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, + } + engines: { node: '>=0.10' } + dev: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + dev: true + + /textextensions@5.16.0: + resolution: + { + integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==, + } + engines: { node: '>=0.8' } + dev: true + + /thread-stream@2.4.0: + resolution: + { + integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==, + } + dependencies: + real-require: 0.2.0 + dev: false + + /through2@2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + /tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: '>=0.6.0' } + dependencies: + os-tmpdir: 1.0.2 + + /tmp@0.2.1: + resolution: + { + integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==, + } + engines: { node: '>=8.17.0' } + dependencies: + rimraf: 3.0.2 + + /tmpl@1.0.5: + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } + dev: true + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: '>=4' } + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + dependencies: + is-number: 7.0.0 + + /tough-cookie@4.1.3: + resolution: + { + integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, + } + engines: { node: '>=6' } + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + /tree-kill@1.2.2: + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true + dev: true + + /treeverse@1.0.4: + resolution: + { + integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==, + } + dev: true + + /trim-newlines@3.0.1: + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: '>=8' } + dev: true + + /ts-jest@29.1.1(@babel/core@7.18.2)(jest@29.6.1)(typescript@5.0.2): + resolution: + { + integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.18.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.6.1(@types/node@14.14.7)(ts-node@10.7.0) + jest-util: 29.6.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.0.2 + yargs-parser: 21.1.1 + dev: true + + /ts-json-schema-generator@0.93.0: + resolution: + { + integrity: sha512-JYacSIgw4KqsOXF/zRSY4pE/v6jUk7aMDXhwK5MdopN0UeKH58TRZHrQADy9uxTf78jqUfFLzARQKNOb9H+jVQ==, + } + engines: { node: '>=10.0.0' } + hasBin: true + dependencies: + '@types/json-schema': 7.0.12 + commander: 7.2.0 + fast-json-stable-stringify: 2.1.0 + glob: 7.2.3 + json-stable-stringify: 1.0.2 + typescript: 4.3.5 + dev: true + + /ts-loader@9.5.1(typescript@5.0.2)(webpack@5.88.2): + resolution: + { + integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.2 + source-map: 0.7.4 + typescript: 5.0.2 + webpack: 5.88.2 + dev: true + + /ts-node@10.7.0(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==, + } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@14.14.7)(typescript@5.0.2): + resolution: + { + integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, + } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.14.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@10.9.2(@types/node@10.0.0)(typescript@5.0.2): + resolution: + { + integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, + } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 10.0.0 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@4.9.5): + resolution: + { + integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, + } + engines: { node: '>=10.0.0' } + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 4.9.5 + yn: 3.1.1 + dev: true + + /ts-node@9.1.1(typescript@5.0.2): + resolution: + { + integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, + } + engines: { node: '>=10.0.0' } + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 5.0.2 + yn: 3.1.1 + dev: true + + /ts-retry-promise@0.7.1: + resolution: + { + integrity: sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ==, + } + engines: { node: '>=6' } + dev: false + + /ts-retry-promise@0.8.0: + resolution: + { + integrity: sha512-elI/GkojPANBikPaMWQnk4T/bOJ6tq/hqXyQRmhfC9PAD6MoHmXIXK7KilJrlpx47VAKCGcmBrTeK5dHk6YAYg==, + } + engines: { node: '>=6' } + dev: false + + /tsc-alias@1.8.3: + resolution: + { + integrity: sha512-/9JARcmXBrEqSuLjdSOqxY7/xI/AnvmBi4CU9/Ba2oX6Oq8vnd0OGSQTk+PIwqWJ5ZxskV0X/x15yzxCNTHU+g==, + } + hasBin: true + dependencies: + chokidar: 3.5.3 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.5.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: '>=6' } + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + + /tslib@2.1.0: + resolution: + { + integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==, + } + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + /tsutils@3.21.0(typescript@5.0.2): + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: '>= 6' } + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tuf-js@1.1.7: + resolution: + { + integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /tuf-js@2.2.0: + resolution: + { + integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + '@tufjs/models': 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } + dev: true + + /type-fest@0.18.1: + resolution: + { + integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, + } + engines: { node: '>=10' } + dev: true + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: '>=10' } + dev: true + + /type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } + + /type-fest@0.4.1: + resolution: + { + integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, + } + engines: { node: '>=6' } + dev: true + + /type-fest@0.6.0: + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: '>=8' } + dev: true + + /type-fest@0.8.1: + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: '>=8' } + dev: true + + /type-fest@1.4.0: + resolution: + { + integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, + } + engines: { node: '>=10' } + dev: false + + /typedarray@0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + dev: true + + /typescript@4.3.5: + resolution: + { + integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==, + } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: + { + integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: + { + integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, + } + engines: { node: '>=12.20' } + hasBin: true + + /uglify-js@3.17.4: + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + } + engines: { node: '>=0.8.0' } + hasBin: true + requiresBuild: true optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: false - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true - - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@1.0.9: - resolution: {integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==} - hasBin: true - dev: false - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 3.1.1 - dev: true - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: true - - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - dependencies: - string-width: 4.2.3 - - /winreg@1.2.4: - resolution: {integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==} - dev: false - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.0.2 - dev: true - - /write-json-file@3.2.0: - resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} - engines: {node: '>=6'} - dependencies: - detect-indent: 5.0.0 - graceful-fs: 4.2.11 - make-dir: 2.1.0 - pify: 4.0.1 - sort-keys: 2.0.0 - write-file-atomic: 2.4.3 - dev: true - - /write-pkg@4.0.0: - resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} - engines: {node: '>=8'} - dependencies: - sort-keys: 2.0.0 - type-fest: 0.4.1 - write-json-file: 3.2.0 - dev: true - - /xml-formatter@3.3.2: - resolution: {integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==} - engines: {node: '>= 14'} - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-formatter@3.4.1: - resolution: {integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==} - engines: {node: '>= 14'} - dependencies: - xml-parser-xo: 4.1.1 - dev: false - - /xml-parser-xo@4.1.1: - resolution: {integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==} - engines: {node: '>= 14'} - dev: false - - /xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - - /xml2js@0.6.0: - resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - /xmlcreate@2.0.4: - resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} - dev: false - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yeoman-environment@3.19.3: - resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} - engines: {node: '>=12.10.0'} - hasBin: true - dependencies: - '@npmcli/arborist': 4.3.1 - are-we-there-yet: 2.0.0 - arrify: 2.0.1 - binaryextensions: 4.18.0 - chalk: 4.1.2 - cli-table: 0.3.11 - commander: 7.1.0 - dateformat: 4.6.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.1.0 - error: 10.4.0 - escape-string-regexp: 4.0.0 - execa: 5.1.1 - find-up: 5.0.0 - globby: 11.1.0 - grouped-queue: 2.0.0 - inquirer: 8.2.5 - is-scoped: 2.1.0 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log-symbols: 4.1.0 - mem-fs: 2.3.0 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimatch: 3.1.2 - npmlog: 5.0.1 - p-queue: 6.6.2 - p-transform: 1.3.0 - pacote: 12.0.3 - preferred-pm: 3.0.3 - pretty-bytes: 5.6.0 - readable-stream: 4.4.2 - semver: 7.5.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - text-table: 0.2.0 - textextensions: 5.16.0 - untildify: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /yeoman-generator@5.9.0(yeoman-environment@3.19.3): - resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} - engines: {node: '>=12.10.0'} - peerDependencies: - yeoman-environment: ^3.2.0 - peerDependenciesMeta: - yeoman-environment: + + /unique-filename@1.1.1: + resolution: + { + integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, + } + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-filename@2.0.1: + resolution: + { + integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: + { + integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@2.0.2: + resolution: + { + integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, + } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@3.0.0: + resolution: + { + integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: + { + integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universal-user-agent@6.0.0: + resolution: + { + integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, + } + dev: true + + /universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } + + /universalify@0.2.0: + resolution: + { + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + } + engines: { node: '>= 4.0.0' } + dev: false + + /universalify@2.0.0: + resolution: + { + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, + } + engines: { node: '>= 10.0.0' } + + /unix-dgram@2.0.6: + resolution: + { + integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==, + } + engines: { node: '>=0.10.48' } + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: false optional: true - dependencies: - chalk: 4.1.2 - dargs: 7.0.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 5.1.1 - github-username: 6.0.0 - lodash: 4.17.21 - mem-fs-editor: 9.7.0(mem-fs@2.3.0) - minimist: 1.2.8 - pacote: 15.2.0 - read-pkg-up: 7.0.1 - run-async: 2.4.1 - semver: 7.5.2 - shelljs: 0.8.5 - sort-keys: 4.2.0 - text-table: 0.2.0 - yeoman-environment: 3.19.3 - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - supports-color - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yosay@2.0.2: - resolution: {integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - ansi-regex: 2.1.1 - ansi-styles: 3.2.1 - chalk: 1.1.3 - cli-boxes: 1.0.0 - pad-component: 0.0.1 - string-width: 2.1.1 - strip-ansi: 3.0.1 - taketalk: 1.0.0 - wrap-ansi: 2.1.0 - dev: true + + /untildify@4.0.0: + resolution: + { + integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, + } + engines: { node: '>=8' } + dev: true + + /upath@2.0.1: + resolution: + { + integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, + } + engines: { node: '>=4' } + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: + { + integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, + } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: + { + integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /upper-case@2.0.2: + resolution: + { + integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==, + } + dependencies: + tslib: 2.1.0 + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + + /url-parse@1.5.10: + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + } + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /url@0.10.3: + resolution: + { + integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==, + } + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + /util@0.12.5: + resolution: + { + integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, + } + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: true + + /uuid@8.0.0: + resolution: + { + integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==, + } + hasBin: true + dev: true + + /uuid@9.0.0: + resolution: + { + integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==, + } + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } + + /v8-to-istanbul@9.1.0: + resolution: + { + integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==, + } + engines: { node: '>=10.12.0' } + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@3.0.0: + resolution: + { + integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, + } + dependencies: + builtins: 1.0.3 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: + { + integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + builtins: 5.0.1 + dev: true + + /vinyl-file@3.0.0: + resolution: + { + integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==, + } + engines: { node: '>=4' } + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + strip-bom-buf: 1.0.0 + strip-bom-stream: 2.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl@2.2.1: + resolution: + { + integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, + } + engines: { node: '>= 0.10' } + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /walk-up-path@1.0.0: + resolution: + { + integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==, + } + dev: true + + /walker@1.0.8: + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: + { + integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, + } + engines: { node: '>=10.13.0' } + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + /webpack-sources@3.2.3: + resolution: + { + integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + } + engines: { node: '>=10.13.0' } + dev: true + + /webpack@5.88.2: + resolution: + { + integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==, + } + engines: { node: '>=10.13.0' } + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver@0.7.4: + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: '>=0.8.0' } + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: '>=0.8.0' } + dev: false + + /whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-pm@2.0.0: + resolution: + { + integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, + } + engines: { node: '>=8.15' } + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.11: + resolution: + { + integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==, + } + engines: { node: '>= 0.4' } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.0.9: + resolution: + { + integrity: sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==, + } + hasBin: true + dev: false + + /which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@3.0.1: + resolution: + { + integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@4.0.0: + resolution: + { + integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, + } + engines: { node: ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + + /wide-align@1.1.5: + resolution: + { + integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, + } + dependencies: + string-width: 4.2.3 + dev: true + + /widest-line@3.1.0: + resolution: + { + integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, + } + engines: { node: '>=8' } + dependencies: + string-width: 4.2.3 + + /winreg@1.2.4: + resolution: + { + integrity: sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==, + } + dev: false + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + + /wrap-ansi@2.1.0: + resolution: + { + integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, + } + engines: { node: '>=0.10.0' } + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /write-file-atomic@2.4.3: + resolution: + { + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, + } + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@4.0.2: + resolution: + { + integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@5.0.1: + resolution: + { + integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.0.2 + dev: true + + /write-json-file@3.2.0: + resolution: + { + integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, + } + engines: { node: '>=6' } + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.11 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-pkg@4.0.0: + resolution: + { + integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, + } + engines: { node: '>=8' } + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /xml-formatter@3.3.2: + resolution: + { + integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, + } + engines: { node: '>= 14' } + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-formatter@3.4.1: + resolution: + { + integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==, + } + engines: { node: '>= 14' } + dependencies: + xml-parser-xo: 4.1.1 + dev: false + + /xml-parser-xo@4.1.1: + resolution: + { + integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, + } + engines: { node: '>= 14' } + dev: false + + /xml2js@0.5.0: + resolution: + { + integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==, + } + engines: { node: '>=4.0.0' } + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + + /xml2js@0.6.0: + resolution: + { + integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, + } + engines: { node: '>=4.0.0' } + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: + { + integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, + } + engines: { node: '>=4.0' } + + /xmlcreate@2.0.4: + resolution: + { + integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, + } + dev: false + + /xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: '>=0.4' } + dev: true + + /y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } + dev: true + + /yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yaml@1.10.2: + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } + dev: true + + /yargs-parser@20.2.9: + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: '>=10' } + dev: true + + /yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } + dev: true + + /yargs@16.2.0: + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: '>=10' } + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: '>=12' } + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yeoman-environment@3.19.3: + resolution: + { + integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==, + } + engines: { node: '>=12.10.0' } + hasBin: true + dependencies: + '@npmcli/arborist': 4.3.1 + are-we-there-yet: 2.0.0 + arrify: 2.0.1 + binaryextensions: 4.18.0 + chalk: 4.1.2 + cli-table: 0.3.11 + commander: 7.1.0 + dateformat: 4.6.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.1.0 + error: 10.4.0 + escape-string-regexp: 4.0.0 + execa: 5.1.1 + find-up: 5.0.0 + globby: 11.1.0 + grouped-queue: 2.0.0 + inquirer: 8.2.5 + is-scoped: 2.1.0 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log-symbols: 4.1.0 + mem-fs: 2.3.0 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimatch: 3.1.2 + npmlog: 5.0.1 + p-queue: 6.6.2 + p-transform: 1.3.0 + pacote: 12.0.3 + preferred-pm: 3.0.3 + pretty-bytes: 5.6.0 + readable-stream: 4.4.2 + semver: 7.5.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 + textextensions: 5.16.0 + untildify: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /yeoman-generator@5.9.0(yeoman-environment@3.19.3): + resolution: + { + integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==, + } + engines: { node: '>=12.10.0' } + peerDependencies: + yeoman-environment: ^3.2.0 + peerDependenciesMeta: + yeoman-environment: + optional: true + dependencies: + chalk: 4.1.2 + dargs: 7.0.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 5.1.1 + github-username: 6.0.0 + lodash: 4.17.21 + mem-fs-editor: 9.7.0(mem-fs@2.3.0) + minimist: 1.2.8 + pacote: 15.2.0 + read-pkg-up: 7.0.1 + run-async: 2.4.1 + semver: 7.5.2 + shelljs: 0.8.5 + sort-keys: 4.2.0 + text-table: 0.2.0 + yeoman-environment: 3.19.3 + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - supports-color + dev: true + + /yn@3.1.1: + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } + dev: true + + /yosay@2.0.2: + resolution: + { + integrity: sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==, + } + engines: { node: '>=4' } + hasBin: true + dependencies: + ansi-regex: 2.1.1 + ansi-styles: 3.2.1 + chalk: 1.1.3 + cli-boxes: 1.0.0 + pad-component: 0.0.1 + string-width: 2.1.1 + strip-ansi: 3.0.1 + taketalk: 1.0.0 + wrap-ansi: 2.1.0 + dev: true From 0bd794b091733df8bc5d0f945aaaf47e893a24b2 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 30 Jan 2024 11:05:54 +1100 Subject: [PATCH 65/95] docs(readme): update readme with new badges --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 552e5b68e..aafff1c33 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@

![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) -[![GitHub stars](https://img.shields.io/github/stars/flxlblio/sfp)](https://gitHub.com/flxlblio/sfp/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/flxlblio/sfp.svg)](https://github.com/flxlblio/sfp/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxlblio/sfp/blob/master/LICENSE) +[![GitHub stars](https://img.shields.io/github/stars/flxlbl-io/sfp)](https://gitHub.com/flxlblio/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxlbl-io/sfp.svg)](https://github.com/flxlbl-io/sfp/graphs/contributors/) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxlbl-io/sfp/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxbl-io%2Fsfp.svg?type=shield&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxbl-io%2Fsfp?ref=badge_shield&issueType=license) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) [![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxlblio) From bfd97596a8e28026647d5a995d398ea202bf1ef8 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 30 Jan 2024 11:07:00 +1100 Subject: [PATCH 66/95] docs(readme): fix typo in badge --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aafff1c33..faa7084b9 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@

![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) -[![GitHub stars](https://img.shields.io/github/stars/flxlbl-io/sfp)](https://gitHub.com/flxlblio/sfp/stargazers/) +[![GitHub stars](https://img.shields.io/github/stars/flxlbl-io/sfp)](https://gitHub.com/flxlbl-io/sfp/stargazers/) [![GitHub contributors](https://img.shields.io/github/contributors/flxlbl-io/sfp.svg)](https://github.com/flxlbl-io/sfp/graphs/contributors/) -[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxlbl-io/sfp/blob/main/LICENSE) +[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxbl-io/sfp/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) From 70467d3cadf78919bd88705f0d2198f941bf833a Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 30 Jan 2024 11:08:10 +1100 Subject: [PATCH 67/95] docs(readme): fix type with badges on repo owner --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index faa7084b9..d927044b2 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,17 @@

![Version](https://img.shields.io/npm/v/@flxblio/sfp.svg) -[![GitHub stars](https://img.shields.io/github/stars/flxlbl-io/sfp)](https://gitHub.com/flxlbl-io/sfp/stargazers/) -[![GitHub contributors](https://img.shields.io/github/contributors/flxlbl-io/sfp.svg)](https://github.com/flxlbl-io/sfp/graphs/contributors/) +[![GitHub stars](https://img.shields.io/github/stars/flxbl-io/sfp)](https://gitHub.com/flxbl-io/sfp/stargazers/) +[![GitHub contributors](https://img.shields.io/github/contributors/flxbl-io/sfp.svg)](https://github.com/flxbl-io/sfp/graphs/contributors/) [![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/flxbl-io/sfp/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![DeepScan grade](https://deepscan.io/api/teams/10234/projects/12959/branches/208838/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10234&pid=12959&bid=208838) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxbl-io%2Fsfp.svg?type=shield&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxbl-io%2Fsfp?ref=badge_shield&issueType=license) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5614/badge)](https://bestpractices.coreinfrastructure.org/projects/5614) -[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxlblio) +[![Join slack](https://i.imgur.com/FZZmA3g.png)](https://launchpass.com/flxblio) -A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxlbl.io +A build system for package based development in Salesforce, delivered as a node cli that can be implemented in any CI/CD system of choice.Read more about the cli and details here - https://docs.flxbl.io #### Features @@ -26,10 +26,10 @@ A build system for package based development in Salesforce, delivered as a node - Integrate with any CI/CD system of choice - All commands are enabled with statsD, for collecting metrics about your pipeline. -There are lot more features to explore. Read more at https://docs.flxlblio.io +There are lot more features to explore. Read more at https://docs.flxblio.io -The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxlblio/sfp) or can be -used by using the [docker image](https://github.com/flxlblio/sfp/pkgs/container/sfp) +The project is delivered as a CLI that can be deployed in any CI/CD system, The module is available in [NPM](https://www.npmjs.com/package/@flxblio/sfp) or can be +used by using the [docker image](https://github.com/flxblio/sfp/pkgs/container/sfp) @@ -45,20 +45,20 @@ used by using the [docker image](https://github.com/flxlblio/sfp/pkgs/container/ #### CI/CD Reference Implementation -Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxlblio.io/implementing-your-ci-cd/github) +Getting started guides for popular CI/CD platforms along with reference pipelines are available [here](https://docs.flxblio.io/implementing-your-ci-cd/github) #### Installing sfp locally sfp can be installed on your local device using npm ``` -npm i -g @flxlblio/sfp +npm i -g @flxblio/sfp ``` #### Docker -Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxlblio/sfp/pkgs/container/sfp). +Docker images for sfp are available at [GitHub Container Registry](https://github.com/flxblio/sfp/pkgs/container/sfp). We recommend using the sfp docker image to avoid breakages in your CI/CD pipelines due to updates in sfp or any of its dependencies such as the SFDX CLI. @@ -86,13 +86,13 @@ To debug and test plugin #### Maintainers -List of Maintainers are available in the [link](https://docs.flxlblio.io/about-us) +List of Maintainers are available in the [link](https://docs.flxblio.io/about-us) #### Where do I reach for queries? -Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxlblio) as well. +Please create an issue in the repo for bugs or utilize GitHub Discussions for other queries. Join our [Slack Community](https://launchpass.com/flxblio) as well. ## License -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxlblio%2Fsfp?ref=badge_large) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fflxblio%2Fsfp.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fflxblio%2Fsfp?ref=badge_large) From 5e4cb364da63534ca157851fe2a94d9f24544f74 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 1 Feb 2024 21:57:12 +1100 Subject: [PATCH 68/95] fix(changelog): revert creation of changelog during run as the table is broken --- packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts index 4333aa1fa..1326bec90 100644 --- a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts +++ b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts @@ -145,7 +145,7 @@ export default class ChangelogImpl { if(this.isDryRun) { const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,false).generate())); + outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,true).generate())); } From 6591083f31d1fa4b1b8a2343ab2024f774c7f7cb Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 1 Feb 2024 21:57:22 +1100 Subject: [PATCH 69/95] chore(publish): update versions and publish to npm - @flxblio/sfp@31.0.1 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index dd590252a..478c4980c 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "31.0.0", + "version": "31.0.1", "license": "MIT", "author": "flxblio", "release": "January 24", From ab8ca59d5f17d8ba89f13af08037043d30a62f5f Mon Sep 17 00:00:00 2001 From: Ronny Rokitta <97387584+Rocko1204@users.noreply.github.com> Date: Tue, 6 Feb 2024 02:39:01 +0100 Subject: [PATCH 70/95] feat(prepare-c-flag): add noAnchestors option to config (#9) --- .../resources/schemas/pooldefinition.schema.json | 6 ++++++ .../sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts | 11 +++++++---- .../sfp-cli/src/core/scratchorg/pool/PoolConfig.ts | 3 +-- .../src/core/scratchorg/pool/PoolCreateImpl.ts | 4 ++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/sfp-cli/resources/schemas/pooldefinition.schema.json b/packages/sfp-cli/resources/schemas/pooldefinition.schema.json index b3102e17d..ce6cadc0a 100644 --- a/packages/sfp-cli/resources/schemas/pooldefinition.schema.json +++ b/packages/sfp-cli/resources/schemas/pooldefinition.schema.json @@ -119,6 +119,12 @@ "type": "boolean", "default":false }, + "noAnchestors": { + "title": "Disable second-generation managed package (2GP) ancestors in the scratch org.", + "description": "Don't include second-generation managed package (2GP) ancestors in the scratch org when set to true", + "type": "boolean", + "default":false + }, "fetchArtifacts": { "title": "Fetch Artifacts using below mechanism", "description": "Fetch artifacts from artifact registry using below mechanism", diff --git a/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts b/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts index f354fbbd8..f8caee807 100644 --- a/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts +++ b/packages/sfp-cli/src/core/scratchorg/ScratchOrgOperator.ts @@ -7,6 +7,7 @@ import { ScratchOrgRequest } from '@salesforce/core'; import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import getFormattedTime from '../utils/GetFormattedTime'; import SFPStatsSender from '../stats/SFPStatsSender'; +import { PoolConfig } from './pool/PoolConfig'; const retry = require('async-retry'); export default class ScratchOrgOperator { @@ -16,7 +17,8 @@ export default class ScratchOrgOperator { alias: string, config_file_path: string, expiry: number, - waitTime: number = 6 + waitTime: number = 6, + poolConfig: Partial ): Promise { SFPLogger.log('Parameters: ' + alias + ' ' + config_file_path + ' ' + expiry + ' ', LoggerLevel.TRACE); @@ -26,7 +28,8 @@ export default class ScratchOrgOperator { alias, config_file_path, Duration.days(expiry), - Duration.minutes(waitTime) + Duration.minutes(waitTime), + poolConfig ); SFPLogger.log(JSON.stringify(scatchOrgResult), LoggerLevel.TRACE); @@ -81,11 +84,11 @@ export default class ScratchOrgOperator { ); } - private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration) { + private async requestAScratchOrg(alias: string, definitionFile: string, expireIn: Duration, waitTime: Duration, poolConfig: Partial) { const createCommandOptions: ScratchOrgRequest = { durationDays: expireIn.days, nonamespace: false, - noancestors: false, + noancestors: poolConfig.noAnchestors || false, wait: waitTime, retry: 3, definitionfile: definitionFile, diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts index b18fc05f2..39996186e 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolConfig.ts @@ -35,6 +35,5 @@ export interface PoolConfig { scratchOrgs?: ScratchOrg[]; failedToCreate?: number; maxRetryCount?:number; - - + noAnchestors?:boolean; } diff --git a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts index f968c97cc..84671d6b2 100644 --- a/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts +++ b/packages/sfp-cli/src/core/scratchorg/pool/PoolCreateImpl.ts @@ -145,7 +145,7 @@ export default class PoolCreateImpl extends PoolBaseImpl { } return ok(this.pool); - + } private async computeAllocation(): Promise { @@ -198,7 +198,7 @@ export default class PoolCreateImpl extends PoolBaseImpl { const startTime = Date.now(); for (let i = 1; i <= pool.to_allocate; i++) { const scratchOrgPromise: Promise = scratchOrgCreationLimiter.schedule(() => - scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime) + scratchOrgOperator.create(`SO` + i, this.pool.configFilePath, this.pool.expiry, this.pool.waitTime, this.pool) ); scratchOrgPromises.push(scratchOrgPromise); } From 80e8dc5ca7e583e205ab65da2fb654e34ad67175 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 6 Feb 2024 12:39:57 +1100 Subject: [PATCH 71/95] chore(publish): update versions and publish to npm - @flxblio/sfp@31.1.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 478c4980c..573c01699 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "31.0.1", + "version": "31.1.0", "license": "MIT", "author": "flxblio", "release": "January 24", From 6432fc6182859bb2f51e6512a01ef8015b3a633a Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 6 Feb 2024 12:44:35 +1100 Subject: [PATCH 72/95] fix(docker): update url links to docker --- dockerfiles/sfp-lite.Dockerfile | 2 +- dockerfiles/sfp.Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfiles/sfp-lite.Dockerfile b/dockerfiles/sfp-lite.Dockerfile index 4b1794217..921bc97df 100644 --- a/dockerfiles/sfp-lite.Dockerfile +++ b/dockerfiles/sfp-lite.Dockerfile @@ -8,7 +8,7 @@ ARG NODE_MAJOR=18 LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" LABEL org.opencontainers.image.url "https://github.com/flxbl-io/sfp" -LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" +LABEL org.opencontainers.image.documentation "https://docs.flxbl.io/sfp" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "Flxbl" LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" diff --git a/dockerfiles/sfp.Dockerfile b/dockerfiles/sfp.Dockerfile index 5c1c720ce..453f2867f 100644 --- a/dockerfiles/sfp.Dockerfile +++ b/dockerfiles/sfp.Dockerfile @@ -11,7 +11,7 @@ ARG NODE_MAJOR=18 LABEL org.opencontainers.image.description "sfp is a build system for modular development in Salesforce." LABEL org.opencontainers.image.licenses "MIT" LABEL org.opencontainers.image.url "https://github.com/flxbl-io/sfp" -LABEL org.opencontainers.image.documentation "https://docs.flxbl.io" +LABEL org.opencontainers.image.documentation "https://docs.flxbl.io/sfp" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "Flxbl" LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" From 878ac4e08b4770830937b526cf864e9978c999e6 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 6 Feb 2024 17:31:57 +1100 Subject: [PATCH 73/95] style(class): fix naming convention of sfpCommand -> SfpCommand --- packages/sfp-cli/src/BuildBase.ts | 4 ++-- packages/sfp-cli/src/InstallPackageCommand.ts | 6 +++--- packages/sfp-cli/src/PackageCreateCommand.ts | 4 ++-- packages/sfp-cli/src/SfpCommand.ts | 6 +++--- packages/sfp-cli/src/commands/apextests/trigger.ts | 4 ++-- packages/sfp-cli/src/commands/artifacts/fetch.ts | 4 ++-- packages/sfp-cli/src/commands/artifacts/query.ts | 4 ++-- packages/sfp-cli/src/commands/changelog/generate.ts | 4 ++-- packages/sfp-cli/src/commands/dependency/expand.ts | 4 ++-- packages/sfp-cli/src/commands/dependency/install.ts | 4 ++-- packages/sfp-cli/src/commands/dependency/shrink.ts | 4 ++-- packages/sfp-cli/src/commands/impact/package.ts | 4 ++-- packages/sfp-cli/src/commands/impact/releaseconfig.ts | 4 ++-- packages/sfp-cli/src/commands/metrics/report.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/deploy.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/prepare.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/promote.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/publish.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/release.ts | 4 ++-- packages/sfp-cli/src/commands/orchestrator/validate.ts | 4 ++-- .../sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts | 4 ++-- packages/sfp-cli/src/commands/pool/delete.ts | 4 ++-- packages/sfp-cli/src/commands/pool/fetch.ts | 4 ++-- packages/sfp-cli/src/commands/pool/list.ts | 4 ++-- packages/sfp-cli/src/commands/pool/metrics/publish.ts | 4 ++-- packages/sfp-cli/src/commands/pool/org/delete.ts | 4 ++-- packages/sfp-cli/src/commands/profile/merge.ts | 4 ++-- packages/sfp-cli/src/commands/profile/reconcile.ts | 4 ++-- packages/sfp-cli/src/commands/profile/retrieve.ts | 4 ++-- packages/sfp-cli/src/commands/releasedefinition/generate.ts | 4 ++-- packages/sfp-cli/src/commands/repo/patch.ts | 4 ++-- 31 files changed, 64 insertions(+), 64 deletions(-) diff --git a/packages/sfp-cli/src/BuildBase.ts b/packages/sfp-cli/src/BuildBase.ts index 97a5abb19..c8608200d 100644 --- a/packages/sfp-cli/src/BuildBase.ts +++ b/packages/sfp-cli/src/BuildBase.ts @@ -1,7 +1,7 @@ import ArtifactGenerator from './core/artifacts/generators/ArtifactGenerator'; import { EOL } from 'os'; -import sfpCommand from './SfpCommand'; +import SfpCommand from './SfpCommand'; import { Messages } from '@salesforce/core'; import fs = require('fs'); import SFPStatsSender from './core/stats/SFPStatsSender'; @@ -34,7 +34,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'build'); -export default abstract class BuildBase extends sfpCommand { +export default abstract class BuildBase extends SfpCommand { protected static requiresUsername = false; protected static requiresDevhubUsername = false; protected static requiresProject = true; diff --git a/packages/sfp-cli/src/InstallPackageCommand.ts b/packages/sfp-cli/src/InstallPackageCommand.ts index 5ee284493..3febb84ad 100644 --- a/packages/sfp-cli/src/InstallPackageCommand.ts +++ b/packages/sfp-cli/src/InstallPackageCommand.ts @@ -1,4 +1,4 @@ -import sfpCommand from './SfpCommand'; +import SfpCommand from './SfpCommand'; import { Messages } from '@salesforce/core'; import ArtifactFetcher, { Artifact } from './core/artifacts/ArtifactFetcher'; import * as rimraf from 'rimraf'; @@ -15,9 +15,9 @@ const messages = Messages.loadMessages('@flxblio/sfp', 'install_package_command' /** * Base class providing common functionality for package installation * - * @extends sfpCommand + * @extends SfpCommand */ -export default abstract class InstallPackageCommand extends sfpCommand { +export default abstract class InstallPackageCommand extends SfpCommand { protected sfpPackage: SfpPackage; protected sfpOrg: SFPOrg; /** diff --git a/packages/sfp-cli/src/PackageCreateCommand.ts b/packages/sfp-cli/src/PackageCreateCommand.ts index da1d88fad..f98707fba 100644 --- a/packages/sfp-cli/src/PackageCreateCommand.ts +++ b/packages/sfp-cli/src/PackageCreateCommand.ts @@ -3,7 +3,7 @@ import { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-log import PackageDiffImpl from './core/package/diff/PackageDiffImpl'; import { Messages } from '@salesforce/core'; import { EOL } from 'os'; -import sfpCommand from './SfpCommand'; +import SfpCommand from './SfpCommand'; import SfpPackage, { PackageType } from './core/package/SfpPackage'; import getFormattedTime from './core/utils/GetFormattedTime'; const fs = require('fs-extra'); @@ -14,7 +14,7 @@ import { loglevel } from './flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'create-package'); -export default abstract class PackageCreateCommand extends sfpCommand { +export default abstract class PackageCreateCommand extends SfpCommand { protected static requiresUsername = false; protected static requiresDevhubUsername = false; protected static requiresProject = true; diff --git a/packages/sfp-cli/src/SfpCommand.ts b/packages/sfp-cli/src/SfpCommand.ts index 2d92e93ce..1be9996af 100644 --- a/packages/sfp-cli/src/SfpCommand.ts +++ b/packages/sfp-cli/src/SfpCommand.ts @@ -13,7 +13,7 @@ import { Org } from '@salesforce/core'; * * @extends SfdxCommand */ -export default abstract class sfpCommand extends Command { +export default abstract class SfpCommand extends Command { protected static requiresProject: boolean; @@ -170,8 +170,8 @@ export default abstract class sfpCommand extends Command { } - protected get statics(): typeof sfpCommand { - return this.constructor as typeof sfpCommand; + protected get statics(): typeof SfpCommand { + return this.constructor as typeof SfpCommand; } } diff --git a/packages/sfp-cli/src/commands/apextests/trigger.ts b/packages/sfp-cli/src/commands/apextests/trigger.ts index 53e600e87..bac3454f8 100644 --- a/packages/sfp-cli/src/commands/apextests/trigger.ts +++ b/packages/sfp-cli/src/commands/apextests/trigger.ts @@ -8,7 +8,7 @@ import { RunAllTestsInPackageOptions, } from '../../core/apextest/TestOptions'; import TriggerApexTests from '../../core/apextest/TriggerApexTests'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import SfpPackage from '../../core/package/SfpPackage'; @@ -27,7 +27,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'trigger_apex_test'); -export default class TriggerApexTest extends sfpCommand { +export default class TriggerApexTest extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/artifacts/fetch.ts b/packages/sfp-cli/src/commands/artifacts/fetch.ts index 1a8854edd..279aea5a0 100644 --- a/packages/sfp-cli/src/commands/artifacts/fetch.ts +++ b/packages/sfp-cli/src/commands/artifacts/fetch.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import FetchImpl, { ArtifactVersion } from '../../impl/artifacts/FetchImpl'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; @@ -12,7 +12,7 @@ import { COLOR_HEADER } from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'fetch'); -export default class Fetch extends sfpCommand { +export default class Fetch extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/artifacts/query.ts b/packages/sfp-cli/src/commands/artifacts/query.ts index 7c0ed8ba7..ecaaa72db 100644 --- a/packages/sfp-cli/src/commands/artifacts/query.ts +++ b/packages/sfp-cli/src/commands/artifacts/query.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import SFPOrg from '../../core/org/SFPOrg'; import SFPLogger, { ConsoleLogger } from '@flxblio/sfp-logger'; @@ -9,7 +9,7 @@ const Table = require('cli-table'); Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'artifacts_query'); -export default class Query extends sfpCommand { +export default class Query extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp artifacts:query -u `]; diff --git a/packages/sfp-cli/src/commands/changelog/generate.ts b/packages/sfp-cli/src/commands/changelog/generate.ts index bc94d8ce8..09c568d00 100644 --- a/packages/sfp-cli/src/commands/changelog/generate.ts +++ b/packages/sfp-cli/src/commands/changelog/generate.ts @@ -1,14 +1,14 @@ import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import ChangelogImpl from '../../impl/changelog/ChangelogImpl'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'generate_changelog'); -export default class GenerateChangelog extends sfpCommand { +export default class GenerateChangelog extends SfpCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfp-cli/src/commands/dependency/expand.ts b/packages/sfp-cli/src/commands/dependency/expand.ts index 87070e906..3f93008c6 100644 --- a/packages/sfp-cli/src/commands/dependency/expand.ts +++ b/packages/sfp-cli/src/commands/dependency/expand.ts @@ -1,6 +1,6 @@ import TransitiveDependencyResolver from '../../core/package/dependencies/TransitiveDependencyResolver'; import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import ProjectConfig from '../../core/project/ProjectConfig'; import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; import * as fs from 'fs-extra'; @@ -16,7 +16,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_expand'); -export default class Expand extends sfpCommand { +export default class Expand extends SfpCommand { public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfp-cli/src/commands/dependency/install.ts b/packages/sfp-cli/src/commands/dependency/install.ts index 9d275a225..67073338b 100644 --- a/packages/sfp-cli/src/commands/dependency/install.ts +++ b/packages/sfp-cli/src/commands/dependency/install.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; import ProjectConfig from '../../core/project/ProjectConfig'; @@ -16,7 +16,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_install'); -export default class Install extends sfpCommand { +export default class Install extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresUsername = true; protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/dependency/shrink.ts b/packages/sfp-cli/src/commands/dependency/shrink.ts index c6aa0ced2..28aa2a4a2 100644 --- a/packages/sfp-cli/src/commands/dependency/shrink.ts +++ b/packages/sfp-cli/src/commands/dependency/shrink.ts @@ -1,6 +1,6 @@ import ShrinkImpl from '../../impl/dependency/ShrinkImpl'; import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import ProjectConfig from '../../core/project/ProjectConfig'; import * as fs from 'fs-extra'; import path = require('path'); @@ -16,7 +16,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'dependency_shrink'); -export default class Shrink extends sfpCommand { +export default class Shrink extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/impact/package.ts b/packages/sfp-cli/src/commands/impact/package.ts index 4b803d1a1..bd5ee5933 100644 --- a/packages/sfp-cli/src/commands/impact/package.ts +++ b/packages/sfp-cli/src/commands/impact/package.ts @@ -1,5 +1,5 @@ import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Stage } from '../../impl/Stage'; import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; @@ -14,7 +14,7 @@ import * as fs from 'fs-extra'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'impact_package'); -export default class Package extends sfpCommand { +export default class Package extends SfpCommand { public static flags = { loglevel, basebranch: Flags.string({ diff --git a/packages/sfp-cli/src/commands/impact/releaseconfig.ts b/packages/sfp-cli/src/commands/impact/releaseconfig.ts index 2e5f1bcdf..31318c57e 100644 --- a/packages/sfp-cli/src/commands/impact/releaseconfig.ts +++ b/packages/sfp-cli/src/commands/impact/releaseconfig.ts @@ -1,5 +1,5 @@ import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Stage } from '../../impl/Stage'; import * as fs from 'fs-extra'; import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger } from '@flxblio/sfp-logger'; @@ -15,7 +15,7 @@ const Table = require('cli-table'); Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'impact_release_config'); -export default class ReleaseConfig extends sfpCommand { +export default class ReleaseConfig extends SfpCommand { public static flags = { loglevel, branch: Flags.string({ diff --git a/packages/sfp-cli/src/commands/metrics/report.ts b/packages/sfp-cli/src/commands/metrics/report.ts index 5bd99e558..17c806ca1 100644 --- a/packages/sfp-cli/src/commands/metrics/report.ts +++ b/packages/sfp-cli/src/commands/metrics/report.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import SFPLogger, { LoggerLevel, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; @@ -12,7 +12,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'metrics_report'); -export default class Report extends sfpCommand { +export default class Report extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = false; diff --git a/packages/sfp-cli/src/commands/orchestrator/deploy.ts b/packages/sfp-cli/src/commands/orchestrator/deploy.ts index 18844663b..a9d8c9ce9 100644 --- a/packages/sfp-cli/src/commands/orchestrator/deploy.ts +++ b/packages/sfp-cli/src/commands/orchestrator/deploy.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import DeployImpl, { DeploymentMode, DeployProps, DeploymentResult } from '../../impl/deploy/DeployImpl'; @@ -22,7 +22,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'deploy'); -export default class Deploy extends sfpCommand { +export default class Deploy extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:deploy -u `]; diff --git a/packages/sfp-cli/src/commands/orchestrator/prepare.ts b/packages/sfp-cli/src/commands/orchestrator/prepare.ts index 18aa7daa9..0e6c3a024 100644 --- a/packages/sfp-cli/src/commands/orchestrator/prepare.ts +++ b/packages/sfp-cli/src/commands/orchestrator/prepare.ts @@ -1,5 +1,5 @@ import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import PrepareImpl from '../../impl/prepare/PrepareImpl'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import { Stage } from '../../impl/Stage'; @@ -26,7 +26,7 @@ import { loglevel, logsgroupsymbol, targetdevhubusername } from '../../flags/sfd Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'prepare'); -export default class Prepare extends sfpCommand { +export default class Prepare extends SfpCommand { protected static requiresDevhubUsername = true; protected static requiresProject = true; diff --git a/packages/sfp-cli/src/commands/orchestrator/promote.ts b/packages/sfp-cli/src/commands/orchestrator/promote.ts index 205acb622..fb067b87e 100644 --- a/packages/sfp-cli/src/commands/orchestrator/promote.ts +++ b/packages/sfp-cli/src/commands/orchestrator/promote.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import PromoteUnlockedPackageImpl from '../../core/package/promote/PromoteUnlockedPackageImpl' import ArtifactFetcher from '../../core/artifacts/ArtifactFetcher'; @@ -14,7 +14,7 @@ import SFPLogger from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'promote'); -export default class Promote extends sfpCommand { +export default class Promote extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:promote -d path/to/artifacts -v `]; diff --git a/packages/sfp-cli/src/commands/orchestrator/publish.ts b/packages/sfp-cli/src/commands/orchestrator/publish.ts index 65256ffaa..2209abba3 100644 --- a/packages/sfp-cli/src/commands/orchestrator/publish.ts +++ b/packages/sfp-cli/src/commands/orchestrator/publish.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Messages } from '@salesforce/core'; import * as fs from 'fs-extra'; import path = require('path'); @@ -29,7 +29,7 @@ import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'publish'); -export default class Promote extends sfpCommand { +export default class Promote extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/orchestrator/release.ts b/packages/sfp-cli/src/commands/orchestrator/release.ts index 57f8d913b..203dff01f 100644 --- a/packages/sfp-cli/src/commands/orchestrator/release.ts +++ b/packages/sfp-cli/src/commands/orchestrator/release.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import ReleaseImpl, { ReleaseProps, ReleaseResult } from '../../impl/release/ReleaseImpl'; @@ -21,7 +21,7 @@ import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'release'); -export default class Release extends sfpCommand { +export default class Release extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/orchestrator/validate.ts b/packages/sfp-cli/src/commands/orchestrator/validate.ts index 45dc3ffcb..272abc423 100644 --- a/packages/sfp-cli/src/commands/orchestrator/validate.ts +++ b/packages/sfp-cli/src/commands/orchestrator/validate.ts @@ -1,5 +1,5 @@ import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; @@ -13,7 +13,7 @@ import { LoggerLevel } from '@flxblio/sfp-logger'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'validate'); -export default class Validate extends sfpCommand { +export default class Validate extends SfpCommand { protected static requiresProject = true; public static description = messages.getMessage('commandDescription'); diff --git a/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts b/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts index 0b9b1f2ec..88201ef37 100644 --- a/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts +++ b/packages/sfp-cli/src/commands/orchestrator/validateAgainstOrg.ts @@ -1,5 +1,5 @@ import { LoggerLevel, Messages, Org } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import ValidateImpl, { ValidateAgainst, ValidateProps, ValidationMode } from '../../impl/validate/ValidateImpl'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; @@ -13,7 +13,7 @@ import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'validateAgainstOrg'); -export default class ValidateAgainstOrg extends sfpCommand { +export default class ValidateAgainstOrg extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp orchestrator:validateAgainstOrg -u `]; diff --git a/packages/sfp-cli/src/commands/pool/delete.ts b/packages/sfp-cli/src/commands/pool/delete.ts index 8ef6856d3..440744645 100644 --- a/packages/sfp-cli/src/commands/pool/delete.ts +++ b/packages/sfp-cli/src/commands/pool/delete.ts @@ -2,7 +2,7 @@ import { Messages } from '@salesforce/core'; import PoolDeleteImpl from '../../core/scratchorg/pool/PoolDeleteImpl'; import OrphanedOrgsDeleteImpl from '../../core/scratchorg/pool/OrphanedOrgsDeleteImpl'; import ScratchOrg from '../../core/scratchorg/ScratchOrg'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import SFPLogger, { ConsoleLogger, LoggerLevel } from '@flxblio/sfp-logger'; import { COLOR_KEY_MESSAGE } from '@flxblio/sfp-logger'; @@ -18,7 +18,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'pool_delete'); -export default class Delete extends sfpCommand { +export default class Delete extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/pool/fetch.ts b/packages/sfp-cli/src/commands/pool/fetch.ts index 02baaa0d8..cfc522a1b 100644 --- a/packages/sfp-cli/src/commands/pool/fetch.ts +++ b/packages/sfp-cli/src/commands/pool/fetch.ts @@ -12,7 +12,7 @@ import { COLOR_HEADER } from '@flxblio/sfp-logger'; import { COLOR_SUCCESS } from '@flxblio/sfp-logger'; import { COLOR_TIME } from '@flxblio/sfp-logger'; import getFormattedTime from '../../core/utils/GetFormattedTime'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Flags, ux } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; @@ -23,7 +23,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poolFetch'); -export default class Fetch extends sfpCommand { +export default class Fetch extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/pool/list.ts b/packages/sfp-cli/src/commands/pool/list.ts index e4761f392..2e597f821 100644 --- a/packages/sfp-cli/src/commands/pool/list.ts +++ b/packages/sfp-cli/src/commands/pool/list.ts @@ -4,7 +4,7 @@ import poolListImpl from '../../core/scratchorg/pool/PoolListImpl'; import ScratchOrg from '../../core/scratchorg/ScratchOrg'; import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Flags, ux } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from '../../flags/sfdxflags'; @@ -15,7 +15,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_poollist'); -export default class List extends sfpCommand { +export default class List extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/pool/metrics/publish.ts b/packages/sfp-cli/src/commands/pool/metrics/publish.ts index 6ff13e294..56485c937 100644 --- a/packages/sfp-cli/src/commands/pool/metrics/publish.ts +++ b/packages/sfp-cli/src/commands/pool/metrics/publish.ts @@ -1,4 +1,4 @@ -import sfpCommand from '../../../SfpCommand'; +import SfpCommand from '../../../SfpCommand'; import SFPStatsSender from '../../../core/stats/SFPStatsSender'; import PoolListImpl from '../../../core/scratchorg/pool/PoolListImpl'; import ScratchOrg from '../../../core/scratchorg/ScratchOrg'; @@ -15,7 +15,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_metrics_publish'); -export default class Publish extends sfpCommand { +export default class Publish extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/pool/org/delete.ts b/packages/sfp-cli/src/commands/pool/org/delete.ts index e1a0f649d..2292e22cc 100644 --- a/packages/sfp-cli/src/commands/pool/org/delete.ts +++ b/packages/sfp-cli/src/commands/pool/org/delete.ts @@ -1,5 +1,5 @@ import { AnyJson } from '@salesforce/ts-types'; -import sfpCommand from '../../../SfpCommand'; +import SfpCommand from '../../../SfpCommand'; import PoolOrgDeleteImpl from '../../../core/scratchorg/pool/PoolOrgDeleteImpl'; import SFPLogger from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; @@ -19,7 +19,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'scratchorg_pool_org_delete'); -export default class Delete extends sfpCommand { +export default class Delete extends SfpCommand { public static description = messages.getMessage('commandDescription'); protected static requiresDevhubUsername = true; diff --git a/packages/sfp-cli/src/commands/profile/merge.ts b/packages/sfp-cli/src/commands/profile/merge.ts index 1955a40d1..5513ff2d0 100644 --- a/packages/sfp-cli/src/commands/profile/merge.ts +++ b/packages/sfp-cli/src/commands/profile/merge.ts @@ -4,7 +4,7 @@ import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; import SFPLogger, { LoggerLevel } from '@flxblio/sfp-logger'; import ProfileRetriever from '@flxblio/sfprofiles/lib/impl/metadata/retriever/profileRetriever'; import ProfileMerge from '@flxblio/sfprofiles/lib/impl/source/profileMerge'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import Table from 'cli-table'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; @@ -14,7 +14,7 @@ Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'profile_merge'); -export default class Merge extends sfpCommand { +export default class Merge extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/profile/reconcile.ts b/packages/sfp-cli/src/commands/profile/reconcile.ts index 571af5b55..58b2d24fd 100644 --- a/packages/sfp-cli/src/commands/profile/reconcile.ts +++ b/packages/sfp-cli/src/commands/profile/reconcile.ts @@ -6,7 +6,7 @@ import { METADATA_INFO } from '@flxblio/sfprofiles/lib/impl/metadata/metadataInf import * as path from 'path'; import ProfileReconcile from '@flxblio/sfprofiles/lib/impl/source/profileReconcile'; import MetadataFiles from '@flxblio/sfprofiles/lib/impl/metadata/metadataFiles'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; const Table = require('cli-table'); import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { Flags } from '@oclif/core'; @@ -17,7 +17,7 @@ Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'profile_reconcile'); -export default class Reconcile extends sfpCommand { +export default class Reconcile extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/profile/retrieve.ts b/packages/sfp-cli/src/commands/profile/retrieve.ts index d1b1853e0..106a5914a 100644 --- a/packages/sfp-cli/src/commands/profile/retrieve.ts +++ b/packages/sfp-cli/src/commands/profile/retrieve.ts @@ -3,7 +3,7 @@ import * as fs from 'fs-extra'; import { isNil } from 'lodash'; import { Sfpowerkit } from '@flxblio/sfprofiles/lib/utils/sfpowerkit'; import ProfileSync from '@flxblio/sfprofiles/lib/impl/source/profileSync'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import Table from 'cli-table'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import { arrayFlagSfdxStyle, loglevel, orgApiVersionFlagSfdxStyle, requiredUserNameFlag } from '../../flags/sfdxflags'; @@ -14,7 +14,7 @@ import SFPLogger, { COLOR_KEY_MESSAGE, COLOR_WARNING, LoggerLevel } from '@flxbl Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'profile_retrieve'); -export default class Retrieve extends sfpCommand { +export default class Retrieve extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/releasedefinition/generate.ts b/packages/sfp-cli/src/commands/releasedefinition/generate.ts index 0bad08e90..6cb37317a 100644 --- a/packages/sfp-cli/src/commands/releasedefinition/generate.ts +++ b/packages/sfp-cli/src/commands/releasedefinition/generate.ts @@ -1,14 +1,14 @@ import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Messages } from '@salesforce/core'; import ReleaseDefinitionGenerator from '../../impl/release/ReleaseDefinitionGenerator'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'releasedefinition_generate'); -export default class Generate extends sfpCommand { +export default class Generate extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [ diff --git a/packages/sfp-cli/src/commands/repo/patch.ts b/packages/sfp-cli/src/commands/repo/patch.ts index 1781b3286..65e77aba4 100644 --- a/packages/sfp-cli/src/commands/repo/patch.ts +++ b/packages/sfp-cli/src/commands/repo/patch.ts @@ -1,5 +1,5 @@ import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; +import SfpCommand from '../../SfpCommand'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; import ProjectConfig from '../../core/project/ProjectConfig'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; @@ -23,7 +23,7 @@ import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol } from '../../flags/sfdxf Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@flxblio/sfp', 'patch'); -export default class Patch extends sfpCommand { +export default class Patch extends SfpCommand { public static description = messages.getMessage('commandDescription'); public static examples = [`$ sfp repo:patch -n `]; From 4f33fd4b876dd88ebbda17a5c2a13ee617284713 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 8 Feb 2024 14:40:49 +1100 Subject: [PATCH 74/95] feat(release): introduce additional properties to release config and definition Introduce additional properties such as releaseConfigName, metadata into release configuration. Refactor the implementation across to make the variables and lass clear --- packages/sfp-cli/messages/release.json | 3 +- .../messages/releasedefinition_generate.json | 5 +- ...schema.json => release-config.schema.json} | 16 +- ...n.schema.json => release-defn.schema.json} | 14 +- packages/sfp-cli/src/BuildBase.ts | 6 +- .../sfp-cli/src/commands/artifacts/fetch.ts | 4 +- .../src/commands/orchestrator/release.ts | 12 +- .../commands/releasedefinition/generate.ts | 5 + packages/sfp-cli/src/commands/repo/patch.ts | 15 +- .../impl/artifacts/FetchAnArtifactFromNPM.ts | 27 ++-- .../sfp-cli/src/impl/artifacts/FetchImpl.ts | 4 +- .../sfp-cli/src/impl/deploy/DeployImpl.ts | 6 +- .../sfp-cli/src/impl/prepare/PrepareImpl.ts | 11 +- .../sfp-cli/src/impl/release/ReleaseConfig.ts | 137 +++--------------- .../src/impl/release/ReleaseConfigLoader.ts | 115 +++++++++++++++ .../src/impl/release/ReleaseDefinition.ts | 100 +++---------- .../release/ReleaseDefinitionGenerator.ts | 81 ++++++----- .../ReleaseDefinitionGeneratorConfigSchema.ts | 21 --- .../impl/release/ReleaseDefinitionLoader.ts | 79 ++++++++++ .../impl/release/ReleaseDefinitionSchema.ts | 21 --- .../sfp-cli/src/impl/release/ReleaseImpl.ts | 18 +-- .../sfp-cli/src/impl/validate/ValidateImpl.ts | 6 +- .../impl/release/ReleaseDefinition.test.ts | 18 +-- 23 files changed, 387 insertions(+), 337 deletions(-) rename packages/sfp-cli/resources/schemas/{releasedefinitiongenerator.schema.json => release-config.schema.json} (82%) rename packages/sfp-cli/resources/schemas/{releasedefinition.schema.json => release-defn.schema.json} (75%) create mode 100644 packages/sfp-cli/src/impl/release/ReleaseConfigLoader.ts delete mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionLoader.ts delete mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts diff --git a/packages/sfp-cli/messages/release.json b/packages/sfp-cli/messages/release.json index dfe21fdc9..890fd0a22 100644 --- a/packages/sfp-cli/messages/release.json +++ b/packages/sfp-cli/messages/release.json @@ -15,5 +15,6 @@ "allowUnpromotedPackagesFlagDescription": "Allow un-promoted packages to be installed in production", "devhubAliasFlagDescription": "Provide the alias of the devhub previously authenticated, default value is HubOrg", "directoryFlagDescription": "Relative path to directory to which the changelog should be generated, if the directory doesnt exist, it will be created", - "branchNameFlagDescription": "Repository branch in which the changelog files are located" + "branchNameFlagDescription": "Repository branch in which the changelog files are located", + "changelogByDomainsFlagDescription":"Create changelog files by domains or name mentioned in release config" } diff --git a/packages/sfp-cli/messages/releasedefinition_generate.json b/packages/sfp-cli/messages/releasedefinition_generate.json index c8f314871..f3072d865 100644 --- a/packages/sfp-cli/messages/releasedefinition_generate.json +++ b/packages/sfp-cli/messages/releasedefinition_generate.json @@ -1,10 +1,11 @@ { "commandDescription": "Generates release definition based on the artifacts installed from a commit reference", - "configFileFlagDescription":"Path to the config file which determines how the release definition should be generated", + "configFileFlagDescription":"Path to the release config file which determines how the release definition should be generated", "releaseNameFlagDescription": "Set a release name on the release definition file created", "commitFlagDescription": "Utilize the tags on the source branch to generate release definiton", "directoryFlagDescription": "Relative path to directory to which the release definition file should be generated, if the directory doesnt exist, it will be created", "branchNameFlagDescription": "Repository branch in which the release definition files are to be written", "noPushFlagDescription":"Do not push the changelog to a repository to the provided branch", - "forcePushFlagDescription": "Force push changes to the repository branch" + "forcePushFlagDescription": "Force push changes to the repository branch", + "metadataFlagDescription": "Additional metadata in json format that needs to be added to the release definition file" } diff --git a/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json b/packages/sfp-cli/resources/schemas/release-config.schema.json similarity index 82% rename from packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json rename to packages/sfp-cli/resources/schemas/release-config.schema.json index 580d0fefb..64d485174 100644 --- a/packages/sfp-cli/resources/schemas/releasedefinitiongenerator.schema.json +++ b/packages/sfp-cli/resources/schemas/release-config.schema.json @@ -1,14 +1,22 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxbl-io/sfp/blob/develop/packages/sfp-cli/resources/releasedefinitiongenerator.schema.json", - "title": "release definition generator", - "description": "The definition for generating a release defintion using generator command", + "$id": "https://github.com/flxbl-io/json-schemas/blob/main/release-config.schema.json", + "title": "Configuration of a release, used as an input to the release definition generator or by sfops for understanding how the repo is structure", + "description": "Configuration of a release", "type": "object", "additionalProperties": true, "dependencies": { "baselineOrg": ["skipIfAlreadyInstalled"] }, "properties": { + "releaseName": { + "type": "string", + "title": "Name of the domain this release configuration belongs to" + }, + "pool": { + "type": "string", + "title": "The pool of review sandbox or scratch org to be used for validating the packages that are part of this release configuration" + }, "excludeArtifacts": { "type": "array", "title": "Exclude the below artifacts while creating a release definition", @@ -57,7 +65,7 @@ }, "releasedefinitionProperties":{ "type": "object", - "title": "Properties that need to be set in the generated definition file", + "title": "Properties that need to be set in the generated release definition", "additionalProperties": true, "properties": { "skipIfAlreadyInstalled": { diff --git a/packages/sfp-cli/resources/schemas/releasedefinition.schema.json b/packages/sfp-cli/resources/schemas/release-defn.schema.json similarity index 75% rename from packages/sfp-cli/resources/schemas/releasedefinition.schema.json rename to packages/sfp-cli/resources/schemas/release-defn.schema.json index d81dcd6bb..33a25f335 100644 --- a/packages/sfp-cli/resources/schemas/releasedefinition.schema.json +++ b/packages/sfp-cli/resources/schemas/release-defn.schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/flxbl-io/sfp/blob/develop/packages/sfp-cli/resources/releasedefinition.schema.json", - "title": "release definition", - "description": "The definition for a release using sfp orchestrator", + "$id": "https://github.com/flxbl-io/json-schemas/blob/main/release-defn.schema.json", + "title": "A definition of a release, the artifacts to be deployed along with its version,", + "description": "This yaml file is either manually defined or auto generated by sfp release definition generator", "type": "object", "required": ["release", "artifacts"], "additionalProperties": false, @@ -13,6 +13,14 @@ "release": { "type": "string" }, + "releaseConfigName": { + "type": "string", + "title": "The name of the release config that generated this release definition,autopopulated when generated by release definition generator" + }, + "metadata": { + "type": "object", + "title": "Additional data to be written to the release definition" + }, "skipIfAlreadyInstalled": { "type": "boolean" }, diff --git a/packages/sfp-cli/src/BuildBase.ts b/packages/sfp-cli/src/BuildBase.ts index c8608200d..e2c6f3439 100644 --- a/packages/sfp-cli/src/BuildBase.ts +++ b/packages/sfp-cli/src/BuildBase.ts @@ -22,7 +22,7 @@ import SFPLogger, { } from '@flxblio/sfp-logger'; import getFormattedTime from './core/utils/GetFormattedTime'; import SfpPackage from './core/package/SfpPackage'; -import ReleaseConfig from './impl/release/ReleaseConfig'; +import ReleaseConfigLoader from './impl/release/ReleaseConfigLoader'; import { Flags } from '@oclif/core'; import { loglevel, orgApiVersionFlagSfdxStyle, targetdevhubusername } from './flags/sfdxflags'; @@ -234,8 +234,8 @@ export default abstract class BuildBase extends SfpCommand { private includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { if (releaseConfigFilePath) { - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); - buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); + let releaseConfigLoader:ReleaseConfigLoader = new ReleaseConfigLoader(logger, releaseConfigFilePath); + buildProps.includeOnlyPackages = releaseConfigLoader.getPackagesAsPerReleaseConfig(); printIncludeOnlyPackages(buildProps.includeOnlyPackages); } return buildProps; diff --git a/packages/sfp-cli/src/commands/artifacts/fetch.ts b/packages/sfp-cli/src/commands/artifacts/fetch.ts index 279aea5a0..50f67c830 100644 --- a/packages/sfp-cli/src/commands/artifacts/fetch.ts +++ b/packages/sfp-cli/src/commands/artifacts/fetch.ts @@ -1,7 +1,7 @@ import SfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import FetchImpl, { ArtifactVersion } from '../../impl/artifacts/FetchImpl'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import ReleaseDefinitionLoader from '../../impl/release/ReleaseDefinitionLoader'; import FetchArtifactsError from '../../impl/artifacts/FetchArtifactsError'; import { ConsoleLogger } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; @@ -58,7 +58,7 @@ export default class Fetch extends SfpCommand { public async execute() { this.validateFlags(); - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(this.flags.releasedefinition)).releaseDefinition; + let releaseDefinition = await ReleaseDefinitionLoader.loadReleaseDefinition(this.flags.releasedefinition); let result: { success: ArtifactVersion[]; failed: ArtifactVersion[]; diff --git a/packages/sfp-cli/src/commands/orchestrator/release.ts b/packages/sfp-cli/src/commands/orchestrator/release.ts index 203dff01f..4c66e9ab3 100644 --- a/packages/sfp-cli/src/commands/orchestrator/release.ts +++ b/packages/sfp-cli/src/commands/orchestrator/release.ts @@ -2,7 +2,7 @@ import SfpCommand from '../../SfpCommand'; import { LoggerLevel, Messages } from '@salesforce/core'; import SFPStatsSender from '../../core/stats/SFPStatsSender'; import ReleaseImpl, { ReleaseProps, ReleaseResult } from '../../impl/release/ReleaseImpl'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import ReleaseDefinitionLoader from '../../impl/release/ReleaseDefinitionLoader'; import ReleaseError from '../../errors/ReleaseError'; import path = require('path'); import SFPLogger, { @@ -14,7 +14,7 @@ import SFPLogger, { COLOR_KEY_MESSAGE, ConsoleLogger, } from '@flxblio/sfp-logger'; -import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; +import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag, requiredUserNameFlag } from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; @@ -95,6 +95,10 @@ export default class Release extends SfpCommand { message: '--allowunpromotedpackages is deprecated, All packages are allowed', }, }), + changelogByDomains: Flags.boolean({ + description: messages.getMessage('changelogByDomainsFlagDescription'), + hidden: true + }), devhubalias: optionalDevHubFlag, loglevel }; @@ -119,9 +123,9 @@ export default class Release extends SfpCommand { SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); - let releaseDefinitions: ReleaseDefinitionSchema[] = []; + let releaseDefinitions: ReleaseDefinition[] = []; for (const pathToReleaseDefintion of this.flags.releasedefinition) { - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)).releaseDefinition; + let releaseDefinition = await ReleaseDefinitionLoader.loadReleaseDefinition(pathToReleaseDefintion); //Support Legacy by taking the existing single workItemFilter and pushing it to the new model if(releaseDefinition.changelog?.workItemFilter) diff --git a/packages/sfp-cli/src/commands/releasedefinition/generate.ts b/packages/sfp-cli/src/commands/releasedefinition/generate.ts index 6cb37317a..5d67be13e 100644 --- a/packages/sfp-cli/src/commands/releasedefinition/generate.ts +++ b/packages/sfp-cli/src/commands/releasedefinition/generate.ts @@ -50,6 +50,10 @@ export default class Generate extends SfpCommand { description: messages.getMessage('forcePushFlagDescription'), dependsOn: ['push'], }), + metadata: Flags.string({ + char: 'm', + description: messages.getMessage('metadataFlagDescription'), + }), loglevel }; @@ -61,6 +65,7 @@ export default class Generate extends SfpCommand { this.flags.configfile, this.flags.releasename, this.flags.branchname, + this.flags.metadata, this.flags.directory, this.flags.nopush, this.flags.forcepush diff --git a/packages/sfp-cli/src/commands/repo/patch.ts b/packages/sfp-cli/src/commands/repo/patch.ts index 65e77aba4..a440066a1 100644 --- a/packages/sfp-cli/src/commands/repo/patch.ts +++ b/packages/sfp-cli/src/commands/repo/patch.ts @@ -1,10 +1,10 @@ import { Messages } from '@salesforce/core'; import SfpCommand from '../../SfpCommand'; -import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; +import ReleaseDefinitionLoader from '../../impl/release/ReleaseDefinitionLoader'; import ProjectConfig from '../../core/project/ProjectConfig'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; import FetchImpl from '../../impl/artifacts/FetchImpl'; -import ReleaseDefinitionSchema from '../../impl/release/ReleaseDefinitionSchema'; +import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; import path = require('path'); import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; import SfpPackage, { PackageType } from '../../core/package/SfpPackage'; @@ -127,7 +127,7 @@ export default class Patch extends SfpCommand { private async fetchArtifacts( - releaseDefintions: ReleaseDefinitionSchema[], + releaseDefintions: ReleaseDefinition[], fetchArtifactScript: string, scope: string, npmrcPath: string, @@ -140,17 +140,16 @@ export default class Patch extends SfpCommand { groupSection.end(); } - private async loadReleaseDefintions(releaseDefinitionPaths: []): Promise { - let releaseDefinitions: ReleaseDefinitionSchema[] = []; + private async loadReleaseDefintions(releaseDefinitionPaths: []): Promise { + let releaseDefinitions: ReleaseDefinition[] = []; for (const pathToReleaseDefintion of releaseDefinitionPaths) { - let releaseDefinition = (await ReleaseDefinition.loadReleaseDefinition(pathToReleaseDefintion)) - .releaseDefinition; + let releaseDefinition = await ReleaseDefinitionLoader.loadReleaseDefinition(pathToReleaseDefintion); releaseDefinitions.push(releaseDefinition); } return releaseDefinitions; } - private async overwriteModules(releaseDefinitions: ReleaseDefinitionSchema[], git: Git, logger: Logger) { + private async overwriteModules(releaseDefinitions: ReleaseDefinition[], git: Git, logger: Logger) { let temporaryWorkingDirectory = git.getRepositoryPath(); let revisedProjectConfig = ProjectConfig.getSFDXProjectConfig(temporaryWorkingDirectory); for (const releaseDefinition of releaseDefinitions) { diff --git a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts index f22432972..8d2f5fc87 100644 --- a/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts +++ b/packages/sfp-cli/src/impl/artifacts/FetchAnArtifactFromNPM.ts @@ -2,14 +2,12 @@ import * as fs from 'fs-extra'; import child_process = require('child_process'); import path = require('path'); import FetchAnArtifact from './FetchAnArtifact'; -import SFPLogger, { COLOR_WARNING } from '@flxblio/sfp-logger'; +import SFPLogger, { COLOR_WARNING, LoggerLevel } from '@flxblio/sfp-logger'; export class FetchAnArtifactFromNPM implements FetchAnArtifact { constructor(private scope: string, private npmrcPath: string) { - //Check whether the user has already passed in @, and remove it - this.scope= this.scope.replace(/@/g, '').toLowerCase(); - + this.scope = this.scope.replace(/@/g, '').toLowerCase(); if (this.npmrcPath) { try { @@ -45,20 +43,27 @@ export class FetchAnArtifactFromNPM implements FetchAnArtifact { cmd += `@${version}`; - console.log(`Fetching ${packageName} using ${cmd}`); + SFPLogger.log(`Fetching ${packageName} using ${cmd}`,LoggerLevel.INFO); child_process.execSync(cmd, { cwd: artifactDirectory, stdio: 'pipe', }); } catch (error) { + SFPLogger.log( + COLOR_WARNING( + `Artifact for ${packageName} not found in the NPM Registry provided, This might result in deployment failures, Try running with trace log level for more information` + ), + LoggerLevel.INFO + ); + + SFPLogger.log( + error, + LoggerLevel.TRACE + ); + + if (!isToContinueOnMissingArtifact) throw error; - else - SFPLogger.log( - COLOR_WARNING( - `Artifact for ${packageName} missing in NPM Registry provided, This might result in deployment failures` - ) - ); } } } diff --git a/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts index 33df9a75c..2e77eed9d 100644 --- a/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts +++ b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts @@ -1,7 +1,7 @@ import * as fs from 'fs-extra'; import Git from '../../core/git/Git'; import GitTags from '../../core/git/GitTags'; -import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; +import ReleaseDefinition from '../release/ReleaseDefinition'; import FetchArtifactsError from './FetchArtifactsError'; import * as rimraf from 'rimraf'; import FetchArtifactSelector from './FetchArtifactSelector'; @@ -22,7 +22,7 @@ export default class FetchImpl { } public async fetchArtifacts( - releaseDefinitions: ReleaseDefinitionSchema[] + releaseDefinitions: ReleaseDefinition[] ): Promise<{ success: ArtifactVersion[]; failed: ArtifactVersion[]; diff --git a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts index b164ac397..f5340c0ce 100644 --- a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts +++ b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts @@ -23,7 +23,7 @@ import * as _ from 'lodash'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import convertBuildNumDotDelimToHyphen from '../../core/utils/VersionNumberConverter'; -import ReleaseConfig from '../release/ReleaseConfig'; +import ReleaseConfigLoader from '../release/ReleaseConfigLoader'; import fs from 'fs-extra'; import { Align, getMarkdownTable } from 'markdown-table-ts'; import FileOutputHandler from '../../outputs/FileOutputHandler'; @@ -327,8 +327,8 @@ export default class DeployImpl { else { SFPLogger.log(COLOR_KEY_MESSAGE(`Filtering packages to be deployed based on release config ${COLOR_KEY_VALUE(releaseConfigPath)}`),LoggerLevel.INFO,logger); - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger,releaseConfigPath); - let packages = releaseConfig.getPackagesAsPerReleaseConfig(); + let releaseConfigLoader:ReleaseConfigLoader = new ReleaseConfigLoader(logger,releaseConfigPath); + let packages = releaseConfigLoader.getPackagesAsPerReleaseConfig(); //Filter artifacts based on packages let filteredSfPPackages:SfpPackage[] = []; diff --git a/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts index f438d7055..9eb11ed76 100644 --- a/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts +++ b/packages/sfp-cli/src/impl/prepare/PrepareImpl.ts @@ -23,10 +23,10 @@ import SFPStatsSender from '../../core/stats/SFPStatsSender'; import ExternalPackage2DependencyResolver from '../../core/package/dependencies/ExternalPackage2DependencyResolver'; import ExternalDependencyDisplayer from '../../core/display/ExternalDependencyDisplayer'; import ReleaseDefinitionGenerator from '../release/ReleaseDefinitionGenerator'; -import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema'; +import ReleaseDefinition from '../release/ReleaseDefinition'; import { ZERO_BORDER_TABLE } from '../../ui/TableConstants'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; -import ReleaseConfig from '../release/ReleaseConfig'; +import ReleaseConfigLoader from '../release/ReleaseConfigLoader'; import { COLOR_KEY_VALUE } from '@flxblio/sfp-logger'; const Table = require('cli-table'); @@ -114,11 +114,12 @@ export default class PrepareImpl { 'prepare', 'test', undefined, + undefined, true, false, true ); - let releaseDefinition = (await releaseDefinitionGenerator.exec()) as ReleaseDefinitionSchema; + let releaseDefinition = (await releaseDefinitionGenerator.exec()) as ReleaseDefinition; return Object.keys(releaseDefinition.artifacts); } } @@ -288,8 +289,8 @@ export default class PrepareImpl { function includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePath:string,buildProps: BuildProps,logger?:Logger): BuildProps { if (releaseConfigFilePath) { - let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, releaseConfigFilePath); - buildProps.includeOnlyPackages = releaseConfig.getPackagesAsPerReleaseConfig(); + let releaseConfigLoader:ReleaseConfigLoader = new ReleaseConfigLoader(logger, releaseConfigFilePath); + buildProps.includeOnlyPackages = releaseConfigLoader.getPackagesAsPerReleaseConfig(); printIncludeOnlyPackages(buildProps.includeOnlyPackages); } return buildProps; diff --git a/packages/sfp-cli/src/impl/release/ReleaseConfig.ts b/packages/sfp-cli/src/impl/release/ReleaseConfig.ts index dfa6f13cf..06f4c3fbb 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseConfig.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseConfig.ts @@ -1,115 +1,24 @@ -import * as fs from 'fs-extra'; -import ProjectConfig from '../../core/project/ProjectConfig'; -import Ajv, { _ } from 'ajv'; -import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; -import lodash = require('lodash'); -const yaml = require('js-yaml'); -import { Logger } from '@flxblio/sfp-logger'; -const path = require('path'); - -export default class ReleaseConfig { - private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; - - get releaseDefinitionGeneratorConfigSchema() { - // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); - } - - public constructor(private logger: Logger, pathToReleaseDefinition: string, private isExplicitDependencyCheckEnabled:boolean=false) { - this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); - this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); - - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && - this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts - ) { - throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); - } - // Easy to handle here than with schema - if ( - this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && - this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies - ) { - throw new Error( - 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' - ); - } - - // Workaround for jsonschema not supporting validation based on dependency value - if ( - this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && - !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled - ) - throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); - } - - public getPackagesAsPerReleaseConfig(directory?: string): string[] { - let packages: string[] = []; - let projectConfig = ProjectConfig.getSFDXProjectConfig(directory); - //Read sfdx project json - let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); - for (const sfdxPackage of sfdxPackages) { - if (this.getArtifactPredicate(sfdxPackage)) { - packages.push(sfdxPackage); - } - } - - if(packages.length>0) - { - for (const sfdxPackage of sfdxPackages) { - if (this.getPackageDependencyPredicate(sfdxPackage)) { - packages.push(sfdxPackage); - } - } - } - - - return packages; - } - - private validateReleaseDefinitionGeneratorConfig( - releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema - ): void { - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), - { encoding: 'UTF-8' } - ); - - let validator = new Ajv({ allErrors: true }).compile(schema); - let validationResult = validator(releaseDefinitionGeneratorSchema); - - if (!validationResult) { - let errorMsg: string = - `Release definition generation config does not meet schema requirements, ` + - `found ${validator.errors.length} validation errors:\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } - - private getArtifactPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { - return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); - } else if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { - return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); - } - else return true; - } - - private getPackageDependencyPredicate(artifact: string): boolean { - if(this.isExplicitDependencyCheckEnabled && this.releaseDefinitionGeneratorConfigSchema.dependencyOn) { - return this.releaseDefinitionGeneratorConfigSchema.dependencyOn?.includes(artifact); - } - } +export default interface ReleaseConfig { + releaseName?: string; + pool?:string; + includeOnlyArtifacts?: string[]; + excludeArtifacts?: string[]; + excludeArtifactsWithTag?: string[]; + excludeAllPackageDependencies?:boolean; + excludePackageDependencies?: string[]; + includeOnlyPackageDependencies?: string[]; + dependencyOn?: string[]; + releasedefinitionProperties?: { + skipIfAlreadyInstalled: boolean; + skipArtifactUpdate:boolean; + baselineOrg?: string; + promotePackagesBeforeDeploymentToOrg?: string; + changelog?: { + repoUrl?: string; + workItemFilters?: string[]; + workItemUrl?: string; + limit?: number; + showAllArtifacts?: boolean; + }; + }; } diff --git a/packages/sfp-cli/src/impl/release/ReleaseConfigLoader.ts b/packages/sfp-cli/src/impl/release/ReleaseConfigLoader.ts new file mode 100644 index 000000000..3805f4da4 --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseConfigLoader.ts @@ -0,0 +1,115 @@ +import * as fs from 'fs-extra'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import Ajv, { _ } from 'ajv'; +import ReleaseConfig from './ReleaseConfig'; +import lodash = require('lodash'); +const yaml = require('js-yaml'); +import { Logger } from '@flxblio/sfp-logger'; +const path = require('path'); + +export default class ReleaseConfigLoader { + private _releaseConfig: ReleaseConfig; + + get releaseConfig() { + // Return clone of releaseDefinition for immutability + return lodash.cloneDeep(this._releaseConfig); + } + + public constructor(private logger: Logger, pathToReleaseDefinition: string, private isExplicitDependencyCheckEnabled:boolean=false) { + this._releaseConfig = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); + this.validateReleaseDefinitionGeneratorConfig(this._releaseConfig); + + // Easy to handle here than with schema + if ( + this._releaseConfig.includeOnlyArtifacts && + this.releaseConfig.excludeArtifacts + ) { + throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); + } + // Easy to handle here than with schema + if ( + this._releaseConfig.includeOnlyPackageDependencies && + this.releaseConfig.excludePackageDependencies + ) { + throw new Error( + 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' + ); + } + + // Workaround for jsonschema not supporting validation based on dependency value + if ( + this._releaseConfig.releasedefinitionProperties?.baselineOrg && + !this._releaseConfig.releasedefinitionProperties?.skipIfAlreadyInstalled + ) + throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); + } + + public getPackagesAsPerReleaseConfig(directory?: string): string[] { + let packages: string[] = []; + let projectConfig = ProjectConfig.getSFDXProjectConfig(directory); + //Read sfdx project json + let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig); + for (const sfdxPackage of sfdxPackages) { + if (this.getArtifactPredicate(sfdxPackage)) { + packages.push(sfdxPackage); + } + } + + if(packages.length>0) + { + for (const sfdxPackage of sfdxPackages) { + if (this.getPackageDependencyPredicate(sfdxPackage)) { + packages.push(sfdxPackage); + } + } + } + + + return packages; + } + + private validateReleaseDefinitionGeneratorConfig( + releaseDefinitionGeneratorSchema: ReleaseConfig + ): void { + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'release-config.schema.json'), + { encoding: 'UTF-8' } + ); + + let validator = new Ajv({ allErrors: true }).compile(schema); + let validationResult = validator(releaseDefinitionGeneratorSchema); + + if (!validationResult) { + let errorMsg: string = + `Release definition generation config does not meet schema requirements, ` + + `found ${validator.errors.length} validation errors:\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } + + private getArtifactPredicate(artifact: string): boolean { + if (this.releaseConfig.includeOnlyArtifacts) { + return this.releaseConfig.includeOnlyArtifacts?.includes(artifact); + } else if (this.releaseConfig.excludeArtifacts) { + return !this.releaseConfig.excludeArtifacts?.includes(artifact); + } else if(this.isExplicitDependencyCheckEnabled && this.releaseConfig.dependencyOn) { + return this.releaseConfig.dependencyOn?.includes(artifact); + } + else return true; + } + + private getPackageDependencyPredicate(artifact: string): boolean { + if(this.isExplicitDependencyCheckEnabled && this.releaseConfig.dependencyOn) { + return this.releaseConfig.dependencyOn?.includes(artifact); + } + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts index accfb708b..a2983888f 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinition.ts @@ -1,79 +1,23 @@ -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; -import Ajv from 'ajv'; -const yaml = require('js-yaml'); -import lodash = require('lodash'); -import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId'; -import Git from '../../core/git/Git'; -import { ConsoleLogger } from '@flxblio/sfp-logger'; -const fs = require('fs-extra'); -const path = require('path'); - -export default class ReleaseDefinition { - get releaseDefinition() { - // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionSchema); - } - private constructor(private _releaseDefinitionSchema: ReleaseDefinitionSchema) { - this.validateReleaseDefinition(this._releaseDefinitionSchema); - - // Workaround for jsonschema not supporting validation based on dependency value - if (this._releaseDefinitionSchema.baselineOrg && !this._releaseDefinitionSchema.skipIfAlreadyInstalled) - throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); - - if (this._releaseDefinitionSchema.packageDependencies) { - this.convertPackageDependenciesIdTo18Digits(this._releaseDefinitionSchema.packageDependencies); - } - } - - public static async loadReleaseDefinition(pathToReleaseDefinition: string) { - //Check whether path contains gitRef - let releaseDefinitionSchema: ReleaseDefinitionSchema; - try { - if (pathToReleaseDefinition.includes(':')) { - let git = await Git.initiateRepo(); - await git.fetch(); - let releaseFile = await git.show([pathToReleaseDefinition]); - releaseDefinitionSchema = yaml.load(releaseFile); - } else { - releaseDefinitionSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8')); - } - } catch (error) { - throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`); - } - - let releaseDefinition = new ReleaseDefinition(releaseDefinitionSchema); - return releaseDefinition; - } - - private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) { - for (let pkg in packageDependencies) { - packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]); - } - } - - private validateReleaseDefinition(releaseDefinition: ReleaseDefinitionSchema): void { - let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinition.schema.json'), - { encoding: 'UTF-8' } - ); - - let validator = new Ajv({ allErrors: true }).compile(schema); - let validationResult = validator(releaseDefinition); - - if (!validationResult) { - let errorMsg: string = - `Release definition does not meet schema requirements, ` + - `found ${validator.errors.length} validation errors:\n`; - - validator.errors.forEach((error, errorNum) => { - errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( - error.params, - null, - 4 - )}`; - }); - - throw new Error(errorMsg); - } - } +export default interface ReleaseDefinition { + release: string; + releaseConfigName?:string; + metadata?: any; + skipIfAlreadyInstalled: boolean; + skipArtifactUpdate:boolean; + baselineOrg?: string; + artifacts: { + [p: string]: string; + }; + packageDependencies?: { + [p: string]: string; + }; + promotePackagesBeforeDeploymentToOrg?: string; + changelog?: { + repoUrl?: string; + workItemFilter?:string; + workItemFilters?: string[]; + workItemUrl?: string; + limit?: number; + showAllArtifacts?: boolean; + }; } diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts index 1b283240b..f64b63f3e 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGenerator.ts @@ -1,10 +1,10 @@ import { GitError } from 'simple-git'; import * as fs from 'fs-extra'; -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; +import ReleaseDefinition from './ReleaseDefinition'; import ProjectConfig from '../../core/project/ProjectConfig'; import Ajv, { _ } from 'ajv'; import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, Logger } from '@flxblio/sfp-logger'; -import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema'; +import ReleaseConfig from './ReleaseConfig'; import lodash = require('lodash'); import { LoggerLevel } from '@flxblio/sfp-logger'; import Git from '../../core/git/Git'; @@ -14,11 +14,11 @@ const yaml = require('js-yaml'); const path = require('path'); export default class ReleaseDefinitionGenerator { - private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema; + private _releaseConfiguration: ReleaseConfig; - get releaseDefinitionGeneratorConfigSchema() { + get releaseConfiguration() { // Return clone of releaseDefinition for immutability - return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema); + return lodash.cloneDeep(this._releaseConfiguration); } public constructor( @@ -27,25 +27,36 @@ export default class ReleaseDefinitionGenerator { pathToReleaseDefinition: string, private releaseName: string, private branch: string, + private metadata: any, private directory?: string, private noPush: boolean = false, private forcePush: boolean = false, private inMemoryMode:boolean = false ) { - this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); - this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema); + this._releaseConfiguration = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8')); + this.validateReleaseDefinitionGeneratorConfig(this._releaseConfiguration); + + + //Attempt to parse metadata flag into JSON + if (this.metadata) { + try { + this.metadata = JSON.parse(this.metadata); + } catch (error) { + throw new Error(`Invalid JSON for metadata flag: ${error}`); + } + } // Easy to handle here than with schema if ( - this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts && - this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts + this._releaseConfiguration.includeOnlyArtifacts && + this.releaseConfiguration.excludeArtifacts ) { throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts'); } // Easy to handle here than with schema if ( - this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies && - this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies + this._releaseConfiguration.includeOnlyPackageDependencies && + this.releaseConfiguration.excludePackageDependencies ) { throw new Error( 'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies' @@ -54,13 +65,13 @@ export default class ReleaseDefinitionGenerator { // Workaround for jsonschema not supporting validation based on dependency value if ( - this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg && - !this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled + this._releaseConfiguration.releasedefinitionProperties?.baselineOrg && + !this._releaseConfiguration.releasedefinitionProperties?.skipIfAlreadyInstalled ) throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); } - async exec(): Promise { @@ -92,7 +103,7 @@ export default class ReleaseDefinitionGenerator { ); } - private async execHandler(): Promise { @@ -146,7 +157,7 @@ export default class ReleaseDefinitionGenerator { } } - if (!this.releaseDefinitionGeneratorConfigSchema.excludeAllPackageDependencies) { + if (!this.releaseConfiguration.excludeAllPackageDependencies) { let allExternalPackages = ProjectConfig.getAllExternalPackages(projectConfig); for (const externalPackage of allExternalPackages) { if ( @@ -161,7 +172,7 @@ export default class ReleaseDefinitionGenerator { return { artifacts, packageDependencies }; } - private async generateReleaseDefintion(artifacts: any, packageDependencies: any, git: Git): Promise { @@ -179,8 +190,10 @@ export default class ReleaseDefinitionGenerator { return obj; }, {}); - let releaseDefinition: ReleaseDefinitionSchema = { + let releaseDefinition: ReleaseDefinition = { release: this.releaseName, + releaseConfigName : this.releaseConfiguration?.releaseName, + metadata: this.metadata, skipIfAlreadyInstalled: true, skipArtifactUpdate:false, artifacts: artifacts, @@ -190,18 +203,18 @@ export default class ReleaseDefinitionGenerator { if (Object.keys(packageDependencies).length > 0) releaseDefinition.packageDependencies = packageDependencies; //add promotePackagesBeforeDeploymentToOrg - releaseDefinition.promotePackagesBeforeDeploymentToOrg = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.promotePackagesBeforeDeploymentToOrg; + releaseDefinition.promotePackagesBeforeDeploymentToOrg = this.releaseConfiguration.releasedefinitionProperties?.promotePackagesBeforeDeploymentToOrg; //override skip if already installed - if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled) - releaseDefinition.skipIfAlreadyInstalled = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipIfAlreadyInstalled; + if(this.releaseConfiguration.releasedefinitionProperties?.skipIfAlreadyInstalled) + releaseDefinition.skipIfAlreadyInstalled = this.releaseConfiguration.releasedefinitionProperties?.skipIfAlreadyInstalled; //override skip artifact update - if(this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate) - releaseDefinition.skipArtifactUpdate = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.skipArtifactUpdate; + if(this.releaseConfiguration.releasedefinitionProperties?.skipArtifactUpdate) + releaseDefinition.skipArtifactUpdate = this.releaseConfiguration.releasedefinitionProperties?.skipArtifactUpdate; //Add changelog info - releaseDefinition.changelog = this.releaseDefinitionGeneratorConfigSchema.releasedefinitionProperties?.changelog; + releaseDefinition.changelog = this.releaseConfiguration.releasedefinitionProperties?.changelog; if(this.inMemoryMode) return releaseDefinition; @@ -240,10 +253,10 @@ export default class ReleaseDefinitionGenerator { } private validateReleaseDefinitionGeneratorConfig( - releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema + releaseDefinitionGeneratorSchema: ReleaseConfig ): void { let schema = fs.readJSONSync( - path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'), + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'release-config.schema.json'), { encoding: 'UTF-8' } ); @@ -268,18 +281,18 @@ export default class ReleaseDefinitionGenerator { } private getArtifactPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) { - return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact); + if (this.releaseConfiguration.includeOnlyArtifacts) { + return this.releaseConfiguration.includeOnlyArtifacts?.includes(artifact); + } else if (this.releaseConfiguration.excludeArtifacts) { + return !this.releaseConfiguration.excludeArtifacts?.includes(artifact); } else return true; } private getDependencyPredicate(artifact: string): boolean { - if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies) { - return this.releaseDefinitionGeneratorConfigSchema.includeOnlyPackageDependencies?.includes(artifact); - } else if (this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies) { - return !this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies?.includes(artifact); + if (this.releaseConfiguration.includeOnlyPackageDependencies) { + return this.releaseConfiguration.includeOnlyPackageDependencies?.includes(artifact); + } else if (this.releaseConfiguration.excludePackageDependencies) { + return !this.releaseConfiguration.excludePackageDependencies?.includes(artifact); } else return true; } } \ No newline at end of file diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts deleted file mode 100644 index 05d3d8ab9..000000000 --- a/packages/sfp-cli/src/impl/release/ReleaseDefinitionGeneratorConfigSchema.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default interface ReleaseDefinitionGeneratorSchema { - includeOnlyArtifacts?: string[]; - excludeArtifacts?: string[]; - excludeArtifactsWithTag?: string[]; - excludeAllPackageDependencies?:boolean; - excludePackageDependencies?: string[]; - includeOnlyPackageDependencies?: string[]; - releasedefinitionProperties?: { - skipIfAlreadyInstalled: boolean; - skipArtifactUpdate:boolean; - baselineOrg?: string; - promotePackagesBeforeDeploymentToOrg?: string; - changelog?: { - repoUrl?: string; - workItemFilters?: string[]; - workItemUrl?: string; - limit?: number; - showAllArtifacts?: boolean; - }; - }; -} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionLoader.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionLoader.ts new file mode 100644 index 000000000..3c11cd4b8 --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionLoader.ts @@ -0,0 +1,79 @@ +import ReleaseDefinition from './ReleaseDefinition'; +import Ajv from 'ajv'; +const yaml = require('js-yaml'); +import lodash = require('lodash'); +import get18DigitSalesforceId from '../../utils/Get18DigitSalesforceId'; +import Git from '../../core/git/Git'; +import { ConsoleLogger } from '@flxblio/sfp-logger'; +const fs = require('fs-extra'); +const path = require('path'); + +export default class ReleaseDefinitionLoader { + get releaseDefinition() { + // Return clone of releaseDefinition for immutability + return lodash.cloneDeep(this._releaseDefinition); + } + private constructor(private _releaseDefinition: ReleaseDefinition) { + this.validateReleaseDefinition(this._releaseDefinition); + + // Workaround for jsonschema not supporting validation based on dependency value + if (this._releaseDefinition.baselineOrg && !this._releaseDefinition.skipIfAlreadyInstalled) + throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'"); + + if (this._releaseDefinition.packageDependencies) { + this.convertPackageDependenciesIdTo18Digits(this._releaseDefinition.packageDependencies); + } + } + + public static async loadReleaseDefinition(pathToReleaseDefinition: string): Promise { + //Check whether path contains gitRef + let releaseDefinition: ReleaseDefinition; + try { + if (pathToReleaseDefinition.includes(':')) { + let git = await Git.initiateRepo(); + await git.fetch(); + let releaseFile = await git.show([pathToReleaseDefinition]); + releaseDefinition = yaml.load(releaseFile); + } else { + releaseDefinition = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'UTF8')); + } + } catch (error) { + throw new Error(`Unable to read the release definition file due to ${JSON.stringify(error)}`); + } + + let releaseDefinitionLoader = new ReleaseDefinitionLoader(releaseDefinition); + return releaseDefinitionLoader.releaseDefinition; + } + + private convertPackageDependenciesIdTo18Digits(packageDependencies: { [p: string]: string }) { + for (let pkg in packageDependencies) { + packageDependencies[pkg] = get18DigitSalesforceId(packageDependencies[pkg]); + } + } + + private validateReleaseDefinition(releaseDefinition: ReleaseDefinition): void { + let schema = fs.readJSONSync( + path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'release-defn.schema.json'), + { encoding: 'UTF-8' } + ); + + let validator = new Ajv({ allErrors: true }).compile(schema); + let validationResult = validator(releaseDefinition); + + if (!validationResult) { + let errorMsg: string = + `Release definition does not meet schema requirements, ` + + `found ${validator.errors.length} validation errors:\n`; + + validator.errors.forEach((error, errorNum) => { + errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify( + error.params, + null, + 4 + )}`; + }); + + throw new Error(errorMsg); + } + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts deleted file mode 100644 index b8f221291..000000000 --- a/packages/sfp-cli/src/impl/release/ReleaseDefinitionSchema.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default interface ReleaseDefinitionSchema { - release: string; - skipIfAlreadyInstalled: boolean; - skipArtifactUpdate:boolean; - baselineOrg?: string; - artifacts: { - [p: string]: string; - }; - packageDependencies?: { - [p: string]: string; - }; - promotePackagesBeforeDeploymentToOrg?: string; - changelog?: { - repoUrl?: string; - workItemFilter?:string; - workItemFilters?: string[]; - workItemUrl?: string; - limit?: number; - showAllArtifacts?: boolean; - }; -} diff --git a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts index 50cc5965c..463980bf8 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts @@ -1,4 +1,4 @@ -import ReleaseDefinitionSchema from './ReleaseDefinitionSchema'; +import ReleaseDefinition from './ReleaseDefinition'; import DeployImpl, { DeployProps, DeploymentMode, DeploymentResult } from '../deploy/DeployImpl'; import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { Stage } from '../Stage'; @@ -15,7 +15,7 @@ import FetchImpl from '../artifacts/FetchImpl'; import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; export interface ReleaseProps { - releaseDefinitions: ReleaseDefinitionSchema[]; + releaseDefinitions: ReleaseDefinition[]; targetOrg: string; fetchArtifactScript: string; isNpm: boolean; @@ -195,9 +195,9 @@ export default class ReleaseImpl { } private async deployArtifacts( - releaseDefinitions: ReleaseDefinitionSchema[] - ): Promise<{ releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]> { - let deploymentResults: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[] = []; + releaseDefinitions: ReleaseDefinition[] + ): Promise<{ releaseDefinition: ReleaseDefinition; result: DeploymentResult }[]> { + let deploymentResults: { releaseDefinition: ReleaseDefinition; result: DeploymentResult }[] = []; for (const releaseDefinition of releaseDefinitions) { let groupSection = new GroupConsoleLogs(`Release ${releaseDefinition.release}`).begin(); SFPLogger.log(EOL); @@ -240,7 +240,7 @@ export default class ReleaseImpl { } private async installPackageDependencies( - releaseDefinitions: ReleaseDefinitionSchema[], + releaseDefinitions: ReleaseDefinition[], targetOrg: string, keys: string, waitTime: number @@ -319,7 +319,7 @@ export default class ReleaseImpl { return output; } - private displayReleaseInfo(releaseDefinition: ReleaseDefinitionSchema, props: ReleaseProps) { + private displayReleaseInfo(releaseDefinition: ReleaseDefinition, props: ReleaseProps) { SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); SFPLogger.log(COLOR_KEY_MESSAGE(`Release: ${releaseDefinition.release}`)); @@ -352,7 +352,7 @@ interface InstallDependenciesResult { } export interface ReleaseResult { - succeededDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; - failedDeployments: { releaseDefinition: ReleaseDefinitionSchema; result: DeploymentResult }[]; + succeededDeployments: { releaseDefinition: ReleaseDefinition; result: DeploymentResult }[]; + failedDeployments: { releaseDefinition: ReleaseDefinition; result: DeploymentResult }[]; installDependenciesResult: InstallDependenciesResult; } diff --git a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts index 7d52ed3f4..b4df61c6c 100644 --- a/packages/sfp-cli/src/impl/validate/ValidateImpl.ts +++ b/packages/sfp-cli/src/impl/validate/ValidateImpl.ts @@ -48,7 +48,7 @@ import ExternalPackage2DependencyResolver from "../../core/package/dependencies/ import ExternalDependencyDisplayer from "../../core/display/ExternalDependencyDisplayer"; import { PreDeployHook } from "../deploy/PreDeployHook"; import GroupConsoleLogs from "../../ui/GroupConsoleLogs"; -import ReleaseConfig from "../release/ReleaseConfig"; +import ReleaseConfigLoader from "../release/ReleaseConfigLoader"; import { mapInstalledArtifactstoPkgAndCommits } from "../../utils/FetchArtifactsFromOrg"; import { ApexTestValidator } from "./ApexTestValidator"; import OrgInfoDisplayer from "../../ui/OrgInfoDisplayer"; @@ -509,12 +509,12 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook { props.validationMode === ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG ) { - let releaseConfig: ReleaseConfig = new ReleaseConfig( + let releaseConfigLoader: ReleaseConfigLoader = new ReleaseConfigLoader( logger, props.releaseConfigPath, true ); - return releaseConfig.getPackagesAsPerReleaseConfig(); + return releaseConfigLoader.getPackagesAsPerReleaseConfig(); } } diff --git a/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts b/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts index a4820edba..55655cc83 100644 --- a/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts +++ b/packages/sfp-cli/tests/impl/release/ReleaseDefinition.test.ts @@ -1,6 +1,6 @@ import { jest, expect } from '@jest/globals'; const fs = require('fs-extra'); -import ReleaseDefinition from '../../../src/impl/release/ReleaseDefinition'; +import ReleaseDefinitionLoader from '../../../src/impl/release/ReleaseDefinitionLoader'; describe('Given a release definition, validateReleaseDefinition', () => { let releaseDefinitionYaml: string; @@ -18,7 +18,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).rejects.toThrowError(); }); @@ -29,7 +29,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).rejects.toThrowError(); }); @@ -43,7 +43,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).toBeDefined(); }); @@ -57,7 +57,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).rejects.toThrowError(); }); @@ -71,7 +71,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).toBeDefined(); }); @@ -85,7 +85,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).rejects.toThrowError(); }); @@ -103,7 +103,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).toBeDefined(); }); @@ -119,7 +119,7 @@ describe('Given a release definition, validateReleaseDefinition', () => { `; expect(async () => { - await ReleaseDefinition.loadReleaseDefinition('path'); + await ReleaseDefinitionLoader.loadReleaseDefinition('path'); }).rejects.toThrow(); }); }); From b555705fa5d374a0749f77199e9bab393f51d7bd Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 8 Feb 2024 14:47:10 +1100 Subject: [PATCH 75/95] chore(version): update to Feb 24 --- dockerfiles/sfp-lite.Dockerfile | 2 +- dockerfiles/sfp.Dockerfile | 2 +- packages/sfp-cli/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dockerfiles/sfp-lite.Dockerfile b/dockerfiles/sfp-lite.Dockerfile index 921bc97df..e2e36806f 100644 --- a/dockerfiles/sfp-lite.Dockerfile +++ b/dockerfiles/sfp-lite.Dockerfile @@ -12,7 +12,7 @@ LABEL org.opencontainers.image.documentation "https://docs.flxbl.io/sfp" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "Flxbl" LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" -LABEL org.opencontainers.image.title "Flxbl sfp lite docker image - January 24" +LABEL org.opencontainers.image.title "Flxbl sfp lite docker image - February 24" ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockerfiles/sfp.Dockerfile b/dockerfiles/sfp.Dockerfile index 453f2867f..a6ef1cb83 100644 --- a/dockerfiles/sfp.Dockerfile +++ b/dockerfiles/sfp.Dockerfile @@ -15,7 +15,7 @@ LABEL org.opencontainers.image.documentation "https://docs.flxbl.io/sfp" LABEL org.opencontainers.image.revision $GIT_COMMIT LABEL org.opencontainers.image.vendor "Flxbl" LABEL org.opencontainers.image.source "https://github.com/flxbl-io/sfp" -LABEL org.opencontainers.image.title "Flxbl sfp docker image - January 24" +LABEL org.opencontainers.image.title "Flxbl sfp docker image - February 24" ENV DEBIAN_FRONTEND=noninteractive diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 573c01699..46575694c 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,10 +1,10 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "31.1.0", + "version": "32.0.0", "license": "MIT", "author": "flxblio", - "release": "January 24", + "release": "February 24", "bin": { "sfp": "./bin/run", "sfpowerscripts": "./bin/run" From 4451f9fd74c2a17effe1b77e29fdc1667703d54e Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 8 Feb 2024 14:50:11 +1100 Subject: [PATCH 76/95] chore(publish): update versions and publish to npm - @flxblio/sfp@33.0.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 46575694c..0696ce1ef 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "32.0.0", + "version": "33.0.0", "license": "MIT", "author": "flxblio", "release": "February 24", From 8925c10ad2827a5c32f2498c59a42a725140da12 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Fri, 9 Feb 2024 15:22:56 +1100 Subject: [PATCH 77/95] fix(cicd): fix default repo location --- .github/workflows/sfpowerscripts-build-docker.yml | 2 +- .github/workflows/sfpowerscripts-copy-docker.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sfpowerscripts-build-docker.yml b/.github/workflows/sfpowerscripts-build-docker.yml index f68f3e9b5..798ea4154 100644 --- a/.github/workflows/sfpowerscripts-build-docker.yml +++ b/.github/workflows/sfpowerscripts-build-docker.yml @@ -17,7 +17,7 @@ on: image: type: string required: false - default: sfpowerscripts + default: sfp suffix-tag: type: string required: true diff --git a/.github/workflows/sfpowerscripts-copy-docker.yml b/.github/workflows/sfpowerscripts-copy-docker.yml index 6e185771a..c9a35af51 100644 --- a/.github/workflows/sfpowerscripts-copy-docker.yml +++ b/.github/workflows/sfpowerscripts-copy-docker.yml @@ -10,7 +10,7 @@ on: repo: type: string required: false - default: 'dxatscale' + default: 'flxbl-io' image: type: string required: false From 8a2a19d2f4d5611a749eb16cf37ef858f5800704 Mon Sep 17 00:00:00 2001 From: Alan Jaouen <14994179+alanjaouen@users.noreply.github.com> Date: Fri, 9 Feb 2024 05:33:05 +0100 Subject: [PATCH 78/95] fix(orginfodisplayer): fix commands used in org info displayer Fix help commands used in org info displayer --- packages/sfp-cli/src/ui/OrgInfoDisplayer.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts b/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts index f3ef01d3e..e3cb0cbf4 100644 --- a/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts +++ b/packages/sfp-cli/src/ui/OrgInfoDisplayer.ts @@ -50,21 +50,21 @@ export default class OrgInfoDisplayer { LoggerLevel.INFO, ); SFPLogger.log( - COLOR_TRACE(`cat ${scratchOrg.sfdxAuthUrl} > ./authfile`), + COLOR_TRACE(`echo ${scratchOrg.sfdxAuthUrl} > ./authfile`), LoggerLevel.INFO, ); SFPLogger.log( - COLOR_TRACE(`sfdx auth sfdxurl store --sfdxurlfile authfile`), + COLOR_TRACE(`sf org login sfdx-url --sfdx-url-file=authfile`), LoggerLevel.INFO, ); SFPLogger.log( - COLOR_TRACE(`sfdx force org open --u ${scratchOrg.username}`), + COLOR_TRACE(`sf org open --target-org=${scratchOrg.username}`), LoggerLevel.INFO, ); SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); - + groupSection.end(); @@ -93,11 +93,11 @@ export default class OrgInfoDisplayer { fileOutputHandler.appendOutput(pathToMarkDownFile, `\n\nYou may use the following commands to authenticate to the org`,); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); - fileOutputHandler.appendOutput(pathToMarkDownFile, `cat ${scratchOrg.sfdxAuthUrl} > ./authfile`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx auth sfdxurl store --sfdxurlfile authfile`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `sfdx force org open --u ${scratchOrg.username}`); - fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); + fileOutputHandler.appendOutput(pathToMarkDownFile, `echo ${scratchOrg.sfdxAuthUrl} > ./authfile`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `sf org login sfdx-url --sfdx-url-file=authfile`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `sf org open --target-org=${scratchOrg.username}`); + fileOutputHandler.appendOutput(pathToMarkDownFile, `\`\`\``); } @@ -153,4 +153,4 @@ export default class OrgInfoDisplayer { } -} \ No newline at end of file +} From de62eef5225a64f26a0ae82ac9d6e914d9fa794b Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Fri, 9 Feb 2024 15:33:49 +1100 Subject: [PATCH 79/95] chore(publish): update versions and publish to npm - @flxblio/sfp@33.0.1 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 0696ce1ef..c879197fa 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "33.0.0", + "version": "33.0.1", "license": "MIT", "author": "flxblio", "release": "February 24", From f5b25e158481d071800e8b691b29a516040aefb3 Mon Sep 17 00:00:00 2001 From: Zhebin Liu Date: Mon, 12 Feb 2024 12:06:10 +1100 Subject: [PATCH 80/95] flow activation and deletion in deployment --- packages/sfp-cli/messages/flow.json | 10 ++ .../sfp-cli/src/commands/flow/activate.ts | 63 ++++++++++ .../sfp-cli/src/commands/flow/deactivate.ts | 63 ++++++++++ packages/sfp-cli/src/commands/flow/delete.ts | 72 +++++++++++ .../deploymentCustomizers/FlowActivator.ts | 99 +++++++++++++++ .../PostDeployersRegistry.ts | 3 + .../DeploymentFilterRegistry.ts | 2 + .../deploymentFilters/FlowVersionFilter.ts | 76 ++++++++++++ packages/sfp-cli/src/core/utils/FlowUtils.ts | 113 ++++++++++++++++++ 9 files changed, 501 insertions(+) create mode 100644 packages/sfp-cli/messages/flow.json create mode 100644 packages/sfp-cli/src/commands/flow/activate.ts create mode 100644 packages/sfp-cli/src/commands/flow/deactivate.ts create mode 100644 packages/sfp-cli/src/commands/flow/delete.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts create mode 100644 packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts create mode 100644 packages/sfp-cli/src/core/utils/FlowUtils.ts diff --git a/packages/sfp-cli/messages/flow.json b/packages/sfp-cli/messages/flow.json new file mode 100644 index 000000000..e9fb2b8d2 --- /dev/null +++ b/packages/sfp-cli/messages/flow.json @@ -0,0 +1,10 @@ +{ + "activateDescription": "Activate the flow upon the input", + "deleteDescription": "Delete the flow", + "deactivateDescription": "Deactivate the flow upon the input", + "developernameFlagDescription": "The developer name of the flow to deactivate", + "namespacePrefixFlagDescription": "Use to specify a specific namespace prefix", + "deactivatedDescription": "Deactivate a Flow based on API Name" + + +} \ No newline at end of file diff --git a/packages/sfp-cli/src/commands/flow/activate.ts b/packages/sfp-cli/src/commands/flow/activate.ts new file mode 100644 index 000000000..55bbcd6e3 --- /dev/null +++ b/packages/sfp-cli/src/commands/flow/activate.ts @@ -0,0 +1,63 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import {activate, getFlowDefinition} from '../../core/utils/FlowUtils'; +import { requiredUserNameFlag } from '../../flags/sfdxflags'; +import SFPOrg from '../../core/org/SFPOrg'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); + +export default class Activate extends sfpCommand { + public static description = messages.getMessage('activateDescription'); + + protected sfpOrg: SFPOrg; + + + protected static requiresUsername = true; + protected static supportsDevhubUsername = true; + protected static requiresProject = false; + + public static flags = { + developername: Flags.string({ + char: 'f', + description: messages.getMessage('developernameFlagDescription') + }), + namespaceprefix: Flags.string({ + char: 'p', + description: messages.getMessage('namespacePrefixFlagDescription') + }), + targetorg: requiredUserNameFlag, + loglevel + }; + + public async execute() { + const { developername, namespaceprefix } = this.flags as unknown as { + developername: string; + namespaceprefix: string; + }; + this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); + + try { + const flowdefinition = await getFlowDefinition( + { + developername, + namespaceprefix, + }, + this.sfpOrg + ); + await activate(flowdefinition, this.sfpOrg); + SFPLogger.log(`Successfully activated the flow ${developername}`,LoggerLevel.INFO); + + + } catch (error) { + throw new Error('Unable to activate flow:' + error); + } + } +} diff --git a/packages/sfp-cli/src/commands/flow/deactivate.ts b/packages/sfp-cli/src/commands/flow/deactivate.ts new file mode 100644 index 000000000..e043a4eb8 --- /dev/null +++ b/packages/sfp-cli/src/commands/flow/deactivate.ts @@ -0,0 +1,63 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import {deactivate, getFlowDefinition} from '../../core/utils/FlowUtils'; +import { requiredUserNameFlag } from '../../flags/sfdxflags'; +import SFPOrg from '../../core/org/SFPOrg'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); + +export default class Activate extends sfpCommand { + public static description = messages.getMessage('deactivateDescription'); + + protected sfpOrg: SFPOrg; + + + protected static requiresUsername = true; + protected static supportsDevhubUsername = true; + protected static requiresProject = false; + + public static flags = { + developername: Flags.string({ + char: 'f', + description: messages.getMessage('developernameFlagDescription') + }), + namespaceprefix: Flags.string({ + char: 'p', + description: messages.getMessage('namespacePrefixFlagDescription') + }), + targetorg: requiredUserNameFlag, + loglevel + }; + + public async execute() { + const { developername, namespaceprefix } = this.flags as unknown as { + developername: string; + namespaceprefix: string; + }; + this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); + + try { + const flowdefinition = await getFlowDefinition( + { + developername, + namespaceprefix, + }, + this.sfpOrg + ); + await deactivate(flowdefinition, this.sfpOrg); + SFPLogger.log(`Successfully deactivated the flow ${developername}`,LoggerLevel.INFO); + + + } catch (error) { + throw new Error('Unable to deactivate flow:' + error); + } + } +} diff --git a/packages/sfp-cli/src/commands/flow/delete.ts b/packages/sfp-cli/src/commands/flow/delete.ts new file mode 100644 index 000000000..708dd1e28 --- /dev/null +++ b/packages/sfp-cli/src/commands/flow/delete.ts @@ -0,0 +1,72 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import {deactivate, deleteFlows, getFlowDefinition, getFlowsByDefinition} from '../../core/utils/FlowUtils'; +import { requiredUserNameFlag } from '../../flags/sfdxflags'; +import SFPOrg from '../../core/org/SFPOrg'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); + +export default class Activate extends sfpCommand { + public static description = messages.getMessage('deleteDescription'); + + protected sfpOrg: SFPOrg; + + + protected static requiresUsername = true; + protected static supportsDevhubUsername = true; + protected static requiresProject = false; + + public static flags = { + developername: Flags.string({ + char: 'f', + description: messages.getMessage('developernameFlagDescription') + }), + namespaceprefix: Flags.string({ + char: 'p', + description: messages.getMessage('namespacePrefixFlagDescription') + }), + targetorg: requiredUserNameFlag, + loglevel + }; + + public async execute() { + const { developername, namespaceprefix } = this.flags as unknown as { + developername: string; + namespaceprefix: string; + }; + this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); + + try { + const flowdefinition = await getFlowDefinition( + { + developername, + namespaceprefix, + }, + this.sfpOrg + ); + if (flowdefinition.ActiveVersionId) { + await deactivate(flowdefinition, this.sfpOrg); + SFPLogger.log(`Successfully deactivated the flow ${developername}`,LoggerLevel.INFO); + } + + const flows = await getFlowsByDefinition(flowdefinition, this.sfpOrg); + if (flows && flows.length > 0) { + await deleteFlows(flows, this.sfpOrg); + } + + SFPLogger.log(`Successfully deleted the flow ${developername}`,LoggerLevel.INFO); + + + } catch (error) { + throw new Error('Unable to delete flow:' + error); + } + } +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts new file mode 100644 index 000000000..9dee093e5 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts @@ -0,0 +1,99 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SFPOrg from '../../org/SFPOrg'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { activate, FlowDefinition } from '../../utils/FlowUtils'; +import SfpPackage from '../SfpPackage'; +import { Connection } from '@salesforce/core'; +import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; +import { Schema } from 'jsforce'; +import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; +import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; + + + + + +export default class FlowActivator implements DeploymentCustomizer { + + + async execute( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg: SFPOrg, + logger: Logger, + deploymentContext: DeploymentContext +): Promise { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let isFlowFound: boolean = false; + let flowsToBeActivated = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.flow.name) { + flowsToBeActivated.push(sourceComponent.fullName); + console.log(sourceComponent.fullName); + } + } + if (flowsToBeActivated.length > 0) { + SFPLogger.log(`Flow found in the package, activating `, LoggerLevel.INFO, logger); + isFlowFound = true; + sfpPackage['isFlowFound'] = true; + } + + try { + if(isFlowFound){ + let query = `SELECT DeveloperName, ActiveVersion.FullName, ActiveVersion.VersionNumber, NamespacePrefix, LatestVersionId FROM FlowDefinition WHERE DeveloperName IN ('${flowsToBeActivated.join("','")}')`; + let flowVersionsInOrg = await QueryHelper.query(query, sfpOrg.getConnection(), true); + //activate the latest version of the flow + for(const flowVersion of flowVersionsInOrg){ + if(flowVersion.ActiveVersion == null ){ + await activate(flowVersion, sfpOrg); + }else{ + SFPLogger.log(`Flow ${flowVersion.DeveloperName} has active version, skipping activation`, LoggerLevel.INFO, logger); + } + } + + } + + return { + deploy_id: `000000`, + result: true, + message: `Avtivated Flows`, + }; + } catch (error) { + SFPLogger.log(`Unable to filter flow, returning the unmodified package`, LoggerLevel.ERROR, logger); + console.log(error); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + + } + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg || orgDetails.isSandbox ) return false; + return true; + + } + + gatherComponentsToBeDeployed( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger + ): Promise<{ location: string; componentSet: ComponentSet }> { + throw new Error('Method not implemented.'); + } + getDeploymentOptions(target_org: string, waitTime: string, apiVersion: string): Promise { + throw new Error('Method not implemented.'); + } + + public getName(): string { + return 'Flow Activator'; + } + +} + + + + diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts index d2ac675f6..5c60239d8 100644 --- a/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/PostDeployersRegistry.ts @@ -1,6 +1,7 @@ import { DeploymentCustomizer } from './DeploymentCustomizer'; import FHTEnabler from './FHTEnabler'; import FTEnabler from './FTEnabler'; +import FlowActivator from './FlowActivator'; export class PostDeployersRegistry { @@ -10,8 +11,10 @@ export class PostDeployersRegistry { //TODO: Make dynamic let fhtEnabler = new FHTEnabler(); let ftEnabler = new FTEnabler(); + let flowActivator = new FlowActivator(); postDeployers.push(fhtEnabler); postDeployers.push(ftEnabler); + postDeployers.push(flowActivator); return postDeployers; } diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts index 4e5721e2f..a0b287331 100644 --- a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts +++ b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts @@ -1,5 +1,6 @@ import { DeploymentFilter } from './DeploymentFilter'; import EntitlementVersionFilter from './EntitlementVersionFilter'; +import FlowVersionFilter from './FlowVersionFilter'; @@ -11,6 +12,7 @@ export class DeploymentFilterRegistry { //TODO: Make dynamic let entitlementVersionFilter = new EntitlementVersionFilter(); deploymentFilterImpls.push(entitlementVersionFilter); + deploymentFilterImpls.push(new FlowVersionFilter()); return deploymentFilterImpls; diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts b/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts new file mode 100644 index 000000000..ac7b55fe4 --- /dev/null +++ b/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts @@ -0,0 +1,76 @@ +import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; +import SFPOrg from '../../org/SFPOrg'; +import QueryHelper from '../../queryHelper/QueryHelper'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import { DeploymentFilter } from './DeploymentFilter'; +import { PackageType } from '../SfpPackage'; +const { XMLBuilder } = require('fast-xml-parser'); +import { deleteFlows, Flow } from '../../utils/FlowUtils'; +const Table = require('cli-table'); +import { ZERO_BORDER_TABLE } from '../../../ui/TableConstants'; + + +export default class FlowVersionFilter implements DeploymentFilter { + + public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { + + let sourceComponents = componentSet.getSourceComponents().toArray(); + let isFlowFound: boolean = false; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.flow.name) { + isFlowFound = true; + break; + } + } + if (!isFlowFound) return componentSet; + + try { + //count flow versions of each flow definition in the org + let query = `SELECT MasterLabel, COUNT(id) RecordCount FROM Flow GROUP BY MasterLabel`; + + + SFPLogger.log(`Checking Flow Versions....`, LoggerLevel.INFO, logger); + //Fetch Entitlements currently in the org + let flowVersionsInOrg = await QueryHelper.query(query, org.getConnection(), true); + let tableHead = ['Flow', 'Versions Count']; + let table = new Table({ + head: tableHead, + chars: ZERO_BORDER_TABLE, + }); + for (const flowVersion of flowVersionsInOrg) { + if(flowVersion.RecordCount == 50){ + SFPLogger.log(`Flow ${flowVersion.MasterLabel} has ${flowVersion.RecordCount} versions, deleting the oldest versions`, LoggerLevel.INFO, logger); + let flows = await QueryHelper.query(`SELECT Id, VersionNumber, FullName, MasterLabel FROM Flow WHERE MasterLabel = '${flowVersion.MasterLabel}' ORDER BY VersionNumber DESC`, org.getConnection(), true); + let flowsToDelete = flows.slice(49); + await deleteFlows(flowsToDelete, org); + flowVersion.RecordCount = 49; + } + table.push([flowVersion.MasterLabel, flowVersion.RecordCount]); + } + SFPLogger.log(table.toString()); + //let modifiedComponentSet = new ComponentSet(); + + + SFPLogger.log(`Completed cleaning up flow version\n`, LoggerLevel.INFO, logger); + return componentSet; + } catch (error) { + SFPLogger.log(`Unable to filter flow, returning the unmodified package`, LoggerLevel.ERROR, logger); + console.log(error); + return componentSet; + } + + } + + public isToApply(projectConfig: any, packageType: string): boolean { + if (packageType != PackageType.Source) return false; + + if (projectConfig?.plugins?.sfpowerscripts?.disableEntitlementFilter) return false; + else return true; +} + +} + + + + diff --git a/packages/sfp-cli/src/core/utils/FlowUtils.ts b/packages/sfp-cli/src/core/utils/FlowUtils.ts new file mode 100644 index 000000000..68b9fe648 --- /dev/null +++ b/packages/sfp-cli/src/core/utils/FlowUtils.ts @@ -0,0 +1,113 @@ +import SFPOrg from '../org/SFPOrg'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; + + + +export async function getFlowDefinition( + opts: FlowOptions, + org: SFPOrg +): Promise { + const { developername, namespaceprefix } = opts; + const conn = org.getConnection(); + + let flowDefinitionQuery = `Select Id, ActiveVersionId, DeveloperName, NamespacePrefix, LatestVersionId, LatestVersion.VersionNumber from FlowDefinition where DeveloperName = '${developername}'`; + + if (namespaceprefix) { + flowDefinitionQuery += ` AND NamespacePrefix = '${namespaceprefix}'`; + } + // Query the org + const result = await conn.tooling.query(flowDefinitionQuery); + + if (!result.records || result.records.length <= 0) { + throw new SFPLogger.log(`Could not find a definition for flow ${[developername]} in the org.` ); + } + + return result.records[0]; +} + +export async function getFlowsByDefinition( + flowdefinition: FlowDefinition, + org: SFPOrg +): Promise { + const conn = org.getConnection(); + let flowQuery = `Select Id, VersionNumber, MasterLabel from Flow where DefinitionId = '${flowdefinition.Id}'`; + if (flowdefinition.NamespacePrefix) { + flowQuery += ` AND Definition.NamespacePrefix = '${flowdefinition.NamespacePrefix}'`; + } + // Query the org + + const result = await conn.tooling.query(flowQuery); + + if (!result.records || result.records.length <= 0) { + throw new SFPLogger.log(`Could not find a definition for flow ${[[flowdefinition.DeveloperName]]} in the org.` ); + } + return result.records; +} +export async function deleteFlows(flows: Flow[], org: SFPOrg): Promise { + const flowIds = flows.map((flow) => flow.Id); + const conn = org.getConnection(); + console.log(flowIds); + + for(let id of flowIds){ + const results = await conn.tooling.sobject('Flow').del(id); + if(results.success){ + SFPLogger.log('Deleted flow version with id: ' + id,LoggerLevel.INFO); + }else{ + SFPLogger.log('Failed to delete flow with id: ' + id + 'ERROR: '+results.errors,LoggerLevel.ERROR); + } + } + return null; +} +export async function deactivate(flow: FlowDefinition, org: SFPOrg): Promise { + const conn = org.getConnection(); + const flowResult = await conn.tooling.sobject('FlowDefinition').update({ + Id: flow.Id, + Metadata: { + activeVersionNumber: '', + }, + }); + + if (!flowResult || !flowResult.success) { + throw new SFPLogger.log(`Unable to deactivate flow ${[flow.DeveloperName]}.`); + } + return flowResult; +} + +export async function activate(flow: FlowDefinition, org: SFPOrg): Promise { + const conn = org.getConnection(); + const flowResult = await conn.tooling.sobject('FlowDefinition').update({ + Id: flow.Id, + Metadata: { + activeVersionNumber: flow.LatestVersion.VersionNumber, + }, + }); + + if (!flowResult || !flowResult.success) { + throw new SFPLogger.log(`Unable to deactivate flow ${[flow.DeveloperName]}.`); + } + return flowResult; +} + + +export interface Flow { + Id: string; + VersionNumber: number; + FullName: string; + MasterLabel: string; + RecordCount: number; +} + +export interface FlowDefinition { + Id: string; + ActiveVersion: Flow; + ActiveVersionId: string; + DeveloperName: string; + LatestVersion: Flow; + LatestVersionId: string; + NamespacePrefix?: string; +} + +export interface FlowOptions { + developername: string; + namespaceprefix: string; +} \ No newline at end of file From d2dbe62ac3c22c56bbbb1ffcf0d3b3c08af019fb Mon Sep 17 00:00:00 2001 From: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:13:34 +1100 Subject: [PATCH 81/95] feat(release): enhanced support for multiple release definitions in release command (#14) * fix(depedencyresolver): add more explict error messages * feat(release): add enhanced support for multiple release defns in a single release call This change allows for a single release command to support multiple release defns from different configurations, It will use a leading order from one of the artifacts to determine the order of executing releases BREAKING CHANGE: changelog will be written for each release config by computing the name, and will be pushed individually * fix(release): fix paths when directory is not mentioned * fix(release): remove deprecated function substr --- .../src/commands/orchestrator/release.ts | 59 +++--- .../dependencies/PackageDependencyResolver.ts | 5 +- .../src/impl/impact/ImpactedReleaseConfig.ts | 10 +- .../impl/release/ReleaseDefinitionSorter.ts | 45 +++++ .../sfp-cli/src/impl/release/ReleaseImpl.ts | 185 ++++++++++++------ .../release/ReleaseDefinitionSorter.test.ts | 169 ++++++++++++++++ 6 files changed, 379 insertions(+), 94 deletions(-) create mode 100644 packages/sfp-cli/src/impl/release/ReleaseDefinitionSorter.ts create mode 100644 packages/sfp-cli/tests/impl/release/ReleaseDefinitionSorter.test.ts diff --git a/packages/sfp-cli/src/commands/orchestrator/release.ts b/packages/sfp-cli/src/commands/orchestrator/release.ts index 4c66e9ab3..6a88f1933 100644 --- a/packages/sfp-cli/src/commands/orchestrator/release.ts +++ b/packages/sfp-cli/src/commands/orchestrator/release.ts @@ -15,7 +15,13 @@ import SFPLogger, { ConsoleLogger, } from '@flxblio/sfp-logger'; import ReleaseDefinition from '../../impl/release/ReleaseDefinition'; -import { arrayFlagSfdxStyle, loglevel, logsgroupsymbol, optionalDevHubFlag, requiredUserNameFlag } from '../../flags/sfdxflags'; +import { + arrayFlagSfdxStyle, + loglevel, + logsgroupsymbol, + optionalDevHubFlag, + requiredUserNameFlag, +} from '../../flags/sfdxflags'; import { Flags } from '@oclif/core'; Messages.importMessagesDirectory(__dirname); @@ -91,16 +97,16 @@ export default class Release extends SfpCommand { allowunpromotedpackages: Flags.boolean({ description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), hidden: true, - deprecated: { + deprecated: { message: '--allowunpromotedpackages is deprecated, All packages are allowed', - }, + }, }), changelogByDomains: Flags.boolean({ description: messages.getMessage('changelogByDomainsFlagDescription'), - hidden: true + hidden: true, }), devhubalias: optionalDevHubFlag, - loglevel + loglevel, }; public async execute() { @@ -121,15 +127,14 @@ export default class Release extends SfpCommand { SFPLogger.log(COLOR_HEADER(`Release Definitions: ${this.flags.releasedefinition}`)); SFPLogger.log(COLOR_HEADER(`Artifact Directory: ${path.resolve('artifacts')}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); let releaseDefinitions: ReleaseDefinition[] = []; for (const pathToReleaseDefintion of this.flags.releasedefinition) { let releaseDefinition = await ReleaseDefinitionLoader.loadReleaseDefinition(pathToReleaseDefintion); //Support Legacy by taking the existing single workItemFilter and pushing it to the new model - if(releaseDefinition.changelog?.workItemFilter) - { + if (releaseDefinition.changelog?.workItemFilter) { releaseDefinition.changelog.workItemFilters = new Array(); releaseDefinition.changelog.workItemFilters.push(releaseDefinition.changelog?.workItemFilter); } @@ -164,21 +169,19 @@ export default class Release extends SfpCommand { isGenerateChangelog: this.flags.generatechangelog, devhubUserName: this.flags.devhubalias, branch: this.flags.branchname, - directory:this.flags.directory, + directory: this.flags.directory, }; - let releaseImpl: ReleaseImpl = new ReleaseImpl(props,new ConsoleLogger()); + let releaseImpl: ReleaseImpl = new ReleaseImpl(props, new ConsoleLogger()); releaseResult = await releaseImpl.exec(); - if(!this.flags.dryrun) - SFPStatsSender.logCount('release.succeeded', tags); + if (!this.flags.dryrun) SFPStatsSender.logCount('release.succeeded', tags); } catch (err) { if (err instanceof ReleaseError) { releaseResult = err.data; } else SFPLogger.log(err.message); - if(!this.flags.dryrun) - SFPStatsSender.logCount('release.failed', tags); + if (!this.flags.dryrun) SFPStatsSender.logCount('release.failed', tags); // Fail the task when an error occurs process.exitCode = 1; @@ -193,8 +196,7 @@ export default class Release extends SfpCommand { } private sendMetrics(releaseResult: ReleaseResult, tags: any, totalElapsedTime: number) { - if(!this.flags.dryrun) - { + if (!this.flags.dryrun) { SFPStatsSender.logCount('release.scheduled', tags); SFPStatsSender.logGauge('release.duration', totalElapsedTime, tags); @@ -223,8 +225,8 @@ export default class Release extends SfpCommand { private printReleaseSummary(releaseResult: ReleaseResult, totalElapsedTime: number): void { if (this.flags.logsgroupsymbol?.[0]) SFPLogger.log(COLOR_HEADER(this.flags.logsgroupsymbol[0], 'Release Summary')); - - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); if (releaseResult.installDependenciesResult) { SFPLogger.log(COLOR_HEADER(`\nPackage Dependencies`)); SFPLogger.log(COLOR_SUCCESS(` ${releaseResult.installDependenciesResult.success.length} succeeded`)); @@ -233,13 +235,25 @@ export default class Release extends SfpCommand { } for (const succeededDeployment of releaseResult.succeededDeployments) { - SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${succeededDeployment.releaseDefinition.release}`)); + SFPLogger.log( + COLOR_HEADER( + `\n Release Defintion: ${succeededDeployment.releaseDefinition.release} for Release Config: ${ + succeededDeployment.releaseDefinition.releaseConfigName + ? succeededDeployment.releaseDefinition.releaseConfigName + : 'N/A' + }` + ) + ); SFPLogger.log(COLOR_SUCCESS(` ${succeededDeployment.result.deployed.length} succeeded`)); SFPLogger.log(COLOR_ERROR(` ${succeededDeployment.result.failed.length} failed`)); } for (const failedDeployment of releaseResult.failedDeployments) { - SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${failedDeployment.releaseDefinition.release}`)); + SFPLogger.log(COLOR_HEADER(`\n Release Defintion: ${failedDeployment.releaseDefinition.release} for for Release Config: ${ + failedDeployment.releaseDefinition.releaseConfigName + ? failedDeployment.releaseDefinition.releaseConfigName + : 'N/A' + }`)); SFPLogger.log(COLOR_SUCCESS(` ${failedDeployment.result.deployed.length} succeeded`)); SFPLogger.log( COLOR_ERROR( @@ -249,12 +263,11 @@ export default class Release extends SfpCommand { ); } - SFPLogger.log(COLOR_TIME(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substr(11, 8)}`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.log(COLOR_TIME(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substring(11,19)}`)); + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); } protected validateFlags() { if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); - } } diff --git a/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts b/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts index 43babb444..6a8836f9d 100644 --- a/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts +++ b/packages/sfp-cli/src/core/package/dependencies/PackageDependencyResolver.ts @@ -46,7 +46,7 @@ export default class PackageDependencyResolver { let dependency = packageDirectory.dependencies[i]; if (this.projectConfig.packageAliases[dependency.package] === undefined && !this.isSubscriberPackageVersionId(dependency.package)) { - throw new Error(`Can't find package id for dependency: ` + dependency.package); + throw new Error(`Can't find package id for dependency: ${dependency.package}, Please ensure that the package is added to sfdx-project.json in your packageAliases`); } let packageVersionId = this.isSubscriberPackageVersionId(dependency.package)?dependency.package:this.projectConfig.packageAliases[dependency.package] @@ -211,7 +211,8 @@ export default class PackageDependencyResolver { if (!package2VersionOnCurrentBranch) { throw new Error( - `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch` + `Failed to find validated Package2 version for dependency ${dependency.package} with version ${dependency.versionNumber} created from the current branch, + You will need to create a new version of the package on the current branch to resolve this dependency.` ); } diff --git a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts index f29fa9f69..fdfbcc7d7 100644 --- a/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts +++ b/packages/sfp-cli/src/impl/impact/ImpactedReleaseConfig.ts @@ -5,7 +5,7 @@ import path from 'path'; export default class ImpactedRelaseConfigResolver { public getImpactedReleaseConfigs(impactedPackages, configDir,isExplicitDependencyCheckEnabled:boolean=false, filterBy?: string) { - const impactedReleaseDefs = []; + const impactedReleaseConfigs = []; fs.readdirSync(configDir).forEach((file) => { const filePath = path.join(configDir, file); @@ -38,7 +38,7 @@ export default class ImpactedRelaseConfigResolver { if (releaseImpactedPackages.length > 0) { if (filterBy) { if (releaseConfig.releaseName.includes(filterBy)) { - impactedReleaseDefs.push({ + impactedReleaseConfigs.push({ releaseName: releaseConfig.releaseName, pool: releaseConfig.pool ? releaseConfig.pool @@ -48,7 +48,7 @@ export default class ImpactedRelaseConfigResolver { }); } } else { - impactedReleaseDefs.push({ + impactedReleaseConfigs.push({ releaseName: releaseConfig.releaseName, pool: releaseConfig.pool ? releaseConfig.pool @@ -61,7 +61,7 @@ export default class ImpactedRelaseConfigResolver { } }); - const sortedImpactedReleaseDefs = impactedReleaseDefs.sort((a, b) => { + const sortedImpactedReleaseConfigs = impactedReleaseConfigs.sort((a, b) => { if (!a.impactedPackages.length && !b.impactedPackages.length) return 0; if (!a.impactedPackages.length) return 1; // Move releases with no impacted packages to the end if (!b.impactedPackages.length) return -1; // Same as above @@ -77,7 +77,7 @@ export default class ImpactedRelaseConfigResolver { }); const output = { - include: sortedImpactedReleaseDefs, + include: sortedImpactedReleaseConfigs, }; return output; } diff --git a/packages/sfp-cli/src/impl/release/ReleaseDefinitionSorter.ts b/packages/sfp-cli/src/impl/release/ReleaseDefinitionSorter.ts new file mode 100644 index 000000000..288f48081 --- /dev/null +++ b/packages/sfp-cli/src/impl/release/ReleaseDefinitionSorter.ts @@ -0,0 +1,45 @@ +import { Logger } from '@flxblio/sfp-logger'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; +import ProjectConfig from '../../core/project/ProjectConfig'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SfpPackage from '../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import ReleaseDefinition from './ReleaseDefinition'; +import _ from 'lodash'; + +export default class ReleaseDefinitionSorter { + + public sortReleaseDefinitions( + releaseDefinitions: ReleaseDefinition[], + leadingSfProjectConfig: any, + logger: Logger + ): ReleaseDefinition[] { + + let clonedReleaseDefintions:ReleaseDefinition[] = _.cloneDeep(releaseDefinitions); + const allPackagesInConfig = ProjectConfig.getAllPackagesFromProjectConfig(leadingSfProjectConfig); + const packageOccurrenceCount = new Map(); + + // Count occurrences of each package across all release definitions + clonedReleaseDefintions.forEach((releaseDefinition) => { + Object.keys(releaseDefinition.artifacts).forEach((pkg) => { + if (allPackagesInConfig.includes(pkg)) { + // Only consider packages present in the project config + packageOccurrenceCount.set(pkg, (packageOccurrenceCount.get(pkg) || 0) + 1); + } + }); + }); + // Annotate each release definition with the index of its first unique package + clonedReleaseDefintions.forEach((releasedefnition) => { + releasedefnition['firstUniquePackageIndex'] = allPackagesInConfig.length; // Default to length (i.e., end) if no unique package is found + for (const pkg of allPackagesInConfig) { + if (releasedefnition.artifacts[pkg] && packageOccurrenceCount.get(pkg) === 1) { + // Check if the package is unique + releasedefnition['firstUniquePackageIndex'] = allPackagesInConfig.indexOf(pkg); + break; // Found the first unique package, no need to continue + } + } + }); + // Sort based on the first unique package's index, placing those without a unique package at the end + return clonedReleaseDefintions.sort((a, b) => a['firstUniquePackageIndex'] - b['firstUniquePackageIndex']); + } +} diff --git a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts index 463980bf8..99eabbf67 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts @@ -1,6 +1,6 @@ import ReleaseDefinition from './ReleaseDefinition'; import DeployImpl, { DeployProps, DeploymentMode, DeploymentResult } from '../deploy/DeployImpl'; -import SFPLogger, { COLOR_HEADER, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import SFPLogger, { COLOR_HEADER, COLOR_INFO, COLOR_KEY_MESSAGE, ConsoleLogger, Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { Stage } from '../Stage'; import ReleaseError from '../../errors/ReleaseError'; import ChangelogImpl from '../changelog/ChangelogImpl'; @@ -12,7 +12,12 @@ import { EOL } from 'os'; import Package2Detail from '../../core/package/Package2Detail'; import InstallUnlockedPackageCollection from '../../core/package/packageInstallers/InstallUnlockedPackageCollection'; import FetchImpl from '../artifacts/FetchImpl'; -import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import GroupConsoleLogs from '../../ui/GroupConsoleLogs'; +import ArtifactFetcher, { Artifact } from '../../core/artifacts/ArtifactFetcher'; +import SfpPackage from '../../core/package/SfpPackage'; +import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; +import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; +import ReleaseDefinitionSorter from './ReleaseDefinitionSorter'; export interface ReleaseProps { releaseDefinitions: ReleaseDefinition[]; @@ -32,6 +37,11 @@ export interface ReleaseProps { directory: string; } +type DeploymentStatus = { + releaseDefinition: ReleaseDefinition; + result: DeploymentResult; +}; + export default class ReleaseImpl { constructor(private props: ReleaseProps, private logger?: Logger) {} @@ -45,6 +55,13 @@ export default class ReleaseImpl { this.logger ); await fetchImpl.fetchArtifacts(this.props.releaseDefinitions); + + SFPLogger.log(COLOR_INFO(`Sorting order of release definitions...`), LoggerLevel.INFO, this.logger); + const sortedReleaseDefns = await this.getSortedReleaseDefns('artifacts',this.props.releaseDefinitions, this.logger); + const sortedReleaseOrder = sortedReleaseDefns.map((def) => def.release); + SFPLogger.log(COLOR_KEY_MESSAGE(`Order of Release Definitions: ${JSON.stringify(sortedReleaseOrder)}`), LoggerLevel.INFO, this.logger); + + groupSection.end(); let installDependenciesResult: InstallDependenciesResult; @@ -55,11 +72,12 @@ export default class ReleaseImpl { this.props.waitTime ); - let deploymentResults = await this.deployArtifacts(this.props.releaseDefinitions); + + let deploymentResults = await this.deployArtifacts(sortedReleaseDefns); //Get all suceeded deploys - let succeededDeploymentResults = []; - let failedDeploymentResults = []; + let succeededDeploymentResults: DeploymentStatus[] = []; + let failedDeploymentResults: DeploymentStatus[] = []; for (const deploymentResult of deploymentResults) { if (deploymentResult.result.failed.length === 0) succeededDeploymentResults.push(deploymentResult); else failedDeploymentResults.push(deploymentResult); @@ -76,62 +94,69 @@ export default class ReleaseImpl { let limit = 30; let workItemUrl: string; let showAllArtifacts: boolean = false; - for (const releaseDefinition of this.props.releaseDefinitions) { - releaseName = releaseName.concat(releaseDefinition.release, '-'); + + //Lets go through all the succeeded deployments and get the changelog + for (const succededDeployment of succeededDeploymentResults) { + releaseName = succededDeployment.releaseDefinition.release; + let releaseDefinition = succededDeployment.releaseDefinition; if (releaseDefinition.changelog) { - if(releaseDefinition.changelog.workItemFilters) { - workitemFilters.push(...releaseDefinition.changelog?.workItemFilters); + if (releaseDefinition.changelog.workItemFilters) { + workitemFilters.push(...releaseDefinition.changelog?.workItemFilters); } if (releaseDefinition.changelog.limit > limit) limit = releaseDefinition.changelog.limit; workItemUrl = releaseDefinition.changelog.workItemUrl; showAllArtifacts = releaseDefinition.changelog.showAllArtifacts; } - } - //Remove the last '-' from the name - releaseName = releaseName.slice(0, -1); - if (this.props.isGenerateChangelog) { - let groupSection = new GroupConsoleLogs('Release changelog').begin(); - try { - let changelogImpl: ChangelogImpl = new ChangelogImpl( - this.logger, - 'artifacts', - releaseName, - workitemFilters, - limit, - workItemUrl, - showAllArtifacts, - this.props.directory, - false, - this.props.branch, - false, - this.props.isDryRun, - this.props.targetOrg - ); - - let releaseChangelog = await changelogImpl.exec(); - - const aggregatedNumberOfWorkItemsInRelease = this.getAggregatedNumberOfWorkItemsInRelease( - releaseName, - releaseChangelog.releases - ); - - SFPStatsSender.logGauge('release.workitems', aggregatedNumberOfWorkItemsInRelease, { - releaseName: releaseName, - }); - - const aggregatedNumberOfCommitsInRelease = this.getAggregatedNumberOfCommitsInRelease( - releaseName, - releaseChangelog.releases - ); - - SFPStatsSender.logGauge('release.commits', aggregatedNumberOfCommitsInRelease, { - releaseName: releaseName, - }); - } catch (error) { - SFPLogger.log(`Unable to push changelog`, LoggerLevel.WARN, this.logger); - } - groupSection.end(); + if (this.props.isGenerateChangelog) { + let groupSection = new GroupConsoleLogs('Release changelog').begin(); + try { + let changelogImpl: ChangelogImpl = new ChangelogImpl( + this.logger, + 'artifacts', + releaseName, + workitemFilters, + limit, + workItemUrl, + showAllArtifacts, + releaseDefinition.releaseConfigName + ? path.join(this.props.directory?this.props.directory:"", releaseDefinition.releaseConfigName) + : this.props.directory?this.props.directory:"", + false, + this.props.branch, + false, + this.props.isDryRun, + this.props.targetOrg + ); + + let releaseChangelog = await changelogImpl.exec(); + + const aggregatedNumberOfWorkItemsInRelease = this.getAggregatedNumberOfWorkItemsInRelease( + releaseName, + releaseChangelog.releases + ); + + SFPStatsSender.logGauge('release.workitems', aggregatedNumberOfWorkItemsInRelease, { + releaseName: releaseName, + domain: releaseDefinition.releaseConfigName, + }); + + const aggregatedNumberOfCommitsInRelease = this.getAggregatedNumberOfCommitsInRelease( + releaseName, + releaseChangelog.releases + ); + + SFPStatsSender.logGauge('release.commits', aggregatedNumberOfCommitsInRelease, { + releaseName: releaseName, + domain: releaseDefinition.releaseConfigName, + }); + } catch (error) { + SFPLogger.log(`Unable to push changelog`, LoggerLevel.WARN, this.logger); + SFPLogger.log(error, LoggerLevel.TRACE, this.logger); + } + + groupSection.end(); + } } } @@ -194,12 +219,12 @@ export default class ReleaseImpl { return numberOfCommits; } - private async deployArtifacts( - releaseDefinitions: ReleaseDefinition[] - ): Promise<{ releaseDefinition: ReleaseDefinition; result: DeploymentResult }[]> { + + + private async deployArtifacts(releaseDefinitions: ReleaseDefinition[]): Promise { let deploymentResults: { releaseDefinition: ReleaseDefinition; result: DeploymentResult }[] = []; for (const releaseDefinition of releaseDefinitions) { - let groupSection = new GroupConsoleLogs(`Release ${releaseDefinition.release}`).begin(); + let groupSection = new GroupConsoleLogs(`Release ${releaseDefinition.release} for Release Configuration: ${releaseDefinition.releaseConfigName}`).begin(); SFPLogger.log(EOL); this.displayReleaseInfo(releaseDefinition, this.props); @@ -222,7 +247,9 @@ export default class ReleaseImpl { currentStage: Stage.DEPLOY, baselineOrg: releaseDefinition.baselineOrg, isDryRun: this.props.isDryRun, - disableArtifactCommit: releaseDefinition.skipArtifactUpdate?releaseDefinition.skipArtifactUpdate:false, + disableArtifactCommit: releaseDefinition.skipArtifactUpdate + ? releaseDefinition.skipArtifactUpdate + : false, promotePackagesBeforeDeploymentToOrg: releaseDefinition.promotePackagesBeforeDeploymentToOrg, devhubUserName: this.props.devhubUserName, }; @@ -239,6 +266,29 @@ export default class ReleaseImpl { return deploymentResults; } + private async getSortedReleaseDefns(artifactDirectory: string,releaseDefns:ReleaseDefinition[], logger: Logger): Promise { + let artifacts = ArtifactFetcher.fetchArtifacts(artifactDirectory, null, logger); + if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${artifactDirectory}`); + + //Convert artifacts to SfpPackages + let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts, logger); + + let sfpPackageInquirer: SfpPackageInquirer = new SfpPackageInquirer(sfpPackages, logger); + let sfdxProjectConfig = sfpPackageInquirer.getLatestProjectConfig(); + + let releaseDefinitionSorter = new ReleaseDefinitionSorter(); + return releaseDefinitionSorter.sortReleaseDefinitions(releaseDefns, sfdxProjectConfig, logger); + } + + private async generateSfpPackageFromArtifacts(artifacts: Artifact[], logger: Logger): Promise { + let sfpPackages: SfpPackage[] = []; + for (const artifact of artifacts) { + let sfpPackage = await SfpPackageBuilder.buildPackageFromArtifact(artifact, logger); + sfpPackages.push(sfpPackage); + } + return sfpPackages; + } + private async installPackageDependencies( releaseDefinitions: ReleaseDefinition[], targetOrg: string, @@ -279,7 +329,11 @@ export default class ReleaseImpl { externalPackage2s.push(dependendentPackage); } let sfpOrg = await SFPOrg.create({ aliasOrUsername: targetOrg }); - let packageCollectionInstaller = new InstallUnlockedPackageCollection(sfpOrg, new ConsoleLogger(),this.props.isDryRun); + let packageCollectionInstaller = new InstallUnlockedPackageCollection( + sfpOrg, + new ConsoleLogger(), + this.props.isDryRun + ); await packageCollectionInstaller.install(externalPackage2s, true, true); groupSection.end(); @@ -320,9 +374,12 @@ export default class ReleaseImpl { } private displayReleaseInfo(releaseDefinition: ReleaseDefinition, props: ReleaseProps) { - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); SFPLogger.log(COLOR_KEY_MESSAGE(`Release: ${releaseDefinition.release}`)); + if (releaseDefinition.releaseConfigName) { + SFPLogger.log(COLOR_KEY_MESSAGE(`Release Config Name: ${releaseDefinition.releaseConfigName}`)); + } SFPLogger.log( COLOR_KEY_MESSAGE( @@ -331,17 +388,17 @@ export default class ReleaseImpl { ); SFPLogger.log(COLOR_KEY_MESSAGE(`Dry-run: ${props.isDryRun}`)); - + if (releaseDefinition.baselineOrg) SFPLogger.log(COLOR_KEY_MESSAGE(`Baselined Against Org: ${releaseDefinition.baselineOrg}`)); - + if ( releaseDefinition.promotePackagesBeforeDeploymentToOrg && releaseDefinition.promotePackagesBeforeDeploymentToOrg == props.targetOrg ) SFPLogger.log(COLOR_KEY_MESSAGE(`Promte Packages Before Deployment Activated?: true`)); - SFPLogger.printHeaderLine('',COLOR_HEADER,LoggerLevel.INFO); + SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); } } diff --git a/packages/sfp-cli/tests/impl/release/ReleaseDefinitionSorter.test.ts b/packages/sfp-cli/tests/impl/release/ReleaseDefinitionSorter.test.ts new file mode 100644 index 000000000..995c956ed --- /dev/null +++ b/packages/sfp-cli/tests/impl/release/ReleaseDefinitionSorter.test.ts @@ -0,0 +1,169 @@ +import { ConsoleLogger } from '@flxblio/sfp-logger'; +import ReleaseDefinitionSorter from '../../../src/impl/release/ReleaseDefinitionSorter'; // Adjust the import path to where your function is defined +import { expect } from '@jest/globals'; + +describe('Sort Release Definitions by leading project config', () => { + it('should sort release definitions when packages are shared', async () => { + // Mock input data + const releaseDefinitions = [ + { + release: 'Release1', + artifacts: { PackageB: '1.0.0', PackageC: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release2', + artifacts: { PackageA: '1.0.0', PackageB: '1.0.0', PackageD: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release3', + artifacts: { PackageE: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + ]; + const leadingSfProjectConfig = { + packageDirectories: [ + { package: 'PackageA', versionNumber: '1.0.0' }, + { package: 'PackageB', versionNumber: '1.0.0' }, + { package: 'PackageC', versionNumber: '1.0.0' }, + { package: 'PackageD', versionNumber: '1.0.0' }, + { package: 'PackageE', versionNumber: '1.0.0' }, + ], + }; + + // Call the function to test + const sortedReleaseDefinitions = await new ReleaseDefinitionSorter().sortReleaseDefinitions( + releaseDefinitions, + leadingSfProjectConfig, + new ConsoleLogger() + ); + + const sortedReleaseOrder = sortedReleaseDefinitions.map((def) => def.release); + const expectedReleaseOrder = ['Release2', 'Release1', 'Release3']; + expect(sortedReleaseOrder).toEqual(expectedReleaseOrder); + }); + + it('should sort release definitions when the first release definition has the last package and packages are shared', async () => { + // Mock input data + const releaseDefinitions = [ + { + release: 'Release3', + artifacts: { PackageE: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release2', + artifacts: { PackageA: '1.0.0', PackageB: '1.0.0', PackageC: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release1', + artifacts: { PackageB: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + ]; + const leadingSfProjectConfig = { + packageDirectories: [ + { package: 'PackageA', versionNumber: '1.0.0' }, + { package: 'PackageB', versionNumber: '1.0.0' }, + { package: 'PackageC', versionNumber: '1.0.0' }, + { package: 'PackageD', versionNumber: '1.0.0' }, + { package: 'PackageE', versionNumber: '1.0.0' }, + ], + }; + + // Call the function to test + const sortedReleaseDefinitions = await new ReleaseDefinitionSorter().sortReleaseDefinitions( + releaseDefinitions, + leadingSfProjectConfig, + new ConsoleLogger() + ); + + const sortedReleaseOrder = sortedReleaseDefinitions.map((def) => def.release); + const expectedReleaseOrder = ['Release2', 'Release3', 'Release1']; + expect(sortedReleaseOrder).toEqual(expectedReleaseOrder); + }); + + it('should return the same definition when only one is provided', async () => { + // Mock input data + const releaseDefinitions = [ + { + release: 'Release3', + artifacts: { PackageE: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + } + ]; + const leadingSfProjectConfig = { + packageDirectories: [ + { package: 'PackageA', versionNumber: '1.0.0' }, + { package: 'PackageB', versionNumber: '1.0.0' }, + { package: 'PackageC', versionNumber: '1.0.0' }, + { package: 'PackageD', versionNumber: '1.0.0' }, + { package: 'PackageE', versionNumber: '1.0.0' }, + ], + }; + + // Call the function to test + const sortedReleaseDefinitions = await new ReleaseDefinitionSorter().sortReleaseDefinitions( + releaseDefinitions, + leadingSfProjectConfig, + new ConsoleLogger() + ); + + const sortedReleaseOrder = sortedReleaseDefinitions.map((def) => def.release); + const expectedReleaseOrder = ['Release3']; + expect(sortedReleaseOrder).toEqual(expectedReleaseOrder); + }); + + it('should sort release definitions when no packages are shared', async () => { + // Mock input data + const releaseDefinitions = [ + { + release: 'Release3', + artifacts: { PackageE: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release2', + artifacts: { PackageA: '1.0.0', PackageB: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + { + release: 'Release1', + artifacts: { PackageC: '1.0.0' }, + skipIfAlreadyInstalled: false, + skipArtifactUpdate: false, + }, + ]; + const leadingSfProjectConfig = { + packageDirectories: [ + { package: 'PackageA', versionNumber: '1.0.0' }, + { package: 'PackageB', versionNumber: '1.0.0' }, + { package: 'PackageC', versionNumber: '1.0.0' }, + { package: 'PackageD', versionNumber: '1.0.0' }, + { package: 'PackageE', versionNumber: '1.0.0' }, + ], + }; + + // Call the function to test + const sortedReleaseDefinitions = await new ReleaseDefinitionSorter().sortReleaseDefinitions( + releaseDefinitions, + leadingSfProjectConfig, + new ConsoleLogger() + ); + + const sortedReleaseOrder = sortedReleaseDefinitions.map((def) => def.release); + const expectedReleaseOrder = ['Release2', 'Release1', 'Release3']; + expect(sortedReleaseOrder).toEqual(expectedReleaseOrder); + }); +}); From 5e543c54d22401764a5edd84c800756d07397c49 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Mon, 12 Feb 2024 13:14:00 +1100 Subject: [PATCH 82/95] chore(publish): update versions and publish to npm - @flxblio/sfp@34.0.0 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index c879197fa..31e54415b 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "33.0.1", + "version": "34.0.0", "license": "MIT", "author": "flxblio", "release": "February 24", From e201376f68a9c3d2052fe810d21bd86e052e372b Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 13 Feb 2024 09:24:01 +1100 Subject: [PATCH 83/95] fix(markdown): ensure markdown files have config name when multiple releases are handled When multiple release defn is provided, the markdown file should not overwrite, it should provide the data for both the release defns --- packages/sfp-cli/src/commands/changelog/generate.ts | 2 ++ packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts | 6 +++++- .../src/impl/changelog/ChangelogMarkdownGenerator.ts | 4 ++-- packages/sfp-cli/src/impl/deploy/DeployImpl.ts | 2 +- packages/sfp-cli/src/impl/release/ReleaseImpl.ts | 7 +++++++ packages/sfp-cli/src/outputs/FileOutputHandler.ts | 6 ++++++ 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/sfp-cli/src/commands/changelog/generate.ts b/packages/sfp-cli/src/commands/changelog/generate.ts index 09c568d00..8258a363d 100644 --- a/packages/sfp-cli/src/commands/changelog/generate.ts +++ b/packages/sfp-cli/src/commands/changelog/generate.ts @@ -89,6 +89,8 @@ export default class GenerateChangelog extends SfpCommand { this.flags.forcepush, this.flags.branchname, this.flags.nopush, + false, + undefined, null ); diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts index 1326bec90..63b8e6be7 100644 --- a/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts +++ b/packages/sfp-cli/src/impl/changelog/ChangelogImpl.ts @@ -35,6 +35,7 @@ export default class ChangelogImpl { private branch: string, private nopush:boolean, private isDryRun: boolean, + private releaseConfigName:string, private org?: string ) { this.org = org?.toLowerCase(); @@ -145,7 +146,10 @@ export default class ChangelogImpl { if(this.isDryRun) { const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('release-changelog.md',marked(new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,true).generate())); + if(this.releaseConfigName){ + outputHandler.appendOutput('release-changelog.md',`# ReleaseConfig: ${this.releaseConfigName}`); + } + outputHandler.appendOutput('release-changelog.md',new ChangelogMarkdownGenerator(releaseChangelog, this.workItemUrl, 1, false,false).generate()); } diff --git a/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts index e5c795b25..c308794c3 100644 --- a/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts +++ b/packages/sfp-cli/src/impl/changelog/ChangelogMarkdownGenerator.ts @@ -40,10 +40,10 @@ export default class ChangelogMarkdownGenerator { if (!release.names) { payload += `\n\n `; // Create anchor from release hash Id - payload += `# ${release['name']}\n`; + payload += `## ${release['name']}\n`; } else { payload += `\n\n`; // Create anchor from release hash Id - payload += `# ${release.names.join(`/`)}\n `; + payload += `## ${release.names.join(`/`)}\n `; payload += `Cumulative Release Number: ${release.buildNumber} \n\n`; if(release.date && !this.isForWorkItemOnlyOutput) payload += `Matching defintion first created or deployed to an org on: ${release.date}\n ` diff --git a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts index f5340c0ce..6d335d9a6 100644 --- a/packages/sfp-cli/src/impl/deploy/DeployImpl.ts +++ b/packages/sfp-cli/src/impl/deploy/DeployImpl.ts @@ -524,7 +524,7 @@ export default class DeployImpl { } const table = getMarkdownTable(tableData); const outputHandler:FileOutputHandler = FileOutputHandler.getInstance(); - outputHandler.writeOutput('deployment-breakdown.md',table) ; + outputHandler.appendOutput('deployment-breakdown.md',table) ; } function processColoursForAllPackages(pkg) { diff --git a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts index 99eabbf67..076fb8552 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts @@ -18,6 +18,7 @@ import SfpPackage from '../../core/package/SfpPackage'; import SfpPackageBuilder from '../../core/package/SfpPackageBuilder'; import SfpPackageInquirer from '../../core/package/SfpPackageInquirer'; import ReleaseDefinitionSorter from './ReleaseDefinitionSorter'; +import FileOutputHandler from '../../outputs/FileOutputHandler'; export interface ReleaseProps { releaseDefinitions: ReleaseDefinition[]; @@ -72,6 +73,10 @@ export default class ReleaseImpl { this.props.waitTime ); + //Clear up the deployment output + SFPLogger.log(`Clearing deployment output`, LoggerLevel.TRACE, this.logger); + FileOutputHandler.getInstance().deleteOutputFile(`deployment-breakdown.md`); + FileOutputHandler.getInstance().deleteOutputFile(`release-changelog.md`); let deploymentResults = await this.deployArtifacts(sortedReleaseDefns); @@ -126,6 +131,7 @@ export default class ReleaseImpl { this.props.branch, false, this.props.isDryRun, + releaseDefinition.releaseConfigName, this.props.targetOrg ); @@ -254,6 +260,7 @@ export default class ReleaseImpl { devhubUserName: this.props.devhubUserName, }; + FileOutputHandler.getInstance().appendOutput(`deployment-breakdown.md`,`## ReleaseConfig: ${releaseDefinition.releaseConfigName?releaseDefinition.releaseConfigName:""}\n`); let deployImpl: DeployImpl = new DeployImpl(deployProps); let deploymentResult = await deployImpl.exec(); diff --git a/packages/sfp-cli/src/outputs/FileOutputHandler.ts b/packages/sfp-cli/src/outputs/FileOutputHandler.ts index cba026c60..a9436b092 100644 --- a/packages/sfp-cli/src/outputs/FileOutputHandler.ts +++ b/packages/sfp-cli/src/outputs/FileOutputHandler.ts @@ -32,4 +32,10 @@ export default class FileOutputHandler { fs.appendFileSync(path.join(this.containerFolder, fileName), output); } + public deleteOutputFile(fileName: string) { + if (fs.existsSync(path.join(this.containerFolder, fileName))) { + fs.unlinkSync(path.join(this.containerFolder, fileName)); + } + } + } \ No newline at end of file From fbbd745798411634d63139672ece1f0b39507688 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 13 Feb 2024 09:24:11 +1100 Subject: [PATCH 84/95] chore(publish): update versions and publish to npm - @flxblio/sfp@34.0.1 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 31e54415b..7cfc96899 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "34.0.0", + "version": "34.0.1", "license": "MIT", "author": "flxblio", "release": "February 24", From 533d932b4c02fd5bfbe651cda69a77b9fa20c9ce Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 13 Feb 2024 10:36:13 +1100 Subject: [PATCH 85/95] fix(release): use releaseconfig name to seperate out changelog creation rather than all Use an indirection using release config instead of all artifacts to generate changelog --- .../sfp-cli/src/impl/artifacts/FetchImpl.ts | 9 ++++++ .../sfp-cli/src/impl/release/ReleaseImpl.ts | 30 ++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts index 2e77eed9d..c6ec486ee 100644 --- a/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts +++ b/packages/sfp-cli/src/impl/artifacts/FetchImpl.ts @@ -40,10 +40,19 @@ export default class FetchImpl { for (const releaseDefinition of releaseDefinitions) { //Each release will be downloaded to specific subfolder inside the provided artifact directory //As each release is a collection of artifacts + let revisedArtifactDirectory = path.join( this.artifactDirectory, releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') ); + if(releaseDefinition.releaseConfigName) + { + revisedArtifactDirectory = path.join( + this.artifactDirectory, + releaseDefinition.releaseConfigName.replace(/[/\\?%*:|"<>]/g, '-'), + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + } rimraf.sync(revisedArtifactDirectory); fs.mkdirpSync(revisedArtifactDirectory); diff --git a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts index 076fb8552..0d2f49bd7 100644 --- a/packages/sfp-cli/src/impl/release/ReleaseImpl.ts +++ b/packages/sfp-cli/src/impl/release/ReleaseImpl.ts @@ -43,7 +43,11 @@ type DeploymentStatus = { result: DeploymentResult; }; + export default class ReleaseImpl { + + + constructor(private props: ReleaseProps, private logger?: Logger) {} public async exec(): Promise { @@ -118,7 +122,7 @@ export default class ReleaseImpl { try { let changelogImpl: ChangelogImpl = new ChangelogImpl( this.logger, - 'artifacts', + this.getArtifactDirectory(releaseDefinition), releaseName, workitemFilters, limit, @@ -235,15 +239,10 @@ export default class ReleaseImpl { this.displayReleaseInfo(releaseDefinition, this.props); - //Each release will be downloaded to specific subfolder inside the provided artifact directory - //As each release is a collection of artifacts - let revisedArtifactDirectory = path.join( - 'artifacts', - releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') - ); + let deployProps: DeployProps = { targetUsername: this.props.targetOrg, - artifactDir: revisedArtifactDirectory, + artifactDir: this.getArtifactDirectory(releaseDefinition), waitTime: this.props.waitTime, tags: this.props.tags, isTestsToBeTriggered: false, @@ -407,6 +406,21 @@ export default class ReleaseImpl { SFPLogger.printHeaderLine('', COLOR_HEADER, LoggerLevel.INFO); } + + private getArtifactDirectory(releaseDefinition: ReleaseDefinition) { + let revisedArtifactDirectory = path.join( + 'artifacts', + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + if (releaseDefinition.releaseConfigName) { + revisedArtifactDirectory = path.join( + 'artifacts', + releaseDefinition.releaseConfigName.replace(/[/\\?%*:|"<>]/g, '-'), + releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-') + ); + } + return revisedArtifactDirectory; + } } interface InstallDependenciesResult { From fc5e0223b4e9201ee007eefc046f935b79a843d2 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Tue, 13 Feb 2024 10:36:38 +1100 Subject: [PATCH 86/95] chore(publish): update versions and publish to npm - @flxblio/sfp@34.0.2 --- packages/sfp-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 7cfc96899..7def7c551 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -1,7 +1,7 @@ { "name": "@flxblio/sfp", "description": "Flxbl Toolkit", - "version": "34.0.1", + "version": "34.0.2", "license": "MIT", "author": "flxblio", "release": "February 24", From a8a881b759ec151d763345a217a8e0428756a987 Mon Sep 17 00:00:00 2001 From: Ronny Rokitta <97387584+Rocko1204@users.noreply.github.com> Date: Tue, 20 Feb 2024 09:00:31 +0100 Subject: [PATCH 87/95] fix(picklist-background): add retry counter to picklist update (#8) * fix(picklist-background): add retry counter to picklist update * feat(picklist-retry): change logic to bottleneck --------- Co-authored-by: Azlam <43767972+azlam-abdulsalam@users.noreply.github.com> --- .../deploymentCustomizers/PicklistEnabler.ts | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts index b17b48be5..b37b44ab9 100644 --- a/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/PicklistEnabler.ts @@ -8,6 +8,7 @@ import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; import SFPOrg from '../../org/SFPOrg'; import { Schema } from 'jsforce'; import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; +import Bottleneck from "bottleneck"; const QUERY_BODY = 'SELECT Id FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = '; @@ -68,7 +69,7 @@ export default class PicklistEnabler implements DeploymentCustomizer { SFPLogger.log( `Fetching picklist for custom field ${picklistName} on object ${objName}`, - LoggerLevel.INFO, + LoggerLevel.TRACE, logger ); @@ -76,15 +77,14 @@ export default class PicklistEnabler implements DeploymentCustomizer { //check for empty picklists on org and fix first deployment issue if (!picklistInOrg?.Metadata?.valueSet?.valueSetDefinition) { - SFPLogger.log( + SFPLogger.log( `Picklist field ${objName}.${picklistName} not in target Org. Skipping`, LoggerLevel.TRACE, logger ); - continue; + continue; } - let picklistValueInOrg = []; for (const value of picklistInOrg.Metadata.valueSet.valueSetDefinition.value) { @@ -104,12 +104,31 @@ export default class PicklistEnabler implements DeploymentCustomizer { let isPickListIdentical = this.arePicklistsIdentical(picklistValueInOrg, picklistValueSource); + const limiter = new Bottleneck({maxConcurrent: 1}); + + limiter.on("failed", async (error, jobInfo) => { + + if (jobInfo.retryCount < 5 && error.message.includes('background')) { + return 30000; + } else if (jobInfo.retryCount >= 5 && error.message.includes('background')) { + throw new Error(`Retry limit exceeded (3 minutes). Unable to process Picklist update.`); + } else { + throw new Error(`Unable to update picklist for custom field ${objName}.${picklistName} due to ${error.message}`); + } + }); + + limiter.on("retry", (error, jobInfo) => SFPLogger.log( + `Background job is beeing executed. Retrying (${jobInfo.retryCount + 1}/5) after 30 seconds...`, + LoggerLevel.WARN, + logger + )); + if (!isPickListIdentical) { - this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger); + await limiter.schedule(() => this.deployPicklist(picklistInOrg, picklistValueSource, sfpOrg.getConnection(), logger)); } else { SFPLogger.log( `Picklist for custom field ${objName}.${picklistName} is identical to the source.No deployment`, - LoggerLevel.INFO, + LoggerLevel.TRACE, logger ); } @@ -122,8 +141,7 @@ export default class PicklistEnabler implements DeploymentCustomizer { }; } } catch (error) { - SFPLogger.log(`Unable to process Picklist update due to ${error.message}`, LoggerLevel.WARN, logger); - SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + throw new Error(`Unable to process Picklist update due to ${error.message}`); } } @@ -160,15 +178,23 @@ export default class PicklistEnabler implements DeploymentCustomizer { if (Array.isArray(values)) { for (const value of values) { //ignore inactive values from source - if(!value?.isActive || value?.isActive == 'true'){ - picklistValueSet.push({fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'] , default: value.default, label: value['label'] ? decodeURI(value['label']) : value['label']}); + if (!value?.isActive || value?.isActive == 'true') { + picklistValueSet.push({ + fullName: value['fullName'] ? decodeURI(value['fullName']) : value['fullName'], + default: value.default, + label: value['label'] ? decodeURI(value['label']) : value['label'], + }); } } } else if (typeof values === 'object' && 'fullName' in values) { //ignore inactive values from source - if(!values?.isActive || values?.isActive == 'true'){ - picklistValueSet.push({fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'] , default: values.default, label: values['label'] ? decodeURI(values['label']) : values['label']}); - } + if (!values?.isActive || values?.isActive == 'true') { + picklistValueSet.push({ + fullName: values['fullName'] ? decodeURI(values['fullName']) : values['fullName'], + default: values.default, + label: values['label'] ? decodeURI(values['label']) : values['label'], + }); + } } return picklistValueSet; } @@ -203,13 +229,8 @@ export default class PicklistEnabler implements DeploymentCustomizer { FullName: picklistInOrg.FullName, }; SFPLogger.log(`Update picklist for custom field ${picklistToDeploy.FullName}`, LoggerLevel.INFO, logger); - try { - await conn.tooling.sobject('CustomField').update(picklistToDeploy); - } catch (error) { - throw new Error( - `Unable to update picklist for custom field ${picklistToDeploy.FullName} due to ${error.message}` - ); - } + await conn.tooling.sobject('CustomField').update(picklistToDeploy); + } public getName(): string { From 7f8b1623b7bb306119a888add81b540947376c6b Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 21 Feb 2024 13:58:39 +1100 Subject: [PATCH 88/95] fix(flow): integrate flow operations with deployment --- packages/sfp-cli/messages/flow.json | 10 +- packages/sfp-cli/package.json | 3 + .../sfp-cli/src/commands/flow/activate.ts | 7 +- .../sfp-cli/src/commands/flow/deactivate.ts | 9 +- packages/sfp-cli/src/commands/flow/delete.ts | 19 +- .../sfp-cli/src/core/flows/FlowOperations.ts | 108 ++++++++ .../deploymentCustomizers/FlowActivator.ts | 238 +++++++++++++----- .../deploymentFilters/FlowVersionFilter.ts | 76 ------ .../packageInstallers/InstallPackage.ts | 2 +- packages/sfp-cli/src/core/utils/FlowUtils.ts | 113 --------- 10 files changed, 308 insertions(+), 277 deletions(-) create mode 100644 packages/sfp-cli/src/core/flows/FlowOperations.ts delete mode 100644 packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts delete mode 100644 packages/sfp-cli/src/core/utils/FlowUtils.ts diff --git a/packages/sfp-cli/messages/flow.json b/packages/sfp-cli/messages/flow.json index e9fb2b8d2..1943bee7f 100644 --- a/packages/sfp-cli/messages/flow.json +++ b/packages/sfp-cli/messages/flow.json @@ -1,10 +1,8 @@ { - "activateDescription": "Activate the flow upon the input", - "deleteDescription": "Delete the flow", - "deactivateDescription": "Deactivate the flow upon the input", - "developernameFlagDescription": "The developer name of the flow to deactivate", + "activateDescription": "Activate the flow on a target org", + "deleteDescription": "Delete the flow on a target org", + "deactivateDescription": "Deactivate the flow on a target org", + "developernameFlagDescription": "The developer name of the flow", "namespacePrefixFlagDescription": "Use to specify a specific namespace prefix", "deactivatedDescription": "Deactivate a Flow based on API Name" - - } \ No newline at end of file diff --git a/packages/sfp-cli/package.json b/packages/sfp-cli/package.json index 7def7c551..1c3984870 100644 --- a/packages/sfp-cli/package.json +++ b/packages/sfp-cli/package.json @@ -144,6 +144,9 @@ "repo": { "description": "Commands to help with maintaing repository" }, + "flow": { + "description": "Commands to help with management of flows" + }, "dependency": { "description": "Commands to help with dependency management of a project", "subtopics": { diff --git a/packages/sfp-cli/src/commands/flow/activate.ts b/packages/sfp-cli/src/commands/flow/activate.ts index 55bbcd6e3..4c6d47eb3 100644 --- a/packages/sfp-cli/src/commands/flow/activate.ts +++ b/packages/sfp-cli/src/commands/flow/activate.ts @@ -1,9 +1,9 @@ import { Messages } from '@salesforce/core'; import sfpCommand from '../../SfpCommand'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger, COLOR_KEY_MESSAGE, COLOR_HEADER, COLOR_ERROR } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; -import {activate, getFlowDefinition} from '../../core/utils/FlowUtils'; +import {activate, getFlowDefinition} from '../../core/flows/FlowOperations'; import { requiredUserNameFlag } from '../../flags/sfdxflags'; import SFPOrg from '../../core/org/SFPOrg'; @@ -38,6 +38,7 @@ export default class Activate extends sfpCommand { }; public async execute() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`flow:activate`)}`),LoggerLevel.INFO); const { developername, namespaceprefix } = this.flags as unknown as { developername: string; namespaceprefix: string; @@ -57,7 +58,7 @@ export default class Activate extends sfpCommand { } catch (error) { - throw new Error('Unable to activate flow:' + error); + throw new Error(COLOR_ERROR('Unable to activate flow:' + error.message)); } } } diff --git a/packages/sfp-cli/src/commands/flow/deactivate.ts b/packages/sfp-cli/src/commands/flow/deactivate.ts index e043a4eb8..7689f30bb 100644 --- a/packages/sfp-cli/src/commands/flow/deactivate.ts +++ b/packages/sfp-cli/src/commands/flow/deactivate.ts @@ -1,9 +1,9 @@ import { Messages } from '@salesforce/core'; import sfpCommand from '../../SfpCommand'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger, COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_ERROR } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; -import {deactivate, getFlowDefinition} from '../../core/utils/FlowUtils'; +import {deactivate, getFlowDefinition} from '../../core/flows/FlowOperations'; import { requiredUserNameFlag } from '../../flags/sfdxflags'; import SFPOrg from '../../core/org/SFPOrg'; @@ -14,7 +14,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); -export default class Activate extends sfpCommand { +export default class DeActivate extends sfpCommand { public static description = messages.getMessage('deactivateDescription'); protected sfpOrg: SFPOrg; @@ -38,6 +38,7 @@ export default class Activate extends sfpCommand { }; public async execute() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`flow:deactivate`)}`),LoggerLevel.INFO); const { developername, namespaceprefix } = this.flags as unknown as { developername: string; namespaceprefix: string; @@ -57,7 +58,7 @@ export default class Activate extends sfpCommand { } catch (error) { - throw new Error('Unable to deactivate flow:' + error); + throw new Error(COLOR_ERROR('Unable to deactivate flow:' + error.message)); } } } diff --git a/packages/sfp-cli/src/commands/flow/delete.ts b/packages/sfp-cli/src/commands/flow/delete.ts index 708dd1e28..6363662d3 100644 --- a/packages/sfp-cli/src/commands/flow/delete.ts +++ b/packages/sfp-cli/src/commands/flow/delete.ts @@ -1,12 +1,13 @@ import { Messages } from '@salesforce/core'; import sfpCommand from '../../SfpCommand'; -import SFPLogger, { LoggerLevel, Logger } from '@flxblio/sfp-logger'; +import SFPLogger, { LoggerLevel, Logger, ConsoleLogger, COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_ERROR } from '@flxblio/sfp-logger'; import { Flags } from '@oclif/core'; import { loglevel } from '../../flags/sfdxflags'; -import {deactivate, deleteFlows, getFlowDefinition, getFlowsByDefinition} from '../../core/utils/FlowUtils'; +import {deactivate, deleteFlows, getFlowDefinition, getFlowsByDefinition} from '../../core/flows/FlowOperations'; import { requiredUserNameFlag } from '../../flags/sfdxflags'; import SFPOrg from '../../core/org/SFPOrg'; + // Initialize Messages with the current plugin directory Messages.importMessagesDirectory(__dirname); @@ -14,7 +15,7 @@ Messages.importMessagesDirectory(__dirname); // or any library that is using the messages framework can also be loaded this way. const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); -export default class Activate extends sfpCommand { +export default class Delete extends sfpCommand { public static description = messages.getMessage('deleteDescription'); protected sfpOrg: SFPOrg; @@ -37,7 +38,8 @@ export default class Activate extends sfpCommand { loglevel }; - public async execute() { + public async execute() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`flow:delete`)}`),LoggerLevel.INFO); const { developername, namespaceprefix } = this.flags as unknown as { developername: string; namespaceprefix: string; @@ -50,23 +52,24 @@ export default class Activate extends sfpCommand { developername, namespaceprefix, }, - this.sfpOrg + this.sfpOrg, + new ConsoleLogger() ); if (flowdefinition.ActiveVersionId) { await deactivate(flowdefinition, this.sfpOrg); SFPLogger.log(`Successfully deactivated the flow ${developername}`,LoggerLevel.INFO); } - const flows = await getFlowsByDefinition(flowdefinition, this.sfpOrg); + const flows = await getFlowsByDefinition(flowdefinition, this.sfpOrg, new ConsoleLogger()); if (flows && flows.length > 0) { - await deleteFlows(flows, this.sfpOrg); + await deleteFlows(flows, this.sfpOrg,new ConsoleLogger()); } SFPLogger.log(`Successfully deleted the flow ${developername}`,LoggerLevel.INFO); } catch (error) { - throw new Error('Unable to delete flow:' + error); + throw new Error(COLOR_ERROR('Unable to delete flow:' + error.message)); } } } diff --git a/packages/sfp-cli/src/core/flows/FlowOperations.ts b/packages/sfp-cli/src/core/flows/FlowOperations.ts new file mode 100644 index 000000000..3eab42e9c --- /dev/null +++ b/packages/sfp-cli/src/core/flows/FlowOperations.ts @@ -0,0 +1,108 @@ +import { Query, SaveResult } from 'jsforce'; +import SFPOrg from '../org/SFPOrg'; +import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; +import QueryHelper from '../queryHelper/QueryHelper'; + +export async function getFlowDefinition(opts: FlowOptions, org: SFPOrg, logger?: Logger): Promise { + const { developername, namespaceprefix } = opts; + const conn = org.getConnection(); + + let flowDefinitionQuery = `Select Id, ActiveVersionId, DeveloperName, NamespacePrefix, LatestVersionId, LatestVersion.VersionNumber from FlowDefinition where DeveloperName = '${developername}'`; + + if (namespaceprefix) { + flowDefinitionQuery += ` AND NamespacePrefix = '${namespaceprefix}'`; + } + // Query the org + const records = await QueryHelper.query(flowDefinitionQuery, conn, true); + + if (!records || records.length <= 0) { + throw new Error( + `Could not find a definition for flow ${[developername]} in the org.` + ); + } + + return records[0] as FlowDefinition; +} + +export async function getFlowsByDefinition(flowdefinition: FlowDefinition, org: SFPOrg,logger:Logger): Promise { + const conn = org.getConnection(); + let flowQuery = `Select Id, VersionNumber, MasterLabel from Flow where DefinitionId = '${flowdefinition.Id}'`; + if (flowdefinition.NamespacePrefix) { + flowQuery += ` AND Definition.NamespacePrefix = '${flowdefinition.NamespacePrefix}'`; + } + // Query the org + + const records = await QueryHelper.query(flowQuery, conn, true); + + if (!records || records.length <= 0) { + throw new Error(`Could not find a definition for flow ${[[flowdefinition.DeveloperName]]} in the org.`); + } + return records as Flow[]; +} + +export async function deleteFlows(flows: Flow[], org: SFPOrg,logger:Logger): Promise { + const flowIds = flows.map((flow) => flow.Id); + const conn = org.getConnection(); + for (let id of flowIds) { + const results = await conn.tooling.sobject('Flow').del(id); + if (results.success) { + SFPLogger.log('Deleted flow version with id: ' + id, LoggerLevel.INFO); + } else { + SFPLogger.log('Failed to delete flow with id: ' + id + 'ERROR: ' + results.errors, LoggerLevel.ERROR,logger); + } + } + return null; +} + +export async function deactivate(flow: FlowDefinition, org: SFPOrg): Promise { + const conn = org.getConnection(); + const flowResult = await conn.tooling.sobject('FlowDefinition').update({ + Id: flow.Id, + Metadata: { + activeVersionNumber: '', + }, + }); + + if (!flowResult || !flowResult.success) { + throw new Error(`Unable to deactivate flow ${[flow.DeveloperName]}.`); + } + return flowResult; +} + +export async function activate(flow: FlowDefinition, org: SFPOrg): Promise { + const conn = org.getConnection(); + const flowResult = await conn.tooling.sobject('FlowDefinition').update({ + Id: flow.Id, + Metadata: { + activeVersionNumber: flow.LatestVersion.VersionNumber, + }, + }); + + if (!flowResult || !flowResult.success) { + throw new Error(`Unable to activate flow ${[flow.DeveloperName]}.`); + } + return flowResult; +} + +export interface Flow { + Id: string; + VersionNumber: number; + FullName: string; + MasterLabel: string; + RecordCount: number; +} + +export interface FlowDefinition { + Id: string; + ActiveVersion: Flow; + ActiveVersionId: string; + DeveloperName: string; + LatestVersion: Flow; + LatestVersionId: string; + NamespacePrefix?: string; +} + +export interface FlowOptions { + developername: string; + namespaceprefix: string; +} diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts index 9dee093e5..f6a1f6c3b 100644 --- a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts @@ -2,85 +2,138 @@ import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; import SFPOrg from '../../org/SFPOrg'; import QueryHelper from '../../queryHelper/QueryHelper'; import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { activate, FlowDefinition } from '../../utils/FlowUtils'; +import { activate, deactivate, deleteFlows, Flow, FlowDefinition, getFlowDefinition } from '../../flows/FlowOperations'; import SfpPackage from '../SfpPackage'; import { Connection } from '@salesforce/core'; import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; import { Schema } from 'jsforce'; import { DeploymentOptions } from '../../deployers/DeploySourceToOrgImpl'; -import { DeploymentContext, DeploymentCustomizer } from "./DeploymentCustomizer"; +import { DeploymentContext, DeploymentCustomizer } from './DeploymentCustomizer'; import { DeploySourceResult } from '../../deployers/DeploymentExecutor'; - - - - +import { ZERO_BORDER_TABLE } from '../../display/TableConstants'; +const Table = require('cli-table'); export default class FlowActivator implements DeploymentCustomizer { - - - async execute( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - sfpOrg: SFPOrg, - logger: Logger, - deploymentContext: DeploymentContext -): Promise { - let sourceComponents = componentSet.getSourceComponents().toArray(); - let isFlowFound: boolean = false; - let flowsToBeActivated = []; + async execute( + sfpPackage: SfpPackage, + componentSet: ComponentSet, + sfpOrg: SFPOrg, + logger: Logger, + deploymentContext: DeploymentContext + ): Promise { + let sourceComponents = componentSet.getSourceComponents().toArray(); + let masterLabelsOfAllFlowsInPackage = []; + let flowsToBeActivated = []; + let flowsToBeDeactivated = []; + + for (const sourceComponent of sourceComponents) { + if (sourceComponent.type.name === registry.types.flow.name) { + //Parse Flows + //Determining the flow to be activated + let flowAsJSON = sourceComponent.parseXmlSync(); + masterLabelsOfAllFlowsInPackage.push(flowAsJSON['Flow']['label']); + if (flowAsJSON['Flow']['status'] == 'Active') { + flowsToBeActivated.push(sourceComponent.fullName); + } else { + flowsToBeDeactivated.push(sourceComponent.fullName); + } + } + } - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.flow.name) { - flowsToBeActivated.push(sourceComponent.fullName); - console.log(sourceComponent.fullName); - } - } - if (flowsToBeActivated.length > 0) { - SFPLogger.log(`Flow found in the package, activating `, LoggerLevel.INFO, logger); - isFlowFound = true; - sfpPackage['isFlowFound'] = true; + try { + + if (masterLabelsOfAllFlowsInPackage.length > 0) { + await this.cleanupOldestFlowVersion(masterLabelsOfAllFlowsInPackage, sfpOrg, logger); + + if (flowsToBeActivated.length > 0) { + SFPLogger.log( + `Active flows found in the package, attempting to activate latest versions`, + LoggerLevel.INFO, + logger + ); + await this.activateLatestVersionOfFlows(flowsToBeActivated, sfpOrg, logger); + } + if (flowsToBeDeactivated.length > 0) { + SFPLogger.log( + `Obsolete/Draft/InvalidDraft flows found in the package, attempting to inactivate the flow`, + LoggerLevel.INFO, + logger + ); + await this.deactivateFlow(flowsToBeDeactivated, sfpOrg, logger); + } + } + + return { + deploy_id: `000000`, + result: true, + message: `Activated/Inactivated Flows`, + }; + } catch (error) { + SFPLogger.log(`Unable to activate flow, skipping activation`, LoggerLevel.ERROR, logger); + console.log(error); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } } - - try { - if(isFlowFound){ - let query = `SELECT DeveloperName, ActiveVersion.FullName, ActiveVersion.VersionNumber, NamespacePrefix, LatestVersionId FROM FlowDefinition WHERE DeveloperName IN ('${flowsToBeActivated.join("','")}')`; + private async activateLatestVersionOfFlows(flowsToBeActivated: string[], sfpOrg: SFPOrg, logger: Logger) { + let query = `SELECT DeveloperName, ActiveVersion.FullName, ActiveVersion.VersionNumber, NamespacePrefix, LatestVersionId FROM FlowDefinition WHERE DeveloperName IN ('${flowsToBeActivated.join( + "','" + )}')`; let flowVersionsInOrg = await QueryHelper.query(query, sfpOrg.getConnection(), true); //activate the latest version of the flow - for(const flowVersion of flowVersionsInOrg){ - if(flowVersion.ActiveVersion == null ){ - await activate(flowVersion, sfpOrg); - }else{ - SFPLogger.log(`Flow ${flowVersion.DeveloperName} has active version, skipping activation`, LoggerLevel.INFO, logger); - } + for (const flowVersion of flowVersionsInOrg) { + if (flowVersion.ActiveVersion == null) { + await activate(flowVersion, sfpOrg); + SFPLogger.log( + `Flow ${flowVersion.DeveloperName} is activated in the org sucessfully`, + LoggerLevel.INFO, + logger + ); + } else { + SFPLogger.log( + `Flow ${flowVersion.DeveloperName}'s latest version is already active, skipping activation`, + LoggerLevel.INFO, + logger + ); + } } - - } - - return { - deploy_id: `000000`, - result: true, - message: `Avtivated Flows`, - }; - } catch (error) { - SFPLogger.log(`Unable to filter flow, returning the unmodified package`, LoggerLevel.ERROR, logger); - console.log(error); - SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); } - } - public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg || orgDetails.isSandbox ) return false; - return true; + private async deactivateFlow(flowsToBeDeactivated: string[], sfpOrg: SFPOrg, logger: Logger) { + for (const flow of flowsToBeDeactivated) { + try { + const flowdefinition = await getFlowDefinition( + { + developername: flow, + namespaceprefix: '', + }, + sfpOrg + ); + + await deactivate(flowdefinition, sfpOrg); + SFPLogger.log( + `Flow ${flow} is marked as inactive in the org sucessfully`, + LoggerLevel.INFO, + logger + ); + } catch (error) { + SFPLogger.log(`Unable to deactive flow ${flow}, skipping deactivation`, LoggerLevel.ERROR, logger); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + } + } - } + public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + //ignore if its a scratch org + const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); + if (orgDetails.isScratchOrg) return false; + return true; + } gatherComponentsToBeDeployed( - sfpPackage: SfpPackage, - componentSet: ComponentSet, - conn: Connection, - logger: Logger + sfpPackage: SfpPackage, + componentSet: ComponentSet, + conn: Connection, + logger: Logger ): Promise<{ location: string; componentSet: ComponentSet }> { throw new Error('Method not implemented.'); } @@ -88,12 +141,65 @@ export default class FlowActivator implements DeploymentCustomizer { throw new Error('Method not implemented.'); } - public getName(): string { + public getName(): string { return 'Flow Activator'; } + private async cleanupOldestFlowVersion(masterLabelsOfAllFlowsInPackage: string[], sfpOrg: SFPOrg, logger: Logger) { + try { + //count flow versions of each flow definition in the org + SFPLogger.log(`Checking current versions of flows`, LoggerLevel.INFO, logger); + + let query = `SELECT MasterLabel, COUNT(id) RecordCount FROM Flow GROUP BY MasterLabel`; + let isFlowVersionPurgeDetected = false; + + let flowVersionsInOrg = await QueryHelper.query(query, sfpOrg.getConnection(), true); + let tableHead = ['Flow', 'Versions Count', 'Action']; + let table = new Table({ + head: tableHead, + chars: ZERO_BORDER_TABLE, + }); + for (const flowVersion of flowVersionsInOrg) { + try { + if ( + flowVersion.RecordCount == 50 && + masterLabelsOfAllFlowsInPackage.includes(flowVersion.MasterLabel) + ) { + isFlowVersionPurgeDetected = true; + SFPLogger.log( + `Flow ${flowVersion.MasterLabel} has ${flowVersion.RecordCount} versions, deleting the oldest versions`, + LoggerLevel.INFO, + logger + ); + let flows = await QueryHelper.query( + `SELECT Id, VersionNumber, FullName, MasterLabel FROM Flow WHERE MasterLabel = '${flowVersion.MasterLabel}' ORDER BY VersionNumber DESC`, + sfpOrg.getConnection(), + true + ); + let flowsToDelete = flows.slice(49); + await deleteFlows(flowsToDelete, sfpOrg, logger); + table.push([flowVersion.MasterLabel, flowVersion.RecordCount, 'Deleted 1 version']); + } + } catch (error) { + SFPLogger.log( + `Unable to purge flow versions for ${flowVersion.MasterLabel}, skipping`, + LoggerLevel.ERROR, + logger + ); + table.push([flowVersion.MasterLabel, flowVersion.RecordCount, 'Unable to delete versions']); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + } + if (table.length > 1 && isFlowVersionPurgeDetected) { + SFPLogger.log(table.toString()); + } + else + { + SFPLogger.log(`All flows in the package have less than 50 versions, skipping version cleanup`, LoggerLevel.INFO, logger); + } + } catch (error) { + SFPLogger.log(`Unable to cleanup flow versions`, LoggerLevel.ERROR, logger); + SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); + } + } } - - - - diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts b/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts deleted file mode 100644 index ac7b55fe4..000000000 --- a/packages/sfp-cli/src/core/package/deploymentFilters/FlowVersionFilter.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { ComponentSet, registry } from '@salesforce/source-deploy-retrieve'; -import SFPOrg from '../../org/SFPOrg'; -import QueryHelper from '../../queryHelper/QueryHelper'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; -import { DeploymentFilter } from './DeploymentFilter'; -import { PackageType } from '../SfpPackage'; -const { XMLBuilder } = require('fast-xml-parser'); -import { deleteFlows, Flow } from '../../utils/FlowUtils'; -const Table = require('cli-table'); -import { ZERO_BORDER_TABLE } from '../../../ui/TableConstants'; - - -export default class FlowVersionFilter implements DeploymentFilter { - - public async apply(org: SFPOrg, componentSet: ComponentSet, logger: Logger): Promise { - - let sourceComponents = componentSet.getSourceComponents().toArray(); - let isFlowFound: boolean = false; - - for (const sourceComponent of sourceComponents) { - if (sourceComponent.type.name === registry.types.flow.name) { - isFlowFound = true; - break; - } - } - if (!isFlowFound) return componentSet; - - try { - //count flow versions of each flow definition in the org - let query = `SELECT MasterLabel, COUNT(id) RecordCount FROM Flow GROUP BY MasterLabel`; - - - SFPLogger.log(`Checking Flow Versions....`, LoggerLevel.INFO, logger); - //Fetch Entitlements currently in the org - let flowVersionsInOrg = await QueryHelper.query(query, org.getConnection(), true); - let tableHead = ['Flow', 'Versions Count']; - let table = new Table({ - head: tableHead, - chars: ZERO_BORDER_TABLE, - }); - for (const flowVersion of flowVersionsInOrg) { - if(flowVersion.RecordCount == 50){ - SFPLogger.log(`Flow ${flowVersion.MasterLabel} has ${flowVersion.RecordCount} versions, deleting the oldest versions`, LoggerLevel.INFO, logger); - let flows = await QueryHelper.query(`SELECT Id, VersionNumber, FullName, MasterLabel FROM Flow WHERE MasterLabel = '${flowVersion.MasterLabel}' ORDER BY VersionNumber DESC`, org.getConnection(), true); - let flowsToDelete = flows.slice(49); - await deleteFlows(flowsToDelete, org); - flowVersion.RecordCount = 49; - } - table.push([flowVersion.MasterLabel, flowVersion.RecordCount]); - } - SFPLogger.log(table.toString()); - //let modifiedComponentSet = new ComponentSet(); - - - SFPLogger.log(`Completed cleaning up flow version\n`, LoggerLevel.INFO, logger); - return componentSet; - } catch (error) { - SFPLogger.log(`Unable to filter flow, returning the unmodified package`, LoggerLevel.ERROR, logger); - console.log(error); - return componentSet; - } - - } - - public isToApply(projectConfig: any, packageType: string): boolean { - if (packageType != PackageType.Source) return false; - - if (projectConfig?.plugins?.sfpowerscripts?.disableEntitlementFilter) return false; - else return true; -} - -} - - - - diff --git a/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts b/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts index 74f8ddccd..c501f872b 100644 --- a/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts +++ b/packages/sfp-cli/src/core/package/packageInstallers/InstallPackage.ts @@ -318,7 +318,7 @@ export abstract class InstallPackage { try { if (await postDeployer.isEnabled(this.sfpPackage, this.connection, this.logger)) { SFPLogger.log( - `Executing Pre Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, + `Executing Post Deployer ${COLOR_KEY_MESSAGE(postDeployer.getName())}`, LoggerLevel.INFO, this.logger ); diff --git a/packages/sfp-cli/src/core/utils/FlowUtils.ts b/packages/sfp-cli/src/core/utils/FlowUtils.ts deleted file mode 100644 index 68b9fe648..000000000 --- a/packages/sfp-cli/src/core/utils/FlowUtils.ts +++ /dev/null @@ -1,113 +0,0 @@ -import SFPOrg from '../org/SFPOrg'; -import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; - - - -export async function getFlowDefinition( - opts: FlowOptions, - org: SFPOrg -): Promise { - const { developername, namespaceprefix } = opts; - const conn = org.getConnection(); - - let flowDefinitionQuery = `Select Id, ActiveVersionId, DeveloperName, NamespacePrefix, LatestVersionId, LatestVersion.VersionNumber from FlowDefinition where DeveloperName = '${developername}'`; - - if (namespaceprefix) { - flowDefinitionQuery += ` AND NamespacePrefix = '${namespaceprefix}'`; - } - // Query the org - const result = await conn.tooling.query(flowDefinitionQuery); - - if (!result.records || result.records.length <= 0) { - throw new SFPLogger.log(`Could not find a definition for flow ${[developername]} in the org.` ); - } - - return result.records[0]; -} - -export async function getFlowsByDefinition( - flowdefinition: FlowDefinition, - org: SFPOrg -): Promise { - const conn = org.getConnection(); - let flowQuery = `Select Id, VersionNumber, MasterLabel from Flow where DefinitionId = '${flowdefinition.Id}'`; - if (flowdefinition.NamespacePrefix) { - flowQuery += ` AND Definition.NamespacePrefix = '${flowdefinition.NamespacePrefix}'`; - } - // Query the org - - const result = await conn.tooling.query(flowQuery); - - if (!result.records || result.records.length <= 0) { - throw new SFPLogger.log(`Could not find a definition for flow ${[[flowdefinition.DeveloperName]]} in the org.` ); - } - return result.records; -} -export async function deleteFlows(flows: Flow[], org: SFPOrg): Promise { - const flowIds = flows.map((flow) => flow.Id); - const conn = org.getConnection(); - console.log(flowIds); - - for(let id of flowIds){ - const results = await conn.tooling.sobject('Flow').del(id); - if(results.success){ - SFPLogger.log('Deleted flow version with id: ' + id,LoggerLevel.INFO); - }else{ - SFPLogger.log('Failed to delete flow with id: ' + id + 'ERROR: '+results.errors,LoggerLevel.ERROR); - } - } - return null; -} -export async function deactivate(flow: FlowDefinition, org: SFPOrg): Promise { - const conn = org.getConnection(); - const flowResult = await conn.tooling.sobject('FlowDefinition').update({ - Id: flow.Id, - Metadata: { - activeVersionNumber: '', - }, - }); - - if (!flowResult || !flowResult.success) { - throw new SFPLogger.log(`Unable to deactivate flow ${[flow.DeveloperName]}.`); - } - return flowResult; -} - -export async function activate(flow: FlowDefinition, org: SFPOrg): Promise { - const conn = org.getConnection(); - const flowResult = await conn.tooling.sobject('FlowDefinition').update({ - Id: flow.Id, - Metadata: { - activeVersionNumber: flow.LatestVersion.VersionNumber, - }, - }); - - if (!flowResult || !flowResult.success) { - throw new SFPLogger.log(`Unable to deactivate flow ${[flow.DeveloperName]}.`); - } - return flowResult; -} - - -export interface Flow { - Id: string; - VersionNumber: number; - FullName: string; - MasterLabel: string; - RecordCount: number; -} - -export interface FlowDefinition { - Id: string; - ActiveVersion: Flow; - ActiveVersionId: string; - DeveloperName: string; - LatestVersion: Flow; - LatestVersionId: string; - NamespacePrefix?: string; -} - -export interface FlowOptions { - developername: string; - namespaceprefix: string; -} \ No newline at end of file From 2927f789e5980301061fe53b46e893ebb1fc5f86 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 21 Feb 2024 14:33:33 +1100 Subject: [PATCH 89/95] fix(flow): update sfdx-project.json schema --- .../sfp-cli/resources/schemas/sfdx-project.schema.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/sfp-cli/resources/schemas/sfdx-project.schema.json b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json index 4eb47bfc2..04932d084 100644 --- a/packages/sfp-cli/resources/schemas/sfdx-project.schema.json +++ b/packages/sfp-cli/resources/schemas/sfdx-project.schema.json @@ -187,6 +187,9 @@ "enableFHT": { "$ref": "#/definitions/packageDirectory.enableFHT" }, + "enableFlowActivation": { + "$ref": "#/definitions/packageDirectory.enableFlowActivation" + }, "enablePicklist": { "$ref": "#/definitions/packageDirectory.enablePicklist" }, @@ -543,6 +546,12 @@ "title": "Enable Field History Tracking support?", "description": "Enable automated update of field history tracking in the target org upon deployment" }, + "packageDirectory.enableFlowActivation": { + "type": "boolean", + "default": true, + "title": "Enable Automated Flow Management?", + "description": "Enable automated activation,deactivation of flows in the target org, Enabled by default for source/diff packages" + }, "packageDirectory.enableFT": { "type": "boolean", "default": true, From 95499f78dd08577011e71a12d7be694ac4fc9dfb Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 21 Feb 2024 14:33:48 +1100 Subject: [PATCH 90/95] fix(flow): disable cleanup for now --- .../deploymentCustomizers/FlowActivator.ts | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts index f6a1f6c3b..3f24f4dde 100644 --- a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts @@ -3,7 +3,7 @@ import SFPOrg from '../../org/SFPOrg'; import QueryHelper from '../../queryHelper/QueryHelper'; import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; import { activate, deactivate, deleteFlows, Flow, FlowDefinition, getFlowDefinition } from '../../flows/FlowOperations'; -import SfpPackage from '../SfpPackage'; +import SfpPackage, { PackageType } from '../SfpPackage'; import { Connection } from '@salesforce/core'; import OrgDetailsFetcher from '../../org/OrgDetailsFetcher'; import { Schema } from 'jsforce'; @@ -41,9 +41,9 @@ export default class FlowActivator implements DeploymentCustomizer { } try { - if (masterLabelsOfAllFlowsInPackage.length > 0) { - await this.cleanupOldestFlowVersion(masterLabelsOfAllFlowsInPackage, sfpOrg, logger); + // Need to move this to a seperate pre deployment process + // await this.cleanupOldestFlowVersion(masterLabelsOfAllFlowsInPackage, sfpOrg, logger); if (flowsToBeActivated.length > 0) { SFPLogger.log( @@ -110,11 +110,7 @@ export default class FlowActivator implements DeploymentCustomizer { ); await deactivate(flowdefinition, sfpOrg); - SFPLogger.log( - `Flow ${flow} is marked as inactive in the org sucessfully`, - LoggerLevel.INFO, - logger - ); + SFPLogger.log(`Flow ${flow} is marked as inactive in the org sucessfully`, LoggerLevel.INFO, logger); } catch (error) { SFPLogger.log(`Unable to deactive flow ${flow}, skipping deactivation`, LoggerLevel.ERROR, logger); SFPLogger.log(`Error Details : ${error.stack}`, LoggerLevel.TRACE); @@ -123,10 +119,15 @@ export default class FlowActivator implements DeploymentCustomizer { } public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { - //ignore if its a scratch org - const orgDetails = await new OrgDetailsFetcher(conn.getUsername()).getOrgDetails(); - if (orgDetails.isScratchOrg) return false; - return true; + if ( + sfpPackage.packageType == PackageType.Diff || + sfpPackage.packageType == PackageType.Source || + sfpPackage.packageDescriptor.enableFlowActivation == undefined || + sfpPackage.packageDescriptor.enableFlowActivation == true + ) { + return true; + } + return false; } gatherComponentsToBeDeployed( @@ -192,10 +193,12 @@ export default class FlowActivator implements DeploymentCustomizer { } if (table.length > 1 && isFlowVersionPurgeDetected) { SFPLogger.log(table.toString()); - } - else - { - SFPLogger.log(`All flows in the package have less than 50 versions, skipping version cleanup`, LoggerLevel.INFO, logger); + } else { + SFPLogger.log( + `All flows in the package have less than 50 versions, skipping version cleanup`, + LoggerLevel.INFO, + logger + ); } } catch (error) { SFPLogger.log(`Unable to cleanup flow versions`, LoggerLevel.ERROR, logger); From 0cca01dcbe108c4b029674a2fb542f4e6c2d7b9c Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 21 Feb 2024 14:35:40 +1100 Subject: [PATCH 91/95] docs(flow): add decision record --- .../deployments/003-flow-management.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 decision records/deployments/003-flow-management.md diff --git a/decision records/deployments/003-flow-management.md b/decision records/deployments/003-flow-management.md new file mode 100644 index 000000000..64d01cdd7 --- /dev/null +++ b/decision records/deployments/003-flow-management.md @@ -0,0 +1,33 @@ +# Flow Activation/Deactivation during deployment + +- Status: Accepted +- Deciders: @azlam-abdulsalam, @vuha-acn, @zhebinliu @Rocko1204 + +## Context and Problem Statement + +While installing a source/diff package, flows by default are deployed as 'Inactive' in the production org. One can deploy flow as 'Active' using the steps mentioned [here](https://help.salesforce.com/s/articleView?id=sf.flow_distribute_deploy_active.htm&language=en_US&type=5), however, this requires the flow to meet test coverage requirement. + +Also making a flow inactive, is convoluted, find the detailed article provided by [Gearset](https://gearset.com/blog/deactivate-flows-within-your-data-deployments/) + +Currently, sfp is unable to validate test coverage requirements for a flow and unable to determine the impacted test class for a flow, Hence in projects utilizing sfp, flows has to be manually activated with source/diff packages causing environment discrepancy + +## Decision + +Adopt a process within sfp deployments to manage Salesforce Flows, focusing on the dynamic activation and deactivation of Flows as part of the deployment of a package. This process aims to ensure that Flows included in the deployment package are correctly set to their intended active or inactive states, reflecting the desired automation behavior in the target org. + +The process will be auto enabled for source/diff packages and can be turned off by 'enableFlowActivation' as an additional package descriptor + +The following workflow will be utilized by sfp to manage flows + +### Process Summary +- Deploy flow along with the intended status as provided by the developer in the package using the deployment mechanism of the package type +- Prior to activation, identify all Flows included in the deployment package and determine their intended states (active or inactive) based on their configuration in the source control. +- Post-Deployment Adjustment: After successful deployment, adjust the activation state of each Flow based on its intended state identified by reading the metadata, This involves: + - Activating Flows intended to be active but are currently inactive in the target org, using tooling api + - Deactivating Flows intended to be inactive but are currently active in the target org. + + +## Consequences + +- Improved Automation and Efficiency: Automating the process of activating and deactivating flows as part of the deployment package enhances the efficiency of deployments and reduces manual intervention, ensuring consistency across environments. +- Increased Complexity: Implementing this feature adds complexity to the sfp deployment process, requiring robust error handling and logging to manage the activation and deactivation of flows effectively. From e130988d6ba629624a51b6df09a5334ea9edb525 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Wed, 21 Feb 2024 14:40:45 +1100 Subject: [PATCH 92/95] fix(flow): remove flow version filter --- .../package/deploymentFilters/DeploymentFilterRegistry.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts index a0b287331..2407779d2 100644 --- a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts +++ b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts @@ -1,6 +1,5 @@ import { DeploymentFilter } from './DeploymentFilter'; import EntitlementVersionFilter from './EntitlementVersionFilter'; -import FlowVersionFilter from './FlowVersionFilter'; @@ -12,8 +11,7 @@ export class DeploymentFilterRegistry { //TODO: Make dynamic let entitlementVersionFilter = new EntitlementVersionFilter(); deploymentFilterImpls.push(entitlementVersionFilter); - deploymentFilterImpls.push(new FlowVersionFilter()); - + return deploymentFilterImpls; } From 3eb6fe60bde07725d459e25a9e4f4cd99a6e0ad1 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 22 Feb 2024 12:24:56 +1100 Subject: [PATCH 93/95] fix(flows): address review comments --- packages/sfp-cli/messages/flow.json | 2 +- packages/sfp-cli/src/commands/flow/cleanup.ts | 93 +++++++++++++++++++ packages/sfp-cli/src/commands/flow/delete.ts | 75 --------------- .../sfp-cli/src/core/flows/FlowOperations.ts | 38 +++++--- 4 files changed, 118 insertions(+), 90 deletions(-) create mode 100644 packages/sfp-cli/src/commands/flow/cleanup.ts delete mode 100644 packages/sfp-cli/src/commands/flow/delete.ts diff --git a/packages/sfp-cli/messages/flow.json b/packages/sfp-cli/messages/flow.json index 1943bee7f..d0bf1b519 100644 --- a/packages/sfp-cli/messages/flow.json +++ b/packages/sfp-cli/messages/flow.json @@ -1,6 +1,6 @@ { "activateDescription": "Activate the flow on a target org", - "deleteDescription": "Delete the flow on a target org", + "cleanupDescription": "Cleanup inactive flows on a target org", "deactivateDescription": "Deactivate the flow on a target org", "developernameFlagDescription": "The developer name of the flow", "namespacePrefixFlagDescription": "Use to specify a specific namespace prefix", diff --git a/packages/sfp-cli/src/commands/flow/cleanup.ts b/packages/sfp-cli/src/commands/flow/cleanup.ts new file mode 100644 index 000000000..b99272c17 --- /dev/null +++ b/packages/sfp-cli/src/commands/flow/cleanup.ts @@ -0,0 +1,93 @@ +import { Messages } from '@salesforce/core'; +import sfpCommand from '../../SfpCommand'; +import SFPLogger, { + LoggerLevel, + Logger, + ConsoleLogger, + COLOR_HEADER, + COLOR_KEY_MESSAGE, + COLOR_ERROR, +} from '@flxblio/sfp-logger'; +import { Flags } from '@oclif/core'; +import { loglevel } from '../../flags/sfdxflags'; +import { deactivate, deleteFlows, getFlowDefinition, getFlowsByDefinition } from '../../core/flows/FlowOperations'; +import { requiredUserNameFlag } from '../../flags/sfdxflags'; +import SFPOrg from '../../core/org/SFPOrg'; + +// Initialize Messages with the current plugin directory +Messages.importMessagesDirectory(__dirname); + +// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, +// or any library that is using the messages framework can also be loaded this way. +const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); + +export default class Cleanup extends sfpCommand { + public static description = messages.getMessage('cleanupDescription'); + + protected sfpOrg: SFPOrg; + + protected static requiresUsername = true; + protected static supportsDevhubUsername = true; + protected static requiresProject = false; + + public static flags = { + developername: Flags.string({ + char: 'f', + description: messages.getMessage('developernameFlagDescription'), + }), + namespaceprefix: Flags.string({ + char: 'p', + description: messages.getMessage('namespacePrefixFlagDescription'), + }), + targetorg: requiredUserNameFlag, + loglevel, + }; + + public async execute() { + SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`flow:cleanup`)}`), LoggerLevel.INFO); + const { developername, namespaceprefix } = (this.flags as unknown) as { + developername: string; + namespaceprefix: string; + }; + this.sfpOrg = await SFPOrg.create({ aliasOrUsername: this.flags.targetorg }); + + try { + const flowdefinition = await getFlowDefinition( + { + developername, + namespaceprefix, + }, + this.sfpOrg, + new ConsoleLogger() + ); + //discover the active version of the flow + if (flowdefinition.ActiveVersionId) { + SFPLogger.log( + `Successfully discovered the active version of flow ${developername}: ${flowdefinition.ActiveVersionId}`, + LoggerLevel.INFO + ); + } + + let flows = await getFlowsByDefinition(flowdefinition, this.sfpOrg, new ConsoleLogger()); + let succeededFlowIds = []; + if (flows && flows.length > 0) { + flows = flows.filter((flow) => flow.Id != flowdefinition.ActiveVersionId); + succeededFlowIds = await deleteFlows(flows, this.sfpOrg, new ConsoleLogger()); + } + // do a comparison of the requested flows and succeeded flows + const flowIds = flows.map((flow) => flow.Id); + const failedFlowIds = flowIds.filter((flowId) => !succeededFlowIds.includes(flowId)); + if (failedFlowIds.length > 0) { + throw new Error( + `Failed to delete the following flow versions: ${failedFlowIds.join( + ', ' + )}, You may need to try again or manually delete them from the org.` + ); + } + + SFPLogger.log(`Successfully cleaned up the flow ${developername}`, LoggerLevel.INFO); + } catch (error) { + throw new Error(COLOR_ERROR('Unable to cleanup flow:' + error.message)); + } + } +} diff --git a/packages/sfp-cli/src/commands/flow/delete.ts b/packages/sfp-cli/src/commands/flow/delete.ts deleted file mode 100644 index 6363662d3..000000000 --- a/packages/sfp-cli/src/commands/flow/delete.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Messages } from '@salesforce/core'; -import sfpCommand from '../../SfpCommand'; -import SFPLogger, { LoggerLevel, Logger, ConsoleLogger, COLOR_HEADER, COLOR_KEY_MESSAGE, COLOR_ERROR } from '@flxblio/sfp-logger'; -import { Flags } from '@oclif/core'; -import { loglevel } from '../../flags/sfdxflags'; -import {deactivate, deleteFlows, getFlowDefinition, getFlowsByDefinition} from '../../core/flows/FlowOperations'; -import { requiredUserNameFlag } from '../../flags/sfdxflags'; -import SFPOrg from '../../core/org/SFPOrg'; - - -// Initialize Messages with the current plugin directory -Messages.importMessagesDirectory(__dirname); - -// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, -// or any library that is using the messages framework can also be loaded this way. -const messages = Messages.loadMessages('@flxblio/sfp', 'flow'); - -export default class Delete extends sfpCommand { - public static description = messages.getMessage('deleteDescription'); - - protected sfpOrg: SFPOrg; - - - protected static requiresUsername = true; - protected static supportsDevhubUsername = true; - protected static requiresProject = false; - - public static flags = { - developername: Flags.string({ - char: 'f', - description: messages.getMessage('developernameFlagDescription') - }), - namespaceprefix: Flags.string({ - char: 'p', - description: messages.getMessage('namespacePrefixFlagDescription') - }), - targetorg: requiredUserNameFlag, - loglevel - }; - - public async execute() { - SFPLogger.log(COLOR_HEADER(`command: ${COLOR_KEY_MESSAGE(`flow:delete`)}`),LoggerLevel.INFO); - const { developername, namespaceprefix } = this.flags as unknown as { - developername: string; - namespaceprefix: string; - }; - this.sfpOrg = await SFPOrg.create({aliasOrUsername:this.flags.targetorg}); - - try { - const flowdefinition = await getFlowDefinition( - { - developername, - namespaceprefix, - }, - this.sfpOrg, - new ConsoleLogger() - ); - if (flowdefinition.ActiveVersionId) { - await deactivate(flowdefinition, this.sfpOrg); - SFPLogger.log(`Successfully deactivated the flow ${developername}`,LoggerLevel.INFO); - } - - const flows = await getFlowsByDefinition(flowdefinition, this.sfpOrg, new ConsoleLogger()); - if (flows && flows.length > 0) { - await deleteFlows(flows, this.sfpOrg,new ConsoleLogger()); - } - - SFPLogger.log(`Successfully deleted the flow ${developername}`,LoggerLevel.INFO); - - - } catch (error) { - throw new Error(COLOR_ERROR('Unable to delete flow:' + error.message)); - } - } -} diff --git a/packages/sfp-cli/src/core/flows/FlowOperations.ts b/packages/sfp-cli/src/core/flows/FlowOperations.ts index 3eab42e9c..9bb9e1357 100644 --- a/packages/sfp-cli/src/core/flows/FlowOperations.ts +++ b/packages/sfp-cli/src/core/flows/FlowOperations.ts @@ -2,6 +2,7 @@ import { Query, SaveResult } from 'jsforce'; import SFPOrg from '../org/SFPOrg'; import SFPLogger, { Logger, LoggerLevel } from '@flxblio/sfp-logger'; import QueryHelper from '../queryHelper/QueryHelper'; +const retry = require('async-retry'); export async function getFlowDefinition(opts: FlowOptions, org: SFPOrg, logger?: Logger): Promise { const { developername, namespaceprefix } = opts; @@ -16,15 +17,17 @@ export async function getFlowDefinition(opts: FlowOptions, org: SFPOrg, logger?: const records = await QueryHelper.query(flowDefinitionQuery, conn, true); if (!records || records.length <= 0) { - throw new Error( - `Could not find a definition for flow ${[developername]} in the org.` - ); + throw new Error(`Could not find a definition for flow ${[developername]} in the org.`); } return records[0] as FlowDefinition; } -export async function getFlowsByDefinition(flowdefinition: FlowDefinition, org: SFPOrg,logger:Logger): Promise { +export async function getFlowsByDefinition( + flowdefinition: FlowDefinition, + org: SFPOrg, + logger: Logger +): Promise { const conn = org.getConnection(); let flowQuery = `Select Id, VersionNumber, MasterLabel from Flow where DefinitionId = '${flowdefinition.Id}'`; if (flowdefinition.NamespacePrefix) { @@ -35,23 +38,30 @@ export async function getFlowsByDefinition(flowdefinition: FlowDefinition, org: const records = await QueryHelper.query(flowQuery, conn, true); if (!records || records.length <= 0) { - throw new Error(`Could not find a definition for flow ${[[flowdefinition.DeveloperName]]} in the org.`); + throw new Error(`Could not find a definition for flow ${[[flowdefinition.DeveloperName]]} in the org.`); } return records as Flow[]; } -export async function deleteFlows(flows: Flow[], org: SFPOrg,logger:Logger): Promise { +export async function deleteFlows(flows: Flow[], org: SFPOrg, logger: Logger): Promise { const flowIds = flows.map((flow) => flow.Id); const conn = org.getConnection(); + const succeededFlows = []; for (let id of flowIds) { - const results = await conn.tooling.sobject('Flow').del(id); - if (results.success) { - SFPLogger.log('Deleted flow version with id: ' + id, LoggerLevel.INFO); - } else { - SFPLogger.log('Failed to delete flow with id: ' + id + 'ERROR: ' + results.errors, LoggerLevel.ERROR,logger); - } + await retry( + async (bail) => { + const results = await conn.tooling.sobject('Flow').del(id); + if (results.success) { + SFPLogger.log('Deleted flow version with id: ' + id, LoggerLevel.INFO); + succeededFlows.push(id); + } else { + throw new Error(`Unable to delete flow version with id: ${id},retrying in 5 seconds...`) + } + }, + { retries: 3, minTimeout: 5000 } + ); } - return null; + return succeededFlows; } export async function deactivate(flow: FlowDefinition, org: SFPOrg): Promise { @@ -64,7 +74,7 @@ export async function deactivate(flow: FlowDefinition, org: SFPOrg): Promise Date: Thu, 22 Feb 2024 12:26:08 +1100 Subject: [PATCH 94/95] fix: undo changes --- .../core/package/deploymentFilters/DeploymentFilterRegistry.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts index 2407779d2..1b22a645b 100644 --- a/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts +++ b/packages/sfp-cli/src/core/package/deploymentFilters/DeploymentFilterRegistry.ts @@ -12,7 +12,6 @@ export class DeploymentFilterRegistry { let entitlementVersionFilter = new EntitlementVersionFilter(); deploymentFilterImpls.push(entitlementVersionFilter); - return deploymentFilterImpls; } } From 63b160271eaa222be3b5a685a9b49c0594320ad2 Mon Sep 17 00:00:00 2001 From: azlam-abdulsalam Date: Thu, 22 Feb 2024 12:29:49 +1100 Subject: [PATCH 95/95] fix: remove incorrect package types --- .../src/core/package/deploymentCustomizers/FlowActivator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts index 3f24f4dde..11e8d133a 100644 --- a/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts +++ b/packages/sfp-cli/src/core/package/deploymentCustomizers/FlowActivator.ts @@ -119,9 +119,9 @@ export default class FlowActivator implements DeploymentCustomizer { } public async isEnabled(sfpPackage: SfpPackage, conn: Connection, logger: Logger): Promise { + if(sfpPackage.packageDescriptor.package_type == PackageType.Data) + return false; if ( - sfpPackage.packageType == PackageType.Diff || - sfpPackage.packageType == PackageType.Source || sfpPackage.packageDescriptor.enableFlowActivation == undefined || sfpPackage.packageDescriptor.enableFlowActivation == true ) {